From 306ea0862d4c78957bef54ceecb6b243d61ec91e Mon Sep 17 00:00:00 2001 From: ANDJ Date: Sat, 11 Jul 2026 17:04:35 +0200 Subject: [PATCH] Initiale Unger Reisen Website (statisch, mobil optimiert) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - One-Page-Site nach Design-Handoff: Hero mit scroll-gesteuertem Bus, Stats, Leistungen, Foto-Band, Flotte, interaktive MapLibre-Karte, Karriere, Footer - Vollständige Handy-Optimierung: Hamburger-Menü, responsive Grids, touch-freundliche Karte - Bus-Foto lokal in assets/ Co-Authored-By: Claude Opus 4.8 --- .gitignore | 11 + README.md | 29 + assets/startslider-bus.png | Bin 0 -> 127309 bytes css/style.css | 544 ++++++ design_handoff_unger_reisen/README.md | 245 +++ .../Unger Reisen.dc.html | 466 +++++ design_handoff_unger_reisen/support.js | 1702 +++++++++++++++++ index.html | 240 +++ js/main.js | 260 +++ 9 files changed, 3497 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/startslider-bus.png create mode 100644 css/style.css create mode 100644 design_handoff_unger_reisen/README.md create mode 100644 design_handoff_unger_reisen/Unger Reisen.dc.html create mode 100644 design_handoff_unger_reisen/support.js create mode 100644 index.html create mode 100644 js/main.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f2c624d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# OS / editor +.DS_Store +Thumbs.db +*.log + +# Claude Code harness config (local) +.claude/ + +# Dependencies (falls später ein Build dazukommt) +node_modules/ +dist/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..a323e83 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Unger Reisen — Website + +Statische One-Page-Website für das Omnibusunternehmen **Unger Reisen** (Buch am Erlbach & Landshut, Niederbayern). + +## Aufbau + +``` +index.html # Markup aller Sektionen +css/style.css # Styles, Design-Tokens, Animationen, Mobile-Optimierung +js/main.js # Daten-Rendering, Scroll-Bus, Mobil-Menü, MapLibre-Karte +assets/ # Bilder (Bus-Foto) +design_handoff_unger_reisen/ # Original-Design-Handoff (Referenz) +``` + +## Lokal starten + +Beliebiger statischer Server, z. B.: + +```bash +npx serve -l 4173 . +``` + +Dann `http://localhost:4173` öffnen. + +## Hinweise + +- Fonts (Anton, Archivo) und die Karte (MapLibre GL JS + Carto „dark-matter") werden per CDN geladen. + Für DSGVO-konformen Betrieb ggf. selbst hosten. +- Rechtsseiten (Impressum, Datenschutz, AGB) sind noch als Platzhalter verlinkt. diff --git a/assets/startslider-bus.png b/assets/startslider-bus.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bfd809e1d6a29348597961eb22548810a9a334 GIT binary patch literal 127309 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
Ikp{XFqFylP@VDxW6Zvz)i(v$xOp;N)m%05LZLi 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 Note on the file format: the prototype is authored as a "Design Component" (`.dc.html`) +> with a small custom template runtime (``, `{{ }}` holes, ``, a +> `class Component extends DCLogic`). **Ignore that runtime.** It is only a prototyping +> harness. Read it as: HTML structure + inline styles + a plain JS class whose `renderVals()` +> returns the data arrays and event handlers. Reimplement with normal components and state. + +## Fidelity +**High-fidelity (hifi).** Final colors, typography, spacing, layout, motion, and copy are all +intentional. Recreate pixel-closely, but re-express the styling in the target system +(e.g. Tailwind classes / styled-components) rather than copying inline styles. + +--- + +## Design Tokens + +### Colors +| Token | Value | Usage | +|---|---|---| +| `--red` (accent) | `#C8102E` | Primary accent. Marquee, stat band, buttons, pins, route, section eyebrows. (Prototype default is `#C8102E`; original palette also used `#E4002B`. Curated options: `#E4002B`, `#D21F1F`, `#C8102E`, `#EE3524`.) | +| `--ink` / `--night` | `#0a0e18` | Page background (near-black navy) | +| `--paper` | `#f4f0e8` | Light text on dark; light card backgrounds | +| Card surface | `#111725` | Dark cards (services, fleet, contact) | +| Card surface (hover) | `#151d30` | Service card hover | +| Map panel bg | `#0d1420` | Map container background | +| `--line` | `rgba(255,255,255,.14)` | Hairline borders/dividers on dark | +| `--muted` | `#8b93a7` | Muted body text | +| Body text on dark | `#c8cdda` | Hero paragraph, secondary text | +| Sub-label text | `#9aa6c0` | Pin sublabels, small caps labels | +| Footer legal text | `#5a6274` / `#40485a` | Footer links & disclaimer | +| Input border (light card) | `#d3ccbe` | Form inputs (note: forms were later removed) | + +### Typography +- **Display font:** `Anton` (Google Fonts). Used for all big headlines, stat numbers, logo, + pin labels. Always `text-transform: uppercase`, `letter-spacing: .5px`, `line-height: .9`. +- **Body/UI font:** `Archivo` (Google Fonts), weights 400–900. Body, nav, labels, buttons. +- Google Fonts import: + `https://fonts.googleapis.com/css2?family=Anton&family=Archivo:wght@400;500;600;700;800;900&display=swap` +- Type scale (fluid, `clamp`): + - Hero H1: `clamp(64px, 13vw, 190px)` + - Section H2 (Anton): `clamp(40px, 7vw, 90–96px)` + - Stat numbers: `clamp(44px, 6vw, 72px)` + - Fleet seat number: `40px` + - Body: `16–19px`; nav/labels/buttons: `12–15px` uppercase, `letter-spacing 1–3px` + +### Spacing / Layout +- Section vertical padding: `clamp(70px, 10vw, 130px)`; horizontal: `clamp(20px, 5vw, 60px)` +- Card grid gaps: `16px`; large column gaps: `clamp(30px, 5vw, 70px)` +- Border radius: mostly **sharp** (0–2px). Buttons are rectangular (no pill). Only pins/dots are circular. + +### Shadows +- Bus body: `0 18px 30px -10px rgba(0,0,0,.6)` +- Map pin dot: `0 0 0 5px 40, 0 2px 6px rgba(0,0,0,.55)` (red glow ring + drop) +- Buttons lift on hover via `transform: translateY(-2px)` (transition `.2s ease`) + +--- + +## Screens / Views +Single continuous page. Sections top→bottom: + +### 1. Top Marquee +- Full-width red (`--red`) bar, white uppercase text scrolling right→left infinitely. +- Content, `/`-separated: "Reisebusse mit Fahrer / Firmen & Vereine / Tagesfahrten / + Transfers rund um die Uhr / Niederbayern". +- Implementation: duplicate the track and animate `translateX(0 → -50%)` linear infinite (~24s). +- `font-size:13px; font-weight:700; letter-spacing:2px`. + +### 2. Nav (fixed/absolute over hero) +- Left: logo — "UNGER" (Anton, 26px, white) + "REISEN" (Archivo, 11px, letter-spacing 5px, red). +- Right: links (uppercase, 13.5px, weight 600) — Leistungen, Flotte, Karriere, Kontakt — + plus a red CTA button **"Jetzt anrufen"** (`href="tel:+498762896"`). +- Sits at `top:39px` (below marquee) when at page top; **on scroll >40px** it solidifies: + background `rgba(10,14,24,.9)`, `backdrop-filter: blur(12px)`, moves to `top:0`, reduces + padding, adds a hairline bottom shadow. Transition `.35s ease`. + +### 3. Hero (`#top`, min-height:88vh) +- Dark radial-gradient bg: `radial-gradient(120% 90% at 70% 10%, #182238 0%, #0a0e18 60%)`. +- Eyebrow: red rule + "OMNIBUSUNTERNEHMEN SEIT GENERATIONEN". +- H1 (Anton): "Wir bringen / Sie **weiter.**" — "weiter." in red. +- Paragraph (max 520px, `#c8cdda`): "Moderne Reisebusse mit erfahrenen Fahrern — für Firmen, + Vereine und Gruppen in ganz Bayern und Europa." +- Buttons: red **"Jetzt anrufen →"** (`tel:`), outline **"Unsere Flotte"** (`#flotte`). +- **Driving scene** (bottom of hero, `height: clamp(280px,42vh,420px)`, pinned bottom): + - Layered parallax: far scenery hills, near hills, a dark road strip, red-dashed lane stripes. + Each is a repeating radial/linear-gradient background animated via `background-position-x` + at different speeds (far slow ~40s, near ~18s, stripes fast ~.5s) — evokes forward motion. + - **The bus**: CSS-drawn side view — cream body with red mid-stripe, windshield, window strip, + "UNGER REISEN" wordmark, door, two spinning wheels (`@keyframes wheel` rotate, .5s linear), + a pulsing headlight glow. Bus width `clamp(380px,52vw,620px)`. + - **Scroll-driven horizontal motion:** on scroll, compute + `hp = clamp(scrollY / (heroHeight * 0.9), 0, 1)` and set the bus + `transform: translate(x, bob)` where `x` interpolates from just off-left + (`-busWidth*0.30`) to `sceneWidth - busWidth*0.70`, and `bob = sin(now/380)*4` (gentle + vertical bob; 0 if reduced-motion). Driven by `requestAnimationFrame`. + - Respect `prefers-reduced-motion`: disable marquee, hills, stripes, wheel spin, and bob. + +### 4. Stat Band +- Full-width red bg, white. Auto-fit grid of 4 stats (Anton big number + label): + - **2** — Standorte in Bayern + - **60+** — Sitzplätze pro Reisebus + - **24/7** — Für Sie erreichbar + - **∞** — Ziele in ganz Europa + +### 5. Leistungen (`#leistungen`) +- Header row: H2 "Das fahren wir für Sie" + intro paragraph. +- Auto-fit grid (min 260px) of 4 dark cards (`#111725`, hairline border, min-height 260px). + Each: big red Anton index (01–04), title (uppercase 22px/800), description. Hover: bg + `#151d30` + `translateY(-4px)`. + 1. **Busanmietung** — "Moderne Reisebusse mit Fahrer — flexibel für einzelne Fahrten oder mehrtägige Touren." + 2. **Firmenreisen** — "Betriebsausflüge, Tagungen und Events. Ihr Team sicher und entspannt am Ziel." + 3. **Vereinsfahrten** — "Ausflüge, Feste und Sportevents — komfortabel für die ganze Gruppe." + 4. **Transfers** — "Flughafen-, Hotel- und Event-Transfers. Pünktlich und rund um die Uhr planbar." + +### 6. Real Photo Band +- Full-bleed band (`height: clamp(320px,48vw,520px)`) with a background bus photo, dark + gradient overlay (`rgba(10,14,24,.55 → .75)`), centered Anton headline: + "Komfort, auf den Sie sich verlassen können." +- Prototype image URL: `https://www.unger-reisen.de/wp-content/uploads/startslider-bus-1024x366.png` + (external; **replace with a licensed/owned photo** — see Assets). Has an `onerror` fallback + to a gradient. + +### 7. Flotte (`#flotte`) +- Eyebrow "Unsere Flotte" + H2 "Für jede Gruppengröße". +- Auto-fit grid (min 280px) of 3 cards. Card header row: name (Anton 30px) on the left, and a + right-aligned inline seat unit: small "bis" + big red number (Anton 40px) + small "Sitze". + Body: description + tag chips (hairline-bordered pills of text). + - **Reisebus** — bis **60** — "Der Große für lange Strecken und große Gruppen — voll ausgestattet." Tags: Klimaanlage, WC, Bordküche, WLAN. + - **Midibus** — bis **35** — "Wendig und komfortabel — ideal für mittlere Gruppen und Tagestouren." Tags: Klimaanlage, Komfortbestuhlung. + - **Kleinbus** — bis **19** — "Persönlich und flexibel für kleine Gruppen, Transfers und Sonderfahrten." Tags: Flexibel, Wendig. + +### 8. Kontakt + Karte (`#kontakt`) +- Eyebrow "So erreichen Sie uns" + H2 "Zwei Standorte. / Ein Anruf." +- Two-column grid (`1.35fr / .95fr`, stack on mobile): + - **Left — interactive map** (panel `min-height:440px`, bg `#0d1420`, hairline border): + - **MapLibre GL JS** map, dark Carto style + `https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json`. + - Two custom HTML markers (`anchor:'bottom'`): a label box (Anton title + Archivo sub) above + a circular dot with a red glow ring. + - **Landshut** — "Niederlassung" — coord `[12.1508, 48.5449]` — dot red, ring white. + - **Buch a. Erlbach** — "Hauptsitz" — coord `[12.0517, 48.4703]` — dot white, ring red. + - **Route line** between the two coords: a GeoJSON `LineString`, red, `width 3`, + `line-dasharray [1.6,1.4]`, plus a wider low-opacity casing (`width 9, opacity .18`). + - `NavigationControl` (zoom + compass) top-right. **`scrollZoom` disabled** so page scroll + isn't hijacked. `fitBounds` to both points with padding `{top:96,bottom:70,left:70,right:70}`, + `maxZoom:12`. Call `map.resize()` shortly after load. + - Overlay chip (bottom-left, `pointer-events:none`): "**15 km** zwischen den Standorten". + - Requires `maplibre-gl` (JS + CSS). In prototype loaded from + `https://unpkg.com/maplibre-gl@4.7.1/...`; in a real app install the npm package. + Map tiles load **online** — expected for a live site. + - **Right — contact card** (`#111725`, hairline border): + - **Hauptsitz** (white dot / red ring): "Eichenstr. 7+9, Vatersdorf · 84172 Buch am Erlbach" + · Tel. +49 (0)8762 / 896 + - divider + - **Niederlassung** (red dot / white ring): "Jenaer Straße 4a · 84034 Landshut" + · Tel. +49 (0)871 / 96 58 586-0 + - CTAs pinned to bottom: red **"Jetzt anrufen"** (`tel:+498762896`) + outline + **"info@unger-reisen.de"** (`mailto:`). + +### 9. Karriere (`#karriere`) +- Bordered band. Left: eyebrow "Karriere & Jobs", H2 "Fahren Sie mit uns", paragraph + "Wir suchen Busfahrer:innen, Begleitpersonen und Sachbearbeiter:innen — steigen Sie ein." +- Right: white button **"Offene Stellen →"** (`mailto:info@unger-reisen.de`). + +### 10. Footer +- 3-column grid on `--ink`, hairline top border: + - Logo + blurb: "Günter Unger e.K. — Omnibus- & Verkehrsunternehmen. Reisen erster Klasse aus Niederbayern." + - **Hauptsitz**: Eichenstr. 7+9, Vatersdorf · 84172 Buch am Erlbach · Tel. +49 (0)8762 / 896 + - **Niederlassung**: Jenaer Straße 4a · 84034 Landshut · Tel. +49 (0)871 / 96 58 586-0 +- Bottom bar: "© 2026 Unger Reisen · Alle Rechte vorbehalten" + Impressum / Datenschutz / AGB. +- Small disclaimer: "Konzept-Entwurf für ein mögliches Website-Redesign · noch nicht offiziell." + (**Remove this line** once it's the real site.) + +--- + +## Interactions & Behavior +- **Nav solidify on scroll** (>40px) — see §2. +- **Scroll-driven bus** across hero — see §3. Core formula: + `hp = clamp(scrollY/(heroHeight*0.9),0,1)`; `x = lerp(-busW*0.3, sceneW - busW*0.7, hp)`. +- **Reveal on scroll**: elements marked for reveal start `opacity:0; translateY(28px)` and + animate to `opacity:1; none` via IntersectionObserver (threshold ~0.12), transition + `.7s cubic-bezier(.2,.7,.2,1)`. Provide a safety fallback that reveals everything after ~2.5s. +- **Marquee / hills / stripes / wheels**: continuous CSS keyframe loops (see §1, §3). +- **Buttons/links hover**: `translateY(-2px)` or border color → white. +- **Map**: pan/zoom via drag + control buttons; scroll-zoom disabled; compass resets bearing. +- **Smooth anchor scrolling** for nav links (`scroll-behavior: smooth`) to `#leistungen`, + `#flotte`, `#karriere`, `#kontakt`, `#top`. +- **Reduced motion**: disable all decorative animation; keep static end states. + +## State Management +Minimal — the page is largely presentational. In a component framework you need: +- Nav-scrolled boolean (or do it with a scroll listener / IntersectionObserver on a sentinel). +- The bus `x`/`bob` transform driven by a scroll + rAF loop (a ref + effect). +- Reveal-on-scroll via IntersectionObserver (a small reusable hook/directive). +- The MapLibre instance held in a ref; init in mount effect, `remove()` on unmount. +- Data arrays for **stats**, **services**, **fleet** (see copy above) — render with `.map`. +- (An earlier version had a controlled contact form; it was **removed** in favor of call/email CTAs. + If you re-add a form, wire name/contact/dest/date/pax/message + a submitted state.) + +## Configurable knobs (from the prototype's props) +- **accentColor** — the red. Default `#C8102E`; options `#E4002B / #D21F1F / #C8102E / #EE3524`. + Applied as a CSS variable `--red`; also recolors the map route on change. Expose as a theme + token in the real app. + +## Assets +- **Fonts:** Anton + Archivo (Google Fonts) — see import above. +- **Icons:** none required (all visuals are CSS/SVG-drawn or map markers). The original shadcn + map component referenced `lucide-react` for map control icons — use those (Plus, Minus, Locate, + Maximize, Compass/X) if you build custom controls; MapLibre's built-in `NavigationControl` + needs no icon assets. +- **Bus hero photo (§6):** placeholder points at unger-reisen.de. **Replace with an owned or + licensed photo** of an Unger coach. If you need a temporary stand-in, use a royalty-free coach + photo (e.g. an Unsplash coach/bus image) and swap later. +- **Map:** MapLibre GL JS + CSS (npm `maplibre-gl`), Carto "dark-matter" style (free, attribution + required — keep the attribution control). Tiles fetched at runtime. +- **No logo file** — the "UNGER REISEN" logo is set in type (Anton + Archivo). + +## Files +- `Unger Reisen.dc.html` — the full design prototype (all sections, styles, and JS behavior). + Read the `` body for structure/markup, the ` + + +
+ + +
+
+ + Reisebusse mit Fahrer/ + Firmen & Vereine/ + Tagesfahrten/ + Transfers rund um die Uhr/ + Niederbayern/ + + +
+
+ + + + + +
+ + +
+
+ Omnibusunternehmen seit Generationen +
+

+ Wir bringen
Sie weiter. +

+

+ Moderne Reisebusse mit erfahrenen Fahrern — für Firmen, Vereine und Gruppen in ganz Bayern und Europa. +

+ +
+ + + +
+ + +
+
+ +
+
{{ s.big }}
+
{{ s.label }}
+
+
+
+
+ + +
+
+

Das fahren wir für Sie

+

Ein Ansprechpartner, ein Bus, alles organisiert — von der Anfrage bis zur Rückfahrt.

+
+
+ +
+
{{ s.no }}
+

{{ s.title }}

+

{{ s.desc }}

+
+
+
+
+ + +
+ Unger Reisen Reisebus +
+
+
Komfort, auf den Sie sich verlassen können.
+
+
+ + +
+
+
Unsere Flotte
+

Für jede Gruppengröße

+
+
+ +
+
+

{{ f.name }}

+
+ bis + {{ f.seats }} + Sitze +
+
+
+

{{ f.desc }}

+
+ + {{ t }} + +
+
+
+
+
+
+ + +
+
+
So erreichen Sie uns
+

Zwei Standorte.
Ein Anruf.

+
+ +
+ + +
+
+
+ 15 km + zwischen
den Standorten
+
+
+ + +
+
+
+
+
Hauptsitz
+
Eichenstr. 7+9, Vatersdorf
84172 Buch am Erlbach
+ Tel. +49 (0)8762 / 896 +
+
+ +
+ +
+
+
+
Niederlassung
+
Jenaer Straße 4a
84034 Landshut
+ Tel. +49 (0)871 / 96 58 586-0 +
+
+ + +
+
+
+ + +
+
+
+
Karriere & Jobs
+

Fahren Sie mit uns

+

Wir suchen Busfahrer:innen, Begleitpersonen und Sachbearbeiter:innen — steigen Sie ein.

+
+ Offene Stellen → +
+
+ + +
+
+
+
+ UNGER + REISEN +
+

Günter Unger e.K. — Omnibus- & Verkehrsunternehmen. Reisen erster Klasse aus Niederbayern.

+
+
+
Hauptsitz
+ Eichenstr. 7+9, Vatersdorf
84172 Buch am Erlbach
Tel. +49 (0)8762 / 896 +
+
+
Niederlassung
+ Jenaer Straße 4a
84034 Landshut
Tel. +49 (0)871 / 96 58 586-0 +
+
+
+
© 2026 Unger Reisen · Alle Rechte vorbehalten
+ +
+
Konzept-Entwurf für ein mögliches Website-Redesign · noch nicht offiziell.
+
+
+
+ + + diff --git a/design_handoff_unger_reisen/support.js b/design_handoff_unger_reisen/support.js new file mode 100644 index 0000000..2a774eb --- /dev/null +++ b/design_handoff_unger_reisen/support.js @@ -0,0 +1,1702 @@ +// GENERATED from dc-runtime/src/*.ts — do not edit. Rebuild with `cd dc-runtime && bun run build`. +"use strict"; +(() => { + var __defProp = Object.defineProperty; + var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; + var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + + // src/react.ts + function getReact() { + const R = window.React; + if (!R) throw new Error("dc-runtime: window.React is not available yet"); + return R; + } + function getReactDOM() { + const RD = window.ReactDOM; + if (!RD) throw new Error("dc-runtime: window.ReactDOM is not available yet"); + return RD; + } + var h = ((...args) => getReact().createElement( + ...args + )); + + // src/parse.ts + function parseDcDocument(doc) { + const dc = doc.querySelector("x-dc"); + if (!dc) return null; + const scriptEl = doc.querySelector("script[data-dc-script]"); + const { props, preview } = parseDataProps( + scriptEl?.getAttribute("data-props") ?? null + ); + return { + template: dc.innerHTML, + js: scriptEl ? scriptEl.textContent || "" : "", + props, + preview + }; + } + function parseDcText(src) { + const openMatch = /]*)?>/.exec(src); + if (!openMatch) return null; + const close = src.lastIndexOf(""); + if (close === -1 || close < openMatch.index) return null; + const template = src.slice(openMatch.index + openMatch[0].length, close); + const doc = new DOMParser().parseFromString(src, "text/html"); + const scriptEl = doc.querySelector("script[data-dc-script]"); + const { props, preview } = parseDataProps( + scriptEl?.getAttribute("data-props") ?? null + ); + return { + template, + js: scriptEl ? scriptEl.textContent || "" : "", + props, + preview + }; + } + function parseDataProps(raw) { + if (!raw) return { props: null, preview: null }; + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + return { props: null, preview: null }; + } + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + return { props: null, preview: null }; + } + const obj = parsed; + const preview = obj.$preview && typeof obj.$preview === "object" ? obj.$preview : null; + const rest = {}; + for (const k of Object.keys(obj)) { + if (k[0] !== "$") rest[k] = obj[k]; + } + return { props: Object.keys(rest).length ? rest : null, preview }; + } + function dcNameFromPath(pathname) { + let p = pathname || ""; + try { + p = decodeURIComponent(p); + } catch { + } + const base = p.split("/").pop() || "Root"; + return base.replace(/\.dc\.html$/, "").replace(/\.html?$/, "") || "Root"; + } + + // src/boot.ts + var BASE_CSS = ` + .sc-placeholder{background:color-mix(in srgb,currentColor 8%,transparent); + border:1px solid color-mix(in srgb,currentColor 50%,transparent); + border-radius:2px;box-sizing:border-box;overflow:hidden} + @keyframes sc-shine{0%{background-position:100% 50%}100%{background-position:0% 50%}} + html.sc-dc-streaming .sc-placeholder, + html.sc-dc-streaming .sc-interp.sc-missing{position:relative; + background:color-mix(in srgb,currentColor 5%,transparent); + border-color:transparent} + html.sc-dc-streaming .sc-placeholder::before, + html.sc-dc-streaming .sc-interp.sc-missing::before{content:''; + position:absolute;inset:0;pointer-events:none; + background:linear-gradient(90deg,rgba(217,119,87,0) 25%,rgba(247,225,211,.95) 37%,rgba(217,119,87,0) 63%); + background-size:400% 100%;animation:sc-shine 1.4s ease infinite} + html.sc-dc-streaming .sc-placeholder:nth-child(n+9 of .sc-placeholder)::before, + html.sc-dc-streaming .sc-interp.sc-missing:nth-child(n+9 of .sc-interp.sc-missing)::before{animation:none; + background:color-mix(in srgb,currentColor 8%,transparent)} + .sc-placeholder-error{padding:4px 8px;font:11px/1.4 ui-monospace,monospace; + color:color-mix(in srgb,currentColor 70%,transparent);word-break:break-word} + .sc-interp.sc-missing{display:inline-block;width:2em;height:1em;overflow:hidden; + vertical-align:text-bottom;background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5); + border-radius:2px;box-sizing:border-box;color:transparent; + user-select:none} + .sc-interp.sc-unresolved{font-family:ui-monospace,monospace;font-size:.85em; + color:color-mix(in srgb,currentColor 50%,transparent); + background:color-mix(in srgb,currentColor 10%,transparent);border-radius:3px; + padding:0 3px} + .sc-host.sc-has-error{position:relative} + .sc-logic-error{position:absolute;top:8px;left:8px;z-index:2147483647;max-width:60ch; + padding:6px 10px;background:#b00020;color:#fff;font:12px/1.4 ui-monospace,monospace; + border-radius:4px;white-space:pre-wrap;pointer-events:none} + /* Mirrors PRINT_BASELINE_CSS in apps/web deck-stage-export.ts \u2014 keep both + in sync until dc-runtime regains a build step. */ + @media print { + @page { margin: 0.5cm; } + figure, table { break-inside: avoid; } + #dc-root, #dc-root > .sc-host { height: auto; } + *, *::before, *::after { + print-color-adjust: exact; -webkit-print-color-adjust: exact; + backdrop-filter: none !important; -webkit-backdrop-filter: none !important; + animation-delay: -99s !important; animation-duration: .001s !important; + animation-iteration-count: 1 !important; animation-fill-mode: both !important; + animation-play-state: running !important; transition-duration: 0s !important; + } + } + `; + var FULL_PAGE_CSS = "html,body{height:100%;margin:0}#dc-root,#dc-root>.sc-host{height:100%}"; + function rootNameForDocument(doc, loc) { + let bootPath = loc.pathname || ""; + if (!/\.dc\.html?$/i.test(safeDecode(bootPath))) { + try { + bootPath = new URL(doc.baseURI || "/").pathname; + } catch { + } + } + return dcNameFromPath(bootPath); + } + function safeDecode(s) { + try { + return decodeURIComponent(s); + } catch { + return s; + } + } + function boot(runtime, doc = document) { + const parsed = parseDcDocument(doc); + if (!parsed) return null; + const React = getReact(); + const rootName = rootNameForDocument(doc, location); + runtime.markFetched(rootName); + runtime.setRootName(rootName); + runtime.adoptParsed(rootName, parsed); + if (!window.__resources) { + fetch(location.href).then((res) => res.ok ? res.text() : "").then((t) => { + const raw = t ? parseDcText(t) : null; + if (raw?.template) runtime.updateHtml(rootName, raw.template); + }).catch(() => { + }); + } + const dc = doc.querySelector("x-dc"); + const hostEl = doc.createElement("div"); + hostEl.id = "dc-root"; + dc.replaceWith(hostEl); + if (!parsed.preview) { + const s = doc.createElement("style"); + s.textContent = FULL_PAGE_CSS; + doc.head.appendChild(s); + } + const Root = runtime.getDC(rootName); + const entry = runtime.registry.get(rootName); + function StandaloneRoot() { + const [, setTick] = React.useState(0); + React.useEffect(() => { + const sub = () => setTick((n) => n + 1); + entry.subs.add(sub); + return () => { + entry.subs.delete(sub); + }; + }, []); + const defaults = React.useMemo(() => { + const d = {}; + for (const k in entry.propsMeta || {}) { + const v = entry.propsMeta?.[k]?.default; + if (v !== void 0) d[k] = v; + } + return d; + }, [entry.propsMeta]); + return h(Root, { ...defaults, ...entry.propOverrides || {} }); + } + const ReactDOM = getReactDOM(); + if (ReactDOM.createRoot) + ReactDOM.createRoot(hostEl).render(h(StandaloneRoot)); + else ReactDOM.render(h(StandaloneRoot), hostEl); + return rootName; + } + + // src/expr.ts + var IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*/; + var NUMBER_RE = /^-?\d+(\.\d+)?$/; + function resolve(vals, src) { + const expr = String(src).trim(); + if (!expr) return void 0; + if (expr[0] === "(" && expr[expr.length - 1] === ")" && parensWrapWhole(expr)) { + return resolve(vals, expr.slice(1, -1)); + } + const eq = findTopLevelEquality(expr); + if (eq) { + const lv = resolve(vals, expr.slice(0, eq.index)); + const rv = resolve(vals, expr.slice(eq.index + eq.op.length)); + switch (eq.op) { + case "===": + return lv === rv; + case "!==": + return lv !== rv; + case "==": + return lv == rv; + default: + return lv != rv; + } + } + if (expr[0] === "!") return !resolve(vals, expr.slice(1)); + if (expr === "true") return true; + if (expr === "false") return false; + if (expr === "null") return null; + if (expr === "undefined") return void 0; + if (NUMBER_RE.test(expr)) return Number(expr); + if (expr.length >= 2 && (expr[0] === '"' || expr[0] === "'") && expr[expr.length - 1] === expr[0]) { + return expr.slice(1, -1); + } + return resolvePath(vals, expr); + } + function parensWrapWhole(expr) { + let depth = 0; + for (let i = 0; i < expr.length - 1; i++) { + if (expr[i] === "(") depth++; + else if (expr[i] === ")") { + depth--; + if (depth === 0) return false; + } + } + return true; + } + function findTopLevelEquality(expr) { + let depth = 0; + for (let i = 0; i < expr.length; i++) { + const c = expr[i]; + if (c === "[" || c === "(") depth++; + else if (c === "]" || c === ")") depth--; + else if (depth === 0 && (c === "=" || c === "!") && expr[i + 1] === "=") { + if (i > 0 && (expr[i - 1] === "=" || expr[i - 1] === "!")) continue; + if (!expr.slice(0, i).trim()) continue; + const op = expr[i + 2] === "=" ? c + "==" : c + "="; + return { index: i, op }; + } + } + return null; + } + function resolvePath(vals, expr) { + const head = expr.match(IDENT_RE); + if (!head) return void 0; + let cur = vals == null ? void 0 : vals[head[0]]; + let i = head[0].length; + while (i < expr.length) { + if (expr[i] === ".") { + const m = expr.slice(i + 1).match(IDENT_RE) || expr.slice(i + 1).match(/^\d+/); + if (!m) return void 0; + cur = cur == null ? void 0 : cur[m[0]]; + i += 1 + m[0].length; + } else if (expr[i] === "[") { + let depth = 1; + let j = i + 1; + while (j < expr.length && depth > 0) { + if (expr[j] === "[") depth++; + else if (expr[j] === "]") { + depth--; + if (depth === 0) break; + } + j++; + } + if (depth !== 0) return void 0; + const key = resolve(vals, expr.slice(i + 1, j)); + cur = cur == null ? void 0 : cur[key]; + i = j + 1; + } else { + return void 0; + } + } + return cur; + } + + // src/encode.ts + var CAMEL_ATTR = "sc-camel-"; + var INLINE_TEXT_TAGS = new Set( + "a abbr b bdi bdo br cite code del dfn em i ins kbd mark q s samp small span strike strong sub sup u var wbr".split( + " " + ) + ); + var RAW_WRAP = { + select: "sc-raw-select", + table: "sc-raw-table", + tbody: "sc-raw-tbody", + thead: "sc-raw-thead", + tfoot: "sc-raw-tfoot", + tr: "sc-raw-tr", + td: "sc-raw-td", + th: "sc-raw-th", + caption: "sc-raw-caption" + }; + var RAW_UNWRAP = Object.fromEntries( + Object.entries(RAW_WRAP).map(([k, v]) => [v, k]) + ); + var EVENT_MAP = { + onclick: "onClick", + onchange: "onChange", + oninput: "onInput", + onsubmit: "onSubmit", + onkeydown: "onKeyDown", + onkeyup: "onKeyUp", + onkeypress: "onKeyPress", + onmousedown: "onMouseDown", + onmouseup: "onMouseUp", + onmouseenter: "onMouseEnter", + onmouseleave: "onMouseLeave", + onfocus: "onFocus", + onblur: "onBlur", + ondoubleclick: "onDoubleClick", + oncontextmenu: "onContextMenu" + }; + var ATTRS = `(?:[^>"']|"[^"]*"|'[^']*')*`; + var IMPORT_SELF_CLOSE_RE = new RegExp( + "<(x-import|dc-import)(" + ATTRS + ")/>", + "gi" + ); + var CAMEL_ATTR_RE = /(\s)([a-z]+[A-Z][A-Za-z0-9]*)(\s*=)/g; + function encodeCase(html) { + html = html.replace( + IMPORT_SELF_CLOSE_RE, + (_, t, a) => "<" + t + a + ">" + ); + html = html.replace(/)/gi, "/gi, ""); + html = html.replace( + CAMEL_ATTR_RE, + (_, sp, name, eq) => sp + CAMEL_ATTR + name.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()) + eq + ); + for (const [real, alias] of Object.entries(RAW_WRAP)) { + html = html.replace( + new RegExp("(])", "gi"), + "$1" + alias + ); + } + return html; + } + function kebabToCamel(s) { + return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase()); + } + function cssToObj(css) { + const o = {}; + for (const decl of css.split(";")) { + const i = decl.indexOf(":"); + if (i < 0) continue; + const prop = decl.slice(0, i).trim(); + o[prop.startsWith("--") ? prop : kebabToCamel(prop)] = decl.slice(i + 1).trim(); + } + return o; + } + function compileAttr(raw) { + const whole = raw.match(/^\s*\{\{([\s\S]+?)\}\}\s*$/); + if (whole) { + const path = whole[1]; + return (vals) => resolve(vals, path); + } + if (raw.includes("{{")) { + const parts = raw.split(/\{\{([\s\S]+?)\}\}/g); + return (vals) => parts.map((s, i) => i & 1 ? resolve(vals, s) ?? "" : s).join(""); + } + return () => raw; + } + + // src/compile.ts + function collectProps(node, kind, host) { + const propGetters = []; + const pseudoClasses = []; + let hintSize = null; + for (const { name, value } of [...node.attributes]) { + if (name === "sc-name" || name === "data-dc-tpl") continue; + let key = name; + if (key.startsWith(CAMEL_ATTR)) + key = kebabToCamel(key.slice(CAMEL_ATTR.length)); + if (key === "hint-size") { + hintSize = value; + continue; + } + if (key.startsWith("style-")) { + pseudoClasses.push(host.pseudoClass(key.slice(6), value)); + continue; + } + if (kind !== "dom") { + if (key.includes("-") && !(kind === "x-import" && (key.startsWith("aria-") || key.startsWith("data-")))) + key = kebabToCamel(key); + } else { + if (key === "class") key = "className"; + else if (key === "for") key = "htmlFor"; + else if (key.startsWith("on")) + key = EVENT_MAP[key] || "on" + key[2].toUpperCase() + key.slice(3); + } + propGetters.push([key, compileAttr(value)]); + } + return { propGetters, pseudoClasses, hintSize }; + } + var HOST_STYLE_PROPS = /* @__PURE__ */ new Set([ + "position", + "left", + "right", + "top", + "bottom", + "inset", + "width", + "height", + "z-index", + "transform" + ]); + function hostPositionStyle(style) { + const all = typeof style === "string" ? cssToObj(style) : style != null && typeof style === "object" ? style : null; + if (!all) return void 0; + const out = {}; + for (const [k, v] of Object.entries(all)) { + const kebab = k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()); + if (HOST_STYLE_PROPS.has(kebab)) out[k] = v; + } + return Object.keys(out).length ? out : void 0; + } + function compileTemplate(html, host) { + const tpl = document.createElement("template"); + //! nosemgrep: direct-inner-html-assignment + tpl.innerHTML = encodeCase(html); + let tplN = 0; + (function stamp(node) { + if (node.nodeType === Node.ELEMENT_NODE) { + node.setAttribute("data-dc-tpl", String(tplN++)); + } + for (const c of node.childNodes) stamp(c); + })(tpl.content); + const builders = walkChildren(tpl.content, host); + const render = ((vals, ctx) => builders.map((b, i) => b(vals || {}, ctx, i))); + render.__annotated = tpl.innerHTML; + return render; + } + function walkChildren(node, host) { + return [...node.childNodes].map((c) => walk(c, host)).filter((b) => b != null); + } + function walk(node, host) { + if (node.nodeType === Node.TEXT_NODE) return walkText(node); + if (node.nodeType !== Node.ELEMENT_NODE) return null; + const el = node; + const tag = el.tagName.toLowerCase(); + if (tag === "sc-for") return walkFor(el, host); + if (tag === "sc-if") return walkIf(el, host); + if (tag === "x-import") return walkXImport(el, host); + if (tag === "sc-helmet") return host.helmet(el); + if (tag === "dc-import") return walkComponent(el, host); + return walkElement(el, host); + } + var warnedHoles = /* @__PURE__ */ new Set(); + function warnUnresolved(ctx, what) { + const key = (ctx?.__name || "?") + "\0" + what; + if (warnedHoles.has(key)) return; + warnedHoles.add(key); + console.warn("[dc-runtime] " + (ctx?.__name || "template") + ": " + what); + } + function walkText(node) { + const txt = node.nodeValue ?? ""; + if (!txt.includes("{{")) { + if (!txt.trim() && !txt.includes(" ")) return null; + return () => txt; + } + const parts = txt.split(/\{\{([\s\S]+?)\}\}/g); + return (vals, ctx, key) => h( + getReact().Fragment, + { key }, + ...parts.map((p, i) => { + if (!(i & 1)) return p; + const v = resolve(vals, p); + if (v === void 0) { + if (!ctx?.__streamingNow) { + if (document.body?.hasAttribute("data-dc-editor-on")) { + return h( + "span", + { key: i, className: "sc-interp sc-unresolved" }, + "{{ " + p.trim() + " }}" + ); + } + warnUnresolved( + ctx, + "{{ " + p.trim() + " }} never resolved \u2014 rendered as empty" + ); + return null; + } + return h( + "span", + { key: i, className: "sc-interp sc-missing" }, + p.trim() + ); + } + if (getReact().isValidElement(v) || Array.isArray(v)) { + return h(getReact().Fragment, { key: i }, v); + } + if (v === null || typeof v === "boolean") return null; + return h("span", { key: i, className: "sc-interp" }, String(v)); + }) + ); + } + function walkFor(el, host) { + const listGet = compileAttr(el.getAttribute("list") || ""); + const asName = el.getAttribute("as") || "item"; + const hintN = parseInt(el.getAttribute("hint-placeholder-count") || "0", 10); + const kids = walkChildren(el, host); + const listSrc = el.getAttribute("list") || ""; + return (vals, ctx, key) => { + let list = listGet(vals); + if (!Array.isArray(list)) { + if (!ctx?.__streamingNow) { + if (list !== void 0 && list !== null) { + warnUnresolved( + ctx, + 'sc-for list="' + listSrc + '" is not an array (' + typeof list + ")" + ); + } + list = []; + } else { + list = hintN > 0 ? Array(hintN).fill(void 0) : []; + } + } + return h( + getReact().Fragment, + { key }, + list.map((item, i) => { + const sub = { ...vals, [asName]: item, $index: i }; + return h( + getReact().Fragment, + { key: i }, + kids.map((b, j) => b(sub, ctx, j)) + ); + }) + ); + }; + } + function walkIf(el, host) { + const valGet = compileAttr(el.getAttribute("value") || ""); + const hintRaw = el.getAttribute("hint-placeholder-val"); + const hintGet = hintRaw != null ? compileAttr(hintRaw) : null; + const kids = walkChildren(el, host); + return (vals, ctx, key) => { + let v = valGet(vals); + if (v === void 0 && hintGet && ctx?.__streamingNow) v = hintGet(vals); + return v ? h( + getReact().Fragment, + { key }, + kids.map((b, j) => b(vals, ctx, j)) + ) : null; + }; + } + function walkComponent(el, host) { + const name = el.getAttribute("name") || el.getAttribute("component") || ""; + el.removeAttribute("name"); + el.removeAttribute("component"); + const tplId = el.getAttribute("data-dc-tpl"); + const styleRaw = el.getAttribute("style"); + el.removeAttribute("style"); + const styleGet = styleRaw != null ? compileAttr(styleRaw) : null; + const { propGetters, hintSize } = collectProps(el, "dc-import", host); + const kids = walkChildren(el, host); + return (vals, ctx, key) => { + const props = { + key, + __hintSize: hintSize, + __tplId: tplId, + __hostStyle: styleGet ? hostPositionStyle(styleGet(vals)) : void 0 + }; + for (const [k, g] of propGetters) { + const v = g(vals); + if (k === "dcProps") { + if (v && typeof v === "object") Object.assign(props, v); + continue; + } + props[k] = v; + } + if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j)); + return h(host.component(name), props); + }; + } + function walkXImport(el, host) { + const globalNameGet = compileAttr( + el.getAttribute("component-from-global-scope") || "" + ); + const exportNameGet = compileAttr( + el.getAttribute("component") || el.getAttribute("name") || "" + ); + const fromRaw = el.getAttribute("from") || (el.getAttribute("component-from-global-scope") ? "" : el.getAttribute("src") || el.getAttribute("import") || ""); + const urls = fromRaw.trim() ? fromRaw.trim().split(/\s+/) : []; + const url = urls.length ? urls[urls.length - 1] : ""; + const kindOf = (u) => /\.(jsx|tsx)(\?|#|$)/i.test(u) ? "jsx" : "js"; + const tplId = el.getAttribute("data-dc-tpl"); + const styleRaw = el.getAttribute("style"); + el.removeAttribute("style"); + const styleGet = styleRaw != null ? compileAttr(styleRaw) : null; + const wrap = tplId != null || styleGet != null; + const { propGetters, hintSize } = collectProps(el, "x-import", host); + const hasContent = el.children.length > 0 || !!(el.textContent || "").trim(); + const kids = hasContent ? walkChildren(el, host) : []; + const urlBindable = fromRaw.includes("{{"); + if (urls.length && !urlBindable) { + let prev; + for (const u of urls) prev = host.loadExternal(kindOf(u), u, prev); + } + const evalName = (g, vals) => { + const v = g(vals); + const s = v == null ? "" : String(v); + return s.includes("{{") ? "" : s; + }; + return (vals, ctx, key) => { + const globalName = evalName(globalNameGet, vals); + const name = globalName || evalName(exportNameGet, vals); + const C = !name || urlBindable ? null : globalName ? host.resolveExternalGlobal(url, globalName) : host.resolveExternal(url, name); + const hostStyle = styleGet ? hostPositionStyle(styleGet(vals)) : void 0; + const wrapper = wrap ? { + key, + className: "sc-host-x", + "data-dc-tpl": tplId, + style: hostStyle || { display: "contents" } + } : null; + if (!C) { + const error = urlBindable ? "x-import `from` cannot contain {{ \u2026 }} \u2014 module URLs are resolved at parse time; use a literal URL" : host.resolveExternalError(url, name); + const ph = host.placeholder({ + key: wrapper ? void 0 : key, + name, + hintSize, + error + }); + return wrapper ? h("div", wrapper, ph) : ph; + } + const props = wrapper ? {} : { key }; + let unresolvedHole = false; + for (const [k, g] of propGetters) { + if (k === "component" || k === "componentFromGlobalScope" || k === "from") { + continue; + } + const v = g(vals); + if (v === void 0) unresolvedHole = true; + if (k === "dcProps") { + if (v && typeof v === "object") Object.assign(props, v); + continue; + } + props[k] = v; + } + if (unresolvedHole && ctx?.__htmlStreamingNow) { + const ph = host.placeholder({ + key: wrapper ? void 0 : key, + name, + hintSize, + error: null + }); + return wrapper ? h("div", wrapper, ph) : ph; + } + if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j)); + return wrapper ? h("div", wrapper, h(C, props)) : h(C, props); + }; + } + function contentKey(el) { + const clone = el.cloneNode(true); + for (const d of clone.querySelectorAll("*")) { + while (d.attributes.length) d.removeAttribute(d.attributes[0].name); + } + const s = clone.innerHTML; + let h2 = 5381; + for (let i = 0; i < s.length; i++) h2 = (h2 << 5) + h2 + s.charCodeAt(i) | 0; + return s.length + "." + (h2 >>> 0).toString(36); + } + var NEVER_CONTENT_KEYED = new Set( + "script style textarea option title select canvas iframe video audio".split( + " " + ) + ); + var NOT_INLINE_SELECTOR = ":not(" + [...INLINE_TEXT_TAGS].join(",") + ")"; + function walkElement(el, host) { + const realTag = RAW_UNWRAP[el.localName] || el.localName; + const tplId = el.getAttribute("data-dc-tpl"); + const inlineOnly = el.childNodes.length > 0 && !NEVER_CONTENT_KEYED.has(realTag) && el.querySelector(NOT_INLINE_SELECTOR) === null; + const keySuffix = inlineOnly ? "|" + contentKey(el) : ""; + const { propGetters, pseudoClasses } = collectProps(el, "dom", host); + const kids = walkChildren(el, host); + return (vals, ctx, key) => { + const props = { + key: key + keySuffix, + "data-dc-tpl": tplId + }; + for (const [k, g] of propGetters) { + let v = g(vals); + if (k === "style" && typeof v === "string") v = cssToObj(v); + if ((k === "value" || k === "checked") && v === void 0) { + v = k === "checked" ? false : ""; + } + props[k] = v; + } + if (pseudoClasses.length) { + props.className = [props.className, ...pseudoClasses].filter(Boolean).join(" "); + } + return h(realTag, props, ...kids.map((b, j) => b(vals, ctx, j))); + }; + } + + // src/logic.ts + var StreamableLogic = class { + constructor(props) { + __publicField(this, "props"); + __publicField(this, "state", {}); + /** Back-pointer to the wrapper component, installed after construction. */ + __publicField(this, "__host"); + this.props = props || {}; + } + setState(update, cb) { + this.__host && this.__host.__setLogicState(update, cb); + } + forceUpdate() { + this.__host && this.__host.forceUpdate(); + } + componentDidMount() { + } + componentDidUpdate(_prevProps) { + } + componentWillUnmount() { + } + /** The flat object the template renders against (merged over props). */ + renderVals() { + return {}; + } + }; + function evalDcLogic(src) { + //! nosemgrep: eval-and-function-constructor + const fn = new Function( + "DCLogic", + "StreamableLogic", + "React", + src + '\n;return (typeof Component!=="undefined"&&Component)||undefined;' + ); + return fn(StreamableLogic, StreamableLogic, getReact()); + } + + // src/component.ts + function shallowEqual(a, b) { + if (!b) return false; + const ak = Object.keys(a).filter((k) => k !== "children"); + const bk = Object.keys(b).filter((k) => k !== "children"); + if (ak.length !== bk.length) return false; + for (const k of ak) if (a[k] !== b[k]) return false; + return true; + } + function Placeholder({ + name, + hintSize, + streaming, + error + }) { + const [w, hgt] = (hintSize || "100%,60px").split(","); + return h( + "div", + { + className: "sc-placeholder" + (streaming ? " sc-streaming" : ""), + style: { width: w.trim(), height: hgt && hgt.trim() }, + title: name + }, + error ? h( + "div", + { className: "sc-placeholder-error" }, + (name ? name + ": " : "") + error + ) : null + ); + } + function hintToMin(hint) { + if (!hint) return void 0; + const [w, hgt] = hint.split(","); + return { minWidth: w.trim(), minHeight: hgt && hgt.trim() }; + } + function createComponentFactory(registry, ensureFetched) { + const React = getReact(); + const AncestorContext = React.createContext([]); + class StreamableComponent extends React.Component { + constructor(props) { + super(props); + __publicField(this, "__name"); + __publicField(this, "__sub"); + __publicField(this, "__needsDidMount", false); + /** Snapshot of the registry's streaming flags taken at render time — + * builders read it off the RenderCtx (this) to pick placeholder vs + * render-nothing for unresolved values. */ + __publicField(this, "__streamingNow", false); + __publicField(this, "__htmlStreamingNow", false); + /** When a construct throws, remember the (class, registry.ver, props) + * triple so render-time reconcile doesn't re-attempt it on every parent + * re-render. A registry bump (new class, template, external module + * resolving via bumpAll) changes `ver` and breaks the memo so an + * env-dependent constructor can self-heal. */ + __publicField(this, "__failedLogic", null); + __publicField(this, "__failedUserProps", null); + __publicField(this, "__failedVer", -1); + /** Per-instance constructor error — kept here (not on the registry entry) + * so one instance's successful construct can't hide a sibling's failure, + * and a construct can never wipe an eval error `updateJs` recorded on + * `r.logicError`. */ + __publicField(this, "__ctorError", null); + __publicField(this, "logic"); + this.__name = props.__name; + this.state = { __v: 0, __err: null }; + this.__sub = () => { + if (this.state.__err) this.setState({ __err: null }); + this.forceUpdate(); + }; + this.__makeLogic(registry.get(this.__name).Logic, null); + ensureFetched(this.__name); + } + /** Error-boundary hook: a render crash anywhere in this DC's subtree + * (its own template, an x-import'd component, a child DC without its + * own deeper boundary) lands here instead of unmounting the page. */ + static getDerivedStateFromError(e) { + return { __err: e instanceof Error && e.message ? e.message : String(e) }; + } + componentDidCatch(e, info) { + console.error( + "[dc-runtime] render error in <" + this.__name + ">:", + e, + info?.componentStack || "" + ); + } + /** Instantiate the logic class (or the no-op base) and adopt `prevState` + * over its initial state — used both at mount and on hot-swap. */ + __makeLogic(Logic, prevState) { + const L = Logic || StreamableLogic; + try { + this.logic = new L(this.__userProps()); + this.__failedLogic = null; + this.__failedUserProps = null; + this.__ctorError = null; + } catch (e) { + console.error(e); + this.__failedLogic = Logic; + this.__failedUserProps = this.__userProps(); + this.__failedVer = registry.get(this.__name).ver; + this.__ctorError = this.__name + ": " + (e instanceof Error && e.message ? e.message : String(e)); + this.logic = new StreamableLogic( + this.__userProps() + ); + } + this.logic.__host = this; + if (prevState) + this.logic.state = { ...this.logic.state || {}, ...prevState }; + } + /** The props the author's logic + template see — internal __-prefixed + * wiring stripped. */ + __userProps() { + const { __name, __hintSize, __tplId, __hostStyle, ...rest } = this.props; + return rest; + } + __setLogicState(update, cb) { + const prev = this.logic.state; + const patch = typeof update === "function" ? update(prev) : update; + this.logic.state = { ...prev, ...patch }; + this.setState((s) => ({ __v: s.__v + 1 }), cb); + } + /** Swap the logic instance when the registry's Logic class changed + * (streaming completion, hot reload). State carries over; didMount + * re-fires after the swap commits so refs exist. */ + __reconcileLogic() { + const r = registry.get(this.__name); + const Next = r.Logic; + const Cur = this.logic.constructor; + if (Next === Cur || !Next && Cur === StreamableLogic || Next === this.__failedLogic && r.ver === this.__failedVer && shallowEqual(this.__userProps(), this.__failedUserProps)) { + return; + } + if (!this.__needsDidMount) { + try { + this.logic.componentWillUnmount(); + } catch (e) { + console.error(e); + } + } + this.__makeLogic(Next, this.logic.state); + this.__needsDidMount = true; + } + componentDidMount() { + registry.get(this.__name).subs.add(this.__sub); + try { + this.logic.componentDidMount(); + } catch (e) { + console.error(e); + } + } + componentDidUpdate(prevProps) { + this.logic.props = this.__userProps(); + if (this.__needsDidMount) { + if (this.state.__err || !registry.get(this.__name).tpl) return; + this.__needsDidMount = false; + try { + this.logic.componentDidMount(); + } catch (e) { + console.error(e); + } + } else { + try { + this.logic.componentDidUpdate(prevProps); + } catch (e) { + console.error(e); + } + } + } + componentWillUnmount() { + registry.get(this.__name).subs.delete(this.__sub); + if (!this.__needsDidMount) { + try { + this.logic.componentWillUnmount(); + } catch (e) { + console.error(e); + } + } + } + render() { + const r = registry.get(this.__name); + const cls = "sc-host" + (r.htmlStreaming ? " sc-streaming-html" : "") + (r.jsStreaming ? " sc-streaming-js" : ""); + const hintStyle = r.htmlStreaming ? hintToMin(this.props.__hintSize) : void 0; + const hostStyle = this.props.__hostStyle || hintStyle ? { ...hintStyle || {}, ...this.props.__hostStyle || {} } : void 0; + const hostBase = { + className: cls, + style: hostStyle, + "data-sc-name": this.__name, + "data-dc-tpl": this.props.__tplId + }; + const chain = Array.isArray(this.context) ? this.context : []; + if (chain.includes(this.__name)) { + const cycle = [ + ...chain.slice(chain.indexOf(this.__name)), + this.__name + ].join(" \u2192 "); + return h( + "div", + { ...hostBase, className: cls + " sc-has-error" }, + h(Placeholder, { + name: this.__name, + hintSize: this.props.__hintSize, + error: "circular import: " + cycle + }) + ); + } + if (this.state.__err) { + return h( + "div", + { ...hostBase, className: cls + " sc-has-error" }, + h( + "div", + { className: "sc-logic-error", "data-omelette-chrome": "" }, + this.__name + ": " + this.state.__err + ), + h(Placeholder, { + name: this.__name, + hintSize: this.props.__hintSize, + error: this.state.__err + }) + ); + } + this.__reconcileLogic(); + if (!r.tpl) { + return h( + "div", + hostBase, + h(Placeholder, { name: this.__name, hintSize: this.props.__hintSize }) + ); + } + const userProps = this.__userProps(); + this.logic.props = userProps; + let vals = userProps; + let renderErr = r.logicError || this.__ctorError; + try { + vals = { ...userProps, ...this.logic.renderVals() || {} }; + } catch (e) { + console.error(e); + renderErr = this.__name + ".renderVals(): " + (e instanceof Error && e.message ? e.message : String(e)); + } + this.__streamingNow = !!(r.htmlStreaming || r.jsStreaming); + this.__htmlStreamingNow = !!r.htmlStreaming; + return h( + "div", + { ...hostBase, className: cls + (renderErr ? " sc-has-error" : "") }, + renderErr && h( + "div", + { className: "sc-logic-error", "data-omelette-chrome": "" }, + renderErr + ), + h( + AncestorContext.Provider, + { value: [...chain, this.__name] }, + r.tpl(vals, this) + ) + ); + } + } + __publicField(StreamableComponent, "contextType", AncestorContext); + const named = /* @__PURE__ */ new Map(); + function getDC(name) { + const hit = named.get(name); + if (hit) return hit; + function Dispatcher(p) { + const [, setTick] = React.useState(0); + React.useEffect(() => { + const sub = () => setTick((n) => n + 1); + registry.get(name).subs.add(sub); + return () => { + registry.get(name).subs.delete(sub); + }; + }, []); + ensureFetched(name); + return h(StreamableComponent, { ...p, __name: name }); + } + Dispatcher.displayName = name; + named.set(name, Dispatcher); + return Dispatcher; + } + return { + getDC, + StreamableComponent + }; + } + + // src/cdn.ts + var REACT_URL = "https://unpkg.com/react@18.3.1/umd/react.production.min.js"; + var REACT_SRI = "sha384-DGyLxAyjq0f9SPpVevD6IgztCFlnMF6oW/XQGmfe+IsZ8TqEiDrcHkMLKI6fiB/Z"; + var REACT_DOM_URL = "https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"; + var REACT_DOM_SRI = "sha384-gTGxhz21lVGYNMcdJOyq01Edg0jhn/c22nsx0kyqP0TxaV5WVdsSH1fSDUf5YJj1"; + var BABEL_URL = "https://unpkg.com/@babel/standalone@7.29.0/babel.min.js"; + var BABEL_SRI = "sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y"; + function cdnScriptFor(url, sri) { + const res = window.__resources; + const v = res ? res[url] : void 0; + return typeof v === "string" && v ? { src: v } : { src: url, integrity: sri }; + } + + // src/external.ts + var isCustomElementName = (n) => !n.includes(".") && n.includes("-"); + function isRenderableType(g) { + if (typeof g === "function") return !isElementClass(g); + return typeof g === "object" && g !== null && typeof g.$$typeof === "symbol"; + } + function resolveDottedPath(root, name) { + let cur = root; + for (const seg of name.split(".")) { + if (cur == null) return void 0; + cur = cur[seg]; + } + return cur; + } + var GLOBAL_POLL_INTERVAL_MS = 50; + var GLOBAL_POLL_TIMEOUT_MS = 3e4; + function createExternalModules(onResolved) { + const cache = /* @__PURE__ */ new Map(); + let babelLoading = null; + const reportedMissing = /* @__PURE__ */ new Map(); + const polling = /* @__PURE__ */ new Set(); + function ensureBabel() { + if (window.Babel) return Promise.resolve(); + if (babelLoading) return babelLoading; + const babel = cdnScriptFor(BABEL_URL, BABEL_SRI); + babelLoading = new Promise((res, rej) => { + const s = document.createElement("script"); + s.src = babel.src; + if (babel.integrity) { + s.integrity = babel.integrity; + s.crossOrigin = "anonymous"; + } + s.onload = () => res(); + s.onerror = rej; + document.head.appendChild(s); + }); + return babelLoading; + } + const pending = /* @__PURE__ */ new Map(); + function load(kind, url, after) { + const existing = pending.get(url); + if (existing) return existing; + cache.set(url, null); + console.info("[dc-runtime] x-import: loading", url, "(" + kind + ")"); + const ready = Promise.all([ + kind === "jsx" ? ensureBabel() : Promise.resolve(), + after ?? Promise.resolve() + ]); + const p = ready.then(() => fetch(url)).then((r) => { + if (!r.ok) throw new Error("HTTP " + r.status); + return r.text(); + }).then((src) => { + const code = kind === "jsx" ? window.Babel.transform(src, { + filename: url, + presets: ["react", "typescript"] + }).code : src; + const module = { exports: {} }; + const before = new Set(Object.keys(window)); + //! nosemgrep: eval-and-function-constructor + new Function("React", "module", "exports", "require", code)( + getReact(), + module, + module.exports, + () => ({}) + ); + const globals = {}; + for (const k of Object.keys(window)) { + if (!before.has(k) && typeof window[k] === "function") { + globals[k] = window[k]; + } + } + cache.set(url, { mod: module.exports, globals }); + console.info( + "[dc-runtime] x-import: loaded", + url, + "\u2014 exports:", + Object.keys(module.exports), + "window globals:", + Object.keys(globals) + ); + onResolved(); + }).catch((e) => { + cache.set(url, { + mod: {}, + globals: {}, + error: "failed to load: " + (e instanceof Error && e.message ? e.message : String(e)) + }); + console.error( + "[dc-runtime] x-import: FAILED to load", + url, + "(" + kind + ")", + e + ); + onResolved(); + }); + pending.set(url, p); + return p; + } + function resolve2(url, name) { + const entry = cache.get(url); + if (!entry) return null; + const { mod, globals } = entry; + const C = mod && mod[name] || globals && globals[name] || typeof window !== "undefined" && window[name] || mod && mod.default; + if (typeof C === "function") return C; + const key = url + "\0" + name; + if (!reportedMissing.has(key)) { + reportedMissing.set( + key, + entry.error || 'no export named "' + name + '" (has: ' + Object.keys(mod).join(", ") + ")" + ); + console.error( + "[dc-runtime] x-import: module", + url, + "loaded but has no component named", + JSON.stringify(name), + "\u2014 available exports:", + Object.keys(mod), + "window globals:", + Object.keys(globals), + ". The module must `module.exports = {" + name + "}` or set `window." + name + "`." + ); + } + return null; + } + function waitForGlobal(name) { + if (polling.has(name)) return; + polling.add(name); + const started = Date.now(); + const isCE = isCustomElementName(name); + const tick = () => { + const found = isCE ? customElements.get(name) : isRenderableType(resolveDottedPath(window, name)); + if (found) { + polling.delete(name); + onResolved(); + return; + } + if (Date.now() - started >= GLOBAL_POLL_TIMEOUT_MS) { + console.warn( + "[dc-runtime] x-import: global", + JSON.stringify(name), + "never appeared on window after " + GLOBAL_POLL_TIMEOUT_MS + "ms" + ); + return; + } + setTimeout(tick, GLOBAL_POLL_INTERVAL_MS); + }; + setTimeout(tick, GLOBAL_POLL_INTERVAL_MS); + } + function resolveGlobal(url, name) { + const isCE = isCustomElementName(name); + if (!url) { + if (isCE) { + if (customElements.get(name)) return name; + waitForGlobal(name); + return null; + } + const g2 = resolveDottedPath(window, name); + if (isRenderableType(g2)) return g2; + waitForGlobal(name); + return null; + } + const entry = cache.get(url); + if (!entry) return null; + if (isCE && customElements.get(name)) return name; + const g = entry.globals[name] ?? resolveDottedPath(window, name); + if (isRenderableType(g)) return g; + if (name.includes(".")) return null; + const key = url + "\0global\0" + name; + if (!reportedMissing.has(key)) { + reportedMissing.set(key, null); + if (isCE && !customElements.get(name)) { + console.warn( + "[dc-runtime] x-import:", + url, + "loaded but no custom element", + JSON.stringify(name), + "is registered and window." + name + " is not a function \u2014 rendering <" + name + "> as an unknown element." + ); + } + } + return name; + } + function getError(url, name) { + const entry = cache.get(url); + if (entry?.error) return entry.error; + return reportedMissing.get(url + "\0" + name) || null; + } + return { load, resolve: resolve2, resolveGlobal, getError }; + } + function isElementClass(g) { + try { + return typeof g === "function" && typeof HTMLElement !== "undefined" && g.prototype instanceof HTMLElement; + } catch { + return false; + } + } + + // src/atomics.ts + var ATOMIC_CSS = ( + // layout + ".fx{display:flex}.col{display:flex;flex-direction:column}.grid{display:grid}.ac{align-items:center}.jc{justify-content:center}.jb{justify-content:space-between}.f1{flex:1}.noshrink{flex-shrink:0}.wrap{flex-wrap:wrap}.fw5{font-weight:500}.fw6{font-weight:600}.fw7{font-weight:700}.fw8{font-weight:800}.fs11{font-size:11px}.fs12{font-size:12px}.fs13{font-size:13px}.fs14{font-size:14px}.fs15{font-size:15px}.fs16{font-size:16px}.fs20{font-size:20px}.fs22{font-size:22px}.upper{text-transform:uppercase}.tc{text-align:center}.nowrap{white-space:nowrap}.gap8{gap:8px}.gap10{gap:10px}.gap12{gap:12px}.gap16{gap:16px}.gap24{gap:24px}.m0{margin:0}.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}.mb8{margin-bottom:8px}.mb12{margin-bottom:12px}.mb16{margin-bottom:16px}.posrel{position:relative}.posabs{position:absolute}.round{border-radius:50%}.ohide{overflow:hidden}.bbox{box-sizing:border-box}.pointer{cursor:pointer}.w100{width:100%}.b0{border:none}" + ); + + // src/helmet.ts + var DESIGN_DOC_MODE_RE = /]*\bname\s*=\s*["']design_doc_mode["'][^>]*\b(?:content|value)\s*=\s*["'](\w+)["']/i; + var CANVAS_BG_LIGHT = "#f0eee6"; + var CANVAS_BG_DARK = "#2e2c26"; + function createHelmetManager(doc, isStreaming) { + const mounted = /* @__PURE__ */ new Set(); + const live = /* @__PURE__ */ new Map(); + let designDocMode = null; + let canvasStyleEl = null; + let appTheme = "light"; + try { + const ds = doc.documentElement.dataset.theme; + appTheme = ds === "dark" || ds === "light" ? ds : new URLSearchParams(doc.defaultView?.location.search ?? "").get( + "theme" + ) === "dark" ? "dark" : "light"; + } catch { + } + function applyCanvasBg() { + if (!canvasStyleEl) return; + const bg = appTheme === "dark" ? CANVAS_BG_DARK : CANVAS_BG_LIGHT; + canvasStyleEl.textContent = `html,body{background:${bg}}#dc-root>.sc-host{position:relative}`; + } + function postDesignMode(mode) { + if (window.parent === window) return; + try { + window.parent.postMessage({ type: "__dc_design_mode", mode }, "*"); + } catch { + } + } + function setDesignDocMode(mode) { + if (mode === designDocMode) return; + designDocMode = mode; + postDesignMode(mode); + if (mode === "canvas") { + doc.documentElement.setAttribute("data-dc-canvas", ""); + canvasStyleEl = doc.createElement("style"); + canvasStyleEl.setAttribute("data-dc-canvas", ""); + applyCanvasBg(); + doc.head.appendChild(canvasStyleEl); + } else { + doc.documentElement.removeAttribute("data-dc-canvas"); + canvasStyleEl?.remove(); + canvasStyleEl = null; + } + } + window.addEventListener("message", (e) => { + const type = e.data && e.data.type; + if (type === "__dc_theme") { + const t = e.data.theme; + if (t === "light" || t === "dark") { + appTheme = t; + applyCanvasBg(); + } + return; + } + if (!designDocMode || type !== "__dc_probe") return; + postDesignMode(designDocMode); + }); + function compile(node) { + const raw = [...node.children]; + const helmetClosed = node.nextSibling != null || node.parentNode?.nextSibling != null; + if (node.hasAttribute("data-dc-atomics") && !mounted.has("__dc-atomics")) { + mounted.add("__dc-atomics"); + const el = doc.createElement("style"); + el.id = "__dc-atomics"; + el.textContent = ATOMIC_CSS; + doc.head.appendChild(el); + } + return (_vals, ctx) => { + const name = ctx && ctx.__name || ""; + const streaming = !!(name && isStreaming(name)); + for (let i = 0; i < raw.length; i++) { + const child = raw[i]; + const tag = child.tagName; + const mayBePartial = streaming && !helmetClosed && i === raw.length - 1; + if (tag === "SCRIPT") { + if (mayBePartial) continue; + const key = "SCRIPT|" + (child.getAttribute("src") || child.textContent || ""); + if (mounted.has(key)) continue; + mounted.add(key); + const el = doc.createElement("script"); + for (const { name: an, value } of [...child.attributes]) + el.setAttribute(an, value); + if (child.textContent) el.textContent = child.textContent; + doc.head.appendChild(el); + } else if (tag === "LINK" || tag === "META") { + if (mayBePartial) continue; + const key = tag + "|" + (child.getAttribute("href") || child.getAttribute("src") || child.outerHTML); + if (mounted.has(key)) continue; + mounted.add(key); + doc.head.appendChild(child.cloneNode(true)); + } else { + const key = name + "|" + i; + let el = live.get(key); + if (!el || el.tagName !== tag) { + if (el) el.remove(); + el = doc.createElement(tag.toLowerCase()); + live.set(key, el); + doc.head.appendChild(el); + } + for (const { name: an, value } of [...child.attributes]) { + if (el.getAttribute(an) !== value) el.setAttribute(an, value); + } + if (el.textContent !== child.textContent) + el.textContent = child.textContent; + } + } + return null; + }; + } + return { compile, setDesignDocMode }; + } + + // src/pseudo.ts + function createPseudoSheet(doc) { + let el = null; + const cache = /* @__PURE__ */ new Map(); + let n = 0; + return (pseudo, css) => { + const k = pseudo + "|" + css; + const hit = cache.get(k); + if (hit) return hit; + if (!el) { + el = doc.createElement("style"); + doc.head.appendChild(el); + } + const cls = "scp" + (n++).toString(36); + const sel = pseudo === "before" || pseudo === "after" ? "." + cls + "::" + pseudo : "." + cls + ":" + pseudo; + el.sheet.insertRule(sel + "{" + css + "}", el.sheet.cssRules.length); + cache.set(k, cls); + return cls; + }; + } + + // src/registry.ts + function createRegistry() { + const entries = /* @__PURE__ */ Object.create(null); + function get(name) { + return entries[name] || (entries[name] = { + html: "", + tpl: null, + Logic: null, + jsStreaming: false, + htmlStreaming: false, + ver: 0, + subs: /* @__PURE__ */ new Set(), + fetched: false + }); + } + function bump(name) { + const r = get(name); + r.ver++; + for (const fn of r.subs) fn(); + } + return { + entries, + get, + bump, + bumpAll() { + for (const n in entries) bump(n); + } + }; + } + + // src/runtime.ts + var COMPONENT_DIR = "."; + function createRuntime(doc = document) { + const registry = createRegistry(); + const pseudoClass = createPseudoSheet(doc); + const helmet = createHelmetManager( + doc, + (name) => registry.get(name).htmlStreaming + ); + const external = createExternalModules(() => registry.bumpAll()); + const factory = createComponentFactory(registry, ensureFetched); + const host = { + component: (name) => factory.getDC(name), + placeholder: (props) => h(Placeholder, props), + helmet: (node) => helmet.compile(node), + loadExternal: (kind, url, after) => external.load(kind, url, after), + resolveExternal: (url, name) => external.resolve(url, name), + resolveExternalGlobal: (url, name) => external.resolveGlobal(url, name), + resolveExternalError: (url, name) => external.getError(url, name), + pseudoClass + }; + function ensureFetched(name) { + const r = registry.get(name); + if (r.fetched) return; + r.fetched = true; + const url = COMPONENT_DIR + "/" + encodeURIComponent(name) + ".dc.html"; + fetch(url).then((res) => { + if (!res.ok) { + console.error( + '[dc-runtime] sibling fetch for "' + name + '" failed:', + url, + "returned", + res.status, + "\u2014 the reference renders as an empty placeholder." + ); + return ""; + } + return res.text(); + }).then((t) => { + if (!t) return; + const parsed = parseDcText(t); + if (!parsed) { + console.error( + '[dc-runtime] sibling fetch for "' + name + '":', + url, + "has no block \u2014 not a Design Component." + ); + return; + } + if (parsed.props) r.propsMeta = parsed.props; + if (parsed.preview) r.preview = parsed.preview; + if (parsed.template && !r.html) updateHtml(name, parsed.template); + if (parsed.js && !r.Logic) updateJs(name, parsed.js); + }).catch( + (e) => console.error( + '[dc-runtime] sibling fetch for "' + name + '" threw:', + url, + e + ) + ); + } + let rootName = null; + function updateHtml(name, html) { + const r = registry.get(name); + r.html = html; + if (name === rootName) { + const mode = DESIGN_DOC_MODE_RE.exec(html)?.[1] ?? null; + if (mode || !r.htmlStreaming) helmet.setDesignDocMode(mode); + } + try { + r.tpl = compileTemplate(html, host); + } catch (e) { + console.error("[dc-runtime] template compile FAILED for", name, e); + } + registry.bump(name); + } + function updateJs(name, src) { + const r = registry.get(name); + const seq = r.jsSeq = (r.jsSeq || 0) + 1; + try { + const Cls = evalDcLogic(src); + if (r.jsSeq !== seq) return; + if (typeof Cls !== "function") { + r.logicError = name + ".dc.html: + + + diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..162afec --- /dev/null +++ b/js/main.js @@ -0,0 +1,260 @@ +/* ========================================================= + Unger Reisen — behaviour + - render data-driven sections (stats / services / fleet) + - scroll-driven bus across the hero + - nav solidify on scroll + - reveal-on-scroll (IntersectionObserver) + - interactive MapLibre map (two locations + route) + ========================================================= */ +(function () { + 'use strict'; + + var ACCENT = '#C8102E'; + var reduceMotion = window.matchMedia && + window.matchMedia('(prefers-reduced-motion:reduce)').matches; + + /* ---------- Data ---------- */ + var stats = [ + { big: '2', label: 'Standorte in Bayern' }, + { big: '60+', label: 'Sitzplätze pro Reisebus' }, + { big: '24/7', label: 'Für Sie erreichbar' }, + { big: '∞', label: 'Ziele in ganz Europa' } + ]; + + var services = [ + { no: '01', title: 'Busanmietung', desc: 'Moderne Reisebusse mit Fahrer — flexibel für einzelne Fahrten oder mehrtägige Touren.' }, + { no: '02', title: 'Firmenreisen', desc: 'Betriebsausflüge, Tagungen und Events. Ihr Team sicher und entspannt am Ziel.' }, + { no: '03', title: 'Vereinsfahrten', desc: 'Ausflüge, Feste und Sportevents — komfortabel für die ganze Gruppe.' }, + { no: '04', title: 'Transfers', desc: 'Flughafen-, Hotel- und Event-Transfers. Pünktlich und rund um die Uhr planbar.' } + ]; + + var fleet = [ + { name: 'Reisebus', seats: '60', desc: 'Der Große für lange Strecken und große Gruppen — voll ausgestattet.', tags: ['Klimaanlage', 'WC', 'Bordküche', 'WLAN'] }, + { name: 'Midibus', seats: '35', desc: 'Wendig und komfortabel — ideal für mittlere Gruppen und Tagestouren.', tags: ['Klimaanlage', 'Komfortbestuhlung'] }, + { name: 'Kleinbus', seats: '19', desc: 'Persönlich und flexibel für kleine Gruppen, Transfers und Sonderfahrten.', tags: ['Flexibel', 'Wendig'] } + ]; + + function el(tag, cls, html) { + var n = document.createElement(tag); + if (cls) n.className = cls; + if (html != null) n.innerHTML = html; + return n; + } + + /* ---------- Render sections ---------- */ + function renderStats() { + var grid = document.getElementById('stats-grid'); + if (!grid) return; + stats.forEach(function (s) { + var wrap = el('div', null); + wrap.setAttribute('data-reveal', ''); + wrap.appendChild(el('div', 'display stat__big', s.big)); + wrap.appendChild(el('div', 'stat__label', s.label)); + grid.appendChild(wrap); + }); + } + + function renderServices() { + var grid = document.getElementById('services-grid'); + if (!grid) return; + services.forEach(function (s) { + var card = el('div', 'service'); + card.setAttribute('data-reveal', ''); + card.appendChild(el('div', 'display service__no', s.no)); + card.appendChild(el('h3', 'service__title', s.title)); + card.appendChild(el('p', 'service__desc', s.desc)); + grid.appendChild(card); + }); + } + + function renderFleet() { + var grid = document.getElementById('fleet-grid'); + if (!grid) return; + fleet.forEach(function (f) { + var card = el('div', 'fleetCard'); + card.setAttribute('data-reveal', ''); + + var head = el('div', 'fleetCard__head'); + head.appendChild(el('h3', 'display fleetCard__name', f.name)); + var seats = el('div', 'fleetCard__seats', + 'bis' + + '' + f.seats + '' + + 'Sitze'); + head.appendChild(seats); + card.appendChild(head); + + var body = el('div', 'fleetCard__body'); + body.appendChild(el('p', 'fleetCard__desc', f.desc)); + var tags = el('div', 'fleetCard__tags'); + f.tags.forEach(function (t) { tags.appendChild(el('span', 'tag', t)); }); + body.appendChild(tags); + card.appendChild(body); + + grid.appendChild(card); + }); + } + + /* ---------- Nav solidify on scroll ---------- */ + function initNav() { + var nav = document.getElementById('nav'); + if (!nav) return; + var onScroll = function () { + nav.classList.toggle('is-scrolled', window.scrollY > 40); + }; + window.addEventListener('scroll', onScroll, { passive: true }); + onScroll(); + } + + /* ---------- Mobile menu ---------- */ + function initMobileMenu() { + var burger = document.getElementById('nav-burger'); + var menu = document.getElementById('mobile-menu'); + if (!burger || !menu) return; + + function setOpen(open) { + menu.classList.toggle('is-open', open); + burger.classList.toggle('is-open', open); + burger.setAttribute('aria-expanded', open ? 'true' : 'false'); + burger.setAttribute('aria-label', open ? 'Menü schließen' : 'Menü öffnen'); + document.body.style.overflow = open ? 'hidden' : ''; + } + + burger.addEventListener('click', function () { + setOpen(!menu.classList.contains('is-open')); + }); + menu.querySelectorAll('a').forEach(function (a) { + a.addEventListener('click', function () { setOpen(false); }); + }); + window.addEventListener('keydown', function (e) { + if (e.key === 'Escape') setOpen(false); + }); + // Close if we grow past the mobile breakpoint. + window.addEventListener('resize', function () { + if (window.innerWidth > 680) setOpen(false); + }); + } + + /* ---------- Scroll-driven bus ---------- */ + function initBus() { + var bus = document.getElementById('bus'); + var hero = document.getElementById('top'); + if (!bus || !hero) return; + + function tick() { + var hp = Math.min(1, Math.max(0, window.scrollY / (hero.offsetHeight * 0.9))); + var scene = bus.parentNode; + var sceneW = scene ? scene.offsetWidth : window.innerWidth; + var busW = bus.offsetWidth || 400; + var minX = -busW * 0.30; + var maxX = sceneW - busW * 0.70; + var x = minX + (maxX - minX) * hp; + var bob = reduceMotion ? 0 : Math.sin(Date.now() / 380) * 4; + bus.style.transform = 'translate(' + x.toFixed(1) + 'px,' + bob.toFixed(1) + 'px)'; + requestAnimationFrame(tick); + } + requestAnimationFrame(tick); + } + + /* ---------- Reveal on scroll ---------- */ + function initReveal() { + var els = Array.prototype.slice.call(document.querySelectorAll('[data-reveal]')); + if ('IntersectionObserver' in window) { + var io = new IntersectionObserver(function (entries) { + entries.forEach(function (e) { + if (e.isIntersecting) { + e.target.classList.add('is-visible'); + io.unobserve(e.target); + } + }); + }, { threshold: 0.12 }); + els.forEach(function (n) { io.observe(n); }); + } else { + els.forEach(function (n) { n.classList.add('is-visible'); }); + } + // Safety fallback: reveal everything after 2.5s regardless. + setTimeout(function () { + els.forEach(function (n) { n.classList.add('is-visible'); }); + }, 2500); + } + + /* ---------- Interactive map ---------- */ + function initMap() { + var HOME = [12.0517, 48.4703]; // Buch am Erlbach / Vatersdorf + var BRANCH = [12.1508, 48.5449]; // Landshut + var container = document.getElementById('unger-map'); + if (!container || typeof maplibregl === 'undefined') return; + + function makePin(fill, ring, title, sub) { + var wrap = el('div', 'pin'); + wrap.appendChild(el('div', 'pin__label', + '
' + title + '
' + + '
' + sub + '
')); + var dot = el('div', 'pin__dot'); + dot.style.background = fill; + dot.style.border = '3px solid ' + ring; + dot.style.boxShadow = '0 0 0 5px ' + ACCENT + '40, 0 2px 6px rgba(0,0,0,.55)'; + wrap.appendChild(dot); + return wrap; + } + + var map = new maplibregl.Map({ + container: container, + style: 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json', + center: [(HOME[0] + BRANCH[0]) / 2, (HOME[1] + BRANCH[1]) / 2], + zoom: 10.4, + attributionControl: { compact: true } + }); + map.scrollZoom.disable(); + map.addControl(new maplibregl.NavigationControl({ showCompass: true, visualizePitch: false }), 'top-right'); + + // On phones, keep the map static so a one-finger drag scrolls the page + // instead of getting trapped panning the map. + if (window.matchMedia && window.matchMedia('(max-width:680px)').matches) { + map.dragPan.disable(); + if (map.touchZoomRotate) map.touchZoomRotate.disable(); + if (map.touchPitch) map.touchPitch.disable(); + } + + new maplibregl.Marker({ element: makePin(ACCENT, '#fff', 'Landshut', 'Niederlassung'), anchor: 'bottom' }) + .setLngLat(BRANCH).addTo(map); + new maplibregl.Marker({ element: makePin('#fff', ACCENT, 'Buch a. Erlbach', 'Hauptsitz'), anchor: 'bottom' }) + .setLngLat(HOME).addTo(map); + + map.on('load', function () { + map.addSource('unger-route', { + type: 'geojson', + data: { type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: [HOME, BRANCH] } } + }); + map.addLayer({ + id: 'unger-route-casing', type: 'line', source: 'unger-route', + layout: { 'line-join': 'round', 'line-cap': 'round' }, + paint: { 'line-color': ACCENT, 'line-width': 9, 'line-opacity': 0.18 } + }); + map.addLayer({ + id: 'unger-route-line', type: 'line', source: 'unger-route', + layout: { 'line-join': 'round', 'line-cap': 'round' }, + paint: { 'line-color': ACCENT, 'line-width': 3, 'line-dasharray': [1.6, 1.4] } + }); + map.fitBounds([HOME, BRANCH], { padding: { top: 96, bottom: 70, left: 70, right: 70 }, duration: 0, maxZoom: 12 }); + setTimeout(function () { try { map.resize(); } catch (e) {} }, 60); + }); + } + + /* ---------- Boot ---------- */ + function init() { + renderStats(); + renderServices(); + renderFleet(); + initNav(); + initMobileMenu(); + initBus(); + initReveal(); + initMap(); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})();