family-dashboard-code ▸ docs/2026-04-02-kiosk-v5-focus-design.md
updated 2026-04-03

Kiosk v5 “Focus” — Design Spec

Date: 2026-04-02 Status: Approved

Summary

Overhaul the kiosk dashboard to focus on what matters: calendar visibility, photo prominence, and readability. Remove the rotating stage panels (horoscopes, transit, country, countdowns, groceries, chores) — hidden, not deleted. Switch to an always-dark theme. Fix travel auto-detection for same-timezone destinations.

Changes

1. Layout — Remove Stage, Expand Calendar + Photo

The kiosk grid becomes (top to bottom, portrait 1080x1920):

Row Content Grid sizing
Header Clock, date, weather, sun times, travel auto
Today Hero card — accent border, full event list auto
Days 2-3 Two medium cards side-by-side with events auto
Days 4-10 7-cell grid with day, date, weather, event names auto
Photo Framed photo with crossfade rotation minmax(200px, 1fr)
Ticker News headline carousel auto
Status Status bar auto

The stage row is removed. Photo is the sole 1fr row — it absorbs all remaining vertical space.

CSS grid template:

grid-template-areas:
  'header'
  'today'
  'next'
  'compact'
  'photo'
  'ticker'
  'status';
grid-template-rows: auto auto auto auto minmax(200px, 1fr) auto auto;

2. Calendar — Days 4-10 Expanded Compact Row

Replace the current 4-cell compact row (days 4-7, shows only day name + weather icon + event count) with a 7-cell grid (days 4-10).

Each cell shows: - Day abbreviation + date number (e.g. “Mon 7”) - Weather icon + high/low temps - First 2-3 event summaries — truncated with ellipsis, prefixed with person emoji

Layout: 7 equal columns. If 7 columns proves too cramped at 1080px width during implementation, fall back to a 4+3 wrapped layout (two rows).

Data change: useCalendar currently returns 7 days. Extend to return 10 days. The useWeather Open-Meteo call already returns 7 days of forecast by default — extend to 10 (forecast_days=10 parameter).

3. Theme — Always Dark with Subtle Time-of-Day Variation

Remove the bright cream theme entirely. Both phases are dark, with night being slightly deeper.

Night / dawn / dusk (darker):

--fd-bg-1: #141210;
--fd-bg-2: #1C1816;
--fd-card-bg: #1C1816;
--fd-card-border: rgba(255, 255, 255, 0.06);
--fd-text-1: #F5F0E8;
--fd-text-2: #C4B8AC;
--fd-photo-frame: #1C1816;
--fd-compact-bg: #2A2420;
--fd-ticker-bg: #2A2420;
--fd-divider: #2A2420;

Day / golden (lighter dark):

--fd-bg-1: #1E1A16;
--fd-bg-2: #2A2420;
--fd-card-bg: #2A2420;
--fd-card-border: rgba(255, 255, 255, 0.08);
--fd-text-1: #F5F0E8;
--fd-text-2: #C4B8AC;
--fd-photo-frame: #2A2420;
--fd-compact-bg: #3D3530;
--fd-ticker-bg: #3D3530;
--fd-divider: #3D3530;

The :root default and the night/dawn/dusk phase all use the deeper dark values. Accent colors, shimmer colors unchanged.

4. Header — 30-40% Size Bump

Scale up clamp() values for all header elements. No layout changes — same flexbox with clock+date on left, weather+sun on right.

Target sizes (approximate, will tune during implementation): - Clock: bump from current range to ~30-40% larger - Date: proportional bump - Weather temp + icon: proportional bump - Sun times: proportional bump

5. Photo Frame — Framed Print Treatment

Replace the current flat colored mat (var(--fd-photo-frame) background + thick padding) with a subtle framed print look:

.kiosk-gallery-photo {
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 0.75rem;
  box-shadow:
    0 4px 24px rgba(0, 0, 0, 0.5),
    0 1px 4px rgba(0, 0, 0, 0.3);
  overflow: hidden;
  /* Remove the thick colored padding/mat */
  padding: 0;
  background: transparent;
}

.kiosk-gallery-photo .photo-frame {
  /* Inner vignette for depth */
  box-shadow: inset 0 0 12px rgba(0, 0, 0, 0.2);
}

The photo fills its container edge-to-edge (minus the thin border), with a soft shadow giving it depth against the dark background.

6. News Ticker — Size Bump

The ticker text is currently clamp(1rem, 1.3vw, 1.2rem) (16-19px) — unreadable from across the room. Scale it up to match the overall 30-40% size increase applied to the rest of the kiosk. Bump the container padding and carousel line-height proportionally.

Target: clamp(1.3rem, 1.8vw, 1.6rem) or similar — tuned during implementation for readability at 6-10 feet alongside the other enlarged elements.

7. Travel Auto-Detection Fix

File: src/hooks/useAutoTravelTarget.ts

Bug: The resolveTravelTarget function (line ~127) selects a geocoded result only if its timezone differs from HOME_TIMEZONE. Same-timezone cities (Paris, Amsterdam, Rome, Warsaw, etc.) are skipped.

Fix: Remove the timezone-difference requirement. The travel signal should be: 1. Calendar event has travel keywords (flight, trip, hotel, conference, etc.) OR has a non-home location 2. Geocoded location is not in the home area (Berlin/Germany) per isHomeArea()

Specifically in resolveTravelTarget: - Remove: results.find((result) => result.timezone !== HOME_TIMEZONE) - Replace with: select the first geocoded result - Keep the isHomeArea skip (so “Meeting in Berlin” doesn’t trigger travel)

Hidden Components (Not Deleted)

These are removed from the kiosk render but remain in the codebase for future re-enablement:

Components: - KioskRotatingStage - KioskPageA (life: countdowns, groceries, chores) - KioskPageB (world: horoscopes, transit, country)

Hooks (no longer imported by kiosk): - useStageRotation - useContentRotation - useHoroscope - useCountryOfDay - useBvgDepartures

The default (mobile) dashboard view is unchanged — only the kiosk view is affected.

Files to Modify

File Change
src/components/kiosk/KioskDashboard.tsx Remove stage, extend compact row to days 4-10
src/components/kiosk/KioskCompactRow.tsx Show 7 days with event names instead of 4 days with counts
src/index.css Update grid template, theme tokens, photo frame styles
src/hooks/useCalendar.ts Return 10 days instead of 7
src/hooks/useWeather.ts Request 10-day forecast from Open-Meteo
src/hooks/useAutoTravelTarget.ts Fix same-timezone travel detection
src/components/layout/Header.tsx Scale up clamp values (or child components)
src/components/clock/Clock.tsx Larger font sizes
src/components/clock/DateDisplay.tsx Larger font sizes
src/components/weather/CurrentWeather.tsx Larger font sizes
src/components/weather/SunTimes.tsx Larger font sizes
src/components/kiosk/KioskNewsTicker.tsx Larger font/padding (if component has inline styles)

Not Changing