// Additional Swiss screens - POI Detail, Buddys, "Hingehen" Sheet, Buddy Profile // Same design language as Swiss.jsx (single hot accent, strict grid, big sans, mono for data). const SX_ACCENT = '#FF4D2E'; const SX_INK = '#000000'; const SX_PAPER = '#FFFFFF'; const SX_GREY_3 = '#888888'; const SX_GREY_2 = '#BBBBBB'; const SX_GREY_1 = '#E5E5E5'; // Reuse helpers from Swiss const SX_PHOTOS = [ 'photo-1494790108377-be9c29b29330', 'photo-1438761681033-6461ffad8d80', 'photo-1544005313-94ddf0286df2', 'photo-1487412720507-e7ab37603c6f', 'photo-1500648767791-00dcc994a43e', 'photo-1472099645785-5658abf4ff4e', 'photo-1507003211169-0a1dd7228f2d', ]; const sxAvatarUrl = (i, s = 80) => `https://images.unsplash.com/${SX_PHOTOS[i % SX_PHOTOS.length]}?w=${s}&h=${s}&fit=crop&crop=faces&q=70`; // Real location photos via Unsplash - chosen for genre fit (park bench, coffee, swimming pool, etc.) const SX_LOC_PHOTOS = { westpark: 'photo-1500382017468-9049fed747ef', // sunlit park, warm grass cafe: 'photo-1554118811-1e0d58224f24', // cafe interior with warm light bad: 'photo-1576013551627-0cc20b96c2a7', // pool water, calm park: 'photo-1441974231531-c6227db76b6e', // forest park }; const sxLocUrl = (key, w = 800, h = 500) => { const id = SX_LOC_PHOTOS[key] || SX_LOC_PHOTOS.westpark; return `https://images.unsplash.com/${id}?w=${w}&h=${h}&fit=crop&q=75`; }; function SXAvatar({ variant = 0, size = 32, ring = 'none' }) { const ringPx = ring === 'none' ? 0 : 2; const ringColor = ring === 'accent' ? SX_ACCENT : SX_INK; return (
); } // Reuse status bar / home indicator - they're declared in Shell.jsx as globals. function SXFrame({ children, bg, dark = false, time = '14:32' }) { return (
{children}
); } function SXMast({ left = null, right = '14.05.26 / 14:32 / DO' }) { return (
{left || (<>Wir. Raus.)} {right}
); } function SXNav({ active = 0 }) { const items = ['Heute', 'Karte', 'Buddys', 'Du']; return (
{items.map((l, i) => { const on = i === active; return (
{l}
); })}
); } const Rule = ({ heavy = false, color = SX_INK }) => (
); // ───────────────────────────────────────────────────────────── // 03 · POI DETAIL - Naturbad Maria Einsiedel // ───────────────────────────────────────────────────────────── function Swiss_POI() { const features = [ { t:'Planschbereich für Kleine', icon:'✓', ok:true }, { t:'Wickeltisch im Eingangsbereich', icon:'✓', ok:true }, { t:'Große Liegewiese · Schatten unter Bäumen', icon:'✓', ok:true }, { t:'Eingezäunt (kompletter Bade-Bereich)', icon:'✓', ok:true }, { t:'WC barrierearm', icon:'✓', ok:true }, { t:'Hund nur an Leine', icon:'!', ok:'warn' }, ]; return (
{/* Top photo with overlaid back/share buttons */}
Naturbad Maria Einsiedel {/* Top-overlay row */}
{/* Buddy strip on photo */}
Anna Igel · seit 13:50
{/* Body */}
{/* Title block */}
Naturbad · Thalkirchen · 4,6★

Naturbad
Maria Einsiedel.

{/* Stat strip */}
{[ { l:'Distanz', v:'4,2', u:'km', accent:true }, { l:'Alter', v:'1-6', u:'Jahre' }, { l:'Buddys', v:'1', u:'aktiv' }, ].map((c, i) => (
{c.l}
{c.v} {c.u}
))}
{/* Why now - the editorial reason */}
Warum heute 14:32

Bei 18° und Sonne startet die Saison - Naturbad in den Isarauen, Planschbereich, große Liegewiese, Anna Igel ist seit 13:50 dort. Gut für 2-3 Stunden.inuten. Anna ist seit einer Stunde dort.

{/* Features - checklist */}
Ausstattung 6 Punkte
{features.map((f, i) => (
{f.icon} {f.t}
))}
{/* Hours / Status */}
Status ● jetzt offen
Heute 06:00 - 22:00 Café 09:00 - 18:00 Sonnenuntergang 20:48
{/* Anfahrt */}
Anfahrt / 4,2 km 3 Optionen
{[ { mode:'Mit Buggy', t:'18 min', sub:'zu Fuß · 1,3 km · durch die Isarauen', accent:true }, { mode:'U-Bahn', t:'14 min', sub:'U3 Thalkirchen · 8 Min Fußweg' }, { mode:'Mit Auto', t:'6 min', sub:'Parken: Zentralländstr. · frei' }, ].map((opt, i, arr) => (
{opt.mode}
{opt.sub}
{opt.t}
))}
{/* Pad before sticky CTA */}
{/* Sticky bottom CTA */}
Hingehen.
); } // ───────────────────────────────────────────────────────────── // 04 · BUDDYS TAB // ───────────────────────────────────────────────────────────── function Swiss_Buddys() { const sections = [ { label:'Aktiv jetzt', count:'3 / 8', accent:true, items:[ { name:'Anna Igel', av:1, status:'Naturbad Maria Einsiedel', since:'seit 13:50', dist:'1,3 km', shares:'Standort' }, { name:'Ben Reh', av:4, status:'Isarauen Thalkirchen', since:'seit 14:30', dist:'0,7 km', shares:'Aktivität' }, { name:'Lena Fuchs', av:0, status:'Floßlände Maria Einsiedel', since:'seit 14:10', dist:'1,7 km', shares:'Standort' }, ], }, { label:'Geplant', items:[ { name:'Mira Otter', av:0, status:'Café Thalkirchen', since:'16:00', dist:'0,3 km', shares:'Aktivität' }, { name:'Tobi Fuchs', av:5, status:'NaturFreunde Bootshaus', since:'16:00 → 17:30', dist:'1,0 km', shares:'Aktivität' }, ], }, { label:'Frei heute', items:[ { name:'Lea Schubert', av:2, status:'verfügbar nachmittags', since:'-', dist:'-', shares:'Aktivität' }, { name:'Jonas Berger', av:6, status:'verfügbar nach 17 Uhr', since:'-', dist:'-', shares:'-' }, ], }, { label:'Offline', muted: true, items:[ { name:'Sami Wagner', av:5, status:'zuletzt gestern', since:'-', dist:'-', shares:'-' }, ], }, ]; return (
{/* Title */}
Buddys / 8 3 aktiv · 2 geplant
{/* Hero number */}
03
Buddys sind
jetzt unterwegs.
{/* Add buddy callout */}
Buddy-Code teilen
K7-MORG-VIER · 3 Tage gültig
Teilen
{/* Sections */} {sections.map((sec, si) => (
{sec.accent ? '● ' : ''}{sec.label} {sec.count && ( {sec.count} )}
{sec.items.map((b, i, arr) => (
{b.name} teilt {b.shares}
{b.status}
{b.since}
{b.dist}
))}
))}
); } // ───────────────────────────────────────────────────────────── // 05 · "HINGEHEN" SHEET - modal over POI // ───────────────────────────────────────────────────────────── function Swiss_Hingehen() { const visibilityOptions = [ { id:'all', label:'Alle Buddys', sub:'5 Personen sehen dich (3 aktiv, 2 geplant)' }, { id:'select', label:'Nur Mira Otter & Anna Igel', sub:'2 Personen sehen dich · ausgewählt' , active: true },, { id:'none', label:'Niemand · privat', sub:'Du gehst nur für dich hin' }, ]; return ( {/* Behind: blurred POI peek */}
Naturbad
Maria Einsiedel.
{/* Modal sheet - ends above the bottom nav so nav stays visible */}
{/* Drag handle */}
{/* Header */}
● Du gehst hin 14:32 · in 18 min
{/* Title - what + where */}

Naturbad
Maria Einsiedel.

ankunft 14:50 · u-bahn 18 min · mit kind 2 j
{/* Time chooser */}
Wann?
{[ { l:'Jetzt', t:'14:32' }, { l:'+30 min', t:'15:00', active:true }, { l:'+1 h', t:'15:30' }, { l:'Später', t:'…' }, ].map((o, i) => (
{o.l}
{o.t}
))}
{/* Visibility */}
Wer sieht das? 2 / 8 Buddys
{visibilityOptions.map((o, i, arr) => (
{o.active &&
}
{o.label}
{o.sub}
))}
{/* Selected buddies preview */}
{/* Mira Otter (av:0, fem) + Anna Igel (av:1, fem) */} Mira Otter & Anna Igel bekommen Bescheid.
{/* Optional message */}
"Bin gleich da - bringe Apfelschorle."
{/* CTA */}
Los - und ankündigen.
Abbrechen
); } // ───────────────────────────────────────────────────────────── // 06 · BUDDY PROFILE - Anna Igel // ───────────────────────────────────────────────────────────── function Swiss_BuddyProfile() { return (
{/* Header band - accent color */}
{/* Top row: back / overflow */}
Buddy seit Jan 2026
{/* Avatar + name */}
● Aktiv jetzt

Anna Igel.

2 Kinder · 1 J & 4 J
{/* Body */}
{/* Where now */}
● Jetzt hier seit 13:30
Naturbad Maria Einsiedel
1,3 km von dir · Thalkirchen
Da auch hingehen.
{/* Stats */}
{[ { l:'Treffen', v:'14', u:'mal' }, { l:'Orte', v:'8', u:'gemeinsam', accent:true }, { l:'Bezirk', v:'Thalkirchen', u:'beide' }, ].map((c, i) => (
{c.l}
{c.v} {c.u}
))}
{/* Shared locations */}
Gemeinsame Orte 8 Orte
{[ { n:'01', name:'Naturbad Maria Einsiedel', count:'5×', last:'jetzt', accent:true }, { n:'02', name:'Café Thalkirchen', count:'3×', last:'vor 4 Tagen' }, { n:'03', name:'Isarauen Thalkirchen', count:'2×', last:'vor 2 Wochen' }, { n:'04', name:'Tierpark Hellabrunn', count:'2×', last:'vor 1 Monat' }, ].map((p, i, arr) => (
{p.n} {p.name} {p.last} {p.count}
))}
{/* Sharing settings */}
Was Anna Igel sieht 3 Optionen
{[ { label:'Mein Standort live', on: false }, { label:'Meine Aktivität', on: true }, { label:'Geplante Ausflüge', on: true }, ].map((s, i, arr) => (
{s.label}
))}
{/* Danger zone */}
Buddy entfernen
Anna Igel sieht dich nicht mehr
Entfernen
); } // ───────────────────────────────────────────────────────────── // 07 · LOCK SCREEN NOTIFICATION - iOS lock screen with a buddy ping // ───────────────────────────────────────────────────────────── function Swiss_LockScreen() { // Wallpaper: a soft, atmospheric Munich evening tone - warm gradient that // reads as a real photograph behind the glass notification. return (
{/* Soft texture overlay (grain) for "real photo" feel */}
{/* iOS Status bar - white */}
14:32
{/* dynamic island gap */}
{/* signal */} {/* wifi */} {/* battery */}
{/* Dynamic Island */}
{/* Big lock-screen clock */}
Donnerstag, 14. Mai
14:32
{/* Widget: weather + step island */}
☀︎
München
18° · klar
Sonnenuntergang
20:48
{/* - NOTIFICATION STACK - */}
{/* Stacked-behind hint (older notification - barely visible) */}
{/* Main "Wir. Raus." notification - strict iOS layout iOS rules respected: - App icon top-left, ~38-40px rounded square - App name: small uppercase, system gray, NOT colored - Title: bold, system font, system label color - Body: regular, secondaryLabel, max ~3 lines collapsed - Time: caption2, top right - NO inline action chips - those appear only on long-press - NO custom avatar - Communication Notifications API requires SiriKit Intents we don't have */}
{/* App icon - "Wir. Raus." - black square, accent dot, set type */}
{/* Stacked typographic mark */}
Wir. Raus.
{/* Body - single column, header row + title + body */}
{/* Header row: app name + time */}
WIR. RAUS. jetzt
{/* Title - single bold line */}
Anna Igel ist im Naturbad Maria Einsiedel.
{/* Body - secondary label */}
4,2 km · Sonne, Schatten ab 14h. Sie freut sich auf Euch.
{/* Flashlight + Camera affordances (iOS lock-screen bottom corners) */}
{/* "Slide to unlock"-style hint */}
Zum Öffnen wischen
{/* Home indicator */}
); } window.Swiss_POI = Swiss_POI; window.Swiss_Buddys = Swiss_Buddys; window.Swiss_Hingehen = Swiss_Hingehen; window.Swiss_BuddyProfile = Swiss_BuddyProfile; window.Swiss_LockScreen = Swiss_LockScreen; // Shared helpers for SwissNext.jsx and other extension files window.SXFrame = SXFrame; window.SXMast = SXMast; window.SXNav = SXNav; window.SXAvatar = SXAvatar;