Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cdfdd9b
feat: excessive externals issue
coolbot100s Oct 17, 2026
45a9424
fix: lint
coolbot100s Oct 17, 2026
fbc2e63
fix: send raw_icon instead of icon to modview icon
coolbot100s Oct 17, 2026
53ef79b
feat: default false for send thead message
tdgao Oct 19, 2026
9b18f7f
fix: ensure queue bar tooltips only go on top
tdgao Oct 19, 2026
16f0f08
feat: add shift m to cycle misc review tabs
tdgao Oct 19, 2026
ff09525
feat: custom panel issue toggle keybinds
tdgao Oct 19, 2026
c7910c3
feat: hover on issue toggle to show preview
tdgao Oct 19, 2026
8bb40a5
feat: add arrow for requested status
tdgao Oct 19, 2026
125fc8b
feat: add option to default collapse versions changelog and dependency
tdgao Oct 19, 2026
16a92b1
feat: add setting to always show all issue controls, adjust num colum…
tdgao Oct 19, 2026
c872fb8
polish: gallery card
tdgao Oct 19, 2026
a997469
fix: when tooltip/panel is showing via focus, hover in and out again …
tdgao Oct 19, 2026
d3a8f04
polish: thread message sent time styles
tdgao Oct 19, 2026
d58ae9f
polish
tdgao Oct 19, 2026
e0fa10e
fix: markdown editor max height broken on firefox
tdgao Oct 19, 2026
4a0cf1a
polish: thread message options button and timestamp display
tdgao Oct 19, 2026
2cb591f
Merge branch 'main' into coolbot/modview-updates
tdgao Oct 19, 2026
7a687c8
feat: add issue card display options for toggles
tdgao Oct 20, 2026
48db112
small fixes
tdgao Oct 20, 2026
f3d07c9
polish
tdgao Oct 20, 2026
9de5519
feat: new disclosure cards layout in project review
tdgao Oct 20, 2026
dd7e1ae
feat: add review interaction UI custom themes
tdgao Oct 20, 2026
9ab4bda
feat: add import export keybinds
tdgao Oct 20, 2026
0d59fbb
fix: capitalize tags for issue message
tdgao Oct 20, 2026
462b658
fix: have any multiselects in project review allow 3 rows of tags
tdgao Oct 20, 2026
e47d4df
feat: view mode layout for disclosures
tdgao Oct 20, 2026
b4447b2
remove: all i18n messages in project-review
tdgao Oct 21, 2026
30e537f
Merge branch 'main' into coolbot/modview-updates
tdgao Oct 21, 2026
25de578
fix standards
tdgao Oct 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions apps/frontend/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ Nuxt 3 with SSR — pages are server-rendered and hydrated on the client. Uses `

Rule of thumb: if it doesn't depend on Nuxt-specific APIs or website-only features, it should be in `packages/ui`.

### Project Review Popout Windows
### Localization

Project review panels can be displayed in multiple browser documents while sharing the main window's Vue application and JavaScript context. Use an anchor, panel, or event target's `ownerDocument` for DOM queries and its `defaultView` for window behavior. Global `document` and `window` still identify the main window after a panel moves.
Any admin or internal pages should not be localized. Use plain English strings, ordinary interpolation and plural handling, and English date/number formatting in their routes, components, providers, and supporting code. This exception also applies during i18n passes. Preserve localization in shared components used elsewhere.

Use the review shortcut context's listeners (`shortcuts.listen` or `useReviewEventListener`) for review interactions that must work in both the workspace and popouts. Shared overlay and modal behavior follows the multiple-document guidance in `packages/ui/AGENTS.md`.
### Popout Windows

See `standards/frontend/POPOUT-WINDOWS.md` for DOM ownership, event listeners, and overlay behavior across browser documents.

## Data Fetching

Expand Down
28 changes: 9 additions & 19 deletions apps/frontend/src/components/project-review/description/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
/>
<div class="mt-0.5 flex shrink-0 justify-end gap-1">
<template v-if="editing">
<Button type="quiet" size="xs" :disabled="saving" @click="resetEditing">
{{ formatMessage(commonMessages.cancelButton) }}
</Button>
<Button type="quiet" size="xs" :disabled="saving" @click="resetEditing"> Cancel </Button>
<Button
type="colored"
color="brand"
Expand All @@ -27,27 +25,23 @@
:disabled="!valid"
@click="save"
>
{{ formatMessage(commonMessages.saveButton) }}
Save
</Button>
</template>
<EditButton
v-else-if="project && !isLoading && !error"
:section="formatMessage(messages.description)"
section="Description"
:disabled="saving"
@click="startEditing"
/>
</div>
</div>
<div class="min-h-0 flex-1">
<p v-if="!selection" class="m-0 text-secondary">
{{ formatMessage(messages.empty) }}
</p>
<p v-else-if="isLoading" role="status" class="m-0">
{{ formatMessage(messages.loading) }}
</p>
<p v-if="!selection" class="m-0 text-secondary">No project selected</p>
<p v-else-if="isLoading" role="status" class="m-0">Loading...</p>
<div v-else-if="error" role="alert">
<p class="m-0">{{ formatMessage(messages.loadError) }}</p>
<Button @click="refresh">{{ formatMessage(messages.retry) }}</Button>
<p class="m-0">Could not load project data</p>
<Button @click="refresh">Retry</Button>
</div>
<div v-else-if="editing" class="flex min-h-full flex-col gap-2">
<TemplateMarkdownEditor
Expand All @@ -67,28 +61,24 @@
class="text-sm leading-tight"
:description="project.description"
/>
<p v-else class="m-0 text-secondary">
{{ formatMessage(messages.emptyDescription) }}
</p>
<p v-else class="m-0 text-secondary">No description</p>
</div>
</div>
</template>

<script setup lang="ts">
import { moderationSettings } from '@modrinth/moderation'
import { Button, commonMessages, ProjectPageDescription, useVIntl } from '@modrinth/ui'
import { Button, ProjectPageDescription } from '@modrinth/ui'
import { useTemplateRef } from 'vue'

import TemplateMarkdownEditor from '~/components/project-review/message-thread/template-markdown-editor.vue'
import { useModerationSettings } from '~/composables/moderation'
import { injectProjectReviewPageContext } from '~/providers/project-review'

import { projectReviewMessages as messages } from '../messages'
import EditButton from '../project-info/edit/button.vue'
import { useProjectTextEdit } from '../project-info/edit/use-project-text-edit'
import ReviewPanel from '../review-panel/index.vue'

const { formatMessage } = useVIntl()
const settings = useModerationSettings()
const interactionScope = useTemplateRef<HTMLElement>('interactionScope')
const { selection, isLoading, error, refresh } = injectProjectReviewPageContext()
Expand Down
17 changes: 7 additions & 10 deletions apps/frontend/src/components/project-review/disclosures/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
<div class="shrink-0 p-2">
<ReviewPanel mode="inline" :target="{ kind: 'disclosures' }" hide-title />
</div>
<p v-if="isPending" role="status">{{ formatMessage(statusMessages.loading) }}</p>
<p v-if="isPending" role="status">Loading disclosures…</p>
<div v-else-if="isError" role="alert">
<p>{{ formatMessage(statusMessages.loadError) }}</p>
<Button @click="refetch()">{{ formatMessage(statusMessages.retry) }}</Button>
<p>Could not load disclosures.</p>
<Button @click="refetch()">Retry</Button>
</div>
<EmptyState
v-else-if="!canEditDisclosures"
type="no-documents"
:heading="formatMessage(editorMessages.uploadVersionFirstHeading)"
:description="formatMessage(commonMessages.uploadVersionsEmptyStateDescription)"
heading="Upload versions before adding disclosures"
description="Come back once you've uploaded your versions."
/>
<template v-else>
<div class="min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-2 pt-3">
Expand All @@ -25,7 +25,7 @@
</div>
<div class="z-10 mt-auto shrink-0">
<p v-if="saveError" role="alert" class="text-red">
{{ formatMessage(statusMessages.saveError) }}
Could not save all disclosure changes. Your edits have been kept. Try saving again.
</p>
<UnsavedChangesPopup
inline
Expand All @@ -43,18 +43,15 @@
</template>

<script setup lang="ts">
import { Button, commonMessages, EmptyState, UnsavedChangesPopup, useVIntl } from '@modrinth/ui'
import { Button, EmptyState, UnsavedChangesPopup } from '@modrinth/ui'

import DisclosureCards from '~/components/ui/project-settings/disclosures/DisclosureCards.vue'
import { disclosureStatusMessages as statusMessages } from '~/components/ui/project-settings/disclosures/messages'
import { injectProjectReviewPageContext } from '~/providers/project-review'

import ReviewPanel from '../review-panel/index.vue'

const { formatMessage } = useVIntl()
const { project, disclosures } = injectProjectReviewPageContext()
const {
messages: editorMessages,
savedSnapshot,
currentSnapshot,
saving,
Expand Down
Loading
Loading