Commit Graph

18 Commits

Author SHA1 Message Date
Ronni Baslund d2096eb847 feat(website): book-a-demo & status pages, expand roadmap/contact
- /demo: book-a-demo page with a what-to-expect column + a form that
  composes a prefilled email to info@dezky.eu (interim, no backend); built
  to swap for a self-hosted scheduler later. Wire every "Book a demo" CTA
  (nav, hero, pricing, the previously-dead final-CTA button, and the
  contact/partners/migration/coming-soon CTAs) to /demo.
- /status: manually-maintained system-status page (overall banner,
  per-service rows, incident history). Live modules operational; Video/Chat
  marked coming soon.
- Roadmap: expand the board (5 items/column) + a "the bigger picture"
  themes grid + a "suggest a feature" CTA + a directional-timelines note.
- Contact: purpose-specific channels (info@ / legal@ / privacy@), a
  response-time note, and a company + "see it live" demo block.
- Drop /status from the [slug].vue stub map; tidy now-unused imports.
2026-06-06 19:19:19 +02:00
Ronni Baslund 3347fa9265 feat(website): expand about page (problem + founders)
Extend /about with the "why": a "the problem" section (jurisdiction vs
geography, creeping prices, lock-in, vendor sprawl) as a 2x2 pain grid, and
a "we're founders ourselves" section. Both bilingual and responsive.

Also point the footer partner link to /partners (was the homepage
#whitelabel section).
2026-06-06 16:47:47 +02:00
Ronni Baslund 97728cb09e feat(website): SLA & cookie policy pages
Replace the /sla and /cookies stubs with real pages (da + en), matching
the DPA/terms/privacy layout. Drop both from the [slug].vue stub map.

- SLA: 99% uptime target framed as a transparency-backed commitment (no
  public service credits); contractual credits offered only via Enterprise
  agreements. Support first-response targets table; status-page reference.
- Cookie policy: strictly-necessary + language preference only, cookie-free
  analytics (Umami), no third-party tracking, "no banner needed"; cookie
  table; final (v1.0), no draft banner.
2026-06-06 16:47:47 +02:00
Ronni Baslund 1686b71411 feat(website): persist language choice in a cookie
useLang now seeds from a first-party `dezky-lang` cookie on SSR init and
toggleLang writes it (12 months, SameSite=Lax). The chosen language now
survives reloads/return visits (fixes the reset-to-Danish quirk) and makes
the cookie-policy entry accurate.
2026-06-06 16:42:46 +02:00
Ronni Baslund 3123d8a5a1 feat(website): terms of service page
Replace the /terms stub with a real Servicevilkår page (da + en),
mirroring the DPA/privacy layout and draft / legal-review banner.

- 12 clauses tailored to the system: the service, per-user accounts,
  acceptable use, customer data (EU-hosted, DPA ref, export/no lock-in),
  pricing & payment (49 kr/user/mo excl. VAT), term/renewal/cancellation,
  uptime & SLA ref, IP, liability cap (last 12 months' fees), changes,
  Danish law / venue Esbjerg
- Drop 'terms' from the [slug].vue stub map so the real page wins
- Contact: legal@dezky.eu

Still a 0.1 draft pending legal review (flagged on the page).
2026-06-06 16:04:29 +02:00
Ronni Baslund d668b1b6a6 feat(website): responsive / mobile layouts
Make the marketing site mobile-friendly across every page and section.
Desktop appearance is unchanged; all breakpoint logic targets <=768px.

- Fluid section padding via clamp(); equal grids use auto-fit/minmax,
  asymmetric grids stack to one column via scoped-CSS media queries
- Nav: real hamburger menu on mobile (links, lang toggle, login, CTA)
- ProductMockup: scales the whole dashboard to fit (zoom) instead of
  reflowing its internals into a tall stack
- Lower oversized heading clamp() minimums so titles no longer overflow
  at ~390px (hero, page headers, final CTA, brand cover/chapter)
- HowItWorks: row-gap when steps stack so node markers clear the text
- Compare + partners tables: stacked rows now label each value with its
  column (Dezky vs hyperscaler / CSP) instead of an ambiguous header
- Footer columns, tiers, calculator and tables stack cleanly on mobile
2026-06-06 15:55:35 +02:00
Ronni Baslund bc0697c3e8 feat(website): real DPA + privacy policy pages
Replace the /dpa and /privacy placeholder stubs with full pages (da + en):
- /dpa — GDPR Art. 28 data processing agreement: roles, subject matter, data
  categories, processor obligations, sub-processors (Hetzner, Stripe — EU),
  no third-country transfer, 72h breach notice, audits, deletion, Danish law.
- /privacy — controller privacy notice: data collected, legal basis, cookieless
  Umami analytics, retention, recipients, data-subject rights + Datatilsynet.
Both carry a "draft — pending legal review" banner. Removes their stub entries.
2026-06-05 22:10:11 +02:00
Ronni Baslund 80c8a23688 chore(website): reword partner-tiers heading to "Skalér med os." 2026-06-05 22:09:53 +02:00
Ronni Baslund f447b13c83 feat(website): brand guide page + NodeMark/NodeLockup variants
Replace the /brand stub with the full Brand Guide from the Claude Design
handoff (cover, logo, color, typography, voice, applications), rendered inside
the site layout, English-only, with illustrative copy adapted to Dezky's real
EU-sovereign voice. Extend NodeMark with a `variant` (donut/solid/outline) and
NodeLockup with a separate `wordmark` colour so the mark reads correctly on
dark surfaces. Drops the old brand stub copy.
2026-06-05 22:09:36 +02:00
Ronni Baslund ed660b9a81 chore(website): gitignore stray npm package-lock.json (project uses pnpm) 2026-06-05 16:02:44 +02:00
Ronni Baslund 41af70d57b chore(website): pin TMPDIR in dev script and fix brand domain
Set TMPDIR=/tmp in the dev script so the Nuxt vite-node Unix socket path stays
under macOS's 104-char limit (fixes "Failed to restrict vite-node socket
permissions" on local runs; harmless in the Linux container). Also fix the
package.json description: dezky.com → dezky.eu.
2026-06-05 15:59:23 +02:00
Ronni Baslund bf183fce07 feat(website): tier-driven progressive partner margin calculator
The /partners margin calculator now derives margin from the user count using
progressive brackets (like tax brackets): first 500 users at 15%, 501–1000 at
30%, 1001+ at 40%, off the 49 kr/user/mo list price. Replaces the manual margin
slider with a live per-bracket breakdown. Rates are read from the tier copy;
tier thresholds aligned to 501 / 1.001 so the cards and calculator agree.
2026-06-05 15:59:19 +02:00
Ronni Baslund 6d82502e7b chore(website): coming-soon badges, standards reframe, pricing, company info
- Suite: "coming soon" badge + dimmed glyph on Meet & Chat (data-driven `soon` flag)
- Stack (section 07): reframe from a vendor shopping-list to open standards +
  portability (no vendor names exposed; keeps the no-lock-in message)
- Pricing: 69 → 49 kr/user/mo
- Company info (footer + contact): Åtoften 33, 6710 Esbjerg V; CVR 43 14 18 21
2026-06-05 14:46:35 +02:00
Ronni Baslund 2e400d86c5 feat(website): partner program page + reseller conversion sections
Add the /partners page rendering the partner pitch: benefits, an interactive
margin calculator (seats × margin → monthly/annual, off the 49 kr list price),
a reseller-facing "CSP vs Dezky" comparison, partner tiers, a 3-step "get
started", and a partner FAQ. Wire the section-06 "see the partner program"
button to it, and align the whitelabel margin bullet to 15–40%.
2026-06-05 14:46:22 +02:00
Ronni Baslund 0a35d9deb6 feat(website): footer sub-pages + shared page layout
Wire every footer link to a real route. Adds a shared `page` layout (Nav +
content + Footer), reusable PageHeader/ComingSoon components, six content pages
(about, contact, brand, roadmap, changelog, migration), and a dynamic [slug]
catch-all for the not-yet-built pages — unknown slugs 404, legal slugs get a
distinct "contact us" body.

Footer links repointed from dead "#" to real paths; section anchors ("/#suite")
smooth-scroll on the homepage and route home + scroll from a sub-page; logo
links home. Page copy (da + en) added under COPY.pages.
2026-06-05 14:40:36 +02:00
Ronni Baslund 4c57d41350 feat(website): rewrite hero headline and switch brand domain to .eu
Hero headline was a broken comma-splice ("Den produktivitetssuite, dine data
bliver i Danmark med."); replace with a clean two-sentence line in both
languages:
  da: "Din digitale arbejdsplads. Data der bliver i EU."
  en: "Your digital workplace. Data that stays in the EU."

Also move all brand references off the unowned dezky.com to dezky.eu
(status page, app dashboard mockup, config/comments). External domains
(zulip.com, Google Fonts) are left untouched.
2026-06-05 12:29:50 +02:00
Ronni Baslund 4c3c47cc87 feat(website): localize whitelabel partner cards (da/en)
Partner demo cards in section 06 were hardcoded Danish strings, so they
stayed Danish in EN mode. Move name + subtitle into COPY.whitelabel.partners
for both languages and render them via a mapped computed; per-card accent and
the placeholder style remain presentational config in the component.

Also harden PartnerCard's avatar-initial against an empty name to satisfy
noUncheckedIndexedAccess.
2026-06-05 12:08:57 +02:00
Ronni Baslund c9911cc262 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).
2026-06-05 10:58:25 +02:00