diff --git a/frontend/mocking/content.json b/frontend/mocking/content.json index 8ce1d5e..d19557f 100644 --- a/frontend/mocking/content.json +++ b/frontend/mocking/content.json @@ -29,15 +29,21 @@ "headline": "Was dieses Template kann", "tagline": "Features", "anchorId": "features", - "padding": { "top": "lg", "bottom": "lg" }, - "text": "

Svelte 5 Runes

Reaktives UI mit $state, $derived und $effect — kein Boilerplate, maximale Performance.

🎨

Tailwind CSS 4

Utility-first Styling mit Custom-Theme, Dark-Mode-ready und blitzschnellen Builds.

🔌

Tibi CMS API

Collections, Hooks, Medialib — alles über eine REST-API. Mit Mock-Modus für offline-Entwicklung.

🌍

i18n Built-in

Mehrsprachigkeit aus der Box: URL-basierte Sprachauswahl, Lazy-Loaded Locales, SSR-kompatibel.

🖥️

SSR via goja

Server-Side Rendering in Go — schnelle Erstauslieferung, SEO-freundlich, mit Cache-Invalidierung.

🧪

Playwright Tests

E2E, API, Visual Regression und Video-Tours — alles vorkonfiguriert und ready to go.

" + "padding": { + "top": "lg", + "bottom": "lg" + }, + "text": "

Svelte 5 Runes

Reaktives UI mit $state, $derived und $effect — kein Boilerplate, maximale Performance.

Tailwind CSS 4

Utility-first Styling mit Custom-Theme, Dark-Mode-ready und blitzschnellen Builds.

Tibi CMS API

Collections, Hooks, Medialib — alles über eine REST-API. Mit Mock-Modus für offline-Entwicklung.

i18n Built-in

Mehrsprachigkeit aus der Box: URL-basierte Sprachauswahl, Lazy-Loaded Locales, SSR-kompatibel.

SSR via goja

Server-Side Rendering in Go — schnelle Erstauslieferung, SEO-freundlich, mit Cache-Invalidierung.

Playwright Tests

E2E, API, Visual Regression und Video-Tours — alles vorkonfiguriert und ready to go.

" }, { "type": "richtext", "headline": "So funktioniert's", "tagline": "Workflow", "anchorId": "workflow", - "padding": { "top": "lg", "bottom": "sm" }, + "padding": { + "top": "lg", + "bottom": "sm" + }, "externalImageUrl": "https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=800&q=80", "imagePosition": "right", "text": "

Starte die Entwicklungsumgebung mit make docker-up && make docker-start. Der esbuild-Watcher kompiliert Änderungen in Echtzeit, BrowserSync lädt den Browser automatisch neu.

Für Offline-Entwicklung aktiviere den Mock-Modus mit MOCK=1 in der .env. Content wird über die Tibi-API geladen und mit dem BlockRenderer dargestellt.

Jeder Block-Typ (Hero, Richtext, Accordion, Features) ist eine eigene Svelte-Komponente — erweiterbar und austauschbar.

" @@ -47,7 +53,10 @@ "headline": "Häufige Fragen", "tagline": "FAQ", "anchorId": "faq", - "padding": { "top": "sm", "bottom": "lg" }, + "padding": { + "top": "sm", + "bottom": "lg" + }, "accordionItems": [ { "question": "Wie starte ich ein neues Projekt mit diesem Template?", @@ -105,15 +114,21 @@ "headline": "What this template offers", "tagline": "Features", "anchorId": "features", - "padding": { "top": "lg", "bottom": "lg" }, - "text": "

Svelte 5 Runes

Reactive UI with $state, $derived and $effect — no boilerplate, maximum performance.

🎨

Tailwind CSS 4

Utility-first styling with custom theme, dark-mode-ready and blazing fast builds.

🔌

Tibi CMS API

Collections, hooks, media library — all via REST API. With mock mode for offline development.

🌍

Built-in i18n

Multi-language out of the box: URL-based language selection, lazy-loaded locales, SSR-compatible.

🖥️

SSR via goja

Server-side rendering in Go — fast initial delivery, SEO-friendly, with cache invalidation.

🧪

Playwright Tests

E2E, API, visual regression and video tours — all preconfigured and ready to go.

" + "padding": { + "top": "lg", + "bottom": "lg" + }, + "text": "

Svelte 5 Runes

Reactive UI with $state, $derived and $effect — no boilerplate, maximum performance.

Tailwind CSS 4

Utility-first styling with custom theme, dark-mode-ready and blazing fast builds.

Tibi CMS API

Collections, hooks, media library — all via REST API. With mock mode for offline development.

Built-in i18n

Multi-language out of the box: URL-based language selection, lazy-loaded locales, SSR-compatible.

SSR via goja

Server-side rendering in Go — fast initial delivery, SEO-friendly, with cache invalidation.

Playwright Tests

E2E, API, visual regression and video tours — all preconfigured and ready to go.

" }, { "type": "richtext", "headline": "How it works", "tagline": "Workflow", "anchorId": "workflow", - "padding": { "top": "lg", "bottom": "sm" }, + "padding": { + "top": "lg", + "bottom": "sm" + }, "externalImageUrl": "https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=800&q=80", "imagePosition": "right", "text": "

Start the dev environment with make docker-up && make docker-start. The esbuild watcher compiles changes in real-time, BrowserSync auto-reloads the browser.

For offline development, enable mock mode with MOCK=1 in .env. Content is loaded via the Tibi API and rendered with the BlockRenderer.

Each block type (Hero, Richtext, Accordion, Features) is its own Svelte component — extensible and swappable.

" @@ -123,7 +138,10 @@ "headline": "Frequently Asked Questions", "tagline": "FAQ", "anchorId": "faq", - "padding": { "top": "sm", "bottom": "lg" }, + "padding": { + "top": "sm", + "bottom": "lg" + }, "accordionItems": [ { "question": "How do I start a new project with this template?", @@ -174,13 +192,19 @@ { "type": "richtext", "headline": "Warum dieses Template?", - "padding": { "top": "lg", "bottom": "md" }, + "padding": { + "top": "lg", + "bottom": "md" + }, "text": "

Das Tibi Svelte Starter vereint bewährte Patterns aus dutzenden Projekten in einem sofort einsetzbaren Fundament:

" }, { "type": "richtext", "headline": "Technologie-Stack", - "padding": { "top": "md", "bottom": "lg" }, + "padding": { + "top": "md", + "bottom": "lg" + }, "externalImageUrl": "https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=800&q=80", "imagePosition": "left", "text": "

Jede Komponente wurde sorgfältig ausgewählt:

" @@ -215,13 +239,19 @@ { "type": "richtext", "headline": "Why this template?", - "padding": { "top": "lg", "bottom": "md" }, + "padding": { + "top": "lg", + "bottom": "md" + }, "text": "

The Tibi Svelte Starter combines proven patterns from dozens of projects into an immediately usable foundation:

" }, { "type": "richtext", "headline": "Technology Stack", - "padding": { "top": "md", "bottom": "lg" }, + "padding": { + "top": "md", + "bottom": "lg" + }, "externalImageUrl": "https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=800&q=80", "imagePosition": "left", "text": "

Every component was carefully chosen:

" @@ -256,7 +286,10 @@ { "type": "contact-form", "headline": "Nachricht senden", - "padding": { "top": "lg", "bottom": "lg" } + "padding": { + "top": "lg", + "bottom": "lg" + } } ], "meta": { @@ -288,7 +321,10 @@ { "type": "contact-form", "headline": "Send a message", - "padding": { "top": "lg", "bottom": "lg" } + "padding": { + "top": "lg", + "bottom": "lg" + } } ], "meta": { @@ -297,4 +333,4 @@ "keywords": "contact, inquiry" } } -] +] \ No newline at end of file diff --git a/frontend/src/blocks/HeroBlock.svelte b/frontend/src/blocks/HeroBlock.svelte index 79556f6..78aaade 100644 --- a/frontend/src/blocks/HeroBlock.svelte +++ b/frontend/src/blocks/HeroBlock.svelte @@ -1,9 +1,11 @@
{block.callToAction.buttonText} diff --git a/frontend/src/css/style.css b/frontend/src/css/style.css index 75ff5e0..55cc1e1 100644 --- a/frontend/src/css/style.css +++ b/frontend/src/css/style.css @@ -128,8 +128,14 @@ } .feature-card .feature-icon { - font-size: 2.5rem; margin-bottom: 1rem; + color: var(--color-brand-600); + line-height: 1; +} + +.feature-card .feature-icon svg { + width: 2.5rem; + height: 2.5rem; } .feature-card h3 { diff --git a/frontend/src/lib/navigation.ts b/frontend/src/lib/navigation.ts index 0b645cb..97c895d 100644 --- a/frontend/src/lib/navigation.ts +++ b/frontend/src/lib/navigation.ts @@ -173,6 +173,16 @@ export const spaLink = (node: HTMLAnchorElement, options: SpaNavigateOptions = { return } + // Handle anchor links: scroll to element instead of SPA navigation + if (href.startsWith("#")) { + event.preventDefault() + const target = document.getElementById(href.slice(1)) + if (target) { + target.scrollIntoView({ behavior: "smooth" }) + } + return + } + // Skip if target is set (e.g., _blank) if (node.target && node.target !== "_self") { return