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:
Ronni Baslund
2026-06-05 10:58:25 +02:00
parent 47eb9502f8
commit c9911cc262
35 changed files with 8760 additions and 1 deletions
+53
View File
@@ -0,0 +1,53 @@
// Nuxt 4 configuration for the Dezky public marketing site (dezky.com).
//
// Unlike apps/portal and apps/operator this surface is fully public — no
// OIDC, no sessions, no platform-api coupling. It can be statically
// generated (`pnpm generate`) and served from a CDN/edge independently of
// the Docker app stack. Locally it runs behind Traefik at dezky.local /
// www.dezky.local with the same mkcert TLS as the rest of the platform.
export default defineNuxtConfig({
compatibilityDate: '2026-01-01',
devtools: { enabled: true },
css: ['~/assets/styles/tokens.css', '~/assets/styles/base.css'],
// Auto-import from the shared packages/ui workspace in addition to the
// app's own components/. /shared-packages is bind-mounted in
// docker-compose.yml — outside containers the same files live at
// <repo>/packages/ui/components/. The local dir keeps the default
// directory-based prefix; the shared dir uses no prefix so a shared
// CountrySelect.vue is just <CountrySelect>. Mirrors portal/operator.
components: [
'~/components',
{ path: '/shared-packages/ui/components', pathPrefix: false },
],
app: {
head: {
// Marketing site is light by default (the design's primary theme). The
// page sets <html lang> reactively based on the da/en toggle.
htmlAttrs: { lang: 'da' },
link: [
{ rel: 'preconnect', href: 'https://fonts.googleapis.com' },
{ rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' },
{
rel: 'stylesheet',
href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap',
},
],
},
},
vite: {
server: {
// Vite 7 added a strict host check; allow the Traefik-fronted hostnames
// this site is served on in dev.
allowedHosts: ['dezky.local', 'www.dezky.local'],
hmr: {
protocol: 'wss',
clientPort: 443,
},
},
},
})