Skip to content

Design System

Übersicht aller UI-Komponenten

1. Grundlagen

1a. Fonts (theme.css)

Typografie-Klassen für Schriftfamilien, Grössen, Headings, Fliesstext und Gewichte. Keine Props — Nutzung über Tailwind-Klassen.

Familien

font-sans

Comfortaa — Das ist ein Beispieltext

font-serif

Serif — Das ist ein Beispieltext

font-mono

Mono — Das ist ein Beispieltext

Grössen

Tailwind-Skala

text-2xs0.625rem / 10px Zeitreisen
text-xs0.75rem / 12px Zeitreisen
text-sm0.875rem / 14px Zeitreisen
text-base1rem / 16px Zeitreisen
text-lg1.125rem / 18px Zeitreisen
text-xl1.25rem / 20px Zeitreisen
text-2xl1.5rem / 24px Zeitreisen
text-3xl1.875rem / 30px Zeitreisen
text-4xl2.25rem / 36px Zeitreisen
text-5xl3rem / 48px Zeitreisen
text-6xl3.75rem / 60px Zeitreisen
text-7xl4.5rem / 72px Zeitreisen
text-8xl6rem / 96px Zeitreisen
text-9xl8rem / 128px Zeitreisen

Headings

Fluide Typografie mit clamp (Mobile → Desktop)

text-h1 — 1.5rem (24px) → 3rem (48px) lh 1.875rem (30px) → 3.75rem (60px) Heading 1
text-h2 — 1.25rem (20px) → 2.125rem (34px) lh 1.875rem (30px) → 3.125rem (50px) Heading 2
text-h3 — 1.125rem (18px) → 1.75rem (28px) lh 1.5rem (24px) → 2.375rem (38px) Heading 3
text-h4 — 1rem (16px) → 1.125rem (18px) lh 1.25rem (20px) → 1.375rem (22px) Heading 4

Fliesstext

text-paragraph — 0.875rem / 14px

Paragraph — Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Gewichte

font-light — 300 Zeitreisen
font-normal — 400 Zeitreisen
font-medium — 500 Zeitreisen
font-semibold — 600 Zeitreisen
font-bold — 700 Zeitreisen

1b. Spacing (theme.css)

Spacing-Klassen von xs bis xxl. Keine Props — Nutzung über Tailwind-Klassen wie p-m oder gap-xl.

xs
0.3125rem
s
0.625rem
m
0.9375rem
l
1.5625rem
xl
2.5rem
xxl
4.0625rem

1c. Farben (theme.css)

Farbklassen inkl. Opacity-Varianten. Keine Props — Nutzung über Tailwind-Klassen wie bg-primary oder text-foreground.

primary#F59424
primary-orange-light#F7AC5A
secondary#EC5C55
accent#9D4CFF
grey#F2F2EB
ink#646464
background#F2F2EB
foreground#646464

Opacity-Varianten

primary/10
primary/20
primary/30
primary/50
primary/70

2. Icons

2a. Favicon & App Icons

PWA- und Browser-Icons aus public/icons/.

favicon.svg
favicon.svgTab / modern
favicon.png
favicon.png32×32
apple-touch-icon.png
apple-touch-icon.png180×180
icon-192.png
icon-192.png192×192
icon-512.png
icon-512.png512×512
icon-512-maskable.png
icon-512-maskable.png512×512 maskable
logo-original.svg
logo-original.svgMaster SVG
logo-original.png
logo-original.png1000×1000

3. Buttons

3a. Button (Button.vue)

Klickbarer Button oder Link in farbigen Varianten.

Prop Typ Required Default Wert Beschreibung
variant'primary' | 'secondary' | 'accent' | 'dark' | 'text'nein'primary'
Farbvariante des Buttons
labelstringnein
Button-Text als Fallback ohne Slot
linkstringnein
URL — rendert NuxtLink statt button
fontSize'sm' | 'base' | 'lg'nein'lg'
Schriftgrösse des Button-Texts
disabledbooleanneinfalseDeaktiviert den Button
type'button' | 'submit' | 'reset'nein'button'
HTML-type-Attribut ohne link
fullWidthbooleanneinfalseButton über die volle Breite (w-full)
default (slot)slotneinButton-Inhalt, Fallback ist label

3b. PlayButton (PlayButton.vue)

Grosser runder Play-Button für Mediensteuerung.

Prop Typ Required Default Wert Beschreibung
ariaLabelstringja
Barrierefreie Beschriftung
variant'default' | 'invert'nein'default'
Farbvariante des Buttons
size'default' | 'md' | 'sm'nein'default'
Grösse des Buttons
disabledbooleanneinfalseDeaktiviert den Button
type'button' | 'submit' | 'reset'nein'button'
HTML-type-Attribut

3c. PauseButton (PauseButton.vue)

Grosser runder Pause-Button für Mediensteuerung.

Prop Typ Required Default Wert Beschreibung
ariaLabelstringja
Barrierefreie Beschriftung
variant'default' | 'invert'nein'default'
Farbvariante des Buttons
size'default' | 'md' | 'sm'nein'default'
Grösse des Buttons
disabledbooleanneinfalseDeaktiviert den Button
type'button' | 'submit' | 'reset'nein'button'
HTML-type-Attribut

4. Formulare

4a. Input (Input.vue)

Texteingabefeld mit Label und optionalem Fehlerzustand.

Prop Typ Required Default Wert Beschreibung
v-modelstringnein''
Aktueller Eingabewert
labelstringnein
Optionales Feld-Label
placeholderstringnein
Platzhalter im Eingabefeld
typestringnein'text'
HTML-Input-Typ
disabledbooleanneinfalseDeaktiviert das Eingabefeld
errorbooleanneinfalseFehlerzustand mit Icon
autocompletestringnein
HTML-autocomplete-Attribut
namestringnein
HTML-name-Attribut

4b. Checkbox (Checkbox.vue)

Checkbox mit optionalem Label.

Prop Typ Required Default Wert Beschreibung
v-modelbooleanneinfalseAngehakt oder nicht angehakt
labelstringnein
Beschriftung neben der Checkbox
disabledbooleanneinfalseDeaktiviert die Checkbox
namestringnein
HTML-name-Attribut
default (slot)slotneinLabel-Inhalt, Fallback ist label

4c. Radio (Radio.vue)

Radio-Button für eine Auswahl innerhalb einer Gruppe.

Prop Typ Required Default Wert Beschreibung
v-modelstringnein''
Aktuell ausgewählter Wert der Gruppe
valuestringjaWert dieser Radio-Option
labelstringnein
Beschriftung neben dem Radio
namestringnein
HTML-name für die Radio-Gruppe
disabledbooleanneinfalseDeaktiviert diese Option
default (slot)slotneinLabel-Inhalt, Fallback ist label


5. Komponenten

5a. Divider (Divider.vue)

Vertikaler Abstandshalter mit optionaler horizontaler Trennlinie.

Prop Typ Required Default Wert Beschreibung
linebooleanneintrueZeigt die horizontale Trennlinie
spacing'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl'nein'xl'
Vertikaler Abstand um den Divider (ohne Linie = Höhe)
mtAutobooleanneinfalseAktiviert mt-auto (schiebt Divider nach unten in Flex-Layouts)

Abschnitt oben


Abschnitt unten


5b. Information-Dialog (InformationDialog.vue)

Schliessbarer Info-Hinweis mit optionalem Icon.

Prop Typ Required Default Wert Beschreibung
v-modelbooleanneintrueSteuert die Sichtbarkeit des Dialogs
showIconbooleanneinfalseZeigt das Info-Icon links neben dem Inhalt
closeAriaLabelstringja
ARIA-Label für den Schliessen-Button
default (slot)slotnein
Dialog-Inhalt
Dies ist ein Informationstext.

5c. Tabs (Tabs.vue)

Tab-Navigation mit Mobile-Select und benannten Slots für Panel-Inhalte.

Prop Typ Required Default Wert Beschreibung
v-modelstringja
Wert des aktiven Tabs
optionsTabOption[]jaTab-Definitionen mit value, label, optional href und disabled
ariaLabelstringnein'Tabs'
ARIA-Label der Desktop-Tab-Navigation
selectAriaLabelstringnein'Select a tab'
ARIA-Label des mobilen Selects
#[value] (slot)slotneinPanel-Inhalt pro Tab, Slot-Name entspricht option.value

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.


5d. JourneyProgress (JourneyProgress.vue)

Fortschrittsbalken für eine Reise mit Start-/Zielort und Zug-Indikator.

Prop Typ Required Default Wert Beschreibung
startstringja
Startort-Label links unter dem Balken
destinationstringja
Zielort-Label rechts unter dem Balken
progressnumberja
Fortschritt von 0 bis 100, intern geklemmt
markers{ id: string, progress: number }[]nein[]Primary-Striche für Trigger auf der Strecke, inklusive bereits passierter
zürich
bern

5e. Tag (Tag.vue)

Kleines Label/Badge in verschiedenen Farbvarianten.

Prop Typ Required Default Wert Beschreibung
variant'primary' | 'outline' | 'secondary' | 'dark'nein'primary'
Farbvariante des Tags
default (slot)slotnein
Tag-Text bzw. Inhalt
Tag

5f. SpeedBadge (SpeedBadge.vue)

Pill-Badge mit Info-Icon und Geschwindigkeitsangabe in km/h. Klick öffnet Bottom-Sheet mit Livegeschwindigkeit und GPX-Distanzen.

Prop Typ Required Default Wert Beschreibung
speednumberja
Geschwindigkeit in km/h ab 0, ohne Obergrenze

5g. LoadingSpinner (LoadingSpinner.vue)

Zweifarbiger Lade-Spinner mit Primary- und Secondary-Farbe.

Prop Typ Required Default Wert Beschreibung
size'sm' | 'md' | 'lg'nein'md'
Grösse des Spinners

5h. ChannelCard (ChannelCard.vue)

Farbige Sender-Kanal-Karte mit Titel, Beschreibung, Geschichten-Badge und Info-Link.

Prop Typ Required Default Wert Beschreibung
titlestringja
Channel-Titel
slugstringja
URL-Slug (Prefix lokalisiert: sender/station/stazione)
descriptionstringnein
Kurzbeschreibung unter dem Titel
storyCountnumbernein0
Anzahl Geschichten (Trigger)
variant'primary' | 'green' | 'secondary' | 'accent'nein'primary'
Hintergrundfarbe der Karte

5i. ChannelSelection (ChannelSelection.vue)

Liste von ChannelCards für die Senderauswahl einer Strecke.


5j. LanguageSwitcher (LanguageSwitcher.vue)

Sprachumschalter über @nuxtjs/i18n (de-CH, fr, it, en).


6. Medien

6a. AudioPlayer (AudioPlayer.vue)

Audio-Wiedergabe mit Wellenform, «Hören»-Badge, Titel, Beschreibung und Transkription. Prop: media: MediaItem (type audio).

Listen

Audio 01 – Einstieg

Beispiel-Audio für den Trigger an der Kante Fust.


6b. VideoPlayer (VideoPlayer.vue)

Video- oder Bild-Wiedergabe mit «Sehen»-Badge, Zeitanzeige, Beschreibung und Transkription. Video kann optionales Begleitaudio parallel abspielen.

Prop Typ Required Default Wert Beschreibung
mediaMediaItemjaCMS-Medium mit type video oder image
type (Demo)'video' | 'image'nein'video'
Wechselt zwischen Video- und Bild-Mock
@completeemitneinVideo ended bzw. Bild nach 5s

Kreuzung Kaufmannstrasse, aufgenommen im Sommer 2024.

Watch

Video 01 – Kreuzung

Beispiel-Video für die Kreuzung Kaufmannstrasse – Quaderstrasse.



6d. MediaPlayer (MediaPlayer.vue)

Dispatcher für Audio-, Video-, Bild- und Slideshow-Player inkl. MediaFooterSheet.

Prop Typ Required Default Wert Beschreibung
mediaMediaItemjaBeliebiges CMS-Medium (audio/video/image/slideshow)
type (Demo)MediaTypenein'audio'
Wechselt den Demo-Medientyp
default (slot)slotneinInhalt im MediaFooterSheet
@completeemitneinWeitergeleitet vom Sub-Player
Listen

Audio 01 – Einstieg

Beispiel-Audio für den Trigger an der Kante Fust.


6e. MediaSource (MediaSource.vue)

i-Icon zur Quellenangabe eines Trigger- oder Puffer-Inhalts. Öffnet einen Dialog mit dem formatierten Quelltext. Die Caption steht kursiv direkt unter dem Medium und dient zugleich als Alternativtext.

Prop Typ Required Default Wert Beschreibung
sourcestring | nullneinnull
Quellenangabe als WYSIWYG-HTML; ohne Inhalt bleibt das Icon verborgen
tone'on-dark' | 'on-light'nein'on-dark'
Farbgebung des i-Icons je nach Hintergrund

Blick über die Quaderstrasse Richtung Altstadt.

Blick über die Quaderstrasse Richtung Altstadt.

Blick über die Quaderstrasse Richtung Altstadt.

Watch

Bild 01 – Quaderstrasse

Beispiel-Bild entlang der Quaderstrasse.


7. Channel / Live

7a. ChannelHeader (ChannelHeader.vue)

Oranger Channel-Header mit Titel, Beschreibung, Story-Badge und animierten Punkten.

Prop Typ Required Default Wert Beschreibung
titlestringja
Channel-Name als h1
descriptionstring | nullneinnull
Kurzbeschreibung unter dem Titel
storyCountnumbernein0
Anzahl Geschichten im Badge

Channel

Brücken

Über Viadukte und dessen Ingenieurskunst

12 stories

7b. ChannelStations (ChannelStations.vue)

Timeline der Trigger-Stationen mit Verbindungslinien und GSAP-Reveal.

Prop Typ Required Default Beschreibung
stationsChannelStation[]jaListe mit id, name und optional duration (Sekunden)

Stations

  1. Landquart3 min
  2. Klosters5 min
  3. Davos Platz4 min

7c. ChannelSwitchButton (ChannelSwitchButton.vue)

Öffnet den Fullscreen-Tuner zum Senderwechsel. Keine Props.


7d. ChannelLiveLoader (ChannelLiveLoader.vue)

Animierter Lade-Indikator mit pulsierenden Ringen für Channel-Live. Keine Props.



9. Integration

9a. TrainTimetable (TrainTimetable.vue)

Standort-Pill mit Bahnhofs-Dropdown und Live-Verbindungen via transport.opendata.ch. Verbindungs-Klick speichert Session und navigiert zur Senderauswahl.

Prop Typ Required Default Beschreibung
stationsStationOption[]jaBahnhöfe mit trackIds und destinations (id, name, trackId)