From b005c1f5224d9f1b187a2dfaf4b11c2209b34aec Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:18:59 -0800 Subject: [PATCH] New project cards (#5298) * New project card * no shadow on icons * Remove updated label * reduce tag count to 5 * improve envs * fix: project card bottom row not growing * move actions in grid mode * focus changes + new project list component * Allow more tags in grid mode, deprioritize non-loader tags * fix prod deploy robots.txt * remove unused id * App cards * prepr * publish date + fix router links * fix author hover underline in firefox * perf: preload on search item hover * remove unused filter * remove option for old grid view --------- Co-authored-by: tdgao Co-authored-by: Calum H. (IMB11) --- .../src/components/RowDisplay.vue | 4 +- ...{ProjectCard.vue => LegacyProjectCard.vue} | 0 .../src/components/ui/SearchCard.vue | 164 ++--- apps/app-frontend/src/pages/Browse.vue | 7 +- apps/frontend/nuxt.config.ts | 2 +- apps/frontend/src/assets/styles/global.scss | 8 - apps/frontend/src/components/ui/Chips.vue | 2 +- .../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 | 233 ++++--- apps/frontend/src/pages/index.vue | 33 +- apps/frontend/src/pages/organization/[id].vue | 29 +- apps/frontend/src/pages/settings/index.vue | 39 +- apps/frontend/src/pages/user/[id].vue | 43 +- packages/assets/styles/accessibility.scss | 10 +- packages/assets/styles/classes.scss | 54 +- packages/assets/styles/variables.scss | 2 + packages/ui/src/components/base/AutoLink.vue | 19 +- packages/ui/src/components/base/Avatar.vue | 9 +- packages/ui/src/components/base/Chips.vue | 2 +- packages/ui/src/components/base/FileInput.vue | 2 +- .../ui/src/components/base/ProjectCard.vue | 569 ------------------ .../ui/src/components/base/SmartClickable.vue | 16 +- 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 --- .../components/project/ProjectCardList.vue | 28 + .../src/components/project/ProjectHeader.vue | 17 +- .../project/ProjectSidebarDetails.vue | 80 +-- .../src/components/project/TagsOverflow.vue | 29 + .../components/project/card/ProjectCard.vue | 355 +++++++++++ .../project/card/ProjectCardAuthor.vue | 39 ++ .../project/card/ProjectCardDate.vue | 47 ++ .../project/card/ProjectCardEnvironment.vue | 66 ++ .../project/card/ProjectCardStats.vue | 54 ++ .../project/card/ProjectCardTags.vue | 60 ++ .../project/card/ProjectCardTitle.vue | 23 + packages/ui/src/components/project/index.ts | 4 +- 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 | 12 +- packages/ui/src/utils/tag-messages.ts | 23 + 46 files changed, 1343 insertions(+), 1759 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/ProjectCardList.vue create mode 100644 packages/ui/src/components/project/TagsOverflow.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 363f07441..a8e8970ae 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(() => { />
- -
-
- -
-
-
- - {{ project.title }} - - by {{ project.author }} -
-
- {{ project.description }} -
-
- -
+ +
- - +
@@ -159,7 +165,7 @@ - - diff --git a/packages/ui/src/components/base/SmartClickable.vue b/packages/ui/src/components/base/SmartClickable.vue index f0ae68467..5ed15d8de 100644 --- a/packages/ui/src/components/base/SmartClickable.vue +++ b/packages/ui/src/components/base/SmartClickable.vue @@ -39,22 +39,26 @@ defineOptions({ } // When clickable is being hovered or focus-visible, give contents an effect - &:has(> *:first-child:hover, > *:first-child:focus-visible) .smart-clickable__contents { - filter: var(--hover-filter-weak); - + :first-child:hover + .smart-clickable__contents, + :first-child:focus-visible + .smart-clickable__contents { // 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 var(--color-focus-ring); + } + } + // 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 3c06549f3..da33acde9 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 000000000..9a306a997 --- /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 9494e461d..11e3cd460 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 7e8378bdd..000000000 --- a/packages/ui/src/components/project/NewProjectCard.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/packages/ui/src/components/project/ProjectCardList.vue b/packages/ui/src/components/project/ProjectCardList.vue new file mode 100644 index 000000000..934162e3f --- /dev/null +++ b/packages/ui/src/components/project/ProjectCardList.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/ui/src/components/project/ProjectHeader.vue b/packages/ui/src/components/project/ProjectHeader.vue index 7463028ba..715529bb5 100644 --- a/packages/ui/src/components/project/ProjectHeader.vue +++ b/packages/ui/src/components/project/ProjectHeader.vue @@ -15,7 +15,11 @@