Vai al contenuto

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.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
variant'primary' | 'secondary' | 'accent' | 'dark' | 'text'propsTable.no'primary'
Farbvariante des Buttons
labelstringpropsTable.no—
Button-Text als Fallback ohne Slot
linkstringpropsTable.no—
URL — rendert NuxtLink statt button
fontSize'sm' | 'base' | 'lg'propsTable.no'lg'
Schriftgrösse des Button-Texts
disabledbooleanpropsTable.nofalseDeaktiviert den Button
type'button' | 'submit' | 'reset'propsTable.no'button'
HTML-type-Attribut ohne link
fullWidthbooleanpropsTable.nofalseButton über die volle Breite (w-full)
default (slot)slotpropsTable.no——Button-Inhalt, Fallback ist label

3b. PlayButton (PlayButton.vue)

Grosser runder Play-Button für Mediensteuerung.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
labelstringpropsTable.yes—
Barrierefreie Beschriftung
variant'default' | 'invert'propsTable.no'default'
Farbvariante des Buttons
size'default' | 'md' | 'sm'propsTable.no'default'
Grösse des Buttons
disabledbooleanpropsTable.nofalseDeaktiviert den Button
type'button' | 'submit' | 'reset'propsTable.no'button'
HTML-type-Attribut

3c. PauseButton (PauseButton.vue)

Grosser runder Pause-Button für Mediensteuerung.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
labelstringpropsTable.yes—
Barrierefreie Beschriftung
variant'default' | 'invert'propsTable.no'default'
Farbvariante des Buttons
size'default' | 'md' | 'sm'propsTable.no'default'
Grösse des Buttons
disabledbooleanpropsTable.nofalseDeaktiviert den Button
type'button' | 'submit' | 'reset'propsTable.no'button'
HTML-type-Attribut

4. Formulare

4a. Input (Input.vue)

Texteingabefeld mit Label und optionalem Fehlerzustand.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
v-modelstringpropsTable.no''
Aktueller Eingabewert
labelstringpropsTable.no—
Optionales Feld-Label
placeholderstringpropsTable.no—
Platzhalter im Eingabefeld
typestringpropsTable.no'text'
HTML-Input-Typ
disabledbooleanpropsTable.nofalseDeaktiviert das Eingabefeld
errorbooleanpropsTable.nofalseFehlerzustand mit Icon
autocompletestringpropsTable.no—
HTML-autocomplete-Attribut
namestringpropsTable.no—
HTML-name-Attribut

4b. Checkbox (Checkbox.vue)

Checkbox mit optionalem Label.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
v-modelbooleanpropsTable.nofalseAngehakt oder nicht angehakt
labelstringpropsTable.no—
Beschriftung neben der Checkbox
disabledbooleanpropsTable.nofalseDeaktiviert die Checkbox
namestringpropsTable.no—
HTML-name-Attribut
default (slot)slotpropsTable.no——Label-Inhalt, Fallback ist label

4c. Radio (Radio.vue)

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

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
v-modelstringpropsTable.no''
Aktuell ausgewählter Wert der Gruppe
valuestringpropsTable.yes——Wert dieser Radio-Option
labelstringpropsTable.no—
Beschriftung neben dem Radio
namestringpropsTable.no—
HTML-name für die Radio-Gruppe
disabledbooleanpropsTable.nofalseDeaktiviert diese Option
default (slot)slotpropsTable.no——Label-Inhalt, Fallback ist label


5. Komponenten

5a. Divider (Divider.vue)

Vertikaler Abstandshalter mit optionaler horizontaler Trennlinie.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
linebooleanpropsTable.notrueZeigt die horizontale Trennlinie
spacing'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl'propsTable.no'xl'
Vertikaler Abstand um den Divider (ohne Linie = Höhe)
mtAutobooleanpropsTable.nofalseAktiviert mt-auto (schiebt Divider nach unten in Flex-Layouts)

Abschnitt oben


Abschnitt unten


5b. Information-Dialog (InformationDialog.vue)

Vollbild-Overlay mit schliessbarem Hinweis und optionalem Icon. Über v-model öffnen.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
v-modelbooleanpropsTable.nofalseSteuert die Sichtbarkeit des Vollbild-Overlays
showIconbooleanpropsTable.nofalseZeigt das Info-Icon links neben dem Inhalt
closeAriaLabelstringpropsTable.yes—
ARIA-Label für den Schliessen-Button
default (slot)slotpropsTable.no—
Dialog-Inhalt

5c. Tabs (Tabs.vue)

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

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
v-modelstringpropsTable.yes—
Wert des aktiven Tabs
optionsTabOption[]propsTable.yes——Tab-Definitionen mit value, label, optional href und disabled
ariaLabelstringpropsTable.no'Tabs'
ARIA-Label der Desktop-Tab-Navigation
selectAriaLabelstringpropsTable.no'Select a tab'
ARIA-Label des mobilen Selects
#[value] (slot)slotpropsTable.no——Panel-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.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
startstringpropsTable.yes—
Startort-Label links unter dem Balken
destinationstringpropsTable.yes—
Zielort-Label rechts unter dem Balken
progressnumberpropsTable.yes—
Fortschritt von 0 bis 100, intern geklemmt
markers{ id: string, progress: number, title: string, types: string[] }[]propsTable.no[]—Trigger auf der Strecke. Ein Klick öffnet Titel und Inhaltstyp
zürich
bern

5e. Tag (Tag.vue)

Kleines Label/Badge in verschiedenen Farbvarianten.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
variant'primary' | 'outline' | 'secondary' | 'dark'propsTable.no'primary'
Farbvariante des Tags
default (slot)slotpropsTable.no—
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.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
speednumberpropsTable.yes—
Geschwindigkeit in km/h ab 0, ohne Obergrenze

5g. LoadingSpinner (LoadingSpinner.vue)

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

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
size'sm' | 'md' | 'lg'propsTable.no'md'
Grösse des Spinners

5h. ChannelCard (ChannelCard.vue)

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

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
titlestringpropsTable.yes—
Channel-Titel
slugstringpropsTable.yes—
URL-Slug (Prefix lokalisiert: sender/station/stazione)
descriptionstringpropsTable.no—
Kurzbeschreibung unter dem Titel
storyCountnumberpropsTable.no0
Anzahl Geschichten (Trigger)
variant'primary' | 'green' | 'secondary' | 'accent'propsTable.no'primary'
Hintergrundfarbe der Karte
isPartialRoutebooleanpropsTable.nofalseHinweis, dass der Sender nur einen Teil der Verbindung abdeckt
routeFromstring | nullpropsTable.nonull
Startbahnhof der Teilstrecke
routeTostring | nullpropsTable.nonull
Endbahnhof der Teilstrecke

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).

Ascolta

Audio 01 – Einstieg

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


6b. VideoPlayer (VideoPlayer.vue)

Video- oder Bild-Wiedergabe mit «Schauen»-Badge, Zeitanzeige, Beschreibung und Transkription. Mit Begleitaudio erscheinen Mini-Wellenform und Badge «Hören».

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
mediaMediaItempropsTable.yes——CMS-Medium mit type video oder image
type (Demo)'video' | 'image'propsTable.no'video'
Wechselt zwischen Video- und Bild-Mock
@completeemitpropsTable.no——Video ended bzw. Bild nach 5s

Kreuzung Kaufmannstrasse, aufgenommen im Sommer 2024.

Ascolta

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. Inhalte ohne Ton (Text, Quiz, Bild ohne Soundtrack, stille Slideshow-Folie) zeigen die Badge «Kein Audio» beim Inhalt. Text und stille Bilder haben zusätzlich «Fertig» nach dem Inhalt.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
mediaMediaItempropsTable.yes——Beliebiges CMS-Medium (audio/video/image/slideshow)
type (Demo)MediaTypepropsTable.no'audio'
Wechselt den Demo-Medientyp
@completeemitpropsTable.no——Weitergeleitet vom Sub-Player
Ascolta

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.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
sourcestring | nullpropsTable.nonull
Quellenangabe als WYSIWYG-HTML; ohne Inhalt bleibt das Icon verborgen
tone'on-dark' | 'on-light'propsTable.no'on-dark'
Farbgebung des i-Icons je nach Hintergrund

Blick über die Quaderstrasse Richtung Altstadt.

Blick über die Quaderstrasse Richtung Altstadt.

GuardaNessun audio

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.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.valuepropsTable.description
titlestringpropsTable.yes—
Channel-Name als h1
descriptionstring | nullpropsTable.nonull
Kurzbeschreibung unter dem Titel
storyCountnumberpropsTable.no0
Anzahl Geschichten im Badge
isPartialRoutebooleanpropsTable.nofalseHinweis, dass der Sender nur einen Teil der Verbindung abdeckt
routeFromstring | nullpropsTable.nonull
Startbahnhof der Teilstrecke
routeTostring | nullpropsTable.nonull
Endbahnhof der Teilstrecke

Canale

Brücken

Über Viadukte und dessen Ingenieurskunst

12 storie

7b. ChannelStations (ChannelStations.vue)

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

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.description
stationsChannelStation[]propsTable.yes—Liste mit id, name und optional duration (Sekunden)

Stazioni

  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.

propsTable.proppropsTable.typepropsTable.requiredpropsTable.defaultpropsTable.description
stationsStationOption[]propsTable.yes—Bahnhöfe mit trackIds und destinations (id, name, trackId)