From 8aa22b9bed38151e7eda1c5b66fade475b236ed5 Mon Sep 17 00:00:00 2001 From: Mr_chank <180248271+chank-op@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:39:05 +1000 Subject: [PATCH 01/19] refactor(i18n): use common messages for generic button labels (#7020) A few components defined their own "Cancel", "Close", "Clear" and "Success" descriptors when commonMessages already has them. Swapped them over and removed the old ones. Locale files come from intl:prune-local dropping the now-orphaned strings across every language. --- .../ui/modal/ModrinthAccountRequiredModal.vue | 15 +++++++++------ apps/app-frontend/src/locales/da-DK/index.json | 3 --- apps/app-frontend/src/locales/de-CH/index.json | 3 --- apps/app-frontend/src/locales/de-DE/index.json | 3 --- apps/app-frontend/src/locales/en-US/index.json | 3 --- apps/app-frontend/src/locales/es-419/index.json | 3 --- apps/app-frontend/src/locales/fr-FR/index.json | 3 --- apps/app-frontend/src/locales/hu-HU/index.json | 3 --- apps/app-frontend/src/locales/it-IT/index.json | 3 --- apps/app-frontend/src/locales/ja-JP/index.json | 3 --- apps/app-frontend/src/locales/ko-KR/index.json | 3 --- apps/app-frontend/src/locales/nl-NL/index.json | 3 --- apps/app-frontend/src/locales/pl-PL/index.json | 3 --- apps/app-frontend/src/locales/pt-BR/index.json | 3 --- apps/app-frontend/src/locales/ru-RU/index.json | 3 --- apps/app-frontend/src/locales/sv-SE/index.json | 3 --- apps/app-frontend/src/locales/tr-TR/index.json | 3 --- apps/app-frontend/src/locales/uk-UA/index.json | 3 --- apps/app-frontend/src/locales/zh-CN/index.json | 3 --- apps/app-frontend/src/locales/zh-TW/index.json | 3 --- .../ui/dashboard/CreatorTaxFormModal.vue | 6 +----- .../components/ui/moderation/ModpackScanModal.vue | 13 +++---------- apps/frontend/src/locales/de-CH/index.json | 9 --------- apps/frontend/src/locales/de-DE/index.json | 9 --------- apps/frontend/src/locales/en-US/index.json | 9 --------- apps/frontend/src/locales/es-419/index.json | 9 --------- apps/frontend/src/locales/fr-FR/index.json | 9 --------- apps/frontend/src/locales/hu-HU/index.json | 3 --- apps/frontend/src/locales/it-IT/index.json | 9 --------- apps/frontend/src/locales/ja-JP/index.json | 3 --- apps/frontend/src/locales/ko-KR/index.json | 9 --------- apps/frontend/src/locales/ms-MY/index.json | 6 ------ apps/frontend/src/locales/nl-NL/index.json | 9 --------- apps/frontend/src/locales/pl-PL/index.json | 9 --------- apps/frontend/src/locales/pt-BR/index.json | 9 --------- apps/frontend/src/locales/ru-RU/index.json | 9 --------- apps/frontend/src/locales/sv-SE/index.json | 6 ------ apps/frontend/src/locales/tr-TR/index.json | 6 ------ apps/frontend/src/locales/uk-UA/index.json | 9 --------- apps/frontend/src/locales/zh-CN/index.json | 9 --------- apps/frontend/src/locales/zh-TW/index.json | 9 --------- .../sharing/invite-players-modal/index.vue | 9 ++++----- .../invite-players-modal-invite-link-editor.vue | 9 +++------ .../components/editor/EditorFindReplace.vue | 9 +++------ packages/ui/src/locales/cs-CZ/index.json | 4 ---- packages/ui/src/locales/da-DK/index.json | 4 ---- packages/ui/src/locales/de-CH/index.json | 10 ---------- packages/ui/src/locales/de-DE/index.json | 10 ---------- packages/ui/src/locales/en-US/index.json | 9 --------- packages/ui/src/locales/es-419/index.json | 10 ---------- packages/ui/src/locales/es-ES/index.json | 3 --- packages/ui/src/locales/fil-PH/index.json | 4 ---- packages/ui/src/locales/fr-FR/index.json | 9 --------- packages/ui/src/locales/hu-HU/index.json | 9 --------- packages/ui/src/locales/id-ID/index.json | 4 ---- packages/ui/src/locales/it-IT/index.json | 9 --------- packages/ui/src/locales/ja-JP/index.json | 3 --- packages/ui/src/locales/ko-KR/index.json | 9 --------- packages/ui/src/locales/ms-MY/index.json | 4 ---- packages/ui/src/locales/nl-NL/index.json | 9 --------- packages/ui/src/locales/pl-PL/index.json | 9 --------- packages/ui/src/locales/pt-BR/index.json | 10 ---------- packages/ui/src/locales/pt-PT/index.json | 4 ---- packages/ui/src/locales/ro-RO/index.json | 3 --- packages/ui/src/locales/ru-RU/index.json | 9 --------- packages/ui/src/locales/sr-CS/index.json | 4 ---- packages/ui/src/locales/sv-SE/index.json | 10 ---------- packages/ui/src/locales/tr-TR/index.json | 3 --- packages/ui/src/locales/uk-UA/index.json | 9 --------- packages/ui/src/locales/vi-VN/index.json | 4 ---- packages/ui/src/locales/zh-CN/index.json | 10 ---------- packages/ui/src/locales/zh-TW/index.json | 10 ---------- 72 files changed, 23 insertions(+), 440 deletions(-) diff --git a/apps/app-frontend/src/components/ui/modal/ModrinthAccountRequiredModal.vue b/apps/app-frontend/src/components/ui/modal/ModrinthAccountRequiredModal.vue index 18b832278d..ad413f1ab8 100644 --- a/apps/app-frontend/src/components/ui/modal/ModrinthAccountRequiredModal.vue +++ b/apps/app-frontend/src/components/ui/modal/ModrinthAccountRequiredModal.vue @@ -73,7 +73,7 @@
- + + +
+ + diff --git a/packages/ui/src/layouts/shared/user-profile/layout.vue b/packages/ui/src/layouts/shared/user-profile/layout.vue index 608994520e..bd16975459 100644 --- a/packages/ui/src/layouts/shared/user-profile/layout.vue +++ b/packages/ui/src/layouts/shared/user-profile/layout.vue @@ -496,7 +496,7 @@ import { injectPageContext, injectTags, } from '#ui/providers' -import { commonMessages, getProjectTypeTitleMessage } from '#ui/utils' +import { commonMessages, getProjectTypeTitleMessage, sortProjectTypes } from '#ui/utils' import { blockedUsersQueryKey, injectUserProfile } from './providers' import { @@ -840,7 +840,7 @@ const projectTypes = computed(() => { const types = new Set(projects.value.map((project) => project.resolvedProjectType)) if (collections.value.length > 0) types.add('collection') types.delete('project') - return [...types] + return sortProjectTypes(types) }) const navLinks = computed(() => { @@ -851,15 +851,13 @@ const navLinks = computed(() => { label: formatMessage(commonMessages.allProjectType), href: profilePath, }, - ...projectTypes.value - .map((projectType) => ({ - label: - projectType === 'collection' - ? formatMessage(messages.collectionsLabel) - : formatMessage(getProjectTypeTitleMessage(projectType), { count: 2 }), - href: `${profilePath}/${projectType}s`, - })) - .sort((first, second) => first.label.localeCompare(second.label)), + ...projectTypes.value.map((projectType) => ({ + label: + projectType === 'collection' + ? formatMessage(messages.collectionsLabel) + : formatMessage(getProjectTypeTitleMessage(projectType), { count: 2 }), + href: `${profilePath}/${projectType}s`, + })), ] }) diff --git a/packages/ui/src/utils/index.ts b/packages/ui/src/utils/index.ts index 6aeb20c1a9..217dd867e4 100644 --- a/packages/ui/src/utils/index.ts +++ b/packages/ui/src/utils/index.ts @@ -6,6 +6,7 @@ export * from './file-extensions' export * from './game-modes' export * from './loaders' export * from './notices' +export * from './project-types' export * from './savable' export * from './search' export * from './server-content-installing' diff --git a/packages/ui/src/utils/project-types.ts b/packages/ui/src/utils/project-types.ts new file mode 100644 index 0000000000..447532156a --- /dev/null +++ b/packages/ui/src/utils/project-types.ts @@ -0,0 +1,31 @@ +export const PROJECT_TYPE_ORDER = [ + 'mod', + 'resourcepack', + 'datapack', + 'shader', + 'modpack', + 'plugin', + 'server', + 'collection', +] as const + +export type OrderedProjectType = (typeof PROJECT_TYPE_ORDER)[number] + +const PROJECT_TYPE_SORT_ALIASES: Record = { + minecraft_java_server: 'server', + shaderpack: 'shader', +} + +export function getProjectTypeSortIndex(type: string): number { + const normalized = PROJECT_TYPE_SORT_ALIASES[type] ?? type + const index = (PROJECT_TYPE_ORDER as readonly string[]).indexOf(normalized) + return index === -1 ? PROJECT_TYPE_ORDER.length : index +} + +export function compareProjectTypes(a: string, b: string): number { + return getProjectTypeSortIndex(a) - getProjectTypeSortIndex(b) +} + +export function sortProjectTypes(types: Iterable): T[] { + return [...types].sort(compareProjectTypes) +} diff --git a/packages/ui/src/utils/search.ts b/packages/ui/src/utils/search.ts index 5a189fa92e..8e06f062ce 100644 --- a/packages/ui/src/utils/search.ts +++ b/packages/ui/src/utils/search.ts @@ -93,10 +93,10 @@ export type ProjectType = const ALL_PROJECT_TYPES: ProjectType[] = [ 'mod', - 'modpack', 'resourcepack', - 'shader', 'datapack', + 'shader', + 'modpack', 'plugin', 'server', ] From bca5303ae34eef7080aa2bd55481fe000172aaa4 Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:19:56 -0700 Subject: [PATCH 14/19] improve popout animations (#7040) --- packages/ui/src/components/base/Combobox.vue | 8 +- .../src/components/base/DropdownFilterBar.vue | 378 +++++++++--------- .../ui/src/components/base/MultiSelect.vue | 7 +- .../base/buttons/TeleportOverflowMenu.vue | 24 +- .../base/buttons/TeleportPopoutMenu.vue | 9 +- .../files-tab/components/FileContextMenu.vue | 11 +- packages/ui/src/styles/tailwind-utilities.css | 23 ++ 7 files changed, 230 insertions(+), 230 deletions(-) diff --git a/packages/ui/src/components/base/Combobox.vue b/packages/ui/src/components/base/Combobox.vue index 4a0c6bcd0a..750238a9e1 100644 --- a/packages/ui/src/components/base/Combobox.vue +++ b/packages/ui/src/components/base/Combobox.vue @@ -97,12 +97,7 @@ - +
- +
-
+
- -
-
- - -
- -
- -
- -
- {{ activeCategorySelectionLabel }} - -
-
+
- -
+
@@ -726,12 +728,6 @@ const isMobileActiveSubmenu = computed( () => isMobileAddMenuLayout.value && activeCategory.value !== undefined && hasSubmenuPosition.value, ) -const addMenuTransitionEnterActiveClass = computed(() => - isMobileAddMenuLayout.value ? 'transition-none duration-0' : 'transition-opacity duration-150', -) -const addMenuTransitionEnterFromClass = computed(() => - isMobileAddMenuLayout.value ? 'opacity-100' : 'opacity-0', -) const addMenuTriggerElement = computed(() => addMenuTrigger.value?.element ?? null) const addMenuOutsideClickTarget = computed(() => menuContainer.value ?? submenu.value) const addMenuOutsideClickIgnore = computed(() => [addMenuTriggerElement, menuContainer, submenu]) diff --git a/packages/ui/src/components/base/MultiSelect.vue b/packages/ui/src/components/base/MultiSelect.vue index f765bd90e6..7d17408333 100644 --- a/packages/ui/src/components/base/MultiSelect.vue +++ b/packages/ui/src/components/base/MultiSelect.vue @@ -108,12 +108,7 @@ - +
{ + switch (resolvedSide.value) { + case 'top': + return 'bottom center' + case 'left': + return 'right center' + case 'right': + return 'left center' + default: + return 'top center' + } +}) + const menuItemClasses = 'overflow-menu-item flex min-h-10 w-full items-center gap-2 rounded-[10px] border-0 bg-transparent px-3 py-2 text-left text-base font-semibold leading-5 text-contrast no-underline ' + 'cursor-pointer whitespace-nowrap hover:bg-surface-4 focus-visible:bg-surface-4 focus-visible:outline-none ' + @@ -294,20 +307,13 @@ defineExpose({ open: openMenu, close: closeMenu }) - +