feat: Refine PDF module labels and styling, and add a divider to the sitemap module.

This commit is contained in:
2026-02-03 19:41:06 +01:00
parent 3e70b00abc
commit 38f2b871b9
10 changed files with 176 additions and 151 deletions

View File

@@ -360,15 +360,16 @@ ${tone}
### OBJECTIVE: ### OBJECTIVE:
1. **briefingSummary**: Summarize the project's essence for the CUSTOMER. 1. **briefingSummary**: Summarize the project's essence for the CUSTOMER.
- FOLLOW PRINCIPLE 1 & 5: Clear, direct, no marketing fluff. - FOLLOW PRINCIPLE 1, 5 & 6: Clear, direct, no marketing fluff.
- **MIRROR TEST**: Capture unique customer "hooks" or personality (e.g., if they mention an Instagram account or a specific hobby/preference that influences the project vibe). - **TONE**: Write naturally in the Ich-Form. Avoid starting every sentence with "Ich".
- Focus 100% on the BRIEFING (TRUTH SOURCE). Ignore the CRAWL context for this narrative. - **MIRROR TEST**: Capture unique customer "hooks" or personality.
- Keep it 2-3 professional, direct sentences. - Focus 100% on the BRIEFING (TRUTH SOURCE).
2. **designVision**: A solid, grounded, and high-quality description of the look & feel. 2. **designVision**: A solid, grounded, and high-quality description of the look & feel.
- FOLLOW PRINCIPLE 1 & 3: Fact-based, professional, high density of information. - FOLLOW PRINCIPLE 1, 3 & 6: Fact-based, professional, high density of information.
- **BESPOKE ELEMENTS**: If the client mentions specific layout ideas (e.g., "Timeline", "Grid", "Industrial Tiles"), incorporate these as strategic decisions. - **TONE**: Natural Ich-Form. Focus on the execution and technical decisions.
- **NO ARROGANCE**: Eliminate all "high-end", "world-class", "dominance" language. Be humble and precise. - **BESPOKE ELEMENTS**: If the client mentions specific layout ideas, incorporate these.
- **SIMPLE & CLEAR**: Use simple German. No buzzwords. "Solid Industrial Design" instead of "Technocratic Sovereignty". - **NO ARROGANCE**: Eliminate all "high-end", "world-class" language.
- **SIMPLE & CLEAR**: Use simple German. No buzzwords.
- 3-5 sentences of deep analysis. - 3-5 sentences of deep analysis.
### OUTPUT FORMAT (Strict JSON): ### OUTPUT FORMAT (Strict JSON):
@@ -421,34 +422,38 @@ You are a Senior Solution Architect. Your goal is ABSOLUTE TRANSPARENCY for the
Each position in the quote must be perfectly justified and detailed. Each position in the quote must be perfectly justified and detailed.
### POSITION TITLES: ### POSITION TITLES:
"Basis Website Setup", "Individuelle Seiten", "System-Module", "Logik-Funktionen", "Schnittstellen (API)", "Inhaltsverwaltung (CMS)". "Basis Website Setup", "Individuelle Seiten", "System-Module", "Logik-Funktionen", "Visuelle Inszenierung", "Komplexe Interaktion", "Schnittstellen (API)", "Inhaltsverwaltung (CMS)", "Sorglos-Betrieb (Hosting)".
### MAPPING RULES (STRICTLY BASED ON PRICING.MD): ### MAPPING RULES (STRICTLY BASED ON PRICING.MD):
- **Basis Website Setup**: Includes Infrastructure, Hosting Setup, Basic SEO, Cookie-Consent (!), Design-Template. - **Basis Website Setup**: Infrastructure, Hosting, SEO-Basics, Cookie-Consent, Staging/Production.
- **System-Module (Features)**: ONLY closed data systems: [Blog, News, Products, Jobs, Cases/References, Events]. - **Individuelle Seiten**: Layout and structure for specific pages (e.g. Home, Services).
- NEVER put "Video Player", "Cookies", "Animations" here. - **System-Module (Features)**: Closed systems with data structures (Blog, News, Products, Jobs, References).
- **Logik-Funktionen**: Functional logic like: Search, Filter, Forms, PDF-Export, Multi-lang. - **Logik-Funktionen**: Pure logic (Search, Filter, Forms, PDF-Export, Multi-lang).
- **Schnittstellen (API)**: REAL Data Syncs (CRM, ERP). DO NOT include Tracking, Google Maps, or simple Video embedding here. Basic embedding is "Basis Website Setup". - **Visuelle Inszenierung**: Hero-Story, visual flows, Scroll-effects.
- **Sorglos-Betrieb (Hosting)**: Hosting & Maintenance. - **Komplexe Interaktion**: UI-experiences like Configurators or multi-step processes.
- **Schnittstellen (API)**: REAL Data Syncs (CRM, ERP, Stripe).
- **Inhaltsverwaltung (CMS)**: Setup and mapping for Headless CMS.
- **Sorglos-Betrieb (Hosting)**: Hosting, Updates, Backups.
### RULES FOR positionDescriptions (STRICT): ### RULES FOR positionDescriptions (STRICT):
1. **ZERO GENERALIZATION**: Do NOT say "Verschiedene Funktionen". 1. **NO "ICH-FORM"**: Do NOT use "Ich" or "Mein". Lead with the action or component.
2. **ITEMIZED SYNTHESIS**: Mention EVERY component selected in Pass 1. 2. **CONCISE & ITEM-BASED**: Use short, technical sentences. Focus on WHAT is delivered.
3. **HARD SPECIFICS**: Preserve technical details from the briefing (e.g., "110 kV", "HDD-Bohrtechnik", specific industry standards). 3. **ZERO GENERALIZATION**: Do NOT say "Verschiedene Funktionen".
4. **BREVITY & DENSITY**: Max 1-2 short sentences. Focus on TASKS not RESULTS. 4. **ITEMIZED SYNTHESIS**: Mention EVERY component selected in Pass 1.
5. **STYLE**: Direct, engineering-grade, no fluff. 5. **HARD SPECIFICS**: Preserve technical details from the briefing (e.g., "110 kV", "HDD-Bohrtechnik").
6. **LANGUAGE**: 100% GERMAN. 6. **STYLE**: Direct, engineering-grade, 100% GERMAN.
7. **SPECIFIC - PAGES**: For "Individuelle Seiten", list the pages as a comma-separated list. 7. **SPECIFIC - PAGES**: For "Individuelle Seiten", list the pages as a comma-separated list.
8. **SPECIFIC - API**: Video Uploads, Google Maps, and Tracking are NOT APIs. 8. **SPECIFIC - HOSTING**: Always append: "Inkl. 20GB Speicher."
9. **SPECIFIC - HOSTING**: Always append: "Inkl. 20GB Speicher. Auto-Erweiterung +10€/10GB." 9. **SPECIFIC - LOGIC**: Describe the ACTUAL logic. NEVER use generic terms.
10. **SPECIFIC - LOGIC**: Describe the ACTUAL logic. NEVER use generic terms like "Erweiterte Formulare" or "Individuelle Formular-Logik". 10. **STRICT KEYS**: Keys MUST be EXACTLY the ones defined in POSITION TITLES.
11. **STRICT KEYS**: Keys MUST be EXACTLY: "Basis Website Setup", "Individuelle Seiten", "System-Module", "Logik-Funktionen", "Schnittstellen (API)", "Inhaltsverwaltung (CMS)", "Sorglos-Betrieb (Hosting)".
### EXAMPLES (FEW-SHOT): ### EXAMPLES (FEW-SHOT):
- **BAD**: "Individuelle Seiten für die Unternehmensdarstellung." - **BAD**: "Ich entwickle die Seiten: Startseite, Leistungen, Kontakt."
- **GOOD**: "Erstellung der Seiten: Startseite (Video-Hero), Über uns (Timeline), Leistungen (110kV Montage), Kontakt." - **GOOD**: "Erstellung der Seiten: Startseite (Video-Hero), Über uns (Timeline), Leistungen, Kontakt."
- **BAD**: "Anbindung von externen Systemen." - **BAD**: "Ich binde Google Maps an."
- **GOOD**: "Native Integration von Google Maps zur Standortermittlung inkl. individueller Marker-Logik." - **GOOD**: "Native API-Integration von Google Maps mit individueller Standort-Visualisierung."
- **BAD**: "Ich programmiere Scroll-Effekte."
- **GOOD**: "Visuelle Inszenierung der Meilensteine durch Scroll-aktivierte Timeline-Elemente."
### FORBIDDEN PHRASES: ### FORBIDDEN PHRASES:
- "Erweiterte Formulare", "Verschiedene Funktionen", "Allgemeine Logik", "Optimierte Darstellung", "Individuelle Formular-Logik". - "Erweiterte Formulare", "Verschiedene Funktionen", "Allgemeine Logik", "Optimierte Darstellung", "Individuelle Formular-Logik".
@@ -478,11 +483,20 @@ You are the "Industrial Critic". Your goal is to catch quality regressions and e
Analyze the CURRENT_STATE against the BRIEFING_TRUTH. Analyze the CURRENT_STATE against the BRIEFING_TRUTH.
### CRITICAL ERROR CHECKLIST (FAIL IF FOUND): ### CRITICAL ERROR CHECKLIST (FAIL IF FOUND):
1. **Placeholder Leakage**: Catch "null", "undefined", or generic strings like "Verschiedene Funktionen", "Erweiterte Formulare", "Individuelle Formular-Logik". 1. **Placeholder Leakage**: Catch "null", "undefined", or generic strings like "Verschiedene Funktionen", "Erweiterte Formulare".
2. **Detail Loss**: The user mentioned specific terms (e.g., "110 kV", "HDD", "Timeline", "Instagram"). Are they present in the positionDescriptions or sitemap? If not, ADD THEM. 2. **Detail Loss**: The user mentioned specific terms. Are they present? If not, ADD THEM.
3. **Consistency**: Ensure the count of pages in "Individuelle Seiten" matches the sitemap pages. 3. **Consistency**: Ensure the count of pages in "Individuelle Seiten" matches the sitemap pages.
4. **Deadlines**: Ensure relative dates (e.g., "April / Mai") are resolved to the year 2026. 4. **Deadlines**: Ensure relative dates (e.g., "April / Mai") are resolved to the year 2026.
5. **Tone Drift**: Remove any marketing "fluff" or "sales-y" language. Maintain the "Industrial Design" persona. 5. **TONE & WORDING FAILURE**:
- FAIL if "Ich" or "Mein" is used in positionDescriptions.
- FAIL if "wir" or "unser" is used anywhere.
- FAIL if a sentence in briefingSummary is too long or marketing-heavy.
- FAIL if "möglicherweise", "grundsätzlich", "in der Regel" is used.
- FAIL if passive voice ("es wird") is used.
6. **MAPPING FAILURE**:
- FAIL if visual elements (Scroll-Effekte, Slider, Hover) are in "Logik-Funktionen". They MUST be in "Visuelle Inszenierung".
- FAIL if multi-step forms or calculators are in "Logik-Funktionen". They MUST be in "Komplexe Interaktion".
7. **PROMPT REWRITE**: If you find any of these errors, rewrite the field entirely to be 100% compliant.
### MISSION: ### MISSION:
Return updated fields ONLY. Specifically focus on hardening 'positionDescriptions', 'sitemap', and 'briefingSummary'. Return updated fields ONLY. Specifically focus on hardening 'positionDescriptions', 'sitemap', and 'briefingSummary'.

View File

@@ -130,6 +130,12 @@ export const pdfStyles = PDFStyleSheet.create({
borderTopWidth: 0.5, borderTopWidth: 0.5,
borderTopColor: '#cbd5e1', borderTopColor: '#cbd5e1',
}, },
divider: {
width: '100%',
height: 1,
backgroundColor: '#f1f5f9',
marginVertical: 12,
},
// Atoms // Atoms
industrialListItem: { industrialListItem: {
flexDirection: 'row', flexDirection: 'row',
@@ -219,6 +225,10 @@ export const IndustrialCard = ({ title, children, style = {} }: { title: string;
export const FoldingMarks = () => (<><PDFView style={[pdfStyles.foldingMark, { top: 297.6 }]} fixed /><PDFView style={[pdfStyles.foldingMark, { top: 420.9, width: 15 }]} fixed /><PDFView style={[pdfStyles.foldingMark, { top: 595.3 }]} fixed /></>); export const FoldingMarks = () => (<><PDFView style={[pdfStyles.foldingMark, { top: 297.6 }]} fixed /><PDFView style={[pdfStyles.foldingMark, { top: 420.9, width: 15 }]} fixed /><PDFView style={[pdfStyles.foldingMark, { top: 595.3 }]} fixed /></>);
export const Divider = ({ style = {} }: { style?: any }) => (
<PDFView style={[pdfStyles.divider, style]} />
);
export const Footer = ({ logo, companyData, bankData, showDetails = true, showPageNumber = true }: { logo?: string; companyData: any; bankData: any; showDetails?: boolean; showPageNumber?: boolean }) => ( export const Footer = ({ logo, companyData, bankData, showDetails = true, showPageNumber = true }: { logo?: string; companyData: any; bankData: any; showDetails?: boolean; showPageNumber?: boolean }) => (
<PDFView style={pdfStyles.footer}><PDFView style={pdfStyles.footerColumn}>{logo ? (<PDFImage src={logo} style={pdfStyles.footerLogo} />) : (<PDFText style={{ fontSize: 12, fontWeight: 'bold', marginBottom: 8 }}>marc mintel</PDFText>)}</PDFView>{showDetails && (<><PDFView style={pdfStyles.footerColumn}><PDFText style={pdfStyles.footerText}><PDFText style={pdfStyles.footerLabel}>{companyData.name}</PDFText>{"\n"}{companyData.address1}{"\n"}{companyData.address2}{"\n"}UST: {companyData.ustId}</PDFText></PDFView><PDFView style={[pdfStyles.footerColumn, { alignItems: 'flex-end' }]}>{showPageNumber && <PDFText style={pdfStyles.pageNumber} render={({ pageNumber, totalPages }) => `${pageNumber} / ${totalPages}`} fixed />}</PDFView></>)}{!showDetails && (<PDFView style={[pdfStyles.footerColumn, { alignItems: 'flex-end' }]}>{showPageNumber && <PDFText style={pdfStyles.pageNumber} render={({ pageNumber, totalPages }) => `${pageNumber} / ${totalPages}`} fixed />}</PDFView>)}</PDFView> <PDFView style={pdfStyles.footer}><PDFView style={pdfStyles.footerColumn}>{logo ? (<PDFImage src={logo} style={pdfStyles.footerLogo} />) : (<PDFText style={{ fontSize: 12, fontWeight: 'bold', marginBottom: 8 }}>marc mintel</PDFText>)}</PDFView>{showDetails && (<><PDFView style={pdfStyles.footerColumn}><PDFText style={pdfStyles.footerText}><PDFText style={pdfStyles.footerLabel}>{companyData.name}</PDFText>{"\n"}{companyData.address1}{"\n"}{companyData.address2}{"\n"}UST: {companyData.ustId}</PDFText></PDFView><PDFView style={[pdfStyles.footerColumn, { alignItems: 'flex-end' }]}>{showPageNumber && <PDFText style={pdfStyles.pageNumber} render={({ pageNumber, totalPages }) => `${pageNumber} / ${totalPages}`} fixed />}</PDFView></>)}{!showDetails && (<PDFView style={[pdfStyles.footerColumn, { alignItems: 'flex-end' }]}>{showPageNumber && <PDFText style={pdfStyles.pageNumber} render={({ pageNumber, totalPages }) => `${pageNumber} / ${totalPages}`} fixed />}</PDFView>)}</PDFView>
); );

View File

@@ -2,7 +2,7 @@
import * as React from 'react'; import * as React from 'react';
import { View as PDFView, Text as PDFText, StyleSheet } from '@react-pdf/renderer'; import { View as PDFView, Text as PDFText, StyleSheet } from '@react-pdf/renderer';
import { IndustrialListItem, IndustrialCard } from '../SharedUI'; import { IndustrialListItem, IndustrialCard, Divider } from '../SharedUI';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
industrialTitle: { fontSize: 24, fontWeight: 'bold', color: '#0f172a', marginBottom: 6, letterSpacing: -0.5 }, industrialTitle: { fontSize: 24, fontWeight: 'bold', color: '#0f172a', marginBottom: 6, letterSpacing: -0.5 },
@@ -27,28 +27,28 @@ export const AboutModule = () => (
<> <>
<PDFText style={styles.industrialTitle}>Über mich</PDFText> <PDFText style={styles.industrialTitle}>Über mich</PDFText>
<PDFText style={styles.industrialSubtitle}>Direkt. Sauber. Verantwortlich.</PDFText> <PDFText style={styles.industrialSubtitle}>Direkt. Sauber. Verantwortlich.</PDFText>
<Divider style={{ marginVertical: 16, backgroundColor: '#f8fafc' }} />
<PDFView style={[styles.industrialGrid2, { marginTop: 20 }]}> <PDFView style={[styles.industrialGrid2, { marginTop: 20 }]}>
<PDFView style={styles.industrialCol}> <PDFView style={styles.industrialCol}>
<PDFText style={styles.industrialTextLead}>Ich baue Websites und Systeme seit über 15 Jahren. Nicht weil ich Websites so liebe sondern weil ich es hasse, wenn Dinge nicht funktionieren.</PDFText> <PDFText style={styles.industrialTextLead}>Ich entwickle Websysteme seit 15 Jahren. Ich kenne Agenturen, Konzerne und Startups. Ich arbeite alleine, weil ich Verantwortung nicht teilen will.</PDFText>
<PDFText style={styles.industrialText}>In diesen Jahren habe ich Agenturen von innen gesehen, Konzerne erlebt und Startups aufgebaut. Ich habe gelernt, dass das Problem selten die Technik ist sondern die Zuständigkeit.</PDFText> <PDFText style={styles.industrialText}>Technik scheitert selten an Bits und Bytes. Sie scheitert an unklaren Zuständigkeiten. Ich bin Ihr einziger Ansprechpartner. Ich treffe die Entscheidungen und ich löse die Probleme.</PDFText>
<PDFView style={{ marginTop: 16 }}> <PDFView style={{ marginTop: 16 }}>
<PDFText style={[styles.industrialText, { fontWeight: 'bold' }]}>Meine Arbeitsweise:</PDFText> <PDFText style={[styles.industrialText, { fontWeight: 'bold' }]}>Mein Standard:</PDFText>
<IndustrialListItem><PDFText style={styles.industrialText}>schnell & stabil</PDFText></IndustrialListItem> <IndustrialListItem><PDFText style={styles.industrialText}>Ich liefere Code ohne Altlasten.</PDFText></IndustrialListItem>
<IndustrialListItem><PDFText style={styles.industrialText}>"boring" (im besten Sinne)</PDFText></IndustrialListItem> <IndustrialListItem><PDFText style={styles.industrialText}>Ich baue Systeme, die ohne mich laufen.</PDFText></IndustrialListItem>
<IndustrialListItem><PDFText style={styles.industrialText}>erweiterbar & wartungsarm</PDFText></IndustrialListItem> <IndustrialListItem><PDFText style={styles.industrialText}>Ich arbeite ohne Overhead und Stille Post.</PDFText></IndustrialListItem>
<IndustrialListItem><PDFText style={styles.industrialText}>unabhängig von Agenturen</PDFText></IndustrialListItem>
</PDFView> </PDFView>
</PDFView> </PDFView>
<PDFView style={styles.industrialCol}> <PDFView style={styles.industrialCol}>
<IndustrialCard title="WAS SIE BEKOMMEN"> <IndustrialCard title="ZUSTÄNDIGKEIT">
<IndustrialListItem><PDFText style={styles.industrialText}>Eine Person. Eine Verantwortung.</PDFText></IndustrialListItem> <IndustrialListItem><PDFText style={styles.industrialText}>Ich bin der einzige Entwickler.</PDFText></IndustrialListItem>
<IndustrialListItem><PDFText style={styles.industrialText}>Direkte Kommunikation ohne Stille Post.</PDFText></IndustrialListItem> <IndustrialListItem><PDFText style={styles.industrialText}>Ich antworte direkt auf technische Fragen.</PDFText></IndustrialListItem>
<IndustrialListItem><PDFText style={styles.industrialText}>Code, der Ihnen gehört.</PDFText></IndustrialListItem> <IndustrialListItem><PDFText style={styles.industrialText}>Ich garantiere die Umsetzung.</PDFText></IndustrialListItem>
</IndustrialCard> </IndustrialCard>
<IndustrialCard title="WAS SIE NICHT BEKOMMEN" style={{ backgroundColor: '#ffffff', borderColor: '#cbd5e1' }}> <IndustrialCard title="KEIN BALLAST" style={{ backgroundColor: '#ffffff', borderColor: '#cbd5e1' }}>
<PDFText style={[styles.industrialText, { color: '#94a3b8', textDecoration: 'line-through' }]}>Projektmanager</PDFText> <PDFText style={[styles.industrialText, { color: '#94a3b8' }]}>Keine Projektmanager.</PDFText>
<PDFText style={[styles.industrialText, { color: '#94a3b8', textDecoration: 'line-through' }]}>Ticket-Systeme</PDFText> <PDFText style={[styles.industrialText, { color: '#94a3b8' }]}>Keine Vertriebler.</PDFText>
<PDFText style={[styles.industrialText, { color: '#94a3b8', textDecoration: 'line-through' }]}>CMS-Drama & Update-Angst</PDFText> <PDFText style={[styles.industrialText, { color: '#94a3b8' }]}>Kein Ticket-Chaos.</PDFText>
</IndustrialCard> </IndustrialCard>
</PDFView> </PDFView>
</PDFView> </PDFView>
@@ -57,40 +57,41 @@ export const AboutModule = () => (
export const CrossSellModule = ({ state }: any) => { export const CrossSellModule = ({ state }: any) => {
const isWebsite = state.projectType === 'website'; const isWebsite = state.projectType === 'website';
const title = isWebsite ? "Das könnte Sie auch interessieren" : "Websites & Ökosysteme"; const title = isWebsite ? "Digitale Routine" : "Websites & Ökosysteme";
const subtitle = isWebsite ? "Kleine Helfer, die den Alltag entlasten" : "Digitale Visitenkarten mit Tiefe"; const subtitle = isWebsite ? "Automatisierung statt Fleißarbeit" : "Technische Infrastruktur ohne Kompromisse";
return ( return (
<> <>
<PDFText style={styles.industrialTitle}>Das könnte Sie auch interessieren</PDFText> <PDFText style={styles.industrialTitle}>{title}</PDFText>
<PDFText style={styles.industrialSubtitle}>Kleine helfer, die den alltag entlasten</PDFText> <PDFText style={styles.industrialSubtitle}>{subtitle}</PDFText>
<PDFView style={[styles.industrialGrid2, { marginTop: 12 }]}> <Divider style={{ marginVertical: 16, backgroundColor: '#f8fafc' }} />
<PDFView style={[styles.industrialGrid2, { marginTop: 12 }]} >
{isWebsite ? ( {isWebsite ? (
<> <>
<PDFView style={styles.industrialCol}> <PDFView style={styles.industrialCol}>
<PDFText style={styles.industrialTextLead}>Zusätzlich zur digitalen Präsenz fressen in vielen Unternehmen wiederkehrende Aufgaben unzählige Stunden: Daten abtippen, Formulare ausfüllen, Angebote anpassen.</PDFText> <PDFText style={styles.industrialTextLead}>Ich identifiziere manuelle Abläufe in Ihrem Unternehmen und ersetze sie durch Software. Ich eliminiere Tippfehler und Zeitfresser.</PDFText>
<PDFText style={[styles.industrialText, { fontWeight: 'bold' }]}>Das ist keine wertschöpfende Arbeit. Das ist Routine.</PDFText> <PDFText style={[styles.industrialText, { fontWeight: 'bold' }]}>Ich schaffe Zeit für wertschöpfende Arbeit. Ich digitalisiere das Chaos.</PDFText>
<PDFView style={styles.darkBox}> <PDFView style={styles.darkBox}>
<PDFText style={styles.darkTitle}>Der schnelle Check</PDFText> <PDFText style={styles.darkTitle}>Direktes Feedback</PDFText>
<PDFText style={styles.darkText}>Wenn bei Ihnen gerade etwas "von Hand gemacht wird" oder "ewig dauert" ich sage Ihnen in 1-2 Tagen, ob und wie schnell man das sinnvoll digitalisieren kann.</PDFText> <PDFText style={styles.darkText}>Ich prüfe Ihren Prozess innerhalb von 48 Stunden. Ich sage Ihnen sofort, ob eine Automatisierung wirtschaftlich sinnvoll ist.</PDFText>
</PDFView> </PDFView>
</PDFView> </PDFView>
<PDFView style={styles.industrialCol}> <PDFView style={styles.industrialCol}>
<IndustrialCard title="PDF-GENERATOREN"> <IndustrialCard title="PDF-GENERATOREN">
<PDFText style={styles.industrialText}>Kurze Eingaben via Formular fertiges Angebot/Bericht. Von 60min auf 5min reduziert.</PDFText> <PDFText style={styles.industrialText}>Ich automatisiere Angebote und Berichte. Ich reduziere den Zeitaufwand auf 5 Minuten. Ich garantiere fehlerfreie Exporte.</PDFText>
</IndustrialCard> </IndustrialCard>
<IndustrialCard title="EXCEL-AUTOMATISIERUNG"> <IndustrialCard title="EXCEL-AUTOMATISIERUNG">
<PDFText style={styles.industrialText}>Verkaufszahlen, Lagerbestände oder Kundenlisten automatisch synchronisieren und auswerten.</PDFText> <PDFText style={styles.industrialText}>Ich synchronisiere Ihre Datenbestände. Ich schaffe Echtzeit-Transparenz ohne manuelle Listenpflege.</PDFText>
</IndustrialCard> </IndustrialCard>
<IndustrialCard title="KI-SCANNER"> <IndustrialCard title="DATEN-SCANN">
<PDFText style={styles.industrialText}>Rechnungen oder handschriftliche Notizen fotografieren Daten landen direkt strukturiert in der Tabelle.</PDFText> <PDFText style={styles.industrialText}>Ich implementiere Schrifterkennung für analoge Dokumente. Ich übertrage Daten direkt in Ihre Systeme.</PDFText>
</IndustrialCard> </IndustrialCard>
</PDFView> </PDFView>
</> </>
) : ( ) : (
<PDFView style={{ width: '100%' }}> <PDFView style={{ width: '100%' }}>
<PDFText style={styles.industrialTextLead}>Neben Automatisierung baue ich komplette digitale Ökosysteme r Unternehmen, die Wert auf Qualität legen.</PDFText> <PDFText style={styles.industrialTextLead}>Ich baue die technische Basis für Ihr Unternehmen. Ich meide Baukästen und Agentur-Abhängigkeiten.</PDFText>
<PDFText style={styles.industrialText}>Keine Baukästen. Keine langsamen WordPress-Themes. Sondern maßgeschneiderte Systeme, die technisch und optisch in der ersten Liga spielen.</PDFText> <PDFText style={styles.industrialText}>Ich entwickle performante Frontends und stabile Backends. Ich liefere Code, den Sie besitzen und selbst kontrollieren.</PDFText>
</PDFView> </PDFView>
)} )}
</PDFView> </PDFView>

View File

@@ -26,10 +26,10 @@ export const BriefingModule = ({ state }: any) => (
<PDFView style={styles.section}> <PDFView style={styles.section}>
<PDFText style={styles.sectionTitle}>Kern-Informationen</PDFText> <PDFText style={styles.sectionTitle}>Kern-Informationen</PDFText>
<PDFView style={styles.configGrid}> <PDFView style={styles.configGrid}>
<PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Ansprechpartner</PDFText><PDFText style={styles.configValue}>{state.personName || "Ihr Team"}</PDFText></PDFView> <PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Ansprechpartner</PDFText><PDFText style={styles.configValue}>{state.personName || "Sie"}</PDFText></PDFView>
<PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Status Quo</PDFText><PDFText style={styles.configValue}>{state.statusQuo || (state.existingWebsite ? 'Relaunch' : 'Neuentwicklung')}</PDFText></PDFView> <PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Projektart</PDFText><PDFText style={styles.configValue}>{state.statusQuo || (state.existingWebsite ? 'Relaunch' : 'Neuentwicklung')}</PDFText></PDFView>
<PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Mitarbeiter</PDFText><PDFText style={styles.configValue}>{state.employeeCount || "—"}</PDFText></PDFView> <PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Mitarbeiter</PDFText><PDFText style={styles.configValue}>{state.employeeCount || "—"}</PDFText></PDFView>
<PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Deadline / Zeitplan</PDFText><PDFText style={styles.configValue}>{state.deadline || 'Flexibel'}</PDFText></PDFView> <PDFView style={styles.configItem}><PDFText style={styles.configLabel}>Zeitplan</PDFText><PDFText style={styles.configValue}>{state.deadline || 'Flexibel'}</PDFText></PDFView>
</PDFView> </PDFView>
</PDFView> </PDFView>
{state.designVision && ( {state.designVision && (

View File

@@ -2,7 +2,7 @@
import * as React from 'react'; import * as React from 'react';
import { View as PDFView, Text as PDFText, StyleSheet, Image as PDFImage } from '@react-pdf/renderer'; import { View as PDFView, Text as PDFText, StyleSheet, Image as PDFImage } from '@react-pdf/renderer';
import { DocumentTitle } from '../SharedUI'; import { DocumentTitle, Divider } from '../SharedUI';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
section: { marginBottom: 24 }, section: { marginBottom: 24 },
@@ -38,47 +38,46 @@ export const TransparenzModule = ({ pricing }: any) => (
<> <>
<DocumentTitle title="Preis-Transparenz & Modell" /> <DocumentTitle title="Preis-Transparenz & Modell" />
<PDFView style={styles.section}> <PDFView style={styles.section}>
<PDFText style={{ fontSize: 10, fontWeight: 'bold', color: '#000000', marginBottom: 8 }}>Grundlage für kalkulierbare Investitionen</PDFText> <PDFText style={{ fontSize: 10, fontWeight: 'bold', color: '#000000', marginBottom: 8 }}>Festpreise statt Stundenabrechnung</PDFText>
<PDFText style={{ fontSize: 8, color: '#64748b', lineHeight: 1.6, marginBottom: 24 }}>Digitaler Erfolg basiert auf Transparenz. Dieses Dokument dient als detaillierte Grundlage für Ihre Investitionsentscheidung. Es handelt sich um ein Festpreis-Modell für die beschriebenen Leistungen, um Ihnen maximale Planungssicherheit zu gewährleisten.</PDFText> <PDFText style={{ fontSize: 8, color: '#64748b', lineHeight: 1.6, marginBottom: 12 }}>Ich biete Planungssicherheit. Ich kalkuliere nach einem modularen Festpreis-System. Sie zahlen für Ergebnisse, nicht für die Zeit. Ich schließe versteckte Kosten aus.</PDFText>
<Divider style={{ backgroundColor: '#f8fafc', marginTop: 12 }} />
</PDFView> </PDFView>
<PDFView style={styles.section}> <PDFView style={styles.section}>
<PDFText style={{ fontSize: 9, color: '#0f172a', fontWeight: 'bold', marginBottom: 8 }}>Warum dieser modulare Ansatz?</PDFText>
<PDFText style={{ fontSize: 8, color: '#64748b', lineHeight: 1.6, marginBottom: 20 }}>Meine Kalkulation basiert auf einem transparenten Festpreis-System. Sie zahlen nicht für Stunden, sondern für messbare Ergebnisse. Jeder Baustein ist darauf ausgelegt, Ihre digitale Präsenz zu stärken und den ROI Ihres Projekts zu maximieren.</PDFText>
<PDFView style={styles.pricingGrid}> <PDFView style={styles.pricingGrid}>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>1. Das Fundament</PDFText> <PDFText style={styles.pricingTitle}>1. Das Fundament</PDFText>
<PDFText style={styles.pricingDesc}>Infrastruktur, technisches SEO, Analytics und ein skalierbares Setup. Der Grundstein für eine Website, die technisch perfekt performt.</PDFText> <PDFText style={styles.pricingDesc}>Ich richte die technische Infrastruktur ein. Ich installiere das Hosting, schaffe SEO-Basics und erstelle die Test-, Staging- und Live-Umgebungen.</PDFText>
<PDFText style={styles.pricingTag}>{pricing.BASE_WEBSITE?.toLocaleString('de-DE')} </PDFText> <PDFText style={styles.pricingTag}>{pricing.BASE_WEBSITE?.toLocaleString('de-DE')} </PDFText>
</PDFView> </PDFView>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>2. Individuelle Erlebnisse</PDFText> <PDFText style={styles.pricingTitle}>2. Seiten</PDFText>
<PDFText style={styles.pricingDesc}>Pro Seite entwickeln wir ein UI/UX-Konzept, das Besucher führt und überzeugt. Keine Standard-Templates, sondern maßgeschneidertes Design.</PDFText> <PDFText style={styles.pricingDesc}>Ich entwickle das individuelle Layout und die Struktur jeder Seite. Ich garantiere die korrekte Darstellung auf allen Endgeräten.</PDFText>
<PDFText style={styles.pricingTag}>{pricing.PAGE?.toLocaleString('de-DE')} / Stk</PDFText> <PDFText style={styles.pricingTag}>{pricing.PAGE?.toLocaleString('de-DE')} / Stk</PDFText>
</PDFView> </PDFView>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>3. Smarte Content-Systeme</PDFText> <PDFText style={styles.pricingTitle}>3. Features</PDFText>
<PDFText style={styles.pricingDesc}>Automatisieren Sie Ihre Kommunikation. Ob Blog, Job-Board oder Case Studies wir bauen Systeme, die sich einfach pflegen lassen.</PDFText> <PDFText style={styles.pricingDesc}>Ich erstelle abgeschlossene technische Systeme (z. B. Blog oder News). Ich definiere die Datenfelder und die Pflege-Oberflächen.</PDFText>
<PDFText style={styles.pricingTag}>{pricing.FEATURE?.toLocaleString('de-DE')} / Stk</PDFText> <PDFText style={styles.pricingTag}>{pricing.FEATURE?.toLocaleString('de-DE')} / Stk</PDFText>
</PDFView> </PDFView>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>4. Funktionalität</PDFText> <PDFText style={styles.pricingTitle}>4. Funktionen</PDFText>
<PDFText style={styles.pricingDesc}>Suche, Filter oder interaktive Formulare. Wir reduzieren Reibung und machen die Nutzung für Ihre Kunden zum Erlebnis.</PDFText> <PDFText style={styles.pricingDesc}>Ich programmiere Logik-Module wie Filter, Suchen oder Kontakt-Schnittstellen. Ich sorge für die fehlerfreie Verarbeitung Ihrer Daten.</PDFText>
<PDFText style={styles.pricingTag}>{pricing.FUNCTION?.toLocaleString('de-DE')} / Stk</PDFText> <PDFText style={styles.pricingTag}>{pricing.FUNCTION?.toLocaleString('de-DE')} / Stk</PDFText>
</PDFView> </PDFView>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>5. High-End Inszenierung</PDFText> <PDFText style={styles.pricingTitle}>5. Interaktion</PDFText>
<PDFText style={styles.pricingDesc}>Video-Integrationen, Mikro-Animationen und immersive Effekte. So heben Sie sich im Markt ab und wirken als Premium-Marke.</PDFText> <PDFText style={styles.pricingDesc}>Ich entwerfe komplexe UI-Abläufe und Konfiguratoren. Ich optimiere die Nutzerführung für maximale Abschlüsse.</PDFText>
<PDFText style={styles.pricingTag}>{pricing.COMPLEX_INTERACTION?.toLocaleString('de-DE')} / Stk</PDFText> <PDFText style={styles.pricingTag}>{pricing.COMPLEX_INTERACTION?.toLocaleString('de-DE')} / Stk</PDFText>
</PDFView> </PDFView>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>6. Autonomie & Vernetzung</PDFText> <PDFText style={styles.pricingTitle}>6. Integrationen</PDFText>
<PDFText style={styles.pricingDesc}>Nahtlose Anbindung an Headless CMS oder Ihre Bestands-APIs (CRM, ERP). Maximale Freiheit bei voller Kontrolle.</PDFText> <PDFText style={styles.pricingDesc}>Ich binde Drittsysteme wie CRM, ERP oder Stripe an. Ich richte CMS-Schnittstellen zur unabhängigen Inhaltsverwaltung ein.</PDFText>
<PDFText style={styles.pricingTag}>ab {pricing.API_INTEGRATION?.toLocaleString('de-DE')} </PDFText> <PDFText style={styles.pricingTag}>ab {pricing.API_INTEGRATION?.toLocaleString('de-DE')} </PDFText>
</PDFView> </PDFView>
<PDFView style={styles.pricingRow}> <PDFView style={styles.pricingRow}>
<PDFText style={styles.pricingTitle}>7. Sorglos-Betrieb</PDFText> <PDFText style={styles.pricingTitle}>7. Betrieb (12 Monate)</PDFText>
<PDFText style={styles.pricingDesc}>Full-Service Hosting, tägliche Backups und proaktive Sicherheitsupdates. Damit Sie sich auf Ihr Kerngeschäft konzentrieren können.</PDFText> <PDFText style={styles.pricingDesc}>Ich betreibe das Hosting, pflege Sicherheitsupdates ein und erstelle monatliche Berichte. Ich garantiere die Verfügbarkeit für ein Jahr.</PDFText>
<PDFText style={styles.pricingTag}>{pricing.HOSTING_MONTHLY?.toLocaleString('de-DE')} / Mon</PDFText> <PDFText style={styles.pricingTag}>1.440 </PDFText>
</PDFView> </PDFView>
</PDFView> </PDFView>
</PDFView> </PDFView>

View File

@@ -7,7 +7,7 @@ import { DocumentTitle } from '../SharedUI';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
table: { marginTop: 12 }, table: { marginTop: 12 },
tableHeader: { flexDirection: 'row', paddingBottom: 8, borderBottomWidth: 1, borderBottomColor: '#000000', marginBottom: 12 }, tableHeader: { flexDirection: 'row', paddingBottom: 8, borderBottomWidth: 1, borderBottomColor: '#000000', marginBottom: 12 },
tableRow: { flexDirection: 'row', paddingVertical: 6, borderBottomWidth: 1, borderBottomColor: '#eeeeee', alignItems: 'flex-start' }, tableRow: { flexDirection: 'row', paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: '#f8fafc', alignItems: 'flex-start' },
colPos: { width: '8%' }, colPos: { width: '8%' },
colDesc: { width: '62%' }, colDesc: { width: '62%' },
colQty: { width: '10%', textAlign: 'center' }, colQty: { width: '10%', textAlign: 'center' },
@@ -47,9 +47,9 @@ export const EstimationModule = ({ state, positions, totalPrice, date }: any) =>
))} ))}
</PDFView> </PDFView>
<PDFView style={styles.summaryContainer} wrap={false}> <PDFView style={styles.summaryContainer} wrap={false}>
<PDFView style={styles.summaryRow}><PDFText style={styles.summaryLabel}>Zwischensumme (Netto)</PDFText><PDFText style={styles.summaryValue}>{totalPrice.toLocaleString('de-DE')} </PDFText></PDFView> <PDFView style={styles.summaryRow}><PDFText style={styles.summaryLabel}>Nettobetrag</PDFText><PDFText style={styles.summaryValue}>{totalPrice.toLocaleString('de-DE')} </PDFText></PDFView>
<PDFView style={styles.summaryRow}><PDFText style={styles.summaryLabel}>zzgl. 19% MwSt.</PDFText><PDFText style={styles.summaryValue}>{(totalPrice * 0.19).toLocaleString('de-DE')} </PDFText></PDFView> <PDFView style={styles.summaryRow}><PDFText style={styles.summaryLabel}>Umsatzsteuer (19%)</PDFText><PDFText style={styles.summaryValue}>{(totalPrice * 0.19).toLocaleString('de-DE')} </PDFText></PDFView>
<PDFView style={styles.totalRow}><PDFText style={styles.summaryLabel}>Gesamtsumme (Brutto)</PDFText><PDFText style={[styles.summaryValue, { fontSize: 14 }]}>{(totalPrice * 1.19).toLocaleString('de-DE')} </PDFText></PDFView> <PDFView style={styles.totalRow}><PDFText style={styles.summaryLabel}>Gesamtbetrag (Brutto)</PDFText><PDFText style={[styles.summaryValue, { fontSize: 14 }]}>{(totalPrice * 1.19).toLocaleString('de-DE')} </PDFText></PDFView>
</PDFView> </PDFView>
</> </>
); );

View File

@@ -64,10 +64,10 @@ export const FrontPageModule = ({ state, headerIcon, date }: any) => (
<PDFView style={styles.titleBrandIcon}> <PDFView style={styles.titleBrandIcon}>
{headerIcon ? <PDFImage src={headerIcon} style={{ width: 40, height: 40 }} /> : <PDFText style={styles.brandIconText}>M</PDFText>} {headerIcon ? <PDFImage src={headerIcon} style={{ width: 40, height: 40 }} /> : <PDFText style={styles.brandIconText}>M</PDFText>}
</PDFView> </PDFView>
<PDFText style={styles.titleDocumentType}>Kostenschätzung & Konzept</PDFText> <PDFText style={styles.titleDocumentType}>Konzept & Kostenschätzung</PDFText>
<PDFText style={styles.titleProjectName}>{state.projectType === 'website' ? 'Digitale Präsenz' : 'Digitale Applikation'}</PDFText> <PDFText style={styles.titleProjectName}>{state.projectType === 'website' ? 'Digitale Präsenz' : 'Digitale Applikation'}</PDFText>
<PDFView style={styles.titleDivider} /> <PDFView style={styles.titleDivider} />
<PDFText style={styles.titleCustomerName}>für {state.companyName || "Ihre Projektanfrage"}</PDFText> <PDFText style={styles.titleCustomerName}>für {state.companyName || "Ihr Projekt"}</PDFText>
<PDFText style={styles.titleDate}>{date} | Marc Mintel</PDFText> <PDFText style={styles.titleDate}>{date} | Marc Mintel</PDFText>
</PDFView> </PDFView>
); );

View File

@@ -2,7 +2,7 @@
import * as React from 'react'; import * as React from 'react';
import { View as PDFView, Text as PDFText, StyleSheet } from '@react-pdf/renderer'; import { View as PDFView, Text as PDFText, StyleSheet } from '@react-pdf/renderer';
import { DocumentTitle } from '../SharedUI'; import { DocumentTitle, Divider } from '../SharedUI';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
section: { marginBottom: 24 }, section: { marginBottom: 24 },
@@ -27,6 +27,7 @@ export const SitemapModule = ({ state }: any) => (
<DocumentTitle title="Seitenstruktur" /> <DocumentTitle title="Seitenstruktur" />
<PDFView style={styles.section}> <PDFView style={styles.section}>
<PDFText style={{ fontSize: 8, color: '#64748b', lineHeight: 1.6, marginBottom: 16 }}>Die folgende Struktur bildet das Fundament für die Benutzerführung und Informationsarchitektur Ihres Projekts.</PDFText> <PDFText style={{ fontSize: 8, color: '#64748b', lineHeight: 1.6, marginBottom: 16 }}>Die folgende Struktur bildet das Fundament für die Benutzerführung und Informationsarchitektur Ihres Projekts.</PDFText>
<Divider style={{ backgroundColor: '#f8fafc', marginBottom: 20 }} />
<PDFView style={styles.sitemapTree}> <PDFView style={styles.sitemapTree}>
<PDFView style={styles.sitemapRootNode}><PDFView style={styles.sitemapRootDot} /><PDFText style={styles.sitemapRootTitle}>{state.websiteTopic || 'Digitales Ökosystem'}</PDFText></PDFView> <PDFView style={styles.sitemapRootNode}><PDFView style={styles.sitemapRootDot} /><PDFText style={styles.sitemapRootTitle}>{state.websiteTopic || 'Digitales Ökosystem'}</PDFText></PDFView>
<PDFView style={styles.sitemapMainLine} /> <PDFView style={styles.sitemapMainLine} />

View File

@@ -3,23 +3,23 @@
"requestsFailed": 0, "requestsFailed": 0,
"requestsRetries": 0, "requestsRetries": 0,
"requestsFailedPerMinute": 0, "requestsFailedPerMinute": 0,
"requestsFinishedPerMinute": 109, "requestsFinishedPerMinute": 142,
"requestMinDurationMillis": 572, "requestMinDurationMillis": 287,
"requestMaxDurationMillis": 2979, "requestMaxDurationMillis": 1881,
"requestTotalFailedDurationMillis": 0, "requestTotalFailedDurationMillis": 0,
"requestTotalFinishedDurationMillis": 15374, "requestTotalFinishedDurationMillis": 11907,
"crawlerStartedAt": "2026-02-03T17:52:01.328Z", "crawlerStartedAt": "2026-02-03T18:37:56.387Z",
"crawlerFinishedAt": "2026-02-03T17:52:05.723Z", "crawlerFinishedAt": "2026-02-03T18:37:59.745Z",
"statsPersistedAt": "2026-02-03T17:52:05.723Z", "statsPersistedAt": "2026-02-03T18:37:59.745Z",
"crawlerRuntimeMillis": 4407, "crawlerRuntimeMillis": 3370,
"crawlerLastStartTimestamp": 1770141121316, "crawlerLastStartTimestamp": 1770143876375,
"requestRetryHistogram": [ "requestRetryHistogram": [
8 8
], ],
"statsId": 0, "statsId": 0,
"requestAvgFailedDurationMillis": null, "requestAvgFailedDurationMillis": null,
"requestAvgFinishedDurationMillis": 1922, "requestAvgFinishedDurationMillis": 1488,
"requestTotalDurationMillis": 15374, "requestTotalDurationMillis": 11907,
"requestsTotal": 8, "requestsTotal": 8,
"requestsWithStatusCode": {}, "requestsWithStatusCode": {},
"errors": {}, "errors": {},

View File

@@ -3,7 +3,7 @@
"retiredSessionsCount": 0, "retiredSessionsCount": 0,
"sessions": [ "sessions": [
{ {
"id": "session_d5YGFP9eEW", "id": "session_cHq4dMfwXI",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -14,28 +14,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "0v9stk94l2has4gq4jejmkd3op", "value": "pjedkv3ggc43er8m2edt6i3gqi",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:02.702Z", "creation": "2026-02-03T18:37:57.817Z",
"lastAccessed": "2026-02-03T17:52:02.702Z" "lastAccessed": "2026-02-03T18:37:57.817Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:01.370Z", "expiresAt": "2026-02-03T19:27:56.432Z",
"createdAt": "2026-02-03T17:52:01.370Z", "createdAt": "2026-02-03T18:37:56.432Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_TkPjda1ECD", "id": "session_YbphnNZDOG",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -46,28 +46,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "tbb2pveomkq9ua23o1u71bjgv0", "value": "ja7mdd60clptutmne95nsea0f4",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:03.289Z", "creation": "2026-02-03T18:37:58.124Z",
"lastAccessed": "2026-02-03T17:52:03.289Z" "lastAccessed": "2026-02-03T18:37:58.124Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.723Z", "expiresAt": "2026-02-03T19:27:57.842Z",
"createdAt": "2026-02-03T17:52:02.723Z", "createdAt": "2026-02-03T18:37:57.842Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_yh43IUCayx", "id": "session_j4wCqQrHhE",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -78,28 +78,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "fd753scoscg0t7e1s2to2f9v7i", "value": "bl0s9u6150j1fe56qq5p81raur",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:04.196Z", "creation": "2026-02-03T18:37:59.132Z",
"lastAccessed": "2026-02-03T17:52:04.196Z" "lastAccessed": "2026-02-03T18:37:59.132Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.725Z", "expiresAt": "2026-02-03T19:27:57.844Z",
"createdAt": "2026-02-03T17:52:02.725Z", "createdAt": "2026-02-03T18:37:57.844Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_S0J5fDWVY3", "id": "session_km9kX8juX5",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -110,28 +110,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "1q9rudf8c5vv73cqq40rlfekur", "value": "7kb8am8on70lsg0498u61mjh80",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:04.653Z", "creation": "2026-02-03T18:37:59.617Z",
"lastAccessed": "2026-02-03T17:52:04.653Z" "lastAccessed": "2026-02-03T18:37:59.617Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.726Z", "expiresAt": "2026-02-03T19:27:57.845Z",
"createdAt": "2026-02-03T17:52:02.726Z", "createdAt": "2026-02-03T18:37:57.845Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_r79Eqvg1Uq", "id": "session_0LdWEWTmbd",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -142,28 +142,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "f840og9pek9msq9draobvo2u03", "value": "67m4qccak2or4g35v85dghk7lo",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:04.787Z", "creation": "2026-02-03T18:37:59.603Z",
"lastAccessed": "2026-02-03T17:52:04.787Z" "lastAccessed": "2026-02-03T18:37:59.603Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.727Z", "expiresAt": "2026-02-03T19:27:57.846Z",
"createdAt": "2026-02-03T17:52:02.727Z", "createdAt": "2026-02-03T18:37:57.846Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_TQDqR0N6bh", "id": "session_7tIybVMGvQ",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -174,28 +174,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "ad2e6u92rpajjh5vesgdqfc05b", "value": "9tvsa0um2dbqqt64us08bjpugt",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:04.891Z", "creation": "2026-02-03T18:37:59.563Z",
"lastAccessed": "2026-02-03T17:52:04.891Z" "lastAccessed": "2026-02-03T18:37:59.563Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.728Z", "expiresAt": "2026-02-03T19:27:57.847Z",
"createdAt": "2026-02-03T17:52:02.728Z", "createdAt": "2026-02-03T18:37:57.847Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_GNNTPF8Zd1", "id": "session_oFBMQoKZBM",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -206,28 +206,28 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "063l7o872dac686isv37sdf3of", "value": "4oab9p5g0sjkpg0bad165hvss5",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:05.702Z", "creation": "2026-02-03T18:37:59.725Z",
"lastAccessed": "2026-02-03T17:52:05.702Z" "lastAccessed": "2026-02-03T18:37:59.725Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.729Z", "expiresAt": "2026-02-03T19:27:57.848Z",
"createdAt": "2026-02-03T17:52:02.729Z", "createdAt": "2026-02-03T18:37:57.848Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0
}, },
{ {
"id": "session_iHMY60Kcw5", "id": "session_7tuITPzdEJ",
"cookieJar": { "cookieJar": {
"version": "tough-cookie@6.0.0", "version": "tough-cookie@6.0.0",
"storeType": "MemoryCookieStore", "storeType": "MemoryCookieStore",
@@ -238,22 +238,22 @@
"cookies": [ "cookies": [
{ {
"key": "8a164f127e89bfa6ad5b54e0547581b9", "key": "8a164f127e89bfa6ad5b54e0547581b9",
"value": "bdkvmq3k59es68k3u9h2ed5l4s", "value": "l0i9ipa1hduoo18scpeb489ian",
"domain": "www.schleicher-gruppe.de", "domain": "www.schleicher-gruppe.de",
"path": "/", "path": "/",
"secure": true, "secure": true,
"httpOnly": true, "httpOnly": true,
"hostOnly": true, "hostOnly": true,
"creation": "2026-02-03T17:52:05.563Z", "creation": "2026-02-03T18:37:59.633Z",
"lastAccessed": "2026-02-03T17:52:05.563Z" "lastAccessed": "2026-02-03T18:37:59.633Z"
} }
] ]
}, },
"userData": {}, "userData": {},
"maxErrorScore": 3, "maxErrorScore": 3,
"errorScoreDecrement": 0.5, "errorScoreDecrement": 0.5,
"expiresAt": "2026-02-03T18:42:02.733Z", "expiresAt": "2026-02-03T19:27:57.853Z",
"createdAt": "2026-02-03T17:52:02.733Z", "createdAt": "2026-02-03T18:37:57.853Z",
"usageCount": 1, "usageCount": 1,
"maxUsageCount": 50, "maxUsageCount": 50,
"errorScore": 0 "errorScore": 0