// blocks.jsx — all modular content blocks (Tailwind utilities). // Each block is exported individually; pages.jsx composes them. // Section padding stays centralised in .block-inner / .block-inner-tight // (styles.css) so every block shares one uniform rhythm. Card interiors // are unified to p-6 (24px). Dynamic colors (line colors, hero scrims) // remain inline since Tailwind can't express runtime values. // ───────────────────────────────────────────────────────────── // Helper: BlockMeta strip — shown only in the design canvas. // ───────────────────────────────────────────────────────────── function BlockMeta({name, variant, notes}) { return (
BLOCK {name} {variant && · {variant}}
{notes && {notes}}
); } // ───────────────────────────────────────────────────────────── // 1) HERO — simple with background image // ───────────────────────────────────────────────────────────── function HeroSimple({ eyebrow = "Saisonhit", title = "Gotthard-Rundfahrt", body = "Legendäre Passroute über den historischen Gotthard — Geschichte, Panorama und Abenteuer in einer unvergesslichen Tour.", bgClass = "bg-mountain-sunset", height = 540, showMeta = true, }) { return (
{showMeta && }
{/* Dark scrim */}

{title}

{body}

); } // ───────────────────────────────────────────────────────────── // 2) HERO — with widget (homepage hero) // ───────────────────────────────────────────────────────────── function HeroWithWidget({showMeta = true, height = 720, bgClass = "img-ph"}) { const variant = (typeof document !== 'undefined' && document.body && document.body.dataset.heroVariant) || 'dark'; const scrims = { dark: 'linear-gradient(90deg, rgba(15,22,35,0.78) 0%, rgba(15,22,35,0.55) 50%, rgba(15,22,35,0.35) 100%)', sunset: 'linear-gradient(90deg, rgba(15,22,35,0.60) 0%, rgba(15,22,35,0.30) 50%, rgba(15,22,35,0.15) 100%)', day: 'linear-gradient(90deg, rgba(15,22,35,0.35) 0%, rgba(15,22,35,0.10) 60%, transparent 100%)', }; const scrim = scrims[variant] || scrims.dark; return (
{showMeta && }

Unterwegs mit
Auto AG Uri

Ihr zuverlässiger Mobilitätspartner im Kanton Uri — verbindet Dörfer, Täler und Menschen seit 1922.

); } // ───────────────────────────────────────────────────────────── // 3) CALL TO ACTION — dark with side image // ───────────────────────────────────────────────────────────── function CTABlock({ title = "Werde Teil unseres Teams", eyebrow = "Jetzt bewerben", body = "Wir suchen engagierte Fachleute, die Uri mobil halten. Entdecke offene Stellen bei Auto AG Uri.", items = [ {icon: , title: "Bus-Chauffeur/euse Kat. D (80–100%)", meta: "Schattdorf"}, {icon: , title: "Automobil-Mechatroniker/in", meta: "Schattdorf"}, ], cta = "Alle Jobs ansehen", bgClass = "bg-bus-night", showMeta = true, }) { return (
{showMeta && }
{eyebrow}

{title}

{body}

{items.map((it, i) => (
{it.icon}
{it.title}
{it.meta}
))}
[photo: bus at depot]
); } // ───────────────────────────────────────────────────────────── // 4) CARDS GRID — image cards with link // ───────────────────────────────────────────────────────────── function CardsGrid({ eyebrow = "Mit dem Bus erleben", title = "Spezialangebote & Freizeit", more = "Alle Angebote", showMeta = true, cards = [ {title: 'Gotthard-Rundfahrt', body: 'Entdecken Sie die legendäre Gotthard-Route — von Altdorf durch das Urserental bis auf den Pass.', bg: 'bg-mountain-sunset'}, {title: 'Urnersee-Ticket', body: 'Bus & Schiff kombiniert — rund um den wunderschönen Urnersee mit traumhaftem Alpenpanorama.', bg: 'bg-lake'}, {title: 'Schneespass Andermatt', body: 'Mit dem Skipass direkt in die Skiarena Andermatt — ohne Stau und Parkplatzsorgen.', bg: 'bg-ski'}, {title: 'Klausenpass Linie', body: 'Spektakuläre Alpenkulisse — die Linie verbindet Uri mit Glarus über den Klausenpass auf 1948 m.', bg: 'bg-mountain-day'}, ], }) { return (
{showMeta && }
{eyebrow &&
{eyebrow}
}

{title}

{more && {more} }
{cards.map((c, i) => (

{c.title}

{c.body}

Mehr erfahren
))}
); } // ───────────────────────────────────────────────────────────── // 5) CARDS COMPACT — icon + title + arrow (linkable rows) // ───────────────────────────────────────────────────────────── function CardsLinks({ title = "Schnellzugriff", eyebrow = "", showMeta = true, cards = [ {icon: , title: 'Einzelbillette', body: 'Tickets online kaufen — gültig auf allen Linien.'}, {icon: , title: 'Linien & Karte', body: 'Übersicht aller 28 Linien im Kanton Uri.'}, {icon: , title: 'Fahrplanwechsel', body: 'Alle Änderungen ab dem 1. Mai 2026.'}, {icon: ,title: 'Karriere bei AAGU', body: 'Offene Stellen und Lehrstellen — jetzt bewerben.'}, ], }) { return (
{showMeta && }
{(title || eyebrow) && (
{eyebrow &&
{eyebrow}
} {title &&

{title}

}
)}
{cards.map((c, i) => ( {c.icon}

{c.title}

{c.body}

Öffnen
))}
); } // ───────────────────────────────────────────────────────────── // 6) STATS — inline (icons with big numbers) // ───────────────────────────────────────────────────────────── function StatsInline({ showMeta = true, stats = [ {icon: , value: "28", unit: "", label: "Linien"}, {icon: , value: "180", unit: "", label: "Haltestellen"}, {icon: , value: "3 Mio.", unit: "", label: "Fahrgäste · Jahr"}, {icon: , value: "99,7", unit: "%", label: "Pünktlichkeit"}, ], }) { return (
{showMeta && }
{stats.map((s, i) => (
{s.icon}
{s.value}{s.unit}
{s.label}
))}
); } // ───────────────────────────────────────────────────────────── // 7) STATS — boxed (white cards with icon + dark number) // ───────────────────────────────────────────────────────────── function StatsBoxed({ showMeta = true, stats = [ {icon: , value: "ca. 4 h", label: "Gesamtdauer"}, {icon: , value: "120 km", label: "Strecke"}, {icon: , value: "2 106 m", label: "Höchstpunkt"}, {icon: , value: "Jun–Okt", label: "Saison"}, ], }) { return (
{showMeta && }
{stats.map((s, i) => (
{s.icon}
{s.value}
{s.label}
))}
); } // ───────────────────────────────────────────────────────────── // 8) NEWS GRID — split cards (image left, text right) // ───────────────────────────────────────────────────────────── function NewsGrid({ title = "Aktuelle News", more = "Alle News", showMeta = true, items = [ {date: '12. April 2026', title: 'Neue Elektrobusse im Einsatz', body: 'Die Auto AG Uri setzt einen weiteren Schritt in Richtung Nachhaltigkeit und nimmt drei neue…', bg: 'bg-bus-night'}, {date: '05. April 2026', title: 'Fahrplanwechsel Sommer', body: 'Bitte beachten Sie die neuen Abfahrtszeiten auf diversen Linien ab dem 1. Mai. Alle Details find…', bg: 'bg-mountain-day'}, ], }) { return (
{showMeta && }

{title}

{more && {more} }
{items.map((it, i) => ( ))}
); } // ───────────────────────────────────────────────────────────── // 9) IMAGE + TEXT (50/50) // ───────────────────────────────────────────────────────────── function ImageText({ eyebrow = "Über uns", title = "Seit 1922 bewegen wir Uri", body = "Was als kleines Postautounternehmen begann, ist heute das zuverlässige Rückgrat der öffentlichen Mobilität im Kanton Uri. Mit 28 Linien, 180 Haltestellen und einer modernen, zunehmend elektrischen Flotte verbinden wir Stadt und Berg, Schule und Arbeit, Alltag und Abenteuer.", bullets = [ "100% Anschluss an SBB-Knoten", "Schrittweise Umstellung auf Elektroflotte bis 2030", "Ausbildungsbetrieb mit 12 Lehrstellen", ], imgClass = "bg-mountain-day", imageRight = true, showMeta = true, }) { const text = (
{eyebrow &&
{eyebrow}
}

{title}

{body}

    {bullets.map((b, i) => (
  • {b}
  • ))}
); const image = (
[photo: alps + depot]
); return (
{showMeta && }
{imageRight ? <>{text}{image} : <>{image}{text}}
); } // ───────────────────────────────────────────────────────────── // 10) FAQ ACCORDION // ───────────────────────────────────────────────────────────── function FAQ({ title = "Häufige Fragen", eyebrow = "FAQ", showMeta = true, items = [ {q: 'Wo kann ich Billette kaufen?', a: 'Billette gibt es online, in unserer App, an den Verkaufsstellen sowie direkt im Bus beim Chauffeur. Wir akzeptieren bar, Karte und TWINT.', open: true}, {q: 'Sind Hunde im Bus erlaubt?', a: 'Ja, Hunde sind in unseren Bussen herzlich willkommen. Kleine Hunde reisen kostenlos, für grössere Hunde gilt der halbe Tarif.'}, {q: 'Wie funktioniert das Tarifsystem?', a: 'Der Kanton Uri ist Teil des Tarifverbunds. Tickets sind zonenbasiert und gelten auf allen Linien innerhalb der gewählten Zonen.'}, {q: 'Gibt es Rabatte für Schulen oder Gruppen?', a: 'Für Schulklassen und Gruppen ab 10 Personen bieten wir attraktive Konditionen. Kontaktieren Sie uns unter info@aagu.ch.'}, ], }) { return (
{showMeta && }
{eyebrow}

{title}

{items.map((it, i) => (

{it.q}

{it.open ? : }
{it.open && (
{it.a}
)}
))}
); } // ───────────────────────────────────────────────────────────── // 11) QUOTE / TESTIMONIAL // ───────────────────────────────────────────────────────────── function QuoteBlock({ quote = "«Ohne die AAGU käme mein Sohn nie pünktlich in die Schule — und ich nie zur Arbeit. Auf den gelben Bus ist einfach Verlass.»", author = "Andrea Gisler", role = "Pendlerin · Bürglen", showMeta = true, }) { return (
{showMeta && }
{quote}
AG
{author}
{role}
); } // ───────────────────────────────────────────────────────────── // 12) SECTION HEADER (used on sub-pages) // ───────────────────────────────────────────────────────────── function SectionHeader({ crumbs = ['Home', 'Freizeit', 'Gotthard-Rundfahrt'], title = "Gotthard-Rundfahrt", body = "Eine Tagesreise über den historischen Alpenpass — auf den Spuren der Säumer, durch Tunnel und Serpentinen bis zum Hospiz.", showMeta = true, }) { const last = crumbs.length - 1; return (
{showMeta && }

{title}

{body}

); } // ───────────────────────────────────────────────────────────── // 13) RICH TEXT (long-form copy) // ───────────────────────────────────────────────────────────── function RichText({showMeta = true}) { return (
{showMeta && }

Eine Reise durch die Urner Geschichte

Die Gotthard-Route ist mehr als nur eine Strasse — sie ist eine der ältesten Nord-Süd-Verbindungen Europas. Schon im 13. Jahrhundert führten die Säumer ihre Maultiere über den Pass. Heute fährt der Linienbus zwischen Mai und Oktober mehrmals täglich über die Tremola, die längste noch erhaltene Pflastersteinstrasse der Schweiz.

Was Sie unterwegs erleben

Unsere Chauffeur:innen kennen jede Kurve und teilen ihr Wissen gerne. Halten Sie in Andermatt für einen Kaffee, besuchen Sie das Sasso-San-Gottardo-Museum oder geniessen Sie das Panorama vom Hospiz. Ab Airolo geht es zurück durch das Tessin — oder mit dem Zug durch den Basistunnel.

Tipp: Reservieren Sie an Wochenenden vor — die Fahrt ist beliebt und die Plätze sind begrenzt.
); } // ───────────────────────────────────────────────────────────── // 15) LINES — official line-color grid (CD-conformant) // ───────────────────────────────────────────────────────────── function LinesBlock({ eyebrow = "Liniennetz", title = "Alle Linien auf einen Blick", more = "Zum Liniennetzplan", showMeta = true, lines = [ {nr: '401', color: 'var(--line-401)', name: 'Flüelen – Göschenen', info: 'Reusstal'}, {nr: '402', color: 'var(--line-402)', name: 'Attinghausen – Bürglen', info: 'Urner Talboden'}, {nr: '403', color: 'var(--line-403)', name: 'Seedorf – Bürglen', info: 'Urnersee'}, {nr: '405', color: 'var(--line-405)', name: 'Schattdorf – Isenthal', info: 'Isenthal'}, {nr: '407', color: 'var(--line-407)', name: 'Amsteg – Bristen', info: 'Maderanertal'}, {nr: '408', color: 'var(--line-408)', name: 'Attinghausen – Linthal', info: 'Klausenpass'}, {nr: '411', color: 'var(--line-411)', name: 'Göschenen – Göscheneralp', info: 'Saisonal'}, {nr: '412', color: 'var(--line-412)', name: 'Altdorf – Amsteg', info: 'Stadtnetz'}, {nr: '413', color: 'var(--line-413)', name: 'Flüelen – Altdorf', info: 'Stadtnetz'}, {nr: '493', color: 'var(--line-493)', name: 'Altdorf – Luzern', info: 'Tellbus'}, ], }) { return (
{showMeta && }
{eyebrow &&
{eyebrow}
}

{title}

{more && {more} }
{lines.map(l => ( {l.nr}
{l.name}
{l.info}
))}
); } // ───────────────────────────────────────────────────────────── // 16) STEPS — numbered process / workflow // ───────────────────────────────────────────────────────────── function StepsBlock({ eyebrow = "So funktionierts", title = "In vier Schritten zur Gruppenreise", steps = [ {n: '1', title: 'Anfrage ausfüllen', body: 'Reichen Sie die Anfrage über unser Online-Formular ein — spätestens 2 Werktage vor Abreise.'}, {n: '2', title: 'Bestätigung erhalten', body: 'Wir prüfen die Verbindung und melden uns mit der Buchungsbestätigung bei Ihnen.'}, {n: '3', title: 'Billett beziehen', body: 'Gruppenbillette erhalten Sie am AAGU-Schalter in Schattdorf, im Bus oder über die SBB.'}, {n: '4', title: 'Losfahren', body: 'Steigen Sie an der angegebenen Haltestelle ein — der Chauffeur erwartet Sie.'}, ], showMeta = true, }) { return (
{showMeta && }
{eyebrow &&
{eyebrow}
}

{title}

{/* Connector line behind the circles */}
{steps.map((s, i) => (
{s.n}

{s.title}

{s.body}

))}
); } // ───────────────────────────────────────────────────────────── // 17) FORM BLOCK — generic form (intro on left, fields on right) // ───────────────────────────────────────────────────────────── function FormInput({label, placeholder, value, type = 'text', required = false}) { return ( ); } function FormSelect({label, placeholder, value, required = false}) { return ( ); } function FormTextarea({label, placeholder, value, required = false, rows = 5}) { return ( ); } function FormBlock({ eyebrow = "Kontakt", title = "Gruppenreise anfragen", body = "Wir erstellen Ihnen ein unverbindliches Angebot für Ihren Anlass. Innerhalb von 2 Werktagen melden wir uns mit Vorschlägen bei Ihnen.", contact = [ {icon: , label: 'Telefon', value: '+41 41 874 78 78'}, {icon: , label: 'E-Mail', value: 'gruppen@aagu.ch'}, {icon: , label: 'Adresse', value: 'Ried 1, 6467 Schattdorf'}, ], showMeta = true, }) { return (
{showMeta && }
{/* LEFT — Intro */}
{eyebrow &&
{eyebrow}
}

{title}

{body}

{contact.map((c, i) => (
{c.icon}
{c.label}
{c.value}
))}
{/* RIGHT — Form */}
e.preventDefault()}>
{/* Checkbox row */}
Antwort innert 2 Werktagen
); } // ───────────────────────────────────────────────────────────── // 18) CALL TO ACTION — banner variant // Full-width primary-color banner · large heading · description · optional button // ───────────────────────────────────────────────────────────── function CTABanner({ eyebrow = null, title = "Gruppenreisen für jeden Anlass", body = "Schulausflug, Vereinsreise, Hochzeit oder Firmenanlass — chartern Sie einen Bus der Auto AG Uri mit eigenem Chauffeur. Von 8 bis 100 Personen.", cta = "Offerte anfragen", ctaIcon = , showButton = true, showMeta = true, }) { return (
{showMeta && }
{/* Subtle decorative chevrons in background */}
{eyebrow && (
{eyebrow}
)}

{title}

{body}

{showButton && ( )}
); } Object.assign(window, { HeroSimple, HeroWithWidget, CTABlock, CTABanner, CardsGrid, CardsLinks, StatsInline, StatsBoxed, NewsGrid, ImageText, FAQ, QuoteBlock, SectionHeader, RichText, LinesBlock, FormBlock, StepsBlock, BlockMeta, });