From 99302b921fc9954583001e2d5c8442a946d2226c Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Mon, 2 Feb 2026 09:50:36 -0800 Subject: [PATCH 01/18] New project card --- .../src/components/RowDisplay.vue | 4 +- ...{ProjectCard.vue => LegacyProjectCard.vue} | 0 .../src/components/ui/ProjectCard.vue | 526 ---------------- .../ui/servers/ServerInstallation.vue | 18 +- apps/frontend/src/composables/featureFlags.ts | 3 +- apps/frontend/src/pages/collection/[id].vue | 72 ++- .../src/pages/discover/[type]/index.vue | 165 +++-- apps/frontend/src/pages/index.vue | 31 +- apps/frontend/src/pages/organization/[id].vue | 29 +- apps/frontend/src/pages/user/[id].vue | 43 +- packages/assets/styles/classes.scss | 2 +- packages/ui/src/components/base/Avatar.vue | 9 +- .../ui/src/components/base/ProjectCard.vue | 569 ------------------ .../ui/src/components/base/SmartClickable.vue | 14 +- packages/ui/src/components/base/TagItem.vue | 10 +- .../ui/src/components/base/TagTagItem.vue | 31 + packages/ui/src/components/base/index.ts | 2 +- .../src/components/project/NewProjectCard.vue | 85 --- .../src/components/project/ProjectHeader.vue | 17 +- .../project/ProjectSidebarDetails.vue | 80 +-- .../components/project/card/ProjectCard.vue | 312 ++++++++++ .../project/card/ProjectCardAuthor.vue | 29 + .../project/card/ProjectCardDate.vue | 35 ++ .../project/card/ProjectCardEnvironment.vue | 66 ++ .../project/card/ProjectCardStats.vue | 54 ++ .../project/card/ProjectCardTags.vue | 74 +++ .../project/card/ProjectCardTitle.vue | 22 + packages/ui/src/components/project/index.ts | 2 +- packages/ui/src/locales/en-US/index.json | 18 + .../src/stories/base/ProjectCard.stories.ts | 229 ++++--- packages/ui/src/utils/common-messages.ts | 24 + packages/ui/src/utils/search.ts | 11 +- packages/ui/src/utils/tag-messages.ts | 23 + 33 files changed, 1083 insertions(+), 1526 deletions(-) rename apps/app-frontend/src/components/ui/{ProjectCard.vue => LegacyProjectCard.vue} (100%) delete mode 100644 apps/frontend/src/components/ui/ProjectCard.vue delete mode 100644 packages/ui/src/components/base/ProjectCard.vue create mode 100644 packages/ui/src/components/base/TagTagItem.vue delete mode 100644 packages/ui/src/components/project/NewProjectCard.vue create mode 100644 packages/ui/src/components/project/card/ProjectCard.vue create mode 100644 packages/ui/src/components/project/card/ProjectCardAuthor.vue create mode 100644 packages/ui/src/components/project/card/ProjectCardDate.vue create mode 100644 packages/ui/src/components/project/card/ProjectCardEnvironment.vue create mode 100644 packages/ui/src/components/project/card/ProjectCardStats.vue create mode 100644 packages/ui/src/components/project/card/ProjectCardTags.vue create mode 100644 packages/ui/src/components/project/card/ProjectCardTitle.vue diff --git a/apps/app-frontend/src/components/RowDisplay.vue b/apps/app-frontend/src/components/RowDisplay.vue index 363f07441d..a8e8970aed 100644 --- a/apps/app-frontend/src/components/RowDisplay.vue +++ b/apps/app-frontend/src/components/RowDisplay.vue @@ -18,8 +18,8 @@ import { useRouter } from 'vue-router' import ContextMenu from '@/components/ui/ContextMenu.vue' import Instance from '@/components/ui/Instance.vue' +import LegacyProjectCard from '@/components/ui/LegacyProjectCard.vue' import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue' -import ProjectCard from '@/components/ui/ProjectCard.vue' import { trackEvent } from '@/helpers/analytics' import { get_by_profile_path } from '@/helpers/process.js' import { duplicate, kill, remove, run } from '@/helpers/profile.js' @@ -270,7 +270,7 @@ onUnmounted(() => { />
- -
- - - - - gallery image - -
- -

- {{ name }} -

-
-

- by - - {{ author }} - -

- -
-

- {{ description }} -

- - - -
-
-
-
-
-
- -
-
-
-
-
-
-
- - - - - diff --git a/apps/frontend/src/components/ui/servers/ServerInstallation.vue b/apps/frontend/src/components/ui/servers/ServerInstallation.vue index 88a7db3ffe..0168d4f203 100644 --- a/apps/frontend/src/components/ui/servers/ServerInstallation.vue +++ b/apps/frontend/src/components/ui/servers/ServerInstallation.vue @@ -77,11 +77,17 @@ - - +
@@ -159,7 +165,7 @@ - - diff --git a/packages/ui/src/components/base/SmartClickable.vue b/packages/ui/src/components/base/SmartClickable.vue index f0ae684672..2716ef7e01 100644 --- a/packages/ui/src/components/base/SmartClickable.vue +++ b/packages/ui/src/components/base/SmartClickable.vue @@ -39,22 +39,28 @@ defineOptions({ } // When clickable is being hovered or focus-visible, give contents an effect - &:has(> *:first-child:hover, > *:first-child:focus-visible) .smart-clickable__contents { + :first-child:hover + .smart-clickable__contents, + :first-child:focus-visible + .smart-clickable__contents { filter: var(--hover-filter-weak); // Utility classes for contents :deep(.smart-clickable\:underline-on-hover) { text-decoration: underline; } - - // Utility classes for contents :deep(.smart-clickable\:highlight-on-hover) { filter: brightness(var(--hover-brightness, 1.25)); } } + :first-child:focus-visible + .smart-clickable__contents { + // Utility classes for contents + :deep(.smart-clickable\:outline-on-focus) { + outline: 0.25rem solid #ea80ff; + } + } + // When clickable is being clicked, give contents an effect - &:has(> *:first-child:active) .smart-clickable__contents { + :first-child:active + .smart-clickable__contents { scale: 0.97; } } diff --git a/packages/ui/src/components/base/TagItem.vue b/packages/ui/src/components/base/TagItem.vue index 3c06549f3a..da33acde91 100644 --- a/packages/ui/src/components/base/TagItem.vue +++ b/packages/ui/src/components/base/TagItem.vue @@ -1,15 +1,12 @@ @@ -17,4 +14,7 @@ defineProps<{ action?: (event: MouseEvent) => void }>() + +const baseClass = + 'bg-[--_bg-color,var(--color-button-bg)] text-nowrap border-[--_bg-color,var(--surface-5)] border-[1px] border-solid px-2 py-1 leading-none rounded-full font-normal text-sm inline-flex items-center gap-1 text-[--_color,var(--color-secondary)] [&>svg]:shrink-0 [&>svg]:h-4 [&>svg]:w-4' diff --git a/packages/ui/src/components/base/TagTagItem.vue b/packages/ui/src/components/base/TagTagItem.vue new file mode 100644 index 0000000000..9a306a9977 --- /dev/null +++ b/packages/ui/src/components/base/TagTagItem.vue @@ -0,0 +1,31 @@ + + diff --git a/packages/ui/src/components/base/index.ts b/packages/ui/src/components/base/index.ts index 9494e461dc..11e3cd460a 100644 --- a/packages/ui/src/components/base/index.ts +++ b/packages/ui/src/components/base/index.ts @@ -49,7 +49,6 @@ export { default as PopoutMenu } from './PopoutMenu.vue' export { default as PreviewSelectButton } from './PreviewSelectButton.vue' export { default as ProgressBar } from './ProgressBar.vue' export { default as ProgressSpinner } from './ProgressSpinner.vue' -export { default as ProjectCard } from './ProjectCard.vue' export { default as RadialHeader } from './RadialHeader.vue' export { default as RadioButtons } from './RadioButtons.vue' export { default as ScrollablePanel } from './ScrollablePanel.vue' @@ -61,6 +60,7 @@ export { default as SmartClickable } from './SmartClickable.vue' export type { TableColumn } from './Table.vue' export { default as Table } from './Table.vue' export { default as TagItem } from './TagItem.vue' +export { default as TagTagItem } from './TagTagItem.vue' export { default as Timeline } from './Timeline.vue' export { default as Toggle } from './Toggle.vue' export { default as UnsavedChangesPopup } from './UnsavedChangesPopup.vue' diff --git a/packages/ui/src/components/project/NewProjectCard.vue b/packages/ui/src/components/project/NewProjectCard.vue deleted file mode 100644 index 7e8378bdd1..0000000000 --- a/packages/ui/src/components/project/NewProjectCard.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/packages/ui/src/components/project/ProjectHeader.vue b/packages/ui/src/components/project/ProjectHeader.vue index 7463028ba3..715529bb5e 100644 --- a/packages/ui/src/components/project/ProjectHeader.vue +++ b/packages/ui/src/components/project/ProjectHeader.vue @@ -15,7 +15,11 @@ From a670c54be7bb4aa614624555cd2931f7e125f56e Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:48:54 -0800 Subject: [PATCH 04/18] reduce tag count to 5 --- packages/ui/src/components/project/card/ProjectCard.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/components/project/card/ProjectCard.vue b/packages/ui/src/components/project/card/ProjectCard.vue index d63d502d7c..0b6b6cf52c 100644 --- a/packages/ui/src/components/project/card/ProjectCard.vue +++ b/packages/ui/src/components/project/card/ProjectCard.vue @@ -122,7 +122,7 @@ :extra-tags="extraTags" :exclude-loaders="excludeLoaders" :selected-tags="selectedTags" - :max-tags="!!$slots.actions ? 4 : 6" + :max-tags="!!$slots.actions ? 4 : 5" />
From f65d65f4461a94d867cb81db649134ff41118669 Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:53:05 -0800 Subject: [PATCH 05/18] improve envs --- apps/frontend/src/pages/discover/[type]/index.vue | 4 ++-- packages/ui/src/components/project/card/ProjectCard.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/pages/discover/[type]/index.vue b/apps/frontend/src/pages/discover/[type]/index.vue index cc69aa7860..53bf03e4c3 100644 --- a/apps/frontend/src/pages/discover/[type]/index.vue +++ b/apps/frontend/src/pages/discover/[type]/index.vue @@ -661,10 +661,10 @@ useSeoMeta({ :followers="result.follows" :banner="result.featured_gallery ?? undefined" :color="result.color ?? undefined" - :environment="{ + :environment="['mod', 'modpack'].includes(currentType) ? { clientSide: result.client_side, serverSide: result.server_side, - }" + }: undefined" :layout=" resultsDisplayMode === 'grid' || resultsDisplayMode === 'gallery' ? 'grid' : 'list' " diff --git a/packages/ui/src/components/project/card/ProjectCard.vue b/packages/ui/src/components/project/card/ProjectCard.vue index 0b6b6cf52c..d7f64afae2 100644 --- a/packages/ui/src/components/project/card/ProjectCard.vue +++ b/packages/ui/src/components/project/card/ProjectCard.vue @@ -122,7 +122,7 @@ :extra-tags="extraTags" :exclude-loaders="excludeLoaders" :selected-tags="selectedTags" - :max-tags="!!$slots.actions ? 4 : 5" + :max-tags="(!!$slots.actions ? 4 : 5) + (!!environment ? 0 : 1)" /> From 96d04d5d02a3f4bf90dfecab304173845106167e Mon Sep 17 00:00:00 2001 From: tdgao Date: Thu, 5 Feb 2026 10:26:43 -0700 Subject: [PATCH 06/18] fix: project card bottom row not growing --- packages/ui/src/components/project/card/ProjectCard.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/project/card/ProjectCard.vue b/packages/ui/src/components/project/card/ProjectCard.vue index d7f64afae2..4b461d3767 100644 --- a/packages/ui/src/components/project/card/ProjectCard.vue +++ b/packages/ui/src/components/project/card/ProjectCard.vue @@ -3,7 +3,7 @@ -
+
-
+
@@ -41,7 +41,7 @@
-
+
- +
Date: Fri, 6 Feb 2026 12:25:57 -0800 Subject: [PATCH 07/18] move actions in grid mode --- apps/frontend/src/pages/discover/[type]/index.vue | 12 ++++++++---- .../ui/src/components/project/card/ProjectCard.vue | 8 ++++---- packages/ui/src/utils/search.ts | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/frontend/src/pages/discover/[type]/index.vue b/apps/frontend/src/pages/discover/[type]/index.vue index 53bf03e4c3..ef94b656d9 100644 --- a/apps/frontend/src/pages/discover/[type]/index.vue +++ b/apps/frontend/src/pages/discover/[type]/index.vue @@ -661,10 +661,14 @@ useSeoMeta({ :followers="result.follows" :banner="result.featured_gallery ?? undefined" :color="result.color ?? undefined" - :environment="['mod', 'modpack'].includes(currentType) ? { - clientSide: result.client_side, - serverSide: result.server_side, - }: undefined" + :environment=" + ['mod', 'modpack'].includes(currentType) + ? { + clientSide: result.client_side, + serverSide: result.server_side, + } + : undefined + " :layout=" resultsDisplayMode === 'grid' || resultsDisplayMode === 'gallery' ? 'grid' : 'list' " diff --git a/packages/ui/src/components/project/card/ProjectCard.vue b/packages/ui/src/components/project/card/ProjectCard.vue index 4b461d3767..0bddd90ecd 100644 --- a/packages/ui/src/components/project/card/ProjectCard.vue +++ b/packages/ui/src/components/project/card/ProjectCard.vue @@ -26,7 +26,7 @@
-
+
@@ -35,12 +35,12 @@ {{ summary }}
-
- -
+
+ +
Date: Fri, 6 Feb 2026 13:16:38 -0800 Subject: [PATCH 08/18] focus changes + new project list component --- apps/frontend/src/assets/styles/global.scss | 8 - apps/frontend/src/components/ui/Chips.vue | 2 +- .../src/pages/discover/[type]/index.vue | 173 +++++++++--------- packages/assets/styles/accessibility.scss | 10 +- packages/assets/styles/classes.scss | 52 ------ packages/assets/styles/variables.scss | 2 + packages/ui/src/components/base/Chips.vue | 2 +- packages/ui/src/components/base/FileInput.vue | 2 +- .../ui/src/components/base/SmartClickable.vue | 2 +- .../components/project/ProjectCardList.vue | 28 +++ .../src/components/project/TagsOverflow.vue | 29 +++ .../components/project/card/ProjectCard.vue | 13 +- .../project/card/ProjectCardAuthor.vue | 2 +- .../project/card/ProjectCardTags.vue | 28 +-- .../project/card/ProjectCardTitle.vue | 2 +- packages/ui/src/components/project/index.ts | 2 + 16 files changed, 171 insertions(+), 186 deletions(-) create mode 100644 packages/ui/src/components/project/ProjectCardList.vue create mode 100644 packages/ui/src/components/project/TagsOverflow.vue diff --git a/apps/frontend/src/assets/styles/global.scss b/apps/frontend/src/assets/styles/global.scss index a01337a9a4..daa0523dd5 100644 --- a/apps/frontend/src/assets/styles/global.scss +++ b/apps/frontend/src/assets/styles/global.scss @@ -467,14 +467,6 @@ kbd { @import '~/assets/styles/utils.scss'; @import '~/assets/styles/components.scss'; -button:focus-visible, -a:focus-visible, -[tabindex='0']:focus-visible, -[type='button']:focus-visible { - outline: 0.25rem solid #ea80ff; - border-radius: 0.25rem; -} - // OMORPHIA FIXES .card { outline-offset: -2px; diff --git a/apps/frontend/src/components/ui/Chips.vue b/apps/frontend/src/components/ui/Chips.vue index a824028cfb..17905aa13c 100644 --- a/apps/frontend/src/components/ui/Chips.vue +++ b/apps/frontend/src/components/ui/Chips.vue @@ -87,7 +87,7 @@ export default { } &:focus-visible { - outline: 0.25rem solid #ea80ff; + outline: 0.25rem solid var(--color-focus-ring); border-radius: 0.25rem; } } diff --git a/apps/frontend/src/pages/discover/[type]/index.vue b/apps/frontend/src/pages/discover/[type]/index.vue index ef94b656d9..717aca4c11 100644 --- a/apps/frontend/src/pages/discover/[type]/index.vue +++ b/apps/frontend/src/pages/discover/[type]/index.vue @@ -26,6 +26,7 @@ import { injectNotificationManager, Pagination, ProjectCard, + ProjectCardList, SearchFilterControl, SearchSidebarFilter, type SortType, @@ -638,94 +639,94 @@ useSeoMeta({

No results found for your query!

-
-