From 4cb0fa14a22849455e038624dc70b24b8c40949e Mon Sep 17 00:00:00 2001 From: Padreug Date: Tue, 9 Jun 2026 17:01:51 +0200 Subject: [PATCH 1/7] feat(ui): install shadcn Card; sweep card patterns site-wide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the shadcn-vue Card primitive (Card / CardHeader / CardTitle / CardDescription / CardContent / CardFooter) at src/components/ui/card. Replace ~20 hand-rolled "rounded-lg border border-border bg-card …" patterns across nine views with : - ConceptView (slow-farming pillars) - VisionValuesView (philosophy + pillars + team) - GalleryView (image figure cards) - EventsView (program cards) - SymposiumView (included items + apply steps) - LongStaysView (path cards) - OpportunitiesView (group cards + apply explainers) - AccommodationView (rooms + cabins + exterior items) - ReservationsView (kind cards + contact card) - MarketplaceView (category cards) - HomeView (featured events) For image-bearing cards (events / rooms), use Card + CardContent so the image stays flush at the top of the card and the inner padding lives on the content slot. For clickable cards, the RouterLink wraps the Card so the whole card is the link target. Variants where the card sits on a tinted section (philosophy items on bg-card section, cabins on bg-card section) override Card's default bg-card with bg-background via the class prop. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/ui/card/Card.vue | 21 ++++ src/components/ui/card/CardContent.vue | 14 +++ src/components/ui/card/CardDescription.vue | 14 +++ src/components/ui/card/CardFooter.vue | 14 +++ src/components/ui/card/CardHeader.vue | 14 +++ src/components/ui/card/CardTitle.vue | 18 ++++ src/components/ui/card/index.ts | 6 ++ src/views/AccommodationView.vue | 119 ++++++++++----------- src/views/ConceptView.vue | 9 +- src/views/EventsView.vue | 45 ++++---- src/views/GalleryView.vue | 35 +++--- src/views/HomeView.vue | 39 +++---- src/views/LongStaysView.vue | 9 +- src/views/MarketplaceView.vue | 9 +- src/views/OpportunitiesView.vue | 29 +++-- src/views/ReservationsView.vue | 13 +-- src/views/SymposiumView.vue | 29 +++-- src/views/VisionValuesView.vue | 25 ++--- 18 files changed, 265 insertions(+), 197 deletions(-) create mode 100644 src/components/ui/card/Card.vue create mode 100644 src/components/ui/card/CardContent.vue create mode 100644 src/components/ui/card/CardDescription.vue create mode 100644 src/components/ui/card/CardFooter.vue create mode 100644 src/components/ui/card/CardHeader.vue create mode 100644 src/components/ui/card/CardTitle.vue create mode 100644 src/components/ui/card/index.ts diff --git a/src/components/ui/card/Card.vue b/src/components/ui/card/Card.vue new file mode 100644 index 0000000..db8c07a --- /dev/null +++ b/src/components/ui/card/Card.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/ui/card/CardContent.vue b/src/components/ui/card/CardContent.vue new file mode 100644 index 0000000..4c4dfc7 --- /dev/null +++ b/src/components/ui/card/CardContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/card/CardDescription.vue b/src/components/ui/card/CardDescription.vue new file mode 100644 index 0000000..02bddba --- /dev/null +++ b/src/components/ui/card/CardDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/card/CardFooter.vue b/src/components/ui/card/CardFooter.vue new file mode 100644 index 0000000..fad3928 --- /dev/null +++ b/src/components/ui/card/CardFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/card/CardHeader.vue b/src/components/ui/card/CardHeader.vue new file mode 100644 index 0000000..119700c --- /dev/null +++ b/src/components/ui/card/CardHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/card/CardTitle.vue b/src/components/ui/card/CardTitle.vue new file mode 100644 index 0000000..d0c0ea7 --- /dev/null +++ b/src/components/ui/card/CardTitle.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/ui/card/index.ts b/src/components/ui/card/index.ts new file mode 100644 index 0000000..e5c7cb2 --- /dev/null +++ b/src/components/ui/card/index.ts @@ -0,0 +1,6 @@ +export { default as Card } from "./Card.vue" +export { default as CardContent } from "./CardContent.vue" +export { default as CardDescription } from "./CardDescription.vue" +export { default as CardFooter } from "./CardFooter.vue" +export { default as CardHeader } from "./CardHeader.vue" +export { default as CardTitle } from "./CardTitle.vue" diff --git a/src/views/AccommodationView.vue b/src/views/AccommodationView.vue index 73f1b8f..f0bab13 100644 --- a/src/views/AccommodationView.vue +++ b/src/views/AccommodationView.vue @@ -2,6 +2,7 @@ import { useI18n } from 'vue-i18n' import { RouterLink } from 'vue-router' import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' const { t, tm, rt } = useI18n() @@ -82,41 +83,39 @@ const exteriorItems = tm('accommodation.exterior.items') as string[]

{{ t('accommodation.rooms.subtitle') }}

    -
  • - -
    -
    -

    - {{ t(`accommodation.rooms.${room.key}.name`) }} -

    - - {{ - room.open - ? t('accommodation.statusOpen') - : t('accommodation.statusComingSoon') - }} - -
    -

    - {{ t(`accommodation.rooms.${room.key}.summary`) }} -

    -
    +
  • + + + +
    +

    + {{ t(`accommodation.rooms.${room.key}.name`) }} +

    + + {{ + room.open + ? t('accommodation.statusOpen') + : t('accommodation.statusComingSoon') + }} + +
    +

    + {{ t(`accommodation.rooms.${room.key}.summary`) }} +

    +
    +
@@ -131,27 +130,25 @@ const exteriorItems = tm('accommodation.exterior.items') as string[]

{{ t('accommodation.cabins.subtitle') }}

    -
  • - -
    -

    - {{ t(`accommodation.cabins.${cabin.key}`) }} -

    - - {{ t('accommodation.statusComingSoon') }} - -
    +
  • + + +
    +

    + {{ t(`accommodation.cabins.${cabin.key}`) }} +

    + + {{ t('accommodation.statusComingSoon') }} + +
    +
@@ -166,12 +163,10 @@ const exteriorItems = tm('accommodation.exterior.items') as string[]

{{ t('accommodation.exterior.subtitle') }}

    -
  • - {{ rt(item) }} +
  • + + {{ rt(item) }} +
diff --git a/src/views/ConceptView.vue b/src/views/ConceptView.vue index 50d04d6..d099c19 100644 --- a/src/views/ConceptView.vue +++ b/src/views/ConceptView.vue @@ -1,6 +1,7 @@ + + diff --git a/src/components/ui/badge/index.ts b/src/components/ui/badge/index.ts new file mode 100644 index 0000000..98a768d --- /dev/null +++ b/src/components/ui/badge/index.ts @@ -0,0 +1,26 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export { default as Badge } from "./Badge.vue" + +export const badgeVariants = cva( + "inline-flex gap-1 items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +) + +export type BadgeVariants = VariantProps diff --git a/src/views/AccommodationView.vue b/src/views/AccommodationView.vue index f0bab13..a84aad4 100644 --- a/src/views/AccommodationView.vue +++ b/src/views/AccommodationView.vue @@ -3,6 +3,7 @@ import { useI18n } from 'vue-i18n' import { RouterLink } from 'vue-router' import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' +import { Badge } from '@/components/ui/badge' const { t, tm, rt } = useI18n() @@ -96,20 +97,16 @@ const exteriorItems = tm('accommodation.exterior.items') as string[]

{{ t(`accommodation.rooms.${room.key}.name`) }}

- {{ room.open ? t('accommodation.statusOpen') : t('accommodation.statusComingSoon') }} - +

{{ t(`accommodation.rooms.${room.key}.summary`) }} @@ -142,11 +139,12 @@ const exteriorItems = tm('accommodation.exterior.items') as string[]

{{ t(`accommodation.cabins.${cabin.key}`) }}

- {{ t('accommodation.statusComingSoon') }} - +
From 262fb039a858c0c7d9f618cb97c71bf42f51e4ce Mon Sep 17 00:00:00 2001 From: Padreug Date: Tue, 9 Jun 2026 23:16:27 +0200 Subject: [PATCH 3/7] feat(header): shadcn NavigationMenu replaces hand-rolled dropdowns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Install the shadcn-vue NavigationMenu component family at src/components/ui/navigation-menu (NavigationMenu / NavigationMenuList / NavigationMenuItem / NavigationMenuTrigger / NavigationMenuContent / NavigationMenuLink / NavigationMenuIndicator / NavigationMenuViewport + navigationMenuTriggerStyle cva). Files came in via the registry JSON (www.shadcn-vue.com/r/styles/default/navigation-menu.json) because the CLI's corepack pnpm shim conflicts with our nix-managed pnpm — handle that more cleanly later. Adds @vueuse/core as a runtime dependency (reactiveOmit / useForwardProps inside the navigation-menu primitives). Two upstream fixes applied: 1. NavigationMenuTrigger imports ChevronDown from "@lucide/vue", not the deprecated "lucide-vue-next" the registry ships by default. 2. NavigationMenuViewport's height/width CSS variable references use Tailwind v3 syntax — h-[--reka-navigation-menu-viewport-height] — which renders as a literal string under Tailwind v4, collapsing the viewport to 2px. Wrap them in var() so v4 resolves them correctly: h-[var(--reka-navigation-menu-viewport-height)]. SiteHeader desktop nav: drop the custom openGroup ref, the document-level click/keydown listeners and the v-show toggle in favour of NavigationMenuTrigger + NavigationMenuContent for the four group dropdowns (Concept / What's On / Collaborate / Reservations), plus a flat Marketplace link styled with navigationMenuTriggerStyle. Hover/focus/open states all use bg-muted + text-primary to preserve the green-bg/gold-text feel from the hand-rolled nav. Mobile menu stays hand-rolled for this commit; Sheet refactor lands in a follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 1 + pnpm-lock.yaml | 3 + src/components/SiteHeader.vue | 117 ++++++++---------- .../ui/navigation-menu/NavigationMenu.vue | 29 +++++ .../navigation-menu/NavigationMenuContent.vue | 30 +++++ .../NavigationMenuIndicator.vue | 22 ++++ .../ui/navigation-menu/NavigationMenuItem.vue | 12 ++ .../ui/navigation-menu/NavigationMenuLink.vue | 18 +++ .../ui/navigation-menu/NavigationMenuList.vue | 27 ++++ .../navigation-menu/NavigationMenuTrigger.vue | 31 +++++ .../NavigationMenuViewport.vue | 30 +++++ src/components/ui/navigation-menu/index.ts | 14 +++ 12 files changed, 272 insertions(+), 62 deletions(-) create mode 100644 src/components/ui/navigation-menu/NavigationMenu.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuContent.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuIndicator.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuItem.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuLink.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuList.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuTrigger.vue create mode 100644 src/components/ui/navigation-menu/NavigationMenuViewport.vue create mode 100644 src/components/ui/navigation-menu/index.ts diff --git a/package.json b/package.json index 482316c..d306d8e 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@lucide/vue": "^1.16.0", "@vee-validate/zod": "^4.15.1", + "@vueuse/core": "^14.3.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "pinia": "^3.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a409bb..d9abe51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@vee-validate/zod': specifier: ^4.15.1 version: 4.15.1(vue@3.5.34(typescript@6.0.3))(zod@3.25.76) + '@vueuse/core': + specifier: ^14.3.0 + version: 14.3.0(vue@3.5.34(typescript@6.0.3)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 diff --git a/src/components/SiteHeader.vue b/src/components/SiteHeader.vue index 285caf1..8f7600d 100644 --- a/src/components/SiteHeader.vue +++ b/src/components/SiteHeader.vue @@ -1,15 +1,23 @@