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
+39
View File
@@ -0,0 +1,39 @@
<script setup lang="ts">
// Dezky marketing landing page. Ported from the Claude Design handoff
// (Landing Page.html → landing-app.jsx + landing-sections.jsx). Light theme,
// Danish default, hero variant A — the production defaults the user landed on.
// Section order matches the design exactly.
import { useTheme, useCopy, useLang } from '~/composables/useLanding'
const t = useTheme()
const copy = useCopy()
const lang = useLang()
const description = computed(() => copy.value.hero.sub)
useHead({
title: 'dezky · suveræn produktivitet',
htmlAttrs: { lang },
meta: [
{ name: 'description', content: description },
],
})
</script>
<template>
<div :style="{ background: t.bg, color: t.fg, minHeight: '100vh' }">
<LandingNav />
<LandingHero />
<LandingProblem />
<LandingSuite />
<LandingHowItWorks />
<LandingSovereignty />
<LandingCompare />
<LandingWhitelabel />
<LandingStack />
<LandingPricing />
<LandingFaq />
<LandingFinalCta />
<LandingFooter />
</div>
</template>