feat(website): add Nuxt 4 marketing landing page
New standalone apps/website (Nuxt 4) serving the public marketing site at dezky.local / www.dezky.local. The customer portal moves off the root domain to app.dezky.local only. Landing page ported from the Dezky design handoff: light theme, Danish default, hero variant A, with a working da/en toggle. Self-contained colour system threaded through components (utils/landingTokens.ts), full bilingual copy (utils/landingCopy.ts), and shared state (composables/useLanding.ts). Sections live under components/landing/* with the Node logo under components/brand/*. Wired into docker-compose (website service, volume, Traefik labels, network aliases) and bootstrap.sh (hosts list + service URLs).
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
// Dezky landing — brand palette, locked logo geometry, and theme helper.
|
||||
// Ported from the Claude Design handoff (landing-sections.jsx). The marketing
|
||||
// site is self-contained colour-wise: it does NOT consume the app's tokens.css
|
||||
// dark/light variables — it threads a `theme` object through components exactly
|
||||
// like the prototype did, so the handoff stays pixel-faithful.
|
||||
|
||||
export const C = {
|
||||
carbon: '#0A0A0A',
|
||||
signal: '#D4FF3A',
|
||||
bone: '#F4F3EE',
|
||||
slate: '#3D3D38',
|
||||
fog: '#E6E4DC',
|
||||
paper: '#FAFAF7',
|
||||
ok: '#1F8A5B',
|
||||
warn: '#E89A1F',
|
||||
bad: '#E23030',
|
||||
} as const
|
||||
|
||||
// Locked Node-mark geometry — the values the user dialled in via Tweaks and
|
||||
// then froze (chat1). Every NodeMark usage in the design passed exactly these.
|
||||
export const LOCKED = {
|
||||
bowlR: 14,
|
||||
stemW: 7,
|
||||
contR: 22,
|
||||
dStyle: 'donut',
|
||||
dotPos: 'corner',
|
||||
dotR: 4,
|
||||
} as const
|
||||
|
||||
export interface DezkyTheme {
|
||||
bg: string
|
||||
bgAlt: string
|
||||
surface: string
|
||||
surfaceAlt: string
|
||||
border: string
|
||||
borderStrong: string
|
||||
fg: string
|
||||
fgMuted: string
|
||||
fgDim: string
|
||||
invert: string
|
||||
invertFg: string
|
||||
signal: string
|
||||
}
|
||||
|
||||
export function makeTheme(dark: boolean): DezkyTheme {
|
||||
return dark
|
||||
? {
|
||||
bg: '#0A0A0A',
|
||||
bgAlt: '#121211',
|
||||
surface: '#171715',
|
||||
surfaceAlt: '#1F1F1C',
|
||||
border: 'rgba(255,255,255,0.08)',
|
||||
borderStrong: 'rgba(255,255,255,0.18)',
|
||||
fg: '#F4F3EE',
|
||||
fgMuted: 'rgba(244,243,238,0.62)',
|
||||
fgDim: 'rgba(244,243,238,0.42)',
|
||||
invert: '#F4F3EE',
|
||||
invertFg: '#0A0A0A',
|
||||
signal: C.signal,
|
||||
}
|
||||
: {
|
||||
bg: C.paper,
|
||||
bgAlt: C.bone,
|
||||
surface: '#FFFFFF',
|
||||
surfaceAlt: C.bone,
|
||||
border: C.fog,
|
||||
borderStrong: 'rgba(10,10,10,0.14)',
|
||||
fg: C.carbon,
|
||||
fgMuted: 'rgba(10,10,10,0.62)',
|
||||
fgDim: 'rgba(10,10,10,0.42)',
|
||||
invert: C.carbon,
|
||||
invertFg: C.bone,
|
||||
signal: C.signal,
|
||||
}
|
||||
}
|
||||
|
||||
// The destination the nav/login CTA points at. Production is app.dezky.com;
|
||||
// locally the portal runs at app.dezky.local.
|
||||
export const APP_URL = 'https://app.dezky.local'
|
||||
Reference in New Issue
Block a user