1 Commits
Author SHA1 Message Date
Lago ab41dd927e Remove public emoji UI and unify booking accent 2026-07-11 12:43:42 +02:00
8 changed files with 90 additions and 13 deletions
+10
View File
@@ -2,6 +2,16 @@
A compact field guide for anyone (human or AI) making changes to this stack. Skim this first. A compact field guide for anyone (human or AI) making changes to this stack. Skim this first.
## 0. Operating mode for agents
When working in this repository, act as an orchestrator rather than a single-threaded implementer:
1. Always make a short plan before changing code or configuration.
2. Delegate both targeted exploration and targeted implementation work to local models when available; the current default is Qwen 3.6 27B.
3. Do not treat delegation as optional for substantive work: research, code changes, refactors, and test updates should be routed through an agent first, then reviewed by the orchestrator.
4. Review delegated output critically, then apply, refine, or reject the result yourself.
5. Keep final responsibility for correctness, verification, and repo consistency in the orchestrating agent.
--- ---
## 1. The deployment model ## 1. The deployment model
+5 -1
View File
@@ -54,7 +54,11 @@
<img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" /> <img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" />
<span>MC Cars</span> <span>MC Cars</span>
</a> </a>
<button class="menu-toggle" aria-label="Menü"></button> <button class="menu-toggle" type="button" aria-label="Menü">
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
</button>
<nav class="main-nav" aria-label="Hauptnavigation"> <nav class="main-nav" aria-label="Hauptnavigation">
<a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a> <a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a>
<a href="/#stimmen" data-i18n="navReviews">Stimmen</a> <a href="/#stimmen" data-i18n="navReviews">Stimmen</a>
+5 -1
View File
@@ -51,7 +51,11 @@
<img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" /> <img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" />
<span>MC Cars</span> <span>MC Cars</span>
</a> </a>
<button class="menu-toggle" aria-label="Menü"></button> <button class="menu-toggle" type="button" aria-label="Menü">
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
</button>
<nav class="main-nav" aria-label="Hauptnavigation"> <nav class="main-nav" aria-label="Hauptnavigation">
<a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a> <a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a>
<a href="/#stimmen" data-i18n="navReviews">Stimmen</a> <a href="/#stimmen" data-i18n="navReviews">Stimmen</a>
+5 -1
View File
@@ -51,7 +51,11 @@
<img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" /> <img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" />
<span>MC Cars</span> <span>MC Cars</span>
</a> </a>
<button class="menu-toggle" aria-label="Menü"></button> <button class="menu-toggle" type="button" aria-label="Menü">
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
</button>
<nav class="main-nav" aria-label="Hauptnavigation"> <nav class="main-nav" aria-label="Hauptnavigation">
<a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a> <a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a>
<a href="/#stimmen" data-i18n="navReviews">Stimmen</a> <a href="/#stimmen" data-i18n="navReviews">Stimmen</a>
+22 -6
View File
@@ -109,7 +109,11 @@
<span>MC Cars</span> <span>MC Cars</span>
</a> </a>
<button class="menu-toggle" aria-label="Menü"></button> <button class="menu-toggle" type="button" aria-label="Menü">
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
</button>
<nav class="main-nav" aria-label="Hauptnavigation"> <nav class="main-nav" aria-label="Hauptnavigation">
<a href="#fahrzeuge" data-i18n="navCars">Fahrzeuge</a> <a href="#fahrzeuge" data-i18n="navCars">Fahrzeuge</a>
@@ -214,7 +218,7 @@
<div class="bpf-main"> <div class="bpf-main">
<!-- Step 1: Vehicle & Time --> <!-- Step 1: Vehicle & Time -->
<div class="bpf-panel" id="bpfStep1"> <div class="bpf-panel" id="bpfStep1">
<h3 class="bpf-panel-title">🚗 <span data-i18n="stepVehicleTime">Fahrzeug & Zeitraum</span></h3> <h3 class="bpf-panel-title"><span data-i18n="stepVehicleTime">Fahrzeug & Zeitraum</span></h3>
<div class="bpf-field"> <div class="bpf-field">
<label for="bpfCar" id="bpfCarLabel" data-i18n="bpfVehicle">Fahrzeug</label> <label for="bpfCar" id="bpfCarLabel" data-i18n="bpfVehicle">Fahrzeug</label>
@@ -282,7 +286,7 @@
<!-- Step 2: Contact --> <!-- Step 2: Contact -->
<div class="bpf-panel" id="bpfStep2" style="display:none;"> <div class="bpf-panel" id="bpfStep2" style="display:none;">
<h3 class="bpf-panel-title">📋 <span data-i18n="stepContact">Kontaktdaten</span></h3> <h3 class="bpf-panel-title"><span data-i18n="stepContact">Kontaktdaten</span></h3>
<div class="bpf-field"> <div class="bpf-field">
<label data-i18n="fieldName">Name</label> <label data-i18n="fieldName">Name</label>
@@ -311,13 +315,19 @@
<!-- Step 3: ID Verification --> <!-- Step 3: ID Verification -->
<div class="bpf-panel" id="bpfStep3" style="display:none;"> <div class="bpf-panel" id="bpfStep3" style="display:none;">
<h3 class="bpf-panel-title">🔐 <span data-i18n="stepVerification">ID-Verifizierung</span></h3> <h3 class="bpf-panel-title"><span data-i18n="stepVerification">ID-Verifizierung</span></h3>
<p class="muted" style="margin-bottom:1.5rem;">Bitte laden Sie einen gültigen Ausweis sowie einen aktuellen Lohnzettel / Gehaltsnachweis hoch.</p> <p class="muted" style="margin-bottom:1.5rem;">Bitte laden Sie einen gültigen Ausweis sowie einen aktuellen Lohnzettel / Gehaltsnachweis hoch.</p>
<div class="bpf-field"> <div class="bpf-field">
<label data-i18n="bpfIdUpload">Ausweis / Führerschein *</label> <label data-i18n="bpfIdUpload">Ausweis / Führerschein *</label>
<div class="bpf-upload-box" id="uploadId"> <div class="bpf-upload-box" id="uploadId">
<span class="bpf-upload-icon"></span> <span class="bpf-upload-icon" aria-hidden="true">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 17V5"></path>
<path d="M7 10l5-5 5 5"></path>
<path d="M5 19h14"></path>
</svg>
</span>
<span data-i18n="bpfClickUpload">Klicken zum Hochladen</span> <span data-i18n="bpfClickUpload">Klicken zum Hochladen</span>
<span class="muted" data-i18n="bpfUploadHint">PDF, JPG, PNG (max. 10 MB)</span> <span class="muted" data-i18n="bpfUploadHint">PDF, JPG, PNG (max. 10 MB)</span>
<input type="file" accept="image/*,.pdf" class="bpf-file-input" id="bpfFileId" /> <input type="file" accept="image/*,.pdf" class="bpf-file-input" id="bpfFileId" />
@@ -328,7 +338,13 @@
<div class="bpf-field"> <div class="bpf-field">
<label data-i18n="bpfIncomeUpload">Lohnzettel / Gehaltsnachweis (optional)</label> <label data-i18n="bpfIncomeUpload">Lohnzettel / Gehaltsnachweis (optional)</label>
<div class="bpf-upload-box" id="uploadIncome"> <div class="bpf-upload-box" id="uploadIncome">
<span class="bpf-upload-icon"></span> <span class="bpf-upload-icon" aria-hidden="true">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 17V5"></path>
<path d="M7 10l5-5 5 5"></path>
<path d="M5 19h14"></path>
</svg>
</span>
<span data-i18n="bpfClickUpload">Klicken zum Hochladen</span> <span data-i18n="bpfClickUpload">Klicken zum Hochladen</span>
<span class="muted" data-i18n="bpfUploadHint">PDF, JPG, PNG (max. 10 MB)</span> <span class="muted" data-i18n="bpfUploadHint">PDF, JPG, PNG (max. 10 MB)</span>
<input type="file" accept="image/*,.pdf" class="bpf-file-input" id="bpfFileIncome" /> <input type="file" accept="image/*,.pdf" class="bpf-file-input" id="bpfFileIncome" />
+5 -1
View File
@@ -54,7 +54,11 @@
<img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" /> <img class="logo-icon" src="/images/MC-Cars-Logo.svg" alt="MC Cars Logo" onerror="this.style.display='none'" />
<span>MC Cars</span> <span>MC Cars</span>
</a> </a>
<button class="menu-toggle" aria-label="Menü"></button> <button class="menu-toggle" type="button" aria-label="Menü">
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
<span class="menu-toggle-bar" aria-hidden="true"></span>
</button>
<nav class="main-nav" aria-label="Hauptnavigation"> <nav class="main-nav" aria-label="Hauptnavigation">
<a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a> <a href="/#fahrzeuge" data-i18n="navCars">Fahrzeuge</a>
<a href="/#stimmen" data-i18n="navReviews">Stimmen</a> <a href="/#stimmen" data-i18n="navReviews">Stimmen</a>
+28 -3
View File
@@ -189,8 +189,20 @@ section { padding: 5rem 0; }
border: 1px solid var(--line); border: 1px solid var(--line);
color: var(--text); color: var(--text);
border-radius: 8px; border-radius: 8px;
padding: 0.4rem 0.75rem; padding: 0.55rem 0.65rem;
cursor: pointer; cursor: pointer;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.22rem;
}
.menu-toggle-bar {
display: block;
width: 1rem;
height: 2px;
border-radius: 999px;
background: currentColor;
} }
/* ---------------- Buttons ---------------- */ /* ---------------- Buttons ---------------- */
@@ -806,12 +818,20 @@ select:focus, input:focus, textarea:focus {
background: var(--accent); color: #0b0c10; border-color: var(--accent); background: var(--accent); color: #0b0c10; border-color: var(--accent);
font-weight: 600; font-weight: 600;
} }
.bpf-step.done { border-color: var(--ok); color: var(--ok); } .bpf-step.done {
border-color: rgba(196, 138, 66, 0.65);
background: rgba(196, 138, 66, 0.06);
color: var(--accent-strong);
}
.bpf-step-num { .bpf-step-num {
display: inline-grid; place-items: center; display: inline-grid; place-items: center;
width: 1.5rem; height: 1.5rem; border-radius: 50%; width: 1.5rem; height: 1.5rem; border-radius: 50%;
background: rgba(255,255,255,0.1); font-size: 0.75rem; font-weight: 700; background: rgba(255,255,255,0.1); font-size: 0.75rem; font-weight: 700;
} }
.bpf-step.done .bpf-step-num {
background: rgba(196, 138, 66, 0.16);
color: var(--accent-strong);
}
.bpf-step.active .bpf-step-num { background: rgba(0,0,0,0.2); color: #0b0c10; } .bpf-step.active .bpf-step-num { background: rgba(0,0,0,0.2); color: #0b0c10; }
.bpf-step-arrow { color: var(--muted); font-size: 1.2rem; } .bpf-step-arrow { color: var(--muted); font-size: 1.2rem; }
@@ -867,7 +887,12 @@ select:focus, input:focus, textarea:focus {
min-height: 120px; min-height: 120px;
} }
.bpf-upload-box:hover { border-color: var(--accent); background: rgba(196,138,66,0.04); } .bpf-upload-box:hover { border-color: var(--accent); background: rgba(196,138,66,0.04); }
.bpf-upload-icon { font-size: 1.5rem; } .bpf-upload-icon {
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--accent-strong);
}
.bpf-file-input { position: absolute; inset: 0; opacity: 0; cursor: pointer; } .bpf-file-input { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.bpf-file-name { font-size: 0.82rem; color: var(--ok); margin-top: 0.3rem; min-height: 1.2rem; } .bpf-file-name { font-size: 0.82rem; color: var(--ok); margin-top: 0.3rem; min-height: 1.2rem; }
+10
View File
@@ -73,6 +73,10 @@ test.describe('Booking Flow End-to-End', () => {
await page.locator('#bpfNext1').click(); await page.locator('#bpfNext1').click();
await page.waitForTimeout(300); await page.waitForTimeout(300);
const completedStep = page.locator('.bpf-step[data-step="1"]');
await expect(completedStep).toHaveClass(/done/);
expect(await completedStep.evaluate((el) => getComputedStyle(el).color)).toBe('rgb(224, 165, 91)');
// Step 2: Fill contact info // Step 2: Fill contact info
await expect(page.locator('#bpfName')).toBeVisible(); await expect(page.locator('#bpfName')).toBeVisible();
await page.locator('#bpfName').fill(testNames[index]); await page.locator('#bpfName').fill(testNames[index]);
@@ -101,6 +105,12 @@ test.describe('Booking Flow End-to-End', () => {
await page.waitForLoadState('domcontentloaded'); await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000); await page.waitForTimeout(2000);
const panelTitles = await page.locator('.bpf-panel-title').allTextContents();
for (const title of panelTitles) {
expect(title).not.toMatch(/[🚗📋🔐⬆☰]/u);
}
await expect(page.locator('.bpf-upload-icon svg')).toHaveCount(2);
// Booking 1: 1 Tag // Booking 1: 1 Tag
await submitBooking(page, 'day', 0); await submitBooking(page, 'day', 0);