Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Valanto Marketing-Website (One-Pager, Vite/React)
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Overview Marketing-Website für Valanto, eine Schweizer SaaS-Plattform für Immobilienprofis (Liegenschaftsverwaltung, Bewertungen mit Dossier, Neubauprojekte, Landingpages, Verkäufer-Portal). Dieses Paket enthält die designte Startseite als One-Pager mit Ankern, fertige DE-Copy sowie FR/EN-Übersetzungen, und die komplette i18n-Struktur. Betreibergesellschaft: Felsberg Consulting GmbH. Verrechnung läuft über die GmbH — im Impressum/Footer korrekt abbilden.檢視完整 README ↗
Veraltet, Stand Juli 2026. Dieses Handoff beschreibt den ersten Entwurf. Heute gelten
src/index.cssundCLAUDE.md: nur eine Schrift (Archivo, kein Source Serif 4), keine Dachzeilen/Eyebrows, Zielgruppen als Bühne mit Produktbildern auf Anthrazit, Produktbilder im Petrol-Rahmen statt durchgehendem Hairline-Raster. Preise und Claim unten sind nachgeführt, die übrigen Gestaltungsangaben nicht. Seit 20.10.2026 nennen Bewerter-Block und Preiskarte die Methoden Realwert, Ertragswert und Residualwert, und vor dem Abschluss steht die Sektion «Fragen und Antworten» (#faq, FAQPage im JSON-LD).
Marketing-Website für Valanto, eine Schweizer SaaS-Plattform für Immobilienprofis (Liegenschaftsverwaltung, Bewertungen mit Dossier, Neubauprojekte, Landingpages, Verkäufer-Portal). Dieses Paket enthält die designte Startseite als One-Pager mit Ankern, fertige DE-Copy sowie FR/EN-Übersetzungen, und die komplette i18n-Struktur.
Betreibergesellschaft: Felsberg Consulting GmbH. Verrechnung läuft über die GmbH – im Impressum/Footer korrekt abbilden.
Die Dateien in diesem Bundle sind Design-Referenzen, erstellt in HTML – ein
Prototyp, der Look und Verhalten zeigt, kein produktiver Code zum 1:1-Kopieren.
Aufgabe ist, dieses Design in der Zielumgebung neu aufzubauen. Stack steht fest:
Laravel + Inertia + React (siehe Abschnitt „Umsetzung: Laravel + Inertia + React").
Sections als eigene React-Komponenten, i18n mit react-i18next (die JSON-Locales in
locales/ passen 1:1). Styling-Werte unten sind verbindlich; Tailwind-Mapping im
Laravel-Abschnitt.
Der Design-Prototyp ist eine Design-Component (.dc.html) und läuft nur im
Design-Tool. Nicht übernehmen – nur als visuelle Referenz lesen.
High-fidelity. Finale Farben, Typografie, Spacing und Interaktionen. Pixelgenau mit den Libraries/Patterns des Zielprojekts nachbauen. Ausnahme: die Produkt-UI im Hero-Mockup und die Dashboard-Tabelle sind Platzhalter-Illustrationen – sobald echte Screenshots vorliegen, ersetzen.
border-radius: 0 durchgängig. Keine Pills, keine
abgerundeten Karten. Buttons sind Rechtecke, oft als zusammenhängende Gruppe
(geteilte Kante, kein Gap).#23262D) statt Schatten und Karten-Lift. Feature-, Preis- und Zielgruppen-Grids
sind durch durchgehende 1px-Linien getrennt, nicht durch Gaps.14px 14px 0).#FAF7F2; Anthrazit-Bänder für Trust-Bar / CTA / Footer.Source Serif 4 (Google Fonts),
weight 600 (Headlines) / 700 (Preise, Labels), letter-spacing: -0.01em auf grossen
Headlines.Archivo (Google Fonts), weights 400/500/600/700.letter-spacing: 0.18em, Farbe Petrol.line-height: 1.7, Farbe #55585F. text-wrap: pretty auf Fliesstext.Farben:
--paper #FAF7F2 – Haupt-Hintergrund--paper-2 #F1ECE2 – sekundärer Block-Hintergrund (SIV-Sektion, Dossier-Rücklage)--ink #23262D – Anthrazit: Text, Linien, dunkle Bänder--ink-2 #1A1C21 – Footer-Hintergrund (noch dunkler)--accent #23808F – Petrol (Primäraktion, Akzente). Abgewandelt vom
Felsberg-Cyan #45B7C3 – eigenständiger, tiefer.--accent-hover #2E9DB0 – Petrol Hover auf dunklem Grund--accent-soft #8FBFC8 – gedämpfter Petrol (Balken, sekundär)--text #55585F – Fliesstext--muted #6E6A60 – gedämpfter Text, Hinweise, „per Monat" (auf Papier). AA-korrigiert von #A6A296 (2.3:1) → #6E6A60 (~4.7:1 auf #FAF7F2).--muted-warm #B4B0A5 / #8E8B82 – Footer-Text (auf dunklem Grund). Footer-Labels/Copyright AA-korrigiert von #6E6B64 (~3.1:1) → #8E8B82 (~4.8:1 auf #1A1C21).--line #23262D – Rasterlinien (voll) · #DED8CC (Hairline auf Papier, dezent)--line-dark #4A4E57 – Linien auf dunklem GrundSpacing (Section-Padding): horizontal 52px, vertikal je Sektion 56–84px.
Grid-Gaps: Content-Splits 40–56px; Karten-/Feature-Grids 0 (durch Linien getrennt).
Radius: 0 überall. Shadows: nur Offset-Schatten am Dossier (14px 14px 0 rgba(35,38,45,.08)), sonst keine.
Icon-/Marker-Grössen: Feature-Zähler „01–06" (Serif 15px, Petrol) + 22px leeres
1px-Quadrat oben rechts je Feature-Zelle. Preis-Häkchen: 16px Petrol-Vollquadrat, ✓ weiss.
Eine Seite (/), scrollbar, mit sticky Header. Sektionen von oben nach unten:
flex, space-between, padding 20px 52px, border-bottom: 1px solid #23262D,
Hintergrund rgba(250,247,242,.92) + backdrop-filter: blur(8px), sticky top.Funktionen · Für wen · Preise · Über uns (Archivo 14.5px, 500,
#55585F) – Anker auf die Sektionen.DE / FR / EN als 1px-umrandete Segmentgruppe (aktives
Segment: Text #23262D auf #ECE6DC; inaktiv: #6E6A60, transparent) · Text-Link
„Login" (Unterstrich) · Button „Kostenlos testen" (Vollquadrat, #23262D Bg, weiss;
Hover → #23808F).1.05fr 1fr, gap 48px, padding 72px 52px 60px.line-height:1.13) · Lead (17px, max-width 520px) · Button-Gruppe (Primär Petrol
„Kostenlos testen" + Sekundär Outline „Demo buchen", geteilte Kante, kein Gap) ·
Trust-Zeile (13px, #6E6A60): „Keine Kreditkarte nötig · 1 Bewertung gratis ·
Schweizer Hosting".#F1ECE2 mit 1px-Rand, vorne weisse Karte mit border:1px solid #23262D und Offset-Schatten 14px 14px 0 rgba(35,38,45,.08), padding 30px 32px.
Inhalt: Label „BEWERTUNGS-DOSSIER" + „Valanto"; Objektzeile („Einfamilienhaus" /
„Seestrasse 14, 8703 Erlenbach"); Marktwert „CHF 1'240'000" (Serif 38px, Petrol);
drei Bewertungsbalken (Lage 4.5 / Zustand 4.0 / Ausbau 3.5) als 8px-Rechteckbalken;
Footerzeile „Bewertung Nr. 2043 · Seite 1 / 18" + „PDF-Export". Badge unten rechts
„🇨🇭 Gehostet in der Schweiz" (Anthrazit-Vollfläche, weiss).#23262D), padding 18px 52px.#B4B0A5, 13px).1fr 1fr – links Eyebrow „ALLES AN EINEM ORT" + H2 „Ein Werkzeug für den
ganzen Immobilien-Workflow"; rechts Intro-Satz.border-top+border-left
am Container, border-right+border-bottom je Zelle). Jede Zelle padding 28px 26px,
min-height 150px, Hover → Bg #fff.border-left/right getrennt.border-right getrennt. Mittlere Karte („Makler") ist die Empfehlung: weisser
Hintergrund + Vollbreiten-Balken oben „Beliebt" (Petrol, weiss), zusätzliches
Top-Padding.letter-spacing:0.12em) · Preis (Serif 42px) + „/ Monat"
· 1px-Trennlinie · Feature-Liste mit 16px-Petrol-Quadrat-Häkchen · CTA-Button unten
(Empfehlung = Petrol-Vollfläche „Testen"; sonst Outline).#F1ECE2, border-top:1px solid #23262D, padding 76px 52px.1fr 1fr: links Eyebrow „VERANKERT IM SCHWEIZER MARKT" + H2 „Nähe zum
Schätzer-Ökosystem" + Text; rechts weisse Box mit 1px-Rahmen, drei durch 1px getrennte
Zeilen (Schweizerkreuz-Icon / Schloss-Icon / Haus-Icon → Schweizer Hosting / Sicher &
stabil / Aus der Praxis).#23262D), padding 72px 52px, zentriert.#FAF7F2) · Text (#B9BCC2) ·
Button-Gruppe (Petrol „Kostenlos testen" + Outline „Demo buchen", geteilte Kante).#1A1C21, padding 56px 52px 28px, color:#B4B0A5.1.6fr 1fr 1fr 1fr, Trennlinie unten 1px solid #34373E:
Funktionen,
Für wen, Preise, Über uns) – smooth scroll.react-i18next (i18n.changeLanguage).#FAF7F2 → #fff.Reihenfolge auf Mobile bewusst Claim → CTA → Beweis: Hero-Text und beide CTAs stehen oben, das Dossier folgt darunter (auf Desktop steht es daneben).
Breakpoint-Vorschlag: < 768px = Mobile (1 Spalte), ≥ 1024px = Desktop-Layout wie in Sektion 1–9 beschrieben; dazwischen Tablet (Feature-Grid 2 Spalten, Hero ggf. noch gestapelt).
Mobile-Regeln pro Sektion:
14px 20px). Logo links; rechts Sprachumschalter
(kleiner) + Burger als 34×34px 1px-Quadrat mit drei 16×2px-Strichen. Nav-Links im
ausklappenden Menü (im Prototyp nur Icon, Menü-Panel noch zu bauen). Hit-Target ≥ 44px.border-top:none). Trust-Zeile
zentriert. Dossier als eigene Karte darunter (Offset-Schatten 10px 10px 0).border-bottom-Trennung.border-bottom (statt border-right wie Desktop). „Beliebt"-Karte weiss + Top-Balken.Hit-Targets durchgängig ≥ 44px. Buttons behalten border-radius: 0.
--muted #A6A296 → #6E6A60 (auf Papier), Footer-Labels/Copyright
#6E6B64 → #8E8B82 (auf dunklem Grund). Diese Werte im Code verwenden, nicht die alten.#23808F als Text auf Papier #FAF7F2 ≈ 4.6:1 (AA für Normaltext ok); als
weisser Text auf Petrol-Fläche ≈ 4.7:1.<header>, <nav>, <section>, <h1/h2>,
<footer>), alt-Texte für den (echten) Hero-Screenshot, :focus-visible-Stil für
Tastaturnavigation (z. B. 2px Petrol-Outline), aria-current am aktiven Sprach-Segment.language: 'de' | 'fr' | 'en' (Default de) – über i18n. Persistenz optional
(localStorage / <html lang>).react-i18next, getrennte Sprachdateien de.json (final), fr.json, en.json.locales/ in diesem Bundle – DE ist
final, FR/EN sind bereits sinnvoll übersetzt (vor Go-Live von Muttersprachlern
gegenlesen lassen).nav.*, hero.*, dossier.*, trust.*, features[].*, audiences[].*,
pricing.*, plans.*, siv.*, cta.*, footer.*.Source Serif 4, Archivo. (M PLUS Rounded 1c aus dem
Briefing wird NICHT verwendet.)#23808F + #fff); SIV
„Sicher & stabil" = Schloss-Linien-Icon; „Aus der Praxis" = Haus-Linien-Icon
(stroke:#23262D, stroke-width:1.8, eckig). Beim Nachbau als eigene <Icon>-
Komponenten übernehmen (z. B. Lucide lock/home + custom Swiss-Cross-SVG).
Feature-Marker sind Ziffern „01–06", keine Icons.Stack steht fest: Laravel + Inertia.js + React + Vite (Tailwind empfohlen). Die Marketing-Startseite ist eine öffentliche Inertia-Page; kein Auth nötig.
routes/web.php → Route auf HomeController
app/Http/Controllers/HomeController.php → rendert Inertia::render('Home', [...])
resources/js/
app.jsx → Inertia-Setup, importiert i18n
i18n.js → react-i18next init
locales/de.json | fr.json | en.json → aus diesem Bundle (1:1 übernehmen)
Pages/Home.jsx → setzt die Sektionen zusammen
Components/site/
Nav.jsx Hero.jsx TrustBar.jsx Features.jsx Audiences.jsx
Pricing.jsx Siv.jsx ClosingCta.jsx Footer.jsx
LangSwitch.jsx
resources/views/app.blade.php → Font-Links (Source Serif 4, Archivo)
tailwind.config.js → Design-Tokens (siehe unten)
Die drei JSON-Dateien passen unverändert. Minimal-Setup:
// resources/js/i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import de from './locales/de.json';
import fr from './locales/fr.json';
import en from './locales/en.json';
i18n.use(initReactI18next).init({
resources: { de: { t: de }, fr: { t: fr }, en: { t: en } },
lng: localStorage.getItem('valanto_lang') || 'de',
fallbackLng: 'de',
ns: ['t'], defaultNS: 't',
interpolation: { escapeValue: false },
});
export default i18n;
In app.jsx einmal import './i18n';. Nutzung: const { t } = useTranslation(); →
t('hero.h1'). Arrays (Features/Audiences/Plans) über
t('features.items', { returnObjects: true }) holen und mappen. Da die Keys unter dem
Namespace t liegen, entspricht t('hero.h1') dem Pfad in der JSON.
LangSwitch.jsx)Client-seitig genügt für den Start:
const change = (lng) => { i18n.changeLanguage(lng); localStorage.setItem('valanto_lang', lng); document.documentElement.lang = lng; };
Segment-Gruppe DE/FR/EN wie im Design (1px-Rahmen, aktives Segment #23262D auf
#ECE6DC).
SEO-Hinweis (empfohlen für Go-Live): für indexierbare mehrsprachige Inhalte besser
server-getrieben über Locale-Präfixe: Route-Gruppe /{locale} (de|fr|en) +
Middleware App::setLocale($locale) + Locale als Inertia-Shared-Prop
(Inertia::share('locale', ...)) an das Frontend geben; i18n initial daraus setzen und
hreflang-Tags rendern. Client-Switch dann als Navigation zum Locale-Präfix.
// tailwind.config.js → theme.extend
colors: {
paper: '#FAF7F2', paper2: '#F1ECE2',
ink: '#23262D', ink2: '#1A1C21',
accent: '#23808F', accentHover: '#2E9DB0', accentSoft: '#8FBFC8',
body: '#55585F', muted: '#6E6A60', // AA-korrigiert (war #A6A296)
lineDark: '#4A4E57', lineFoot: '#34373E',
},
borderRadius: { none: '0' }, // radius durchgängig 0 – keine rounded-* utilities nutzen
fontFamily: {
serif: ['"Source Serif 4"', 'serif'],
sans: ['Archivo', 'system-ui', 'sans-serif'],
},
Regeln: keine rounded-*-Klassen, Trennung über border-Utilities (Hairline-Raster
border-ink), Button-Gruppen mit geteilter Kante (border-l-0 / border-t-0 am zweiten
Button). Fonts via app.blade.php Google-Fonts-<link> oder @fontsource.
// routes/web.php
Route::get('/', [HomeController::class, 'index'])->name('home');
// HomeController@index
return Inertia::render('Home');
Statische Seite – keine DB. Test-/Demo-Formulare später als eigene Inertia-Actions.
Problem: Ohne SSR liefert Laravel nur <div id="app"></div> aus; Inhalt kommt erst
per JS. Schlecht für Google und für Scraper von LinkedIn/WhatsApp (die kein JS ausführen).
Empfohlener Weg – offizielle Inertia-SSR (kein Vite-Prerender-Plugin, kein Next.js):
resources/js/ssr.jsx anlegen (Inertia-SSR-Entry mit createServer +
createInertiaApp aus @inertiajs/react/server); i18n dort ebenfalls importieren, damit
die Übersetzungen serverseitig gerendert werden.vite.config.js das SSR-Input ergänzen: laravel({ input: ['resources/js/app.jsx'], ssr: 'resources/js/ssr.jsx' }).npm run build erzeugt bootstrap/ssr/ssr.js. Laufzeit: php artisan inertia:start-ssr (ein Node-Prozess; auf Forge/Herd als Daemon, optional via Laravel
Octane). Fällt der Prozess aus, degradiert Inertia sauber auf Client-Rendering.config/inertia.php SSR aktivieren ('ssr' => ['enabled' => true]).Danach steht Hero-Text, Preise und alle Section-Überschriften im ausgelieferten HTML.
Titel/Head pro Seite: die <Head>-Komponente aus @inertiajs/react in Home.jsx
verwenden (<Head title="…"><meta … /></Head>) – wird mit SSR ins <head> gerendert.
Open-Graph-Tags server-seitig ins Blade-Root (resources/views/app.blade.php, im
<head>) – so sind sie immer present, auch ohne laufenden SSR-Node-Prozess und für
JS-lose Scraper. Statische Inhalte, daher hartkodierbar (oder pro Locale via Shared-Prop):
<meta property="og:type" content="website">
<meta property="og:site_name" content="Valanto">
<meta property="og:title" content="Valanto – Immobiliensoftware aus der Schweiz">
<meta property="og:description" content="Bewerten und vermarkten – in einem Werkzeug. Für Vermarkter, Bewerter und Spezialisten. Entwickelt und gehostet in der Schweiz.">
<meta property="og:url" content="https://valanto.ch/">
<meta property="og:image" content="https://valanto.ch/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="description" content="Bewerten und vermarkten – in einem Werkzeug. Für Vermarkter, Bewerter und Spezialisten. Gehostet in der Schweiz.">
Bei mehrsprachig: pro Locale eigene og:title/description + og:locale
(de_CH / fr_CH / en) und hreflang-Alternates rendern.
og:image (1200×630): liegt als og-image.png im Paket (Valanto-Stil: Anthrazit,
Wortmarke, Claim, Modul-Leiste). Nach public/og-image.png legen; og:image-URL zeigt
bereits darauf. Editierbare Quelle: og-image-source.html.
Prüfen nach Umsetzung:
https://valanto.test bzw. der
Live-Domain: Hero-H1, die drei Preise (CHF 90/70/140) und die Section-Überschriften
müssen im rohen HTML stehen – nicht nur ein leeres root-div.curl -s https://valanto.ch/ | grep -i "og:title" → OG-Tags vorhanden.Valanto Website.dc.html – Design-Prototyp (Referenz, nur im Design-Tool lauffähig).og-image.png – fertiges 1200×630 Social-Share-Bild → nach public/og-image.png.og-image-source.html – editierbare Quelle des OG-Bilds.locales/de.json, locales/fr.json, locales/en.json – react-i18next-Sprachdateien,
1:1 nach resources/js/locales/ übernehmen.screenshots/ – Desktop- und Mobile-Aufnahmen des Designs.Website-Briefing-Portal.md – Original-Briefing mit Kontext & Positionierung.