10 Commits

Author SHA1 Message Date
226de83d0f feat: Implement AI-powered estimation system, add comprehensive usage guide, and redesign PDF sitemap module.
Some checks failed
Build & Deploy Mintel Blog / build-and-deploy (push) Failing after 23s
2026-02-04 01:36:27 +01:00
ce421eb8d2 refactor: Centralize PDF styling with COLORS and FONT_SIZES and enhance module content and dynamic title generation. 2026-02-03 22:35:01 +01:00
38f2b871b9 feat: Refine PDF module labels and styling, and add a divider to the sitemap module. 2026-02-03 19:41:06 +01:00
3e70b00abc feat: introduce new PDF layouts and modules, enhance shared UI components, and add wording guidelines. 2026-02-03 19:25:07 +01:00
788c7aa7df feat: Introduce AI estimation and quote generation scripts, update pricing logic and PDF components, add new documentation, and clean up temporary files. 2026-02-03 16:05:59 +01:00
9751d2f61f feat: Implement combined quote PDF with AGBs and recurring pricing, utilizing shared PDF UI components. 2026-02-03 00:16:24 +01:00
083be92c5b feat: Centralize pricing calculation logic into a new module and add a script for generating quotes. 2026-02-02 22:52:35 +01:00
aa4374a664 clone 2026-02-02 21:47:49 +01:00
6e6f4fe3d7 Fix: Remove inline styles from Open Graph and Twitter image meta tags and simplify JSON-LD navigation data. 2026-02-02 18:51:59 +01:00
badb7b6141 clone 2026-02-02 16:31:08 +01:00
586 changed files with 18434 additions and 6924 deletions

5
.gitignore vendored
View File

@@ -40,3 +40,8 @@ pnpm-debug.log*
# testing
/coverage
# local cache & data
.cache/
cloned-websites/
storage/

View File

@@ -87,4 +87,18 @@ npm run video:preview
# Render the showcase video
npm run video:render
```
See `.agent/workflows/video-toolkit.md` for more details.
See `.agent/workflows/video-toolkit.md` for more details.
## 🤖 Industrial AI Estimation System
A multi-pass AI consultation engine for generating technical project estimations and professional PDFs.
- **Context-Aware**: Crawls existing customer websites to understand company DNA.
- **Industrial Standards**: Strictly follows "Industrial Engineering" aesthetics and technical wording.
- **Transparent**: Maps scope directly to a modular pricing model.
### Quick Start
```bash
# Generate estimation with website crawl
npm run ai-estimate -- "Project Briefing" --url https://example.com
```
See [ESTIMATION_GUIDE.md](docs/ESTIMATION_GUIDE.md) for full documentation.

File diff suppressed because one or more lines are too long

View File

@@ -209,7 +209,7 @@ export default function KLZCablesCaseStudy() {
transition={{ type: "spring", stiffness: 200, damping: 20 }}
>
<IframeSection
src="/showcase/klz-cables/index.html"
src="/showcase/klz-cables.com/index.html"
height="850px"
desktopWidth={1920}
allowScroll
@@ -252,7 +252,7 @@ export default function KLZCablesCaseStudy() {
>
<div className="relative w-full overflow-visible">
<IframeSection
src="/showcase/klz-cables/products-power-cables-medium-voltage-cables-n2xsf2y.html"
src="/showcase/klz-cables.com/power-cables-medium-voltage-cables.html"
height="1000px"
desktopWidth={1920}
allowScroll
@@ -290,7 +290,7 @@ export default function KLZCablesCaseStudy() {
className="relative h-[650px] w-full overflow-visible group"
>
<IframeSection
src="/showcase/klz-cables/power-cables.html"
src="/showcase/klz-cables.com/which-cables-for-wind-power-differences-from-low-to-extra-high-voltage-explained-2.html"
height="100%"
desktopWidth={1920}
allowScroll
@@ -321,9 +321,50 @@ export default function KLZCablesCaseStudy() {
</div>
</Section>
{/* --- SECTION 04: TEAM & TRUST --- */}
{/* --- SECTION 04: CONTENT ENGINE --- */}
<Section
number="04"
title="Content Strategy"
variant="white"
borderBottom
containerVariant="wide"
>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-16 items-center">
<div className="lg:col-span-4 space-y-10 order-2 lg:order-1">
<Reveal direction="left" blur>
<div className="space-y-6">
<Label className="text-slate-400">Knowledge Transfer</Label>
<H3 className="text-4xl md:text-6xl tracking-tighter">Insights & News.</H3>
<BodyText className="text-xl text-slate-500 font-serif italic">
Die News-Engine dient als technischer Hub für Industrie-Standards. Durch die Implementierung eines performanten Blog-Systems wird Fachwissen direkt an die Zielgruppe kommuniziert.
</BodyText>
</div>
</Reveal>
</div>
<div className="lg:col-span-8 order-1 lg:order-2">
<Reveal width="100%" direction="right" scale={0.98} blur>
<motion.div
whileHover={{ scale: 1.01 }}
transition={{ type: "spring", stiffness: 200, damping: 20 }}
className="relative h-[700px] w-full"
>
<IframeSection
src="/showcase/klz-cables.com/blog.html"
height="100%"
desktopWidth={1600}
allowScroll
browserFrame
className="h-full w-full no-scrollbar"
/>
</motion.div>
</Reveal>
</div>
</div>
</Section>
{/* --- SECTION 05: TEAM & TRUST --- */}
<Section
number="05"
title="Ergebnis"
borderBottom
containerVariant="wide"
@@ -340,7 +381,7 @@ export default function KLZCablesCaseStudy() {
<div className="relative group w-full text-left">
<div className="relative block w-full overflow-visible">
<IframeSection
src="/showcase/klz-cables/team.html"
src="/showcase/klz-cables.com/team.html"
height="1100px"
desktopWidth={1440}
allowScroll
@@ -353,6 +394,46 @@ export default function KLZCablesCaseStudy() {
</div>
</Section>
{/* --- SECTION 06: CONVERSION --- */}
<Section
number="06"
title="Lead Engineering"
variant="white"
containerVariant="wide"
>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-16 items-center">
<div className="lg:col-span-7">
<Reveal direction="left" scale={0.98} blur>
<motion.div
whileHover={{ scale: 1.01 }}
transition={{ type: "spring", stiffness: 200, damping: 20 }}
className="relative h-[800px] w-full"
>
<IframeSection
src="/showcase/klz-cables.com/contact.html"
height="100%"
desktopWidth={1200}
allowScroll
browserFrame
className="h-full w-full no-scrollbar"
/>
</motion.div>
</Reveal>
</div>
<div className="lg:col-span-5 space-y-10">
<Reveal direction="right" blur>
<div className="space-y-6">
<Label className="text-slate-400">Conversion Layer</Label>
<H3 className="text-4xl md:text-6xl tracking-tighter">Direkter Draht.</H3>
<BodyText className="text-xl text-slate-500 font-serif italic">
Das Kontakt-System wurde auf maximale Reduktion getrimmt. Keine unnötigen Hürden, sondern ein direkter Kommunikations-Kanal zwischen technischem Bedarf und individueller Beratung.
</BodyText>
</div>
</Reveal>
</div>
</div>
</Section>
{/* --- FINAL CTA: ARCHITECTURE & VALUE --- */}
<section className="py-40 md:py-64 bg-white relative overflow-hidden border-t border-slate-100">
<BackgroundGrid />

246
data/briefings/etib.txt Normal file
View File

@@ -0,0 +1,246 @@
Hallo Marc,
eine harte Deadline gibt es nicht Was denkst du ist realistisch? Ich habe als Ziel so
April / Mai im Kopf -> dann aber schon zu 95 % fertig. Viele Grüße
Mit freundlichen Grüßen
Danny Joseph
Geschäftsführer
E-TIB GmbH
Gewerbestraße 22
D-03172 Guben
Mobil +49 15207230518
E-Mail d.joseph@e-tib.com
Web www.e-tib.com
--------------------------------------------------------------------------------------------------
Hey,
ich würde wie bei https://www.schleicher-gruppe.de/ ein Video auf der Startseite
haben wollen. Da ginge sicherlich was vom bisherigen Messevideo. Liebe Grüße.
Mit freundlichen Grüßen
Danny Joseph
Geschäftsführer
E-TIB GmbH
Gewerbestraße 22
D-03172 Guben
Mobil +49 15207230518
E-Mail d.joseph@e-tib.com
Web www.e-tib.com
--------------------------------------------------------------------------------------------------
Geschäftsführung: Danny Joseph
Handelsregister: Amtsgericht Cottbus
HRB: 12403 CB
USt. ID-Nr.: DE304799919
--------------------------------------------------------------------------------------------------
Von: Frieder Helmich <f.helmich@etib-ing.com>
Gesendet: Donnerstag, 29. Januar 2026 08:49
An: Marc Mintel <marc@cablecreations.de>; Danny Joseph <d.joseph@e-tib.com>
Betreff: AW: Homepage E-TIB
Hi Marc,
brauchst du nur Fotos oder bindest du auch videos ein? Wir haben sehr viel Videomaterial. Wir haben auch einen kleinen Film den wir auf der Messe laufen lassen haben.
Mit freundlichen Grüßen
i.A. Frieder Helmich
E-TIB Ingenieurgesellschaft mbH
Kampstraße 3
D-27412 Bülstedt
Tel +49 4283 6979923
Mobil +49 173 6560514
Fax +49 4283 6084091
E-Mail f.helmich@etib-ing.com
Web www.etib-ing.com
ETIB_Ing_logo_mk
Datenschutzhinweise: www.etib-ing.com/datenschutz
-----------------------------------------------------------------------------------------------
Geschäftsführung: Julian Helmich
Handelsregister: Amtsgericht Tostedt
HRB: 207158
-----------------------------------------------------------------------------------------------
Von: Marc Mintel <marc@cablecreations.de>
Gesendet: Mittwoch, 28. Januar 2026 18:10
An: Danny Joseph <d.joseph@e-tib.com>
Cc: Frieder Helmich <f.helmich@etib-ing.com>
Betreff: Re: Homepage E-TIB
Hallo Danny,
Vielen Dank für die schnelle Rückmeldung.
Wie gesprochen werde ich mir die Unterlagen und Webseiten im Detail anschauen und mich dann noch einmal bei dir melden.
Gibt es eigentlich eine Deadline oder einen zeitlichen Rahmen, wo ihr mit der neuen Webseite rechnen möchtet?
Je nach dem könnte man auch Features priorisieren, so dass der Kern der Seite schnellstmöglich modernisiert online geht und der Rest im Nachgang.
Das Foto-Material würde ich auch gerne sichten, dann kann man schon sehen, wie viel sich damit arbeiten lässt.
Viele Grüße
From: Danny Joseph <d.joseph@e-tib.com>
Organization: E-TIB GmbH
Date: Wednesday, 28. January 2026 at 16:16
To: Marc Mintel <marc@cablecreations.de>
Cc: 'Frieder Helmich' <f.helmich@etib-ing.com>
Subject: Homepage E-TIB
Hallo Marc,
wie telefonisch besprochen erste wirre Gedanken:
Wir möchten eine minimalistische, hochwertige Homepage die sowohl am PV, als auch
Auf Smartphone / Tablet etc. vernünftig ausschaut.
Bisher war unser Aufhänger:
DIE EXPERTEN FÜR KABELTIEFBAU …
Alles nur Ideen: …
# Schaltflächen ähnlich: https://www.schleicher-gruppe.de/
E-TIB GmbH
E-TIB Verwaltung GmbH
E-TIB Ingenieurgesellschaft mbH
E-TIB Bohrtechnik GmbH
# Schaltflächen ähnlich: https://www.schleicher-gruppe.de/
(ehemals Kompetenzen www.e-tib.com)
Kabelbau
Kabelpflugarbeiten
Horizontalspülbohrungen
Elektromontagen bis 110 kV
Glasfaser-Kabelmontagen
Wartung & Störungsdienst
Genehmigungs- und Ausführungsplanung
Komplexe Querung (Bahn, Autobahn, Gewässer)
Elektro- und Netzanschlussplanung
Vermessung & Dokumentation
Input für Über uns: Grid … Timeline?
Gründung E-TIB GmbH: 16.12.2015
Kabelbau
Kabelpflugarbeiten
Horizontalspülbohrungen
Elektromontagen bis 110 kV
Glasfaser-Kabelmontagen
Wartung & Störungsdienst
Elektro- und Netzanschlussplanung
Vermessung & Dokumentation
Gründung E-TIB Verwaltung GmbH: 14.11.2019
Der Erwerb, die Vermietung, Verpachtung und Verwaltung
von Immobilien, Grundstücken, Maschinen und Geräten.
Gründung E-TIB Ingenieurgesellschaft mbH: 04.02.2019
Genehmigungs- und Ausführungsplanung
Komplexe Querung (Bahn, Autobahn, Gewässer)
Elektro- und Netzanschlussplanung
Gründung E-TIB Bohrtechnik GmbH: 21.10.2025
Horizontalspülbohrungen in allen Bodenklassen
GruppenKacheln (Beispieltexte) ...
ETIB GmbH Ausführung elektrischer Infrastrukturprojekte
ETIB Bohrtechnik GmbH Präzise Horizontalbohrungen in allen Bodenklassen
ETIB Verwaltung GmbH Zentrale Dienste, Einkauf, Finanzen
ETIB Ingenieurgesellschaft mbH Planung, Projektierung, Dokumentation
Kontaktseite siehe: www.e-tib.com
Karriere: ...
Messen: wo wir dieses Jahr einen Stand haben: Intersolar München, Windenergietage Linstow, Kabelwerkstatt Wiesbaden
Referenzen: … müsste ich dir zur Verfügung stellen
Pflichtseiten
Impressum (vollständig, Verantwortliche, Registernummer, UStID).
Datenschutz (Verarbeitungen, Rechtsgrundlagen, AVV, CookieGruppen, Löschfristen, Rechte).
CookieEinstellungen (Consent Manager: ...)
www.e-tib.com
www.etib-ing.com
Hier mein instagram account:
me.and.eloise
Verstehst du mich vielleicht ein kleines Stück mehr…
Unser Frieder Helmich kann erstes Foto-/Videomaterial zur Verfügung stellen:
f.helmich@etib-ing.com
Lass mir mal eine Idee vom Stundenaufwand / Kosten pro Stunde für Erstellung zukommen,
damit wir eine Vertragsgrundlage haben. Danach lass uns loslegen.
Besten Dank dir.
Mit freundlichen Grüßen
Danny Joseph
Geschäftsführer
E-TIB GmbH
Gewerbestraße 22
D-03172 Guben
Mobil +49 15207230518
E-Mail d.joseph@e-tib.com
Web www.e-tib.com
--------------------------------------------------------------------------------------------------
Geschäftsführung: Danny Joseph
Handelsregister: Amtsgericht Cottbus
HRB: 12403 CB
USt. ID-Nr.: DE304799919
--------------------------------------------------------------------------------------------------
Von: Marc Mintel <marc@cablecreations.de>
Gesendet: Donnerstag, 13. November 2025 16:30
An: d.joseph@e-tib.com
Betreff: Homepage
Hi Danny,
mein Vater meinte, ich könnte mich mal bei dir melden, weil ihr jemanden für eure Website sucht.
Kurz zu mir: Ich habe über 10 Jahre in der Webentwicklung gearbeitet. Inzwischen liegt mein Schwerpunkt zwar im 3D-Bereich (u. a. cablecreations.de), aber ich betreue weiterhin Websites für Firmen, die das Ganze unkompliziert abgegeben haben möchten. Unter anderem betreue ich auch die Seite von KLZ (klz-cables.com). Der Ablauf ist bei mir recht einfach: Wenn ihr etwas braucht, reicht in der Regel eine kurze Mail Anpassungen, Inhalte oder technische Themen erledige ich dann im Hintergrund. Dadurch spart ihr euch Schulungen, Zugänge oder lange Meetings, wie man sie oft mit Agenturen hat.
Wichtig ist: Eine Website braucht auch nach dem Aufbau regelmäßige Pflege, damit Technik und Sicherheit sauber laufen das übernehme ich dann ebenfalls, damit ihr im Alltag keinen Aufwand damit habt.
Um einschätzen zu können, ob und wie ich euch unterstützen kann, wäre es gut zu wissen, was ihr mit der Website vorhabt und was an der aktuellen Seite nicht mehr passt. Wenn du magst, können wir dazu auch kurz telefonieren.
Viele Grüße
Marc
Marc Mintel
Founder & 3D Artist
marc@cablecreations.de
Cable Creations
www.cablecreations.de
info@cablecreations.de
VAT: DE367588065
Georg-Meistermann-Straße 7
54586 Schüller
Germany

73
docs/AUTOMATION.md Normal file
View File

@@ -0,0 +1,73 @@
# Routine Automation
*Kleine Helfer, die den Alltag deutlich entlasten*
In vielen mittelständischen Unternehmen fressen wiederkehrende Aufgaben Monat für Monat unzählige Stunden:
- Daten aus Dokumenten abtippen
- Formulare von Hand ausfüllen
- Angebote, Berichte oder Bestätigungen manuell anpassen
- Eingehende Anfragen immer wieder neu prüfen und bearbeiten
Das ist keine wertschöpfende Arbeit.
Das ist Routine, die teuer ist, Fehler produziert und gute Mitarbeiter davon abhält, sich um das zu kümmern, was wirklich Umsatz bringt.
Ich baue genau für diese Routine **einfache, maßgeschneiderte Helfer** meist mit PDF- oder Excel-Ausgabe, Konfiguratoren oder KI-Dokumenten-Einlesen.
Einmal eingerichtet, laufen sie leise im Hintergrund.
Kein großes Projekt. Kein monatliches Tool-Abo. Kein „lernen Sie das neue System“.
### Was das konkret bringen kann Beispiele aus der Praxis
- **Schnelle Dokumentenerstellung (PDF-Generatoren)**
Kurze Eingaben (Formular, Mail, Excel-Zeile) → fertiges PDF raus: Angebote, Berichte, Protokolle, Bestätigungen, Übersichten. Immer Ihr Corporate Design, immer aktuelle Daten/Bausteine.
→ Von 30120 Minuten runter auf 210 Minuten.
- **Excel-Automatisierungen & smarte Tabellen**
Verkaufszahlen, Lagerbestände, Kundenlisten → automatische Berechnungen, Zusammenfassungen, Prognosen oder Exporte. Monatsberichte oder Preislisten aktualisieren sich von selbst.
→ Kein ständiges Nachrechnen mehr, keine Versionskonflikte.
- **Konfiguratoren für Anfragen & Schätzungen**
Kunde oder Mitarbeiter geht schrittweise durch ein Formular (auf Ihrer Website oder intern): „Welche Leistung? Welcher Umfang? Welcher Termin?“ → sofort realistische Schätzung, Preisspanne oder fertiges Angebot als PDF/Excel.
- **KI-Einlesen von PDFs oder handschriftlichen Dokumenten**
Eingescannte Rechnungen, Lieferscheine, Formulare, Notizen oder handgeschriebene Protokolle → KI liest Text, Zahlen, Felder aus (auch Handschrift, wo lesbar) → Daten landen in übersichtlicher Tabelle/Excel oder vorausgefülltem Formular.
Mitarbeiter prüft nur noch kurz → kleine Korrektur → Prozess geht weiter.
→ Kein stundenlanges Abtippen mehr, deutlich schnellerer Durchlauf.
### Der echte Wert für Sie
- 3080 % weniger Zeit bei Routineaufgaben → Ihre Teams konzentrieren sich aufs Wesentliche
- Weniger Fehler & Rückfragen → einheitlicher, professioneller Output
- Schnellere Reaktion auf Kunden → Konfiguratoren & KI-Einlesen liefern sofort Infos
- Amortisation oft schon nach wenigen Wochen oder Dutzend Nutzungen
- Nutzt, was Sie bereits haben: Website, Excel, Mail, Scanner-App
### Was ich **nicht** mache
Ich ersetze **kein** ERP, CRM, Buchhaltungs- oder HR-System.
Kein automatisches Buchen, keine Finanzamtschnittstelle, keine GoBD-Archivierungspflichten.
Nur smarte Abkürzungen bei Routine der Rest bleibt in Ihren bewährten Tools.
### Ich kann Ihnen helfen, wenn Sie mit diesen typischen Problemen kämpfen
- „Wir tippen immer noch Daten aus gescannten Dokumenten oder handschriftlichen Notizen ab.“
- „Angebote, Berichte oder Protokolle dauern ewig, weil alles von Hand angepasst wird.“
- „Kunden fragen ständig dasselbe wir antworten jedes Mal manuell.“
- „Excel-Tabellen und Berechnungen werden ständig neu gemacht und gehen kaputt.“
- „Bis wir eine realistische Schätzung oder ein Angebot raus haben, vergeht zu viel Zeit.“
Schreiben Sie mir einfach einen kurzen Satz zu Ihrem größten Zeitfresser in diesem Bereich.
Ich antworte meist innerhalb von 12 Tagen:
- Ist das machbar? Ja/Nein
- Ca. wie viel Aufwand (meist 315 Stunden) & Preisrahmen
- Was Sie realistisch sparen können (Zeit, Nerven, Fehler)
Passt es → baue ich es.
Danach: Routine digitalisiert. Mehr Ruhe im Alltag.
**Kurz gesagt**
Routine Automation:
Nicht die große Revolution.
Sondern gezielte Entlastung bei den Dingen, die jeden Tag Zeit und Nerven kosten.
Mehr Zeit. Weniger Frust. Besserer Output.
Und das Gefühl: „Das läuft jetzt einfach.“
Wenn bei Ihnen gerade etwas „von Hand gemacht wird“ oder „ewig dauert“ Ich sage Ihnen, ob und wie schnell man das sinnvoll digitalisieren kann.

83
docs/ESTIMATION_GUIDE.md Normal file
View File

@@ -0,0 +1,83 @@
# Service Estimation & AI Consultation Guide
This guide explains how to use the automated estimation system to generate professional PDF quotes for clients using AI-driven context analysis.
## 🛠 Basic Usage
The primary entry point is the `ai-estimate` script. It orchestrates a 6-pass AI consultation:
1. **Fact Extraction**: Identifying company data and project scope.
2. **Feature Deep-Dive**: Generating technical justifications for items.
3. **Strategic Content**: Creating the Briefing Analysis and Strategic Vision.
4. **Information Architecture**: Designing a hierarchical sitemap.
5. **Position Synthesis**: Mapping everything to a transparent pricing model.
6. **Industrial Critic**: Final quality gate for tone and accuracy.
### Generating an Estimation from Scratch
#### 1. With a Website URL (Recommended)
Providing a URL allows the system to crawl the existing site to understand the "Company DNA" and services.
```bash
npm run ai-estimate -- "Relaunch der Website mit Fokus auf B2B Leads" --url https://example.com
```
#### 2. From a Text File
If you have a long briefing in a `.txt` file:
```bash
npm run ai-estimate -- @briefing.txt --url https://example.com
```
#### 3. Text-Only (No URL)
If no URL is provided, the system relies entirely on your briefing text.
```bash
npm run ai-estimate -- "Neuentwicklung eines Portals für XYZ"
```
---
## 📄 Output Modes
The system can generate two types of documents:
### 1. Full Quote (Default)
Includes everything: Front Page, Briefing Analysis, Vision, Sitemap, Technical Principles, Detailed Pricing, Roadmap, and Legal Terms (AGB).
```bash
npm run ai-estimate -- "Project Briefing"
```
### 2. Estimation Only
A condensed version excluding legal terms and deep technical principles. Focuses purely on the strategic fit and the price.
```bash
npm run ai-estimate -- "Project Briefing" --estimation
```
---
## 📦 Cache & Cache Management
To save costs and time, all AI responses and crawl results are cached in the `.cache` directory.
### Regenerating with Cached Data
If you run the same command again (identical briefing and URL), the system will use the cached results and won't call the AI APIs again. This is useful if you want to tweak the PDF layout without spending tokens.
### Forcing a Refresh
To ignore the cache and get a fresh AI consultation:
```bash
npm run ai-estimate -- "Project Briefing" --clear-cache
```
### Manual Tweaking (JSON State)
Every run saves a detailed state to `out/estimations/json/[Company]_[Timestamp].json`.
If you want to manually edit the AI's results (e.g., fix a typo in the sitemap or description), you can edit this JSON file and then regenerate the PDF from it:
```bash
npm run ai-estimate -- --json out/estimations/json/Your_Project.json
```
*(Add `--estimation` if you want the condensed version).*
---
## 💡 Advanced Options
- `--comments "..."`: Add manual notes that the AI should consider (e.g., "Customer prefers a minimalist blue theme").
- `--clear-cache`: Purges all cached data for this project before starting.
- `--url [URL]`: Explicitly sets the crawl target (auto-discovered from briefing if omitted).

View File

@@ -12,6 +12,7 @@ Die Grundlage für jede Website:
• Grundstruktur & Design-Vorlage
• technisches SEO-Basics
• Analytics (mit automatischem Mail-Report)
• Testing, Staging, Production Umgebung
• Livegang
Enthält keine Seiten, Inhalte oder Funktionen.
@@ -125,7 +126,7 @@ Datensatz anpassen
Hosting & Betrieb
120 € / Monat
12 Monate = 1440 €
Sichert:
• Webhosting & Verfügbarkeit

43
docs/PRINCIPLES.md Normal file
View File

@@ -0,0 +1,43 @@
Prinzipien
Ich arbeite nach klaren Grundsätzen, die sicherstellen, dass meine Kunden fair, transparent und langfristig profitieren.
1. Volle Preis-Transparenz
Alle Kosten sind offen und nachvollziehbar.
Es gibt keine versteckten Gebühren, keine Abos, keine Lock-ins.
Jeder Kunde sieht genau, wofür er bezahlt.
2. Quellcode & Projektzugang
Auf Wunsch erhalten Kunden jederzeit den vollständigen Source Code und eine nachvollziehbare Struktur.
Damit kann jeder andere Entwickler problemlos weiterarbeiten.
Niemand kann später behaupten, der Code sei „Messy“ oder unbrauchbar.
3. Best Practices & saubere Technik
Ich setze konsequent bewährte Standards und dokumentierte Abläufe ein.
Das sorgt dafür, dass Systeme wartbar, verständlich und erweiterbar bleiben langfristig.
4. Verantwortung & Fairness
Ich übernehme die technische Verantwortung für die Website.
Ich garantiere keine Umsätze, Rankings oder rechtliche Ergebnisse nur saubere Umsetzung und stabile Systeme.
Wenn etwas nicht sinnvoll ist, sage ich es ehrlich.
5. Langfristiger Wert
Eine Website ist ein Investment.
Ich baue sie so, dass Anpassungen, Erweiterungen und Übergaben an andere Entwickler problemlos möglich sind.
Das schützt Ihre Investition und vermeidet teure Neuaufbauten.
6. Zusammenarbeit ohne Tricks
Keine künstlichen Deadlines, kein unnötiger Overhead.
Kommunikation ist klar, Entscheidungen nachvollziehbar, Übergaben sauber dokumentiert.

98
docs/TECH.md Normal file
View File

@@ -0,0 +1,98 @@
Wie ich Websites technisch umsetze
Ich entwickle Websites als moderne, performante Websysteme nicht als Baukasten-Seiten und nicht als schwer wartbare CMS-Konstrukte.
Der Fokus liegt auf Geschwindigkeit, Stabilität, Datenschutz und langfristiger Wartbarkeit.
Die Technik dient dabei immer einem Zweck:
Ihre Website soll zuverlässig funktionieren, schnell laden und kein laufendes Risiko darstellen.
Geschwindigkeit & Performance
Meine Websites sind so aufgebaut, dass Inhalte extrem schnell ausgeliefert werden unabhängig davon, ob ein Besucher am Desktop oder mobil unterwegs ist.
Das bedeutet für Sie:
• kurze Ladezeiten
• bessere Nutzererfahrung
• messbar bessere Werte bei Google PageSpeed & Core Web Vitals
• geringere Absprungraten
Die Seiten werden nicht „zusammengeklickt“, sondern technisch optimiert ausgeliefert.
Responsives Design (ohne Kompromisse)
Jede Website ist von Grund auf responsiv.
Layout, Inhalte und Funktionen passen sich automatisch an:
• Smartphones
• Tablets
• Laptops
• große Bildschirme
Dabei wird nicht einfach skaliert, sondern gezielt für unterschiedliche Bildschirmgrößen optimiert.
Das Ergebnis ist eine saubere Darstellung und gute Bedienbarkeit auf allen Geräten.
Stabilität & Betriebssicherheit
Im Hintergrund laufen Überwachungs- und Kontrollmechanismen, die technische Probleme automatisch erkennen.
Für Sie heißt das:
• Fehler werden bemerkt, auch wenn niemand sie meldet
• ich werde aktiv informiert, statt erst zu reagieren, wenn etwas kaputt ist
• Probleme können frühzeitig behoben werden
Das reduziert Ausfälle und vermeidet unangenehme Überraschungen.
Datenschutz & DSGVO
Ich setze konsequent auf freie, selbst betriebene Software statt auf große externe Plattformen.
Ihre Vorteile:
• keine Weitergabe von Nutzerdaten an Dritte
• keine versteckten Tracker
• keine Abhängigkeit von US-Anbietern
• datenschutzfreundliche Statistik ohne Cookies
Die Website bleibt technisch schlank und rechtlich kontrollierbar.
Unabhängigkeit & Kostenkontrolle
Da ich keine proprietären Systeme oder Lizenzmodelle einsetze:
• entstehen keine laufenden Tool-Gebühren
• gibt es keine plötzlichen Preiserhöhungen
• bleibt die Website langfristig planbar betreibbar
Sie zahlen für die Leistung nicht für Lizenzen oder Marken.
Wartbarkeit & Erweiterbarkeit
Die technische Struktur ist so aufgebaut, dass:
• Inhalte erweitert werden können
• Funktionen sauber ergänzt werden können
• Anpassungen nicht das ganze System gefährden
Das schützt Ihre Investition und verhindert teure Neuaufbauten nach kurzer Zeit.
Kurz gesagt
Ich baue Websites, die:
• schnell sind
• auf allen Geräten sauber funktionieren
• datenschutzkonform betrieben werden
• technisch überwacht sind
• langfristig wartbar bleiben
Die Technik steht nicht im Vordergrund
aber sie sorgt dafür, dass Ihre Website zuverlässig ihren Zweck erfüllt.

42
docs/TONE.md Normal file
View File

@@ -0,0 +1,42 @@
Ton & Haltung in der Kommunikation
Dieses Dokument beschreibt die verbindlichen Prinzipien, nach denen ich mit Kunden kommuniziere schriftlich wie mündlich, auf der Website wie im Projektalltag.
1. Klarheit vor Höflichkeit
Ich kommuniziere klar, direkt und verständlich.
Unklare Formulierungen, Marketingfloskeln oder beschwichtigende Aussagen werden vermieden.
Lieber eine ehrliche, präzise Aussage als eine „freundliche“ Unverbindlichkeit.
2. Ehrlichkeit ohne Verkaufsdruck
Ich verspreche nichts, was ich nicht sicher einhalten kann.
Grenzen, Risiken und Unsicherheiten werden offen benannt.
Es gibt keine künstliche Dringlichkeit, kein Upselling aus Prinzip und keine verdeckten Interessen.
3. Sachlich, ruhig, professionell
Die Kommunikation bleibt sachlich und respektvoll auch bei Kritik, Verzögerungen oder Meinungsverschiedenheiten.
Emotionale Eskalation, Schuldzuweisungen oder Rechtfertigungsschleifen werden vermieden.
4. Verantwortung statt Ausreden
Probleme werden benannt, nicht relativiert.
Wenn etwas nicht funktioniert, wird erklärt warum und wie damit umgegangen wird.
Ich übernehme Verantwortung für meine Arbeit, nicht für äußere Faktoren außerhalb meines Einflusses.
5. Transparenz statt Fachchinesisch
Komplexe Sachverhalte werden verständlich erklärt, ohne künstliche Vereinfachung oder Herablassung.
Fachbegriffe werden nur verwendet, wenn sie notwendig sind.
Wissen dient der Orientierung des Kunden, nicht der Selbstdarstellung.
6. Gleichbehandlung aller Kunden
Alle Kunden werden gleich behandelt unabhängig von Projektgröße, Budget oder Laufzeit.
Es gibt keine versteckten Prioritäten, Sonderregeln oder impliziten Erwartungshaltungen.
7. Langfristige Perspektive
Die Kommunikation ist auf nachhaltige Zusammenarbeit ausgelegt, nicht auf kurzfristige Zustimmung.
Entscheidungen und Empfehlungen orientieren sich am langfristigen Nutzen des Kunden.

56
docs/WORDING.md Normal file
View File

@@ -0,0 +1,56 @@
1. Aktiv statt passiv
Sätze werden aktiv formuliert.
Keine unpersönlichen Konstruktionen, kein „es wird“, „man sollte“, „könnte“.
2. Kurz und eindeutig
Sätze sind so kurz wie möglich, so lang wie nötig.
Ein Gedanke pro Satz. Keine Schachtelsätze.
3. Keine Weichmacher
Keine Wörter wie:
• eventuell
• möglicherweise
• grundsätzlich
• in der Regel
• normalerweise
Wenn etwas gilt, wird es gesagt. Wenn nicht, wird es ausgeschlossen.
4. Keine Marketingbegriffe
Keine Buzzwords, Superlative oder leeren Versprechen.
Keine emotional aufgeladenen Begriffe. Keine Werbesprache.
5. Konkrete Aussagen
Keine abstrakten Formulierungen.
Aussagen beziehen sich auf konkrete Ergebnisse, Zustände oder Abläufe.
6. Ich-Form
Kommunikation erfolgt konsequent in der Ich-Form.
Kein „wir“, kein „unser Team“, keine künstliche Vergrößerung.
7. Keine Rechtfertigungen
Keine erklärenden Absicherungen im Satz.
Aussagen stehen für sich und werden nicht relativiert.
8. Neutraler Ton
Keine Umgangssprache.
Keine Ironie.
Keine Emojis.
9. Verbindliche Sprache
Keine offenen Enden ohne Grund.
Wenn etwas nicht garantiert wird, wird das klar benannt ohne Abschwächung.
10. Technisch präzise, sprachlich einfach
Technische Inhalte werden präzise beschrieben, sprachlich jedoch simpel gehalten.
Kein unnötiger Jargon.

View File

@@ -1,64 +0,0 @@
import os
import re
showcase_dir = "public/showcase/klz-cables"
main_css = "wp-content/cache/breeze-minification/css/breeze_klz-cables-com-1-10895.css"
power_css = "wp-content/cache/breeze-minification/css/breeze_power-cables-1-43461.css"
fallback_img = "wp-content/uploads/2025/04/3.webp"
def fix_html_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
modified = False
# Fix CSS
links = re.findall(r'<link [^>]*rel=["\']stylesheet["\'][^>]*href=["\']([^"\']*)["\'][^>]*>', content)
links += re.findall(r'<link [^>]*href=["\']([^"\']*)["\'][^>]*rel=["\']stylesheet["\'][^>]*>', content)
for link in links:
file_dir = os.path.dirname(file_path)
rel_link = os.path.join(file_dir, link)
if not os.path.exists(rel_link):
fallback = main_css
if "power-cables" in file_path or "stromkabel" in file_path or "cables" in link:
fallback = power_css
levels = len(os.path.relpath(file_dir, showcase_dir).split(os.sep))
if os.path.relpath(file_dir, showcase_dir) == ".": levels = 0
new_link = ("../" * levels) + fallback
content = content.replace(link, new_link)
modified = True
# Fix Images (src)
imgs = re.findall(r'<img [^>]*src=["\']([^"\']*)["\'][^>]*>', content)
for img in imgs:
if img.startswith("data:"): continue
file_dir = os.path.dirname(file_path)
rel_img = os.path.join(file_dir, img)
if not os.path.exists(rel_img):
levels = len(os.path.relpath(file_dir, showcase_dir).split(os.sep))
if os.path.relpath(file_dir, showcase_dir) == ".": levels = 0
new_img = ("../" * levels) + fallback_img
content = content.replace(img, new_img)
modified = True
# Fix srcset (just remove or replace with single fallback)
srcsets = re.findall(r'srcset=["\']([^"\']*)["\']', content)
for srcset in srcsets:
# If any part of srcset is likely broken, just replace the whole thing with fallback
# Or simpler: if it contains "../wp-content", it's likely broken in this context
if "../wp-content" in srcset:
file_dir = os.path.dirname(file_path)
levels = len(os.path.relpath(file_dir, showcase_dir).split(os.sep))
if os.path.relpath(file_dir, showcase_dir) == ".": levels = 0
new_img = ("../" * levels) + fallback_img
content = content.replace(f'srcset="{srcset}"', f'srcset="{new_img} 800w"')
modified = True
if modified:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
for root, dirs, files in os.walk(showcase_dir):
for file in files:
if file.endswith(".html"):
fix_html_file(os.path.join(root, file))

232
package-lock.json generated
View File

@@ -19,6 +19,7 @@
"@types/react": "^19.2.8",
"@types/react-dom": "^19.2.3",
"@vercel/og": "^0.8.6",
"axios": "^1.13.4",
"canvas-confetti": "^1.9.4",
"clsx": "^2.1.1",
"crawlee": "^3.15.3",
@@ -5905,6 +5906,12 @@
"node": ">=4"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/autoprefixer": {
"version": "10.4.23",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz",
@@ -5941,6 +5948,17 @@
"postcss": "^8.1.0"
}
},
"node_modules/axios": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz",
"integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/b4a": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
@@ -6338,6 +6356,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -6702,6 +6733,18 @@
"simple-swizzle": "^0.2.2"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -7685,6 +7728,15 @@
"robust-predicates": "^3.0.2"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
@@ -7844,6 +7896,20 @@
"node": ">=10"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -7948,12 +8014,57 @@
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"license": "MIT"
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-module-lexer": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
"integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"license": "MIT"
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esbuild": {
"version": "0.25.0",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
@@ -8425,6 +8536,26 @@
}
}
},
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/fontkit": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz",
@@ -8442,6 +8573,22 @@
"unicode-trie": "^2.0.0"
}
},
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/form-data-encoder": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz",
@@ -8559,6 +8706,43 @@
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -8619,6 +8803,18 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"license": "BSD-2-Clause"
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/got": {
"version": "14.6.6",
"resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz",
@@ -8787,6 +8983,33 @@
"node": ">=8"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -9782,6 +10005,15 @@
"node": ">= 20"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mdast-util-to-hast": {
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",

View File

@@ -14,6 +14,8 @@
"test:file-examples": "tsx ./scripts/test-file-examples-comprehensive.ts",
"clone-website": "tsx ./scripts/clone-recursive.ts",
"clone-page": "tsx ./scripts/clone-page.ts",
"generate-quote": "tsx ./scripts/generate-quote.ts",
"ai-estimate": "tsx ./scripts/ai-estimate.ts",
"video:preview": "remotion preview video/index.ts",
"video:render": "remotion render video/index.ts ButtonShowcase out/button-showcase.mp4",
"video:render:contact": "remotion render video/index.ts ContactFormShowcase out/contact-showcase.mp4 --concurrency=1 --codec=h264 --crf=16 --pixel-format=yuv420p --overwrite",
@@ -32,6 +34,7 @@
"@types/react": "^19.2.8",
"@types/react-dom": "^19.2.3",
"@vercel/og": "^0.8.6",
"axios": "^1.13.4",
"canvas-confetti": "^1.9.4",
"clsx": "^2.1.1",
"crawlee": "^3.15.3",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More