Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
1e1cbf4
fix: initial setup
lenderom Dec 13, 2025
34618fa
Merge remote-tracking branch 'origin/main' into feat/add-lithuania
lenderom Dec 14, 2025
03d63a1
fix: update ltg
lenderom Dec 14, 2025
c426087
feat: Migrate SP page to new train category expanders
MoritzWeber0 Dec 16, 2025
f1e84dc
Merge branch 'main' into feat/add-lithuania
therobrob Dec 18, 2025
4a12271
fix: fixed warnings & errors
therobrob Dec 18, 2025
f35d5b0
feat: Update archetypes and add new heading "Scheduled routes"
MoritzWeber0 Dec 18, 2025
3926d1d
feat: Consistently apply "schedules routes" heading
MoritzWeber0 Dec 18, 2025
a3ff494
feat: Group SP train reservation and improve heading rendering
MoritzWeber0 Dec 18, 2025
8ff6b6c
feat: Consistently use the same apostroph in French
MoritzWeber0 Dec 18, 2025
1cc449b
Merge branch 'refactor/consistent-apostroph' into feat/migrate-sp
MoritzWeber0 Dec 18, 2025
7cb674e
feat: Add id attribute to train category expanders
MoritzWeber0 Dec 18, 2025
9d400c3
feat: Migrate SBB
MoritzWeber0 Dec 18, 2025
8b97f32
feat: Auto-expand expanders when accessed via link
MoritzWeber0 Dec 18, 2025
fcda39c
fix: Migrate important highlight to reservation section
MoritzWeber0 Dec 18, 2025
d81a1dc
Merge branches 'feat/migrate-sp' and 'feat/add-lithuania' of github.c…
lenderom Dec 19, 2025
e4c597b
fix: prepare preview
lenderom Dec 19, 2025
10d3b60
fix: add sources
lenderom Dec 19, 2025
3b1619e
fix: prepare latvia
lenderom Dec 19, 2025
bc53159
Merge branch 'main' into feat/add-lithuania
therobrob Dec 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .opencode/command/update-traincategory.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ A shortcode looks like:

```
{{% train-category
id="train-id" (lowercase, hyphenated abbreviation of the train category)
title="title"
type="highspeed" (can be highspeed, regional, subway, bus, funicular, sleeper)
type="highspeed" (can be highspeed, regional, subway, bus, funicular, sleeper, ship)
fip_accepted=true (can be true, false, partially)
reservation_required=true (can be true, false, partially)
reservation_possible=true (can be true, false, partially; omit the attribute if false or if reservation_required is true)
Expand All @@ -36,8 +37,10 @@ If there is a risk of confusion (previously marked with ℹ️ in the text), add
{{% /highlight %}}
```

Tranform the "**Reservation cost:**" (or language equivalent) section to a heading "### Reservation".
Tranform the "**Reservation cost:**" (or language equivalent) section to a heading "#### Reservation" (de: Reservierung / fr: Réservation).

If there is additional information in the text that can't be represented in the shortcode, add the information to the text. For example "**Reservation required:** ⚠️ sometimes (marked with _R_)" becomes "A reservation is required for some trains (marked with _R_)."

If the expander mentions routes where FIP are valid, place them under a `#### Scheduled routes` (de: Strecken im Linienverkehr / fr: Lignes régulières). heading. Subheading for `##### Strecken mit FIP-Gültigkeit` and `##### Strecken ohne FIP-Gültigkeit` are possible if needed.

Make sure to remove the old expanders after adding the shortcode.
68 changes: 49 additions & 19 deletions archetypes/operator/index.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,37 +45,67 @@ FIP Globalpreis: <✅/⛔>
## Zugkategorien und Reservierungen

<!--
Sind Reservierungen möglich und wo besteht eine Reservierungspflicht?
-->
Für jede Zugkategorie kann ein eigene Abschnitt nach dem folgenden Prinzip eingefügt werden. Folgende Parameter können übergeben werden:
- `id`: Kleingeschriebene, mit Bindestrichen getrennte Abkürzung der Zugkategorie (z.B. "ice", "tgv-inoui")
- `title`: Titel der Zugkategorie
- `type`: `highspeed`, `regional`, `subway`, `bus`, `funicular`, `sleeper` oder `ship`
- `fip_accepted`: true, false, partially
- `reservation_required`: true, false, partially
- `reservation_possible`: true, false, partially (default false, kann weggelassen werden, wenn reservation_required true ist)
- `route_overview_url`: Link zu einer Seite mit einer Übersicht der Routen dieser Kategorie (kann weggelassen werden, wenn nicht vorhanden)
- `additional_information_url`: Link zu einer Seite mit zusätzlichen Informationen zu dieser Kategorie (kann weggelassen werden, wenn nicht vorhanden)
-->

{{% train-category
id="zug-id"
title="title"
type="highspeed"
fip_accepted=true
reservation_required=true
reservation_possible=true
route_overview_url="https://example.com"
additional_information_url="https://example.com"
%}}

<!--
Für jede Zugkategorie kann ein eigene Abschnitt nach dem folgenden Prinzip eingefügt werden.
Im Titel können folgende Emojis verwendet werden:
- ⚠️ für eine generelle Reservierungspflicht oder Zuschläge
- 1️⃣ für eine Reservierungspflicht in der 1. Klasse
- ⛔ für eine Nichtanerkennung von FIP
- ℹ️ für Verwechslungsgefahr mit anderen Bahngesellschaften/Zugkategorien
Hier kann eine Beschreibung der Zugkategorie ergänzt werden.
-->

{{% expander "Zugkategorie" traincategory "category" %}}
{{% highlight confusion %}}
Dieses Highlight kann ergänzt werden, wenn es das Risiko gibt, dass die Zugkategorie mit einer anderen verwechselt wird.
{{% /highlight %}}

{{% highlight important %}}
Hier können weitere wichtige Informationen ergänzt werden.
{{% /highlight %}}

<!-- Ersetze Zugkategorie mit dem Name der Zugkategorie, z. B. ICE. -->
#### Reservierung

**Beschreibung:**
<!--
Beschreibung der Reservierungsbedingung für diese Zugkategorie.
-->

<!-- Füge hier eine Beschreibung der Zugkategorie ein -->
#### Strecken im Linienverkehr

**Reservierung möglich:** Ja/Nein \
**Reservierungspflicht:** Ja/Nein \
<!--
Auflistung aller Strecken dieser Zugkategorie im Linienverkehr.
<!-- Wenn FIP nicht gültig ist, ergänze folgendes:
**FIP:** ⛔ FIP wird nicht anerkannt
Bei teilweiser FIP-Gültigkeit können die folgenden Unterüberschriften verwendet werden:
-->
<!-- Wenn es FIP Globalpreise gibt, ergänze folgendes:
**FIP Globalpreis:**

<!--
##### Strecken mit FIP-Gültigkeit
- Route 1
- Route 2
##### Strecken ohne FIP-Gültigkeit
- Route 3
- Route 4
-->

{{% /expander %}}
{{% /train-category %}}

## Klassenkategorien

Expand Down
68 changes: 49 additions & 19 deletions archetypes/operator/index.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,37 +45,67 @@ FIP Global Fare: <✅/⛔>
## Train Categories and Reservations

<!--
Are reservations possible and where is there a reservation requirement?
-->
For each train category, a separate section can be added according to the following principle. The following parameters can be passed:
- `id`: Lowercase, hyphenated abbreviation of the train category (e.g., "ice", "tgv-inoui")
- `title`: Title of the train category
- `type`: `highspeed`, `regional`, `subway`, `bus`, `funicular`, `sleeper` or `ship`
- `fip_accepted`: true, false, partially
- `reservation_required`: true, false, partially
- `reservation_possible`: true, false, partially (default false, can be omitted if reservation_required is true)
- `route_overview_url`: Link to a page with an overview of the routes of this category (can be omitted if not available)
- `additional_information_url`: Link to a page with additional information about this category (can be omitted if not available)
-->

{{% train-category
id="train-id"
title="title"
type="highspeed"
fip_accepted=true
reservation_required=true
reservation_possible=true
route_overview_url="https://example.com"
additional_information_url="https://example.com"
%}}

<!--
For each train category, a separate section can be added according to the following principle:
In the title, the following emojis can be used:
- ⚠️ for a general reservation requirement or supplements
- 1️⃣ for a reservation requirement in 1st class
- ⛔ for a non-acceptance of FIP
- ℹ️ for confusion with other railway companies/train categories
A description of the train category can be added here.
-->

{{% expander "Train category" traincategory "category" %}}
{{% highlight confusion %}}
This highlight can be added if there is a risk that the train category could be confused with another one.
{{% /highlight %}}

{{% highlight important %}}
Further important information can be added here.
{{% /highlight %}}

<!-- Replace "Train category" with the name of the category, e.g. ICE. -->
#### Reservation

**Description:**
<!--
Description of the reservation conditions for this train category.
-->

<!-- Description of the category -->
#### Scheduled routes

**Reservation possible:** <yes/no> \
**Reservation required:** <⚠️ yes/no/⚠️1️⃣ only first class> \
<!--
List of all routes of this train category in scheduled services.
<!-- If FIP is not valid, add the following:
**FIP:** ⛔ FIP is not accepted
For partial FIP validity, the following subheadings can be used:
-->
<!-- If there are FIP Global Fares, add the following:
**FIP Global Fare:**

<!--
##### Routes with FIP validity
- Route 1
- Route 2
##### Routes without FIP validity
- Route 3
- Route 4
-->

{{% /expander %}}
{{% /train-category %}}

## Class Categories

Expand Down
68 changes: 49 additions & 19 deletions archetypes/operator/index.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,37 +45,67 @@ Tarif Global FIP : <✅/⛔>
## Catégories de trains et réservations

<!--
Les réservations sont-elles possibles et où sont-elles obligatoires ?
-->
Pour chaque catégorie de train, une section distincte peut être ajoutée selon le modèle suivant. Les paramètres suivants peuvent être utilisés :
- `id` : Abréviation en minuscules avec traits d'union de la catégorie de train (par ex. "ice", "tgv-inoui")
- `title` : Titre de la catégorie de train
- `type` : `highspeed`, `regional`, `subway`, `bus`, `funicular`, `sleeper` ou `ship`
- `fip_accepted` : true, false, partially
- `reservation_required` : true, false, partially
- `reservation_possible` : true, false, partially (défaut false, peut être omis si reservation_required est true)
- `route_overview_url` : Lien vers une page avec un aperçu des lignes de cette catégorie (peut être omis si non disponible)
- `additional_information_url` : Lien vers une page avec des informations supplémentaires sur cette catégorie (peut être omis si non disponible)
-->

{{% train-category
id="train-id"
title="titre"
type="highspeed"
fip_accepted=true
reservation_required=true
reservation_possible=true
route_overview_url="https://example.com"
additional_information_url="https://example.com"
%}}

<!--
Pour chaque catégorie de train, une section distincte peut être ajoutée selon le modèle suivant :
Dans le titre, les emojis suivants peuvent être utilisés :
- ⚠️ pour une obligation générale de réservation ou des suppléments
- 1️⃣ pour une obligation de réservation en 1ère classe uniquement
- ⛔ pour une non-validité FIP
- ℹ️ pour des confusions possibles avec d’autres compagnies ferroviaires / catégories de train
Une description de la catégorie de train peut être ajoutée ici.
-->

{{% expander "Catégorie de train" traincategory "category" %}}
{{% highlight confusion %}}
Ce bloc peut être ajouté s’il y a un risque que la catégorie de train soit confondue avec une autre.
{{% /highlight %}}

{{% highlight important %}}
D’autres informations importantes peuvent être ajoutées ici.
{{% /highlight %}}

<!-- Remplacez "Catégorie de train" par le nom de la catégorie, par ex. TGV, ICE -->
#### Réservation

**Description :** \
<!--
Description des conditions de réservation pour cette catégorie de train.
-->

<!-- Description de la catégorie -->
#### Lignes régulières

**Réservation possible :** <oui/non> \
**Réservation obligatoire :** <⚠️ oui / non / ⚠️1️⃣ seulement en 1ère classe> \
<!--
Liste de toutes les lignes de cette catégorie de train en service régulier.

<!-- Si FIP n’est pas accepté, ajoutez ceci :
**FIP :** ⛔ FIP non accepté
Pour une validité FIP partielle, les sous-titres suivants peuvent être utilisés :
-->
<!-- Si les Tarifs Globaux FIP sont disponibles, ajoutez ceci :
**Tarif Global FIP :**

<!--
##### Lignes avec validité FIP

- Ligne 1
- Ligne 2

##### Lignes sans validité FIP

- Ligne 3
- Ligne 4
-->

{{% /expander %}}
{{% /train-category %}}

## Catégories de classes

Expand Down
5 changes: 0 additions & 5 deletions assets/content-not-available-yet.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@
"EN": "Kosovo",
"FR": "Kosovo"
},
{
"DE": "Litauen (bald verfügbar)",
"EN": "Lithuania (coming soon)",
"FR": "Lituanie (à venir)"
},
{
"DE": "Montenegro",
"EN": "Montenegro",
Expand Down
Binary file added assets/images/flags/latvia.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions assets/js/expander.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
function expandTargetedExpander() {
const hash = window.location.hash;
if (!hash) return;

const targetElement = document.getElementById(hash.substring(1));

if (targetElement && targetElement.tagName === "DETAILS") {
targetElement.open = true;
}
}

document.addEventListener("DOMContentLoaded", expandTargetedExpander);
window.addEventListener("hashchange", expandTargetedExpander);
1 change: 1 addition & 0 deletions assets/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ import "./dropdown.js";
import "./darkmode.js";
import "./search.js";
import "./interactiveMap.js";
import "./expander.js";
20 changes: 20 additions & 0 deletions assets/sass/headings.scss
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,23 @@ h4 {
text-wrap: balance;
break-after: avoid;
}

h5 {
font-size: 1.6rem;
line-height: 1.25;
margin-bottom: 1rem;
margin-top: 0;
font-weight: 700;
text-wrap: balance;
break-after: avoid;
}

h6 {
font-size: 1.4rem;
line-height: 1.25;
margin-bottom: 1rem;
margin-top: 0;
font-weight: 700;
text-wrap: balance;
break-after: avoid;
}
14 changes: 14 additions & 0 deletions assets/sass/trainCategory.scss
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,17 @@ details.o-expander--train-category:not([open]) {
}
}
}

.o-train-category__content {
h4 {
@extend h3;
}

h5 {
@extend h4;
}

h6 {
@extend h5;
}
}
37 changes: 37 additions & 0 deletions content/booking/ltg-website/index.de.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
draft: false
title: "LTG-Link Website"
description: "Buchungsinformationen für Buchungswebsite von LTG-Link."
params:
classes:
first: "kostenlos"
second: "kostenlos"
fip_50: true
reservations: true
booking_link: "https://ltglink.lt/en"
type: "website"
---

Auf der Buchungswebsite von LTG-Link werden FIP 50 Tickets, Reservierungen sowie 0er-Fahrkarten für Verbindungen von LTG-Link in Litauen und Lettland verkauft. Eine Buchung ist auch über die App von LTG-Link möglich.

Fahrkarten im Inlandsverkehr sind 30 Tage, im Auslandsverkehr 60 Tage vorher buchbar.

![Übersicht Vergünstigungen](ltg-website-discount-overview.webp)

![FIP Vergünstigung](ltg-website-fip-discount.webp)

{{% booking-section "fip_50" %}}

## FIP 50 Fahrkarten

Auf der Buchungswebsite von LTG-Link werden FIP 50 Tickets für Verbindungen von LTG-Link in Litauen und Lettland verkauft. Um den FIP 50 Rabatt hinzuzufügen, muss in der Übersicht der Passagiere/Vergünstigungen die Option _I have FIP card_ gewählt werden. Anschließend muss die Nummer des FIP Ausweises hinzugefügt und die Option _FIP discount 50%_ gewählt werden.
{{% /booking-section %}}

{{% booking-section "reservations" %}}

## Reservierungen

Auf der Buchungswebsite von LTG-Link werden Reservierungen und 0er-Fahrkarten für Verbindungen von LTG-Link in Litauen und Lettland verkauft. Dazu muss in der Übersicht der Passagiere/Vergünstigungen die Option _I have FIP card_ gewählt werden. Anschließend muss die Nummer des FIP Ausweises hinzugefügt und die Option _FIP discount 100%_ gewählt werden.

FIP-Ermäßigung wird online auch bei grenzüberschreitenden Fahrten nach Polen und Lettland gewährt. Für Fahrten zwischen Polen und Litauen zu 0 € ist dann aber sowohl ein litauischer als auch ein polnischer PKP-Freifahrtschein erforderlich.
{{% /booking-section %}}
Loading
Loading