From fe2a6912ce8518bc1665fcb4039904c8682a27ec Mon Sep 17 00:00:00 2001 From: Padreug Date: Sun, 14 Jun 2026 16:43:27 +0200 Subject: [PATCH] feat(layout): shared tiled-panel page pattern across secondary pages Calibrate all non-home pages to one layout language matching the Wix design: the celtic-knot tile becomes the page background (shown in the gutters), content floats in a single near-black rounded panel, and cards inside are plain cards. - Add PageShell (floating bg-panel card), PageSection (plain content block), and PageHero (centered hero; left grid w/ aside image) under src/components/layout/. - Tile the body background and add a --panel token; the home page's fixed landscape sits above this layer, so home is unchanged. - Re-skin the 11 secondary views through these primitives and unify headings to the font-display uppercase idiom. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/components/layout/PageHero.vue | 58 ++++++++++++ src/components/layout/PageSection.vue | 33 +++++++ src/components/layout/PageShell.vue | 14 +++ src/style.css | 10 ++ src/views/AccommodationView.vue | 111 +++++++++++----------- src/views/ConceptView.vue | 91 +++++++++--------- src/views/EventsView.vue | 48 +++++----- src/views/GalleryView.vue | 29 +++--- src/views/LongStaysView.vue | 41 ++++---- src/views/MarketplaceView.vue | 41 ++++---- src/views/NotFoundView.vue | 2 +- src/views/OpportunitiesView.vue | 85 ++++++++--------- src/views/ReservationsView.vue | 63 ++++++------- src/views/SymposiumView.vue | 130 ++++++++++++-------------- src/views/VisionValuesView.vue | 111 ++++++++++------------ 15 files changed, 459 insertions(+), 408 deletions(-) create mode 100644 src/components/layout/PageHero.vue create mode 100644 src/components/layout/PageSection.vue create mode 100644 src/components/layout/PageShell.vue diff --git a/src/components/layout/PageHero.vue b/src/components/layout/PageHero.vue new file mode 100644 index 0000000..0e68417 --- /dev/null +++ b/src/components/layout/PageHero.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/layout/PageSection.vue b/src/components/layout/PageSection.vue new file mode 100644 index 0000000..c96b824 --- /dev/null +++ b/src/components/layout/PageSection.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/layout/PageShell.vue b/src/components/layout/PageShell.vue new file mode 100644 index 0000000..fb804d1 --- /dev/null +++ b/src/components/layout/PageShell.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/style.css b/src/style.css index 5b12c48..36e5ccf 100644 --- a/src/style.css +++ b/src/style.css @@ -25,6 +25,8 @@ --border: hsl(151 50% 18%); --input: hsl(151 50% 18%); --ring: hsl(43 64% 50%); + /* Near-black green of the content panel that floats on the tiled bg. */ + --panel: hsl(151 55% 4%); --radius: 0.5rem; } @@ -48,6 +50,7 @@ --border: hsl(151 50% 15%); --input: hsl(151 50% 15%); --ring: hsl(43 64% 52%); + --panel: hsl(151 55% 3%); } @theme inline { @@ -70,6 +73,7 @@ --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); + --color-panel: var(--panel); --radius-lg: var(--radius); --radius-md: calc(var(--radius) - 2px); --radius-sm: calc(var(--radius) - 4px); @@ -85,6 +89,12 @@ } body { @apply bg-background text-foreground; + /* Celtic-knot tile is the page background; it shows in the gutters + around the floating content panel (see PageShell). The home page's + fixed landscape image sits above this layer, so home is unaffected. */ + background-image: url('./assets/section-tile.webp'); + background-repeat: repeat; + background-position: center top; font-family: var(--font-sans); font-weight: 300; } diff --git a/src/views/AccommodationView.vue b/src/views/AccommodationView.vue index a84aad4..a5a37d9 100644 --- a/src/views/AccommodationView.vue +++ b/src/views/AccommodationView.vue @@ -4,6 +4,9 @@ import { RouterLink } from 'vue-router' import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' +import PageHero from '@/components/layout/PageHero.vue' +import PageSection from '@/components/layout/PageSection.vue' +import PageShell from '@/components/layout/PageShell.vue' const { t, tm, rt } = useI18n() @@ -59,29 +62,21 @@ const exteriorItems = tm('accommodation.exterior.items') as string[] diff --git a/src/views/ConceptView.vue b/src/views/ConceptView.vue index d099c19..761a563 100644 --- a/src/views/ConceptView.vue +++ b/src/views/ConceptView.vue @@ -2,6 +2,9 @@ import { useI18n } from 'vue-i18n' import { RouterLink } from 'vue-router' import { Card } from '@/components/ui/card' +import PageHero from '@/components/layout/PageHero.vue' +import PageSection from '@/components/layout/PageSection.vue' +import PageShell from '@/components/layout/PageShell.vue' const { t } = useI18n() @@ -13,35 +16,27 @@ const pillars = [ diff --git a/src/views/EventsView.vue b/src/views/EventsView.vue index b060aac..80199d0 100644 --- a/src/views/EventsView.vue +++ b/src/views/EventsView.vue @@ -4,6 +4,9 @@ import { RouterLink } from 'vue-router' import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import PageHero from '@/components/layout/PageHero.vue' +import PageSection from '@/components/layout/PageSection.vue' +import PageShell from '@/components/layout/PageShell.vue' const { t } = useI18n() @@ -37,30 +40,23 @@ const events = [ diff --git a/src/views/GalleryView.vue b/src/views/GalleryView.vue index ed895a4..a17f49a 100644 --- a/src/views/GalleryView.vue +++ b/src/views/GalleryView.vue @@ -1,6 +1,9 @@ diff --git a/src/views/LongStaysView.vue b/src/views/LongStaysView.vue index 355a7f0..7241b2d 100644 --- a/src/views/LongStaysView.vue +++ b/src/views/LongStaysView.vue @@ -3,6 +3,9 @@ import { useI18n } from 'vue-i18n' import { RouterLink } from 'vue-router' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' +import PageHero from '@/components/layout/PageHero.vue' +import PageSection from '@/components/layout/PageSection.vue' +import PageShell from '@/components/layout/PageShell.vue' const { t } = useI18n() @@ -10,30 +13,22 @@ const paths = ['exchange', 'rental', 'partial', 'funded'] as const diff --git a/src/views/MarketplaceView.vue b/src/views/MarketplaceView.vue index cb79bc2..c758ae9 100644 --- a/src/views/MarketplaceView.vue +++ b/src/views/MarketplaceView.vue @@ -2,6 +2,9 @@ import { useI18n } from 'vue-i18n' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' +import PageHero from '@/components/layout/PageHero.vue' +import PageSection from '@/components/layout/PageSection.vue' +import PageShell from '@/components/layout/PageShell.vue' const { t } = useI18n() @@ -9,28 +12,20 @@ const categories = ['fresh', 'pantry', 'craft'] as const diff --git a/src/views/NotFoundView.vue b/src/views/NotFoundView.vue index 9f5032e..0366658 100644 --- a/src/views/NotFoundView.vue +++ b/src/views/NotFoundView.vue @@ -4,7 +4,7 @@ import { RouterLink } from 'vue-router'