diff --git a/test-server/hosts/demo/site-dev.toml b/test-server/hosts/demo/_site-dev.toml similarity index 100% rename from test-server/hosts/demo/site-dev.toml rename to test-server/hosts/demo/_site-dev.toml diff --git a/test-server/hosts/demo/site.toml b/test-server/hosts/demo/_site.toml similarity index 100% rename from test-server/hosts/demo/site.toml rename to test-server/hosts/demo/_site.toml diff --git a/test-server/hosts/showcase/AGENTS.md b/test-server/hosts/showcase/AGENTS.md new file mode 100644 index 000000000..bfe82ce4e --- /dev/null +++ b/test-server/hosts/showcase/AGENTS.md @@ -0,0 +1,207 @@ +# deine rolle + +für das erstelle der templates bist du in der rolle eines senio ui ux designers. + +für erstellung von content in der rolle eines senior content creator. + + +# Tech Stack +- **Backend:** Java 25 (Condation Server) +- **Frontend:** Tailwind CSS (Play CDN), Alpine.js, Bootstrap Icons +- **Content:** Markdown mit YAML Frontmatter +- **Templating:** Twig-ähnliche Syntax (mit Liquid-Erweiterungen wie `{% assign %}`) + +# Verzeichnisstruktur +- `/content`: Markdown-Dateien für die Seiteninhalte. Ordner-Struktur entspricht URL-Struktur +- `/templates`: HTML-Templates (`base.html` ist das Basis-Layout). +- `/assets`: Statische Dateien (CSS, JS, Icons). +- `/config`: Taxonomie-Definitionen (Marken, Produkte). +- `/messages`: Lokalisierung (Properties-Dateien). +- `/extensions`: in javascript geschriebene Extensions + + +# taxonomy + +aktuell gehen nur tags: + +taxonomies.yaml +```yaml +## YAML Template. +--- +taxonomies: + - title: Tags + slug: tags + field: taxonomy.tags # feld in den metadaten + array: true +``` + +taxonomy.tags.yaml +```yaml +--- +values: +- id: schuhe + title: Schuhe +- id: kinderkleidung + title: Kinderkleidung +- id: kleidung + title: Kleidung +- id: hoodies_sweatshirts + title: Hoodies & Sweatshirts +- id: small-test + title: Small Test +- id: new-tag + title: New tag +``` + +es werden dann automatisch überischtsseite generiert: +/tags für die tag übesicht +/tags/schuhe für den tag schuhe + +im template kann mit cms.taxonomies.url("tags", "schuhe"), eine url erstellt werden. + + +# Templating Syntax (Twig/Liquid-Hybrid) + +## Variablen & Ausgabe +- `{{ node.meta }}`: Eigenschaft des aktuellen Knotens ausgeben. Zugriff auf Meta-Attribute (Yaml Header). Bsp. Titel: {{ node.meta.title }} oder nullsafe {{ node.meta.getOrDefault("title", "default titel") }} +- zugriff ist auch mit punkt notation möglich: {{ node.meta.getOrDefault("seo.description", "default description")}} +- `{{ requestContext.getQueryParameter('page') }}`: Zugriff auf Request-Parameter. +- Der genrenderete Inhalt eine Seite liegt in `{{ node.content | raw}}`, der raw filter sorgt dafür, dass es unescaped ausgegeben wird. + +## Kontrollstrukturen +```twig +{% if condition %} + ... +{% else %} + ... +{% endif %} + +{% for item in list %} + ... +{% endfor %} +``` + +## Zuweisungen (Liquid Style) +```twig +{% assign variableName = value %} +``` + +## Layouts mit Blöcken +Base template _base.html_ definiert Blöcke +```twig +{% block name %} {% endblock %} +``` + +Child template extendet das base tempalte. +```twig +{% extends "base.html" %} +{% block name %} Standardinhalt {% endblock %} +``` + +## Filter + +Filter werden Beispielweise wie folgt genutzt: + +```twig +{{ page.totalPages | minus(1) }} +``` + +Es gibt folgende Filter +- **minus()** Zieht die angegebene Zahl ab +- **plus()** Addiert die angegebene Zahl +- **date()** Formatiert ein Datumsobject nach der Java Datumsformat konvetion +- **raw** Sorgt dafür, dass Text/HTML unescaped ausgegeben wird +- **markdown** Der Text läuft durch den markdown renderer + +## Template Komponenten + +```twig +{[ ext:hello name="CondationCMS" color="red" ]} +{[ /ext:hello ]} +``` + +Erstellung über ein extensions +```js +import { $hooks } from 'system/hooks.mjs'; + +$hooks.registerAction("system/template/component", (context) => { + context.arguments().get("components").put( + "hello", + (params) => `
${params.name}
` + ) + return null; +}) +``` + +## Markdown Content Struktur +Jede Inhaltsseite beginnt mit einem YAML-Frontmatter: +```yaml +--- +title: Seiten Titel +template: template-name.html +published: true +menu: + position: 1 + visible: true +--- +# Markdown Inhalt hier +``` + +## ShortCodes + +Über Tags können Erweiterungen für Markdown erstellt werden. +```markdown +[[ext:hello name="CondationCMS" /]] +``` + +```js +import { $hooks } from 'system/hooks.mjs'; + + +$hooks.registerAction("system/content/shortcode", ({shortCodes}) => { + shortCodes.put( + "hello", + (params) => `Hello, ${params.name}` + ) + return null; +}) +``` + +# Entwicklungshinweise +- **CSS:** Tailwind CSS wird aktuell über das CDN eingebunden (``). +- **Interaktivität:** Alpine.js wird für Dropdowns und mobile Menüs genutzt. +- **Icons:** Bootstrap Icons liegen lokal in `/assets/bootstrap-icons-1.11.3/`. +- **Performance:** Da es ein Flat-File System ist, auf effiziente Abfragen von Taxonomien achten. + +## Übersichtsseiten: +so werden übersichtsseiten gebaut: + +``` +{% assign pageNumber = requestContext.getQueryParameter('page', '1') %} +{% assign page = cms.nodeList.from("/news/*").sort("publish_date").reverse(true).page(pageNumber).size(3).list() %} + +{% for entry in page.items %} + {{ entry.meta['title] }} + {{ {{ cms.links.createUrl(entry.path) }} }} +{% endfor %} + +``` + +Das Page-Object, dass von nodeList geliefert wird, enthält folgende informationen: +- **page.items** Die Ergebnisse für diese Seite +- **page.totalItems** Die gesamt Anzahl der Ergebnisse +- **page.pageSize** Anzahl der Ergebnisse pro Seite +- **page.totalPages** Anzahl der Saiten +- **page.page** die aktuelle Seitennummer + +## Medien + +Medien liegen im Ordner assets/. +referenziert werden sie im template /assets/ + + +mehr informationen findest du hier: https://condation.com/documentation/cms + + +# Projekt +Information zum Projekt findest du in PROJECT.md \ No newline at end of file diff --git a/test-server/hosts/showcase/PROJECT.md b/test-server/hosts/showcase/PROJECT.md new file mode 100644 index 000000000..01ee5ce3a --- /dev/null +++ b/test-server/hosts/showcase/PROJECT.md @@ -0,0 +1,1145 @@ +--- + +title: Nordlicht Outdoor +description: Showcase-Projekt für CondationCMS +---------------------------------------------- + +# Nordlicht Outdoor + +**Nordlicht Outdoor** ist ein fiktiver Anbieter für nachhaltige Outdoor-Reisen, geführte Wanderungen und Survival-Kurse in Nordeuropa und den Alpen. + +Das Projekt dient als umfassende Showcase-Website für CondationCMS. Es zeigt sowohl klassische Unternehmensinhalte als auch strukturierte Inhalte, dynamische Übersichten, Taxonomien, Formulare, Medienverwaltung, Mehrsprachigkeit und API-Anbindungen. + +## Ziele des Showcase-Projekts + +Mit dem Projekt sollen die wichtigsten Funktionen von CondationCMS in einem realistischen Anwendungsszenario präsentiert werden. + +Das Showcase richtet sich an zwei Zielgruppen: + +### Entwickler + +Entwickler erhalten einen Einblick in: + +* die Struktur eines CondationCMS-Projekts +* Templates und Layouts +* Content Types +* Sections und Section Items +* dynamische Abfragen +* Taxonomien +* Module und Extensions +* die Headless API +* mehrsprachige Websites +* Medienverarbeitung + +### Redakteure + +Redakteure können nachvollziehen, wie sie: + +* neue Seiten erstellen +* Reisen und Kurse verwalten +* Termine planen +* Inhalte zeitgesteuert veröffentlichen +* Bilder und Galerien pflegen +* Landingpages aus Sections zusammenstellen +* SEO-Metadaten bearbeiten +* Inhalte suchen und filtern +* Übersetzungen verwalten + +# Über Nordlicht Outdoor + +Nordlicht Outdoor organisiert kleine, geführte Outdoor-Abenteuer abseits überfüllter Touristenrouten. + +Das Angebot reicht von entspannten Wanderreisen bis zu anspruchsvollen Winterexpeditionen. Ergänzt wird das Programm durch Survival-Kurse, Orientierungstrainings und Workshops zur Vorbereitung auf längere Touren. + +Das Unternehmen legt besonderen Wert auf: + +* kleine Gruppen +* erfahrene Guides +* nachhaltiges Reisen +* regionale Partner +* Sicherheit +* authentische Naturerlebnisse + +# Seitenstruktur + +```text +/ +├── reisen/ +│ ├── norwegen/ +│ ├── schweden/ +│ ├── island/ +│ └── alpen/ +├── kurse/ +│ ├── survival-grundkurs/ +│ ├── navigation-und-orientierung/ +│ ├── erste-hilfe-outdoor/ +│ └── winter-survival/ +├── termine/ +├── reiseziele/ +│ ├── norwegen/ +│ ├── schweden/ +│ ├── island/ +│ └── alpen/ +├── magazin/ +│ ├── ausruestung/ +│ ├── reiseberichte/ +│ ├── outdoor-wissen/ +│ └── sicherheit/ +├── ueber-uns/ +│ ├── team/ +│ ├── nachhaltigkeit/ +│ └── partner/ +├── faq/ +└── kontakt/ +``` + +# Inhaltstypen + +## Standardseite + +Die Standardseite wird für allgemeine Unternehmensseiten und Landingpages verwendet. + +Mögliche Felder: + +```yaml +title: +description: +navigationTitle: +featuredImage: +layout: +sections: +seo: +``` + +Typische Einsatzbereiche: + +* Startseite +* Über uns +* Nachhaltigkeit +* Kontakt +* allgemeine Landingpages + +## Reise + +Eine Reise beschreibt ein buchbares Outdoor-Angebot. + +```yaml +title: +description: +destination: +region: +country: +duration: +difficulty: +minimumAge: +groupSize: +price: +currency: +featuredImage: +gallery: +includedServices: +excludedServices: +equipment: +requirements: +highlights: +itinerary: +availableDates: +guide: +categories: +tags: +featured: +``` + +Beispiel: + +```yaml +title: Winterabenteuer in Nordnorwegen +description: Sieben Tage zwischen Fjorden, Schnee und Polarlichtern. +destination: Tromsø +region: Nordnorwegen +country: Norwegen +duration: 7 +difficulty: mittel +minimumAge: 16 +groupSize: + minimum: 4 + maximum: 10 +price: 1890 +currency: EUR +featured: true +categories: + - winterreisen + - wanderreisen +tags: + - norwegen + - polarlichter + - schneeschuhwandern +``` + +## Kurs + +Ein Kurs vermittelt praktische Fähigkeiten für Outdoor-Aktivitäten. + +```yaml +title: +description: +location: +duration: +level: +minimumAge: +groupSize: +price: +currency: +featuredImage: +gallery: +topics: +equipmentRequired: +includedEquipment: +requirements: +availableDates: +instructor: +categories: +tags: +featured: +``` + +Beispiel: + +```yaml +title: Survival-Grundkurs +description: Die wichtigsten Grundlagen für Notfälle in der Natur. +location: Harz +duration: 2 +level: einsteiger +minimumAge: 16 +price: 249 +currency: EUR +topics: + - Feuer machen + - Notunterkunft bauen + - Wasser aufbereiten + - Orientierung + - Verhalten in Notsituationen +categories: + - survival +tags: + - einsteiger + - wochenendkurs +``` + +## Termin + +Ein Termin repräsentiert die konkrete Durchführung einer Reise oder eines Kurses. + +```yaml +title: +startDate: +endDate: +location: +relatedContent: +availablePlaces: +maximumPlaces: +bookingStatus: +price: +currency: +guide: +registrationDeadline: +``` + +Mögliche Statuswerte: + +```yaml +bookingStatus: + - available + - limited + - sold-out + - cancelled + - completed +``` + +## Reiseziel + +Ein Reiseziel bündelt Reisen, Magazinartikel und Informationen zu einer Region. + +```yaml +title: +description: +country: +region: +featuredImage: +gallery: +climate: +bestTravelTime: +language: +currency: +travelInformation: +categories: +featured: +``` + +## Magazinartikel + +Magazinartikel liefern Inspiration, Wissen und aktuelle Informationen. + +```yaml +title: +description: +author: +publishDate: +featuredImage: +gallery: +category: +tags: +readingTime: +relatedContent: +featured: +``` + +Mögliche Kategorien: + +* Ausrüstung +* Reiseberichte +* Outdoor-Wissen +* Sicherheit +* Nachhaltigkeit +* Neuigkeiten + +## Teammitglied + +Ein Teammitglied kann Guide, Trainer oder Mitarbeiter sein. + +```yaml +name: +role: +portrait: +description: +specializations: +languages: +certifications: +experience: +email: +socialLinks: +featured: +``` + +Beispiel: + +```yaml +name: Lena Bergmann +role: Outdoor-Guide +specializations: + - Wintertouren + - Navigation + - Erste Hilfe +languages: + - Deutsch + - Englisch + - Norwegisch +certifications: + - Wilderness First Responder + - International Mountain Leader +experience: 12 Jahre +``` + +## FAQ + +```yaml +question: +answer: +category: +position: +``` + +Mögliche Kategorien: + +* Buchung +* Bezahlung +* Ausrüstung +* Anreise +* Sicherheit +* Stornierung + +## Testimonial + +```yaml +name: +location: +quote: +rating: +relatedContent: +image: +published: +``` + +# Taxonomien + +Taxonomien ermöglichen dynamische Übersichten und Filter. + +## Länder + +```text +Norwegen +Schweden +Island +Deutschland +Österreich +Schweiz +``` + +## Aktivitäten + +```text +Wandern +Schneeschuhwandern +Trekking +Survival +Orientierung +Kanufahren +Wintercamping +``` + +## Schwierigkeitsgrade + +```text +Einfach +Mittel +Anspruchsvoll +Experte +``` + +## Jahreszeiten + +```text +Frühling +Sommer +Herbst +Winter +``` + +## Zielgruppen + +```text +Einsteiger +Fortgeschrittene +Familien +Alleinreisende +Gruppen +Unternehmen +``` + +# Sections + +Landingpages können aus wiederverwendbaren Sections zusammengestellt werden. + +## Hero + +```yaml +type: hero +headline: +text: +image: +primaryAction: +secondaryAction: +alignment: +``` + +## Text mit Bild + +```yaml +type: text-image +headline: +text: +image: +imagePosition: +action: +``` + +## Kartenübersicht + +```yaml +type: card-grid +headline: +text: +source: +limit: +columns: +action: +``` + +Mögliche Quellen: + +```text +featured-trips +featured-courses +latest-articles +upcoming-events +team-members +destinations +``` + +## Kommende Termine + +```yaml +type: upcoming-events +headline: +limit: +contentType: +showAvailability: +showPrice: +``` + +## Bildergalerie + +```yaml +type: gallery +headline: +images: +layout: +lightbox: +``` + +## Testimonials + +```yaml +type: testimonials +headline: +items: +layout: +``` + +## FAQ + +```yaml +type: faq +headline: +category: +items: +``` + +## Call to Action + +```yaml +type: call-to-action +headline: +text: +backgroundImage: +primaryAction: +secondaryAction: +``` + +## Newsletter + +```yaml +type: newsletter +headline: +text: +form: +privacyText: +``` + +## Statistiken + +```yaml +type: statistics +headline: +items: + - value: + label: +``` + +Beispiel: + +```yaml +type: statistics +headline: Abenteuer mit Erfahrung +items: + - value: 12 + label: Jahre Erfahrung + - value: 850 + label: zufriedene Teilnehmer + - value: 24 + label: Reiseziele + - value: 8 + label: erfahrene Guides +``` + +# Startseite + +Die Startseite soll die wichtigsten Funktionen des CMS sichtbar machen. + +## Empfohlene Sections + +1. Hero mit großem Hintergrundbild +2. Hervorgehobene Reisen +3. Unternehmensvorstellung +4. Kommende Termine +5. Beliebte Reiseziele +6. Survival- und Outdoor-Kurse +7. Vorteile von Nordlicht Outdoor +8. Testimonials +9. Aktuelle Magazinartikel +10. Newsletter-Anmeldung +11. Call to Action + +## Beispielinhalt + +```yaml +title: Nordlicht Outdoor +description: Geführte Outdoor-Reisen und Survival-Kurse in kleinen Gruppen. +template: home +sections: + - type: hero + headline: Draußen beginnt das echte Abenteuer + text: Geführte Reisen, Survival-Kurse und unvergessliche Naturerlebnisse. + image: /media/home/hero-norway.jpg + primaryAction: + label: Reisen entdecken + url: /reisen/ + secondaryAction: + label: Kurse ansehen + url: /kurse/ + + - type: card-grid + headline: Unsere beliebtesten Reisen + source: featured-trips + limit: 3 + columns: 3 + + - type: text-image + headline: Kleine Gruppen. Große Erlebnisse. + text: Wir reisen bewusst, persönlich und abseits der bekannten Wege. + image: /media/home/group-hiking.jpg + imagePosition: right + + - type: upcoming-events + headline: Die nächsten Abenteuer + limit: 5 + showAvailability: true + showPrice: true + + - type: card-grid + headline: Wissen, das draußen zählt + source: featured-courses + limit: 3 + columns: 3 + + - type: testimonials + headline: Was unsere Teilnehmer sagen + + - type: card-grid + headline: Neues aus dem Magazin + source: latest-articles + limit: 3 + columns: 3 + + - type: newsletter + headline: Inspiration für dein nächstes Abenteuer + text: Neue Reisen, Kurse und Outdoor-Tipps direkt in dein Postfach. +``` + +# Beispielreisen + +## Winterabenteuer in Nordnorwegen + +Eine siebentägige Reise mit Schneeschuhwanderungen, Wintercamping und Polarlichtbeobachtung. + +Schwerpunkte: + +* Nordnorwegische Fjorde +* Polarlichter +* Schneeschuhwandern +* kleine Gruppe +* lokale Unterkünfte +* Einführung in Winter-Survival + +## Trekking durch den Sarek-Nationalpark + +Eine anspruchsvolle Trekkingtour durch eine der letzten großen Wildnisregionen Europas. + +Schwerpunkte: + +* mehrtägige Trekkingtour +* Übernachtung im Zelt +* anspruchsvolles Gelände +* Flussüberquerungen +* Navigation ohne markierte Wege + +## Hüttenwanderung in den Alpen + +Eine geführte Wanderung von Hütte zu Hütte für Teilnehmer mit normaler Grundkondition. + +Schwerpunkte: + +* alpine Landschaften +* regionale Küche +* Übernachtung auf Berghütten +* Gepäcktransport optional +* geeignet für ambitionierte Einsteiger + +# Beispielkurse + +## Survival-Grundkurs + +Die Teilnehmer lernen die wichtigsten Grundlagen für Notfälle in der Natur. + +Inhalte: + +* Feuer ohne Feuerzeug +* Wasser finden und aufbereiten +* Notunterkunft bauen +* Orientierung +* Erste Hilfe +* Notruf und Rettung + +## Navigation und Orientierung + +Ein praxisorientierter Kurs zum sicheren Navigieren mit Karte, Kompass und GPS. + +Inhalte: + +* topografische Karten lesen +* Kompass verwenden +* Standort bestimmen +* Routen planen +* GPS und Smartphone sinnvoll einsetzen +* Navigation bei schlechter Sicht + +## Erste Hilfe Outdoor + +Ein Erste-Hilfe-Kurs für Situationen, in denen professionelle Hilfe nicht sofort verfügbar ist. + +Inhalte: + +* Versorgung typischer Verletzungen +* Unterkühlung +* Hitzeschäden +* improvisierter Transport +* Notfallkommunikation +* Entscheidungsfindung in abgelegenen Regionen + +# Dynamische Abfragen + +## Hervorgehobene Reisen + +```text +type == "trip" and featured == true +``` + +## Kommende Termine + +```text +type == "event" and startDate >= now() +``` + +## Reisen nach Norwegen + +```text +type == "trip" and country == "Norwegen" +``` + +## Einsteigerangebote + +```text +difficulty == "Einfach" or level == "einsteiger" +``` + +## Winterangebote + +```text +season contains "Winter" +``` + +## Magazinartikel zu Ausrüstung + +```text +type == "article" and category == "Ausrüstung" +``` + +# Suche + +Die Volltextsuche sollte Inhalte aus mehreren Inhaltstypen erfassen. + +Durchsuchbare Inhalte: + +* Seitentitel +* Beschreibungen +* Fließtexte +* Reiseziele +* Aktivitäten +* Tags +* Namen von Teammitgliedern + +Beispielhafte Suchanfragen: + +```text +Norwegen +Survival +Winter +Einsteiger +Polarlichter +Navigation +Alpen +``` + +Suchergebnisse können nach Inhaltstyp gefiltert werden: + +```text +Alle +Reisen +Kurse +Termine +Magazin +Reiseziele +``` + +# Formulare + +## Kontaktformular + +Felder: + +```text +Name +E-Mail-Adresse +Telefonnummer +Betreff +Nachricht +Datenschutzeinwilligung +``` + +## Reiseanfrage + +Felder: + +```text +Name +E-Mail-Adresse +Reise +Gewünschter Termin +Anzahl der Teilnehmer +Erfahrungsniveau +Nachricht +``` + +## Kursanmeldung + +Felder: + +```text +Name +E-Mail-Adresse +Kurs +Termin +Anzahl der Teilnehmer +Besondere Anforderungen +``` + +## Newsletter + +Felder: + +```text +E-Mail-Adresse +Interessengebiete +Datenschutzeinwilligung +``` + +# Medien + +Das Showcase soll die Medienfunktionen von CondationCMS umfassend demonstrieren. + +Verwendete Medientypen: + +* Hero-Bilder +* Reisebilder +* Bildergalerien +* Teamfotos +* Karten +* PDF-Packlisten +* Reiseunterlagen +* Vorschaubilder für Magazinartikel + +Zu demonstrierende Funktionen: + +* automatisches Skalieren +* verschiedene Bildgrößen +* Cropping +* WebP-Ausgabe +* responsive Bilder +* Alt-Texte +* Bildunterschriften +* zentrale Medienauswahl +* Austausch bestehender Bilder + +# Downloads + +Mögliche Downloads: + +```text +Packliste für Winterreisen +Packliste für Hüttentouren +Vorbereitung auf den Survival-Kurs +Allgemeine Reisebedingungen +Sicherheitsinformationen +Nachhaltigkeitsbericht +``` + +# Mehrsprachigkeit + +Das Showcase sollte mindestens auf Deutsch und Englisch verfügbar sein. + +Beispielstruktur: + +```text +/de/reisen/winterabenteuer-norwegen/ +/en/trips/northern-norway-winter-adventure/ +``` + +Zu demonstrierende Funktionen: + +* übersetzte Seiten +* sprachabhängige Navigation +* lokalisierte URLs +* lokalisierte Taxonomien +* unterschiedliche Datumsformate +* unterschiedliche Währungen +* sprachabhängige Suche +* `hreflang` +* Canonical URLs +* Übersetzungsstatus im Manager + +# SEO + +Jede Seite kann eigene SEO-Daten erhalten. + +```yaml +seo: + title: + description: + canonical: + index: true + follow: true + image: +``` + +Zusätzliche SEO-Funktionen: + +* XML-Sitemap +* strukturierte Daten +* Open Graph +* Social-Media-Bilder +* Canonical URLs +* `hreflang` +* zeitgesteuerte Veröffentlichung +* automatische Metadaten als Fallback + +Mögliche strukturierte Daten: + +```text +Organization +Article +Person +Event +Course +TouristTrip +BreadcrumbList +FAQPage +``` + +# Workflow und Veröffentlichung + +Das Showcase kann verschiedene Veröffentlichungszustände darstellen. + +```text +Draft +In Review +Scheduled +Published +Archived +``` + +Beispielszenarien: + +* Ein neuer Magazinartikel wird als Entwurf gespeichert. +* Ein Redakteur reicht den Artikel zur Prüfung ein. +* Der Artikel wird für einen späteren Zeitpunkt geplant. +* Eine Reise wird nach dem letzten Termin archiviert. +* Ein ausgebuchter Termin bleibt sichtbar, kann aber nicht mehr gebucht werden. + +# Headless API + +Strukturierte Inhalte können zusätzlich über die API bereitgestellt werden. + +Beispiele: + +```http +GET /api/trips +GET /api/trips/winter-adventure-norway +GET /api/courses +GET /api/events +GET /api/events?country=norway +GET /api/articles +GET /api/destinations +``` + +Mögliche API-Verwendung: + +* mobile App +* externer Veranstaltungskalender +* Buchungssystem +* Partnerwebsite +* Digital-Signage-Anzeige +* Newsletter-System + +# Module und Integrationen + +Das Showcase bietet sinnvolle Anwendungsfälle für Module und Extensions. + +## Kartenintegration + +Darstellung von: + +* Reisezielen +* Treffpunkten +* Wanderrouten +* Kursorten +* Unterkünften + +## Wetterintegration + +Anzeige von: + +* aktuellem Wetter +* Reisezeit-Empfehlungen +* Schneelage +* Tageslichtdauer + +## Newsletter + +Anbindung an einen externen Newsletter-Dienst. + +## Buchungssystem + +Übergabe von Reise- und Termindaten an ein externes Buchungssystem. + +## Bewertungen + +Teilnehmer können Reisen oder Kurse bewerten. + +## SEO-Modul + +Automatische Ausgabe von: + +* Meta-Tags +* Open Graph +* strukturierten Daten +* Canonical URLs +* XML-Sitemaps + +# Beispielnavigation + +```yaml +items: + - label: Reisen + url: /reisen/ + + - label: Kurse + url: /kurse/ + + - label: Termine + url: /termine/ + + - label: Reiseziele + url: /reiseziele/ + + - label: Magazin + url: /magazin/ + + - label: Über uns + url: /ueber-uns/ + + - label: Kontakt + url: /kontakt/ +``` + +# Designrichtung + +Das Design soll modern, hochwertig und naturverbunden wirken. + +## Stil + +* große Naturbilder +* klare Typografie +* großzügige Abstände +* übersichtliche Karten +* dezente Animationen +* gute Lesbarkeit +* klare Call-to-Actions + +## Farbwelt + +Empfohlene Grundfarben: + +```text +Dunkles Waldgrün +Gedämpftes Moosgrün +Steingrau +Sand +Off-White +Akzentfarbe Orange oder Rostrot +``` + +## Komponenten + +Benötigte UI-Komponenten: + +* Header +* Hauptnavigation +* Sprachumschalter +* Hero +* Breadcrumb +* Karten +* Filter +* Suche +* Terminliste +* Verfügbarkeitsanzeige +* Preisbox +* Galerie +* Akkordeon +* Tabs +* Formulare +* Pagination +* Newsletter-Box +* Footer + +# Showcase-Szenarien + +## Für Entwickler + +1. Projekt lokal starten +2. neues Template hinzufügen +3. eigene Section erstellen +4. Reise über eine Query laden +5. eigene Template-Funktion verwenden +6. Extension registrieren +7. Modul aktivieren +8. Inhalte über die API abrufen + +## Für Redakteure + +1. neue Reise erstellen +2. Bilder auswählen +3. Termin hinzufügen +4. Seite in der Vorschau prüfen +5. SEO-Daten bearbeiten +6. Veröffentlichung planen +7. englische Übersetzung erstellen +8. Inhalt veröffentlichen + +# Fazit + +Nordlicht Outdoor verbindet klassische Unternehmenskommunikation mit strukturierten Inhalten, redaktionellen Workflows und technischen Integrationen. + +Das Thema ist umfangreich genug, um nahezu alle Funktionen von CondationCMS realistisch zu demonstrieren, bleibt aber gleichzeitig verständlich und visuell attraktiv. + +Es eignet sich damit sowohl als technische Referenzimplementierung als auch als öffentliches Showcase für Entwickler, Redakteure und potenzielle Nutzer von CondationCMS. diff --git a/test-server/hosts/showcase/README.md b/test-server/hosts/showcase/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/test-server/hosts/showcase/assets/css/site.css b/test-server/hosts/showcase/assets/css/site.css new file mode 100644 index 000000000..b6946f93a --- /dev/null +++ b/test-server/hosts/showcase/assets/css/site.css @@ -0,0 +1,9 @@ +@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Newsreader:ital,wght@1,500&display=swap'); +:root{--forest:#123c32;--forest-dark:#092820;--moss:#667b52;--sand:#f1eade;--paper:#faf8f3;--ink:#17231f;--muted:#67716d;--orange:#df7138;--line:#d9ddd7}*{box-sizing:border-box}html{background:var(--paper)}body{margin:0;color:var(--ink);background:var(--paper);font-family:'DM Sans',sans-serif;line-height:1.6}img{display:block;width:100%}a{color:inherit;text-decoration:none}.shell{width:min(1180px,calc(100% - 48px));margin-inline:auto}.skip-link{position:fixed;z-index:100;top:-60px;left:20px;background:white;padding:12px}.skip-link:focus{top:12px}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)} +.site-header{height:82px;background:rgba(250,248,243,.97);border-bottom:1px solid rgba(0,0,0,.08);position:relative;z-index:20}.nav-wrap{height:100%;display:flex;align-items:center;justify-content:space-between}.brand{display:flex;gap:11px;align-items:center;font-weight:700;letter-spacing:.1em;line-height:1}.brand small{display:block;font-size:9px;letter-spacing:.29em;margin-top:6px;color:var(--orange)}.brand-mark{position:relative;color:var(--forest);font-size:26px;transform:scaleX(.72)}.main-nav{display:flex;align-items:center;gap:27px;font-size:14px;font-weight:600}.main-nav a:not(.nav-cta):hover{color:var(--orange)}.nav-cta{background:var(--forest);color:white;padding:12px 18px}.nav-cta i{margin-left:7px}.menu-toggle{display:none;border:0;background:none;font-size:28px}.hero{height:min(780px,calc(100vh - 45px));min-height:650px;background-size:cover;background-position:center;position:relative;color:white;display:flex;align-items:center}.hero-inner{padding-bottom:60px}.eyebrow{text-transform:uppercase;color:var(--orange);font-size:11px;font-weight:700;letter-spacing:.21em;margin:0 0 18px}.eyebrow.light{color:#f1a274}.hero h1,.page-hero h1,.detail-hero h1{font-size:clamp(52px,6.3vw,92px);line-height:.95;letter-spacing:-.055em;margin:0 0 27px;max-width:830px}.hero h1 em,h2 em,.page-hero h1 em{font-family:'Newsreader',serif;font-weight:500}.hero-copy{font-size:18px;max-width:600px;color:rgba(255,255,255,.83);margin-bottom:33px}.button-row{display:flex;gap:13px}.button{display:inline-flex;align-items:center;justify-content:center;gap:14px;padding:14px 20px;border:1px solid transparent;font-size:14px;font-weight:700;cursor:pointer}.button-accent{background:var(--orange);color:white}.button-accent:hover{background:#c85e28}.button-ghost{border-color:rgba(255,255,255,.5);color:white}.hero-facts{position:absolute;bottom:0;left:0;right:0;background:rgba(5,28,22,.82);backdrop-filter:blur(10px);border-top:1px solid rgba(255,255,255,.13)}.hero-facts>div{height:86px;display:grid;grid-template-columns:repeat(4,1fr);align-items:center}.hero-facts span{display:flex;gap:9px;justify-content:center;font-size:12px;color:rgba(255,255,255,.74);border-right:1px solid rgba(255,255,255,.15)}.hero-facts span:last-child{border:0}.hero-facts strong{font-size:18px;color:white}.hero-facts i{font-size:19px;color:#f1a274} +.section{padding-block:110px}.section-heading{display:flex;align-items:end;justify-content:space-between;margin-bottom:47px}.section-heading h2,.story-copy h2,.newsletter h2{font-size:clamp(39px,4.4vw,61px);line-height:1.02;letter-spacing:-.045em;margin:0}.heading-copy{max-width:430px;color:var(--muted)}.text-link{font-weight:700;font-size:14px;border-bottom:1px solid var(--orange);padding-bottom:7px}.text-link i{color:var(--orange);margin-left:8px}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}.trip-card{background:#fff;border:1px solid #e5e4df;transition:.3s}.trip-card:hover{transform:translateY(-5px);box-shadow:0 18px 40px rgba(17,42,34,.11)}.card-media{height:245px;position:relative;overflow:hidden}.card-media img{height:100%;object-fit:cover;transition:.5s}.trip-card:hover .card-media img{transform:scale(1.035)}.card-tag{display:inline-block;background:var(--orange);color:white;font-size:10px;font-weight:700;letter-spacing:.15em;text-transform:uppercase;padding:7px 10px}.card-media .card-tag{position:absolute;left:17px;top:17px}.card-body{padding:24px}.card-meta{display:flex;gap:22px;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.card-meta i{color:var(--orange)}.card-body h3,.course-card h3{font-size:23px;line-height:1.15;margin:13px 0 10px}.card-body p{color:var(--muted);font-size:14px;line-height:1.6;margin:0 0 24px}.card-foot{border-top:1px solid #e6e5df;padding-top:17px;display:flex;justify-content:space-between;font-size:13px}.card-foot strong{font-size:17px}.card-foot span{font-weight:700}.story-section{background:var(--sand);padding:110px 0}.split{display:grid;grid-template-columns:1.05fr .95fr;gap:90px;align-items:center}.story-image{position:relative}.story-image img{height:600px;object-fit:cover}.image-note{position:absolute;background:var(--forest);color:white;padding:18px 22px;bottom:25px;right:-35px;font-size:12px}.image-note strong{font-size:25px;display:block;color:#f1a274}.story-copy>p:not(.eyebrow){font-size:17px;color:#5e6964}.check-list{list-style:none;padding:5px 0;margin:25px 0 35px}.check-list li{display:flex;gap:17px;border-top:1px solid #d8d0c3;padding:17px 0}.check-list i{color:var(--orange);font-size:22px}.check-list span{display:flex;flex-direction:column}.check-list small{color:var(--muted);margin-top:3px}.section-dark{background:var(--forest-dark);color:white}.text-link.light{color:white}.event-list{border-top:1px solid rgba(255,255,255,.18)}.event-row{display:grid;grid-template-columns:125px 1fr auto;align-items:center;padding:24px 12px;border-bottom:1px solid rgba(255,255,255,.16);transition:.2s}.event-row:hover{background:rgba(255,255,255,.04);padding-left:22px}.event-row time{display:flex;align-items:center;gap:10px}.event-row time strong{font-size:35px;color:#f1a274}.event-row time span{font-size:11px;text-transform:uppercase}.event-row h3{font-size:20px;margin:6px 0 2px}.event-row p{margin:0;color:#9eb0aa;font-size:13px}.status{font-size:9px;text-transform:uppercase;letter-spacing:.13em;color:#a3c78f}.status.limited{color:#f1a274}.event-price{font-size:18px}.event-price i{font-size:14px;margin-left:18px;color:#f1a274}.course-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}.course-card{background:white;border:1px solid #e5e4df}.course-card img{height:220px;object-fit:cover}.course-card div{padding:23px;position:relative}.course-card span{color:var(--orange);text-transform:uppercase;font-weight:700;font-size:10px;letter-spacing:.14em}.course-card p{font-size:14px;color:var(--muted)}.course-card small{font-weight:700}.course-card div>i{position:absolute;right:23px;bottom:23px;color:var(--orange)}.quote-section{text-align:center;background:var(--sand);padding:95px 0}.quote-section i{font-size:30px;color:var(--orange)}.quote-section blockquote{font-family:'Newsreader',serif;font-style:italic;font-size:clamp(30px,4vw,48px);line-height:1.2;max-width:900px;margin:24px auto}.quote-section p{color:var(--muted)}.newsletter{background:var(--forest);color:white;padding:85px 0}.newsletter>.shell{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:end}.newsletter form label{display:block;font-size:12px;margin-bottom:9px}.newsletter form>div{display:flex}.newsletter input{width:100%;background:white;border:0;padding:16px}.newsletter small{display:block;color:#aac0b8;margin-top:11px;font-size:10px} +.site-footer{background:#061d18;color:#b4c3be;padding:75px 0 25px}.footer-grid{display:grid;grid-template-columns:1.6fr .7fr .7fr 1.3fr;gap:50px}.brand-light{color:white;margin-bottom:21px}.brand-light .brand-mark{color:#f1a274}.footer-grid h3{font-size:12px;text-transform:uppercase;color:white;letter-spacing:.14em}.footer-grid>div>a:not(.brand){display:block;font-size:13px;margin:9px 0}.footer-grid p{font-size:13px}.footer-form{display:flex;border-bottom:1px solid #73847e}.footer-form input{background:transparent;border:0;color:white;padding:12px 0;width:100%;outline:none}.footer-form button{border:0;background:none;color:#f1a274;font-size:20px}.footer-bottom{border-top:1px solid #29413a;margin-top:55px;padding-top:20px;display:flex;justify-content:space-between;font-size:10px}.footer-bottom a{margin-left:22px}.page-hero{background:var(--sand);padding:95px 0 80px}.page-hero h1{font-size:clamp(50px,6vw,80px);color:var(--forest);margin-bottom:20px}.page-hero p:not(.eyebrow){max-width:650px;color:var(--muted);font-size:18px}.page-hero.compact{padding:85px 0}.filter-bar{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px}.filter-bar>span{font-size:13px;color:var(--muted)}.filter{border:1px solid var(--line);background:white;padding:8px 14px;margin-left:4px;font-size:12px}.filter.active{background:var(--forest);color:white}.detail-hero{height:620px;position:relative;color:white;display:flex;align-items:flex-end}.detail-hero>img,.detail-overlay{position:absolute;inset:0;height:100%;object-fit:cover}.detail-overlay{background:linear-gradient(0deg,rgba(6,29,24,.9),rgba(6,29,24,.08) 70%)}.detail-hero .shell{position:relative;padding-bottom:60px}.detail-hero h1{font-size:clamp(48px,6vw,78px);margin:15px 0}.detail-hero p{font-size:18px;max-width:690px}.back-link{display:block;margin-bottom:40px;font-size:13px}.detail-facts{background:var(--forest);color:white}.detail-facts>.shell{display:grid;grid-template-columns:repeat(4,1fr)}.detail-facts span{padding:27px;border-right:1px solid rgba(255,255,255,.15);display:grid;grid-template-columns:32px 1fr}.detail-facts i{grid-row:span 2;color:#f1a274;font-size:20px}.detail-facts small{color:#98ada6}.detail-layout{display:grid;grid-template-columns:1fr 350px;gap:90px;align-items:start}.prose{font-size:17px;color:#43504b}.prose h2{font-size:38px;color:var(--ink);margin-top:45px;line-height:1.15}.prose h3{color:var(--forest);margin-top:32px}.prose li{margin:9px 0}.prose.wide{max-width:840px;margin:auto}.booking-box{background:white;border:1px solid var(--line);padding:28px;position:sticky;top:25px}.booking-box>span,.booking-box>small{display:block;color:var(--muted);font-size:11px}.booking-box>strong{font-size:40px;color:var(--forest)}.booking-box hr{border:0;border-top:1px solid var(--line);margin:20px 0}.booking-box p{font-size:13px}.booking-box p i{color:var(--orange);margin-right:7px}.booking-box .button{width:100%;margin:15px 0}.booking-box>small{text-align:center}.booking-box small a{text-decoration:underline}.contact-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:100px}.contact-grid h2{font-size:38px}.contact-line{display:flex;align-items:center;gap:18px;margin:30px 0}.contact-line i{width:45px;height:45px;display:grid;place-items:center;background:var(--sand);color:var(--orange);font-size:20px}.contact-line span{font-weight:600}.contact-line small{display:block;color:var(--muted);font-weight:400}.contact-form{background:white;border:1px solid var(--line);padding:35px}.contact-form label{display:block;font-size:12px;font-weight:700;margin-bottom:20px}.contact-form input:not([type=checkbox]),.contact-form select,.contact-form textarea{display:block;width:100%;border:1px solid var(--line);background:var(--paper);padding:13px;margin-top:7px}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:16px}.privacy{font-weight:400!important}.privacy input{margin-right:8px} +.departure-layout{display:grid;grid-template-columns:1fr 350px;gap:90px;align-items:start}.back-link.dark{color:var(--forest);margin-bottom:32px} +.reveal{opacity:0;transform:translateY(18px);transition:.7s ease}.reveal.visible{opacity:1;transform:none} +@media(max-width:900px){.main-nav{display:none;position:absolute;top:82px;left:0;right:0;background:var(--paper);padding:25px;flex-direction:column;align-items:stretch}.main-nav.is-open{display:flex}.menu-toggle{display:block}.hero{min-height:680px}.hero-facts>div{grid-template-columns:1fr 1fr}.hero-facts span:nth-child(2){border:0}.card-grid,.course-grid{grid-template-columns:1fr 1fr}.split,.newsletter>.shell,.contact-grid{grid-template-columns:1fr;gap:50px}.story-image img{height:470px}.image-note{right:15px}.footer-grid{grid-template-columns:1fr 1fr}.detail-layout,.departure-layout{grid-template-columns:1fr}.booking-box{position:static}.detail-facts>.shell{grid-template-columns:1fr 1fr}} +@media(max-width:620px){.shell{width:min(100% - 30px,1180px)}.site-header{height:70px}.hero{height:760px;background-position:62% center;align-items:flex-start;padding-top:100px}.hero h1{font-size:49px}.hero-facts>div{height:130px}.hero-facts span{font-size:9px;flex-direction:column;gap:0}.hero-facts strong{font-size:14px}.button-row{align-items:stretch;flex-direction:column;width:max-content}.section,.story-section{padding-block:75px}.section-heading{display:block}.section-heading .text-link{display:inline-block;margin-top:25px}.card-grid,.course-grid{grid-template-columns:1fr}.story-image img{height:390px}.event-row{grid-template-columns:80px 1fr}.event-price{display:none}.newsletter form>div{display:block}.newsletter .button{width:100%;margin-top:8px}.footer-grid{grid-template-columns:1fr}.footer-bottom{display:block}.footer-bottom span{display:block;margin-top:10px}.detail-facts>.shell{width:100%;grid-template-columns:1fr 1fr}.detail-facts span{padding:18px 12px}.contact-form{padding:22px}.two-col{grid-template-columns:1fr}.filter-bar{display:block}.filter-bar>div{margin-top:15px}.filter{margin:3px 2px}.page-hero{padding:70px 0}} diff --git a/test-server/hosts/showcase/assets/images/alpine-hut-hike.png b/test-server/hosts/showcase/assets/images/alpine-hut-hike.png new file mode 100644 index 000000000..d6b544bd7 Binary files /dev/null and b/test-server/hosts/showcase/assets/images/alpine-hut-hike.png differ diff --git a/test-server/hosts/showcase/assets/images/favicon.svg b/test-server/hosts/showcase/assets/images/favicon.svg new file mode 100644 index 000000000..fc132d12a --- /dev/null +++ b/test-server/hosts/showcase/assets/images/favicon.svg @@ -0,0 +1 @@ + diff --git a/test-server/hosts/showcase/assets/images/hero-northern-norway.png b/test-server/hosts/showcase/assets/images/hero-northern-norway.png new file mode 100644 index 000000000..6b2f2399d Binary files /dev/null and b/test-server/hosts/showcase/assets/images/hero-northern-norway.png differ diff --git a/test-server/hosts/showcase/assets/images/northern-norway-winter.png b/test-server/hosts/showcase/assets/images/northern-norway-winter.png new file mode 100644 index 000000000..3c36ee0a5 Binary files /dev/null and b/test-server/hosts/showcase/assets/images/northern-norway-winter.png differ diff --git a/test-server/hosts/showcase/assets/images/survival-basics.png b/test-server/hosts/showcase/assets/images/survival-basics.png new file mode 100644 index 000000000..29bd018f2 Binary files /dev/null and b/test-server/hosts/showcase/assets/images/survival-basics.png differ diff --git a/test-server/hosts/showcase/assets/js/site.js b/test-server/hosts/showcase/assets/js/site.js new file mode 100644 index 000000000..44ab07151 --- /dev/null +++ b/test-server/hosts/showcase/assets/js/site.js @@ -0,0 +1 @@ +document.addEventListener('DOMContentLoaded',()=>{const items=document.querySelectorAll('.reveal');if(!('IntersectionObserver'in window)){items.forEach(i=>i.classList.add('visible'));return}const observer=new IntersectionObserver(entries=>entries.forEach(entry=>{if(entry.isIntersecting){entry.target.classList.add('visible');observer.unobserve(entry.target)}}),{threshold:.12});items.forEach(item=>observer.observe(item))}); diff --git a/test-server/hosts/showcase/config/taxonomies.yaml b/test-server/hosts/showcase/config/taxonomies.yaml new file mode 100644 index 000000000..a11ed2e86 --- /dev/null +++ b/test-server/hosts/showcase/config/taxonomies.yaml @@ -0,0 +1,7 @@ +--- +taxonomies: + - title: Tags + slug: tags + field: taxonomy.tags + array: true + diff --git a/test-server/hosts/showcase/config/taxonomy.tags.yaml b/test-server/hosts/showcase/config/taxonomy.tags.yaml new file mode 100644 index 000000000..cf64f51a6 --- /dev/null +++ b/test-server/hosts/showcase/config/taxonomy.tags.yaml @@ -0,0 +1,25 @@ +--- +values: + - id: norway + title: Norway + - id: sweden + title: Sweden + - id: alps + title: Alps + - id: winter + title: Winter + - id: summer + title: Summer + - id: hiking + title: Hiking + - id: trekking + title: Trekking + - id: snowshoeing + title: Snowshoeing + - id: survival + title: Survival + - id: beginners + title: Beginners + - id: weekend-course + title: Weekend course + diff --git a/test-server/hosts/showcase/content/about/index.md b/test-server/hosts/showcase/content/about/index.md new file mode 100644 index 000000000..188e19e8d --- /dev/null +++ b/test-server/hosts/showcase/content/about/index.md @@ -0,0 +1,22 @@ +--- +title: We guide differently +eyebrow: About Nordlicht +description: Personal, thoughtful and grounded in real knowledge of the places we travel. +template: page.html +status: published +menu: + visible: true + position: 6 +--- +## Small groups are not an upgrade + +Nordlicht Outdoor began with a simple belief: nature becomes more vivid when fewer people move through it with attention. Our group sizes end where many others begin. + +## Experience that brings calm + +Our guides are qualified, have known their regions for years and are trusted to make decisions. When weather changes the plan, we explain why — and choose a worthwhile alternative. + +## Travel that supports each place + +We work with locally owned accommodation, buy regionally and choose longer stays over rushed itineraries. On sensitive trails, we keep groups deliberately small. + diff --git a/test-server/hosts/showcase/content/contact/index.md b/test-server/hosts/showcase/content/contact/index.md new file mode 100644 index 000000000..4014e811d --- /dev/null +++ b/test-server/hosts/showcase/content/contact/index.md @@ -0,0 +1,7 @@ +--- +title: Contact +description: Personal advice for your next journey or outdoor course. +template: contact.html +status: published +--- + diff --git a/test-server/hosts/showcase/content/courses/index.md b/test-server/hosts/showcase/content/courses/index.md new file mode 100644 index 000000000..288b16379 --- /dev/null +++ b/test-server/hosts/showcase/content/courses/index.md @@ -0,0 +1,12 @@ +--- +title: Skills that matter outside +eyebrow: Outdoor courses +description: Practical skills, honest feedback and small groups — from your first fire to confident navigation. +template: listing.html +source: /courses/* +status: published +menu: + visible: true + position: 2 +--- + diff --git a/test-server/hosts/showcase/content/courses/navigation-orientation/index.md b/test-server/hosts/showcase/content/courses/navigation-orientation/index.md new file mode 100644 index 000000000..7aac7fde5 --- /dev/null +++ b/test-server/hosts/showcase/content/courses/navigation-orientation/index.md @@ -0,0 +1,28 @@ +--- +contentType: course +title: Navigation & Orientation +description: Find your own way with confidence using map, compass and GPS. +template: detail.html +parentUrl: /courses/ +location: Lüneburg Heath, Germany +duration: 2 +level: Beginner +groupSize: + maximum: 10 +price: 229 +featuredImage: /assets/images/hero-northern-norway.png +menu: + position: 2 +status: published +--- +## Know where you are + +We translate contour lines into real terrain, take bearings and plan a route of our own. Smartphones and GPS are included where they make sense — as useful tools, never as the only answer. + +## What you will learn + +- Read topographic maps +- Use a compass and map ruler +- Find your position and direction of travel +- Plan a realistic route +- Navigate in poor visibility diff --git a/test-server/hosts/showcase/content/courses/survival-basics/index.md b/test-server/hosts/showcase/content/courses/survival-basics/index.md new file mode 100644 index 000000000..494f2e5fd --- /dev/null +++ b/test-server/hosts/showcase/content/courses/survival-basics/index.md @@ -0,0 +1,32 @@ +--- +contentType: course +title: Survival Basics +description: The essential skills for dealing with an emergency outdoors. +template: detail.html +parentUrl: /courses/ +location: Harz Mountains, Germany +duration: 2 +level: Beginner +groupSize: + maximum: 10 +price: 249 +featuredImage: /assets/images/survival-basics.png +taxonomy: + tags: [survival, beginners, weekend-course] +menu: + position: 1 +status: published +--- +## Stay calm. Make good decisions. + +Over one focused weekend, you learn how to set priorities in an outdoor emergency. Every skill is explained clearly and then put into practice outside. + +## What you will learn + +- Light a fire using simple tools +- Find and safely treat water +- Build a weatherproof emergency shelter +- Establish your position and organise help +- Apply essential outdoor first aid + +No previous experience is required. You receive a complete packing list four weeks before the course. diff --git a/test-server/hosts/showcase/content/courses/wilderness-first-aid/index.md b/test-server/hosts/showcase/content/courses/wilderness-first-aid/index.md new file mode 100644 index 000000000..9ab0cf7ad --- /dev/null +++ b/test-server/hosts/showcase/content/courses/wilderness-first-aid/index.md @@ -0,0 +1,20 @@ +--- +contentType: course +title: Wilderness First Aid +description: Make clear decisions when professional help is hours away. +template: detail.html +parentUrl: /courses/ +location: Harz Mountains, Germany +duration: 2 +level: Intermediate +groupSize: + maximum: 12 +price: 279 +featuredImage: /assets/images/alpine-hut-hike.png +menu: + position: 3 +status: published +--- +## Help that goes further + +Through realistic scenarios, you practise patient assessment, treatment, heat retention, improvised transport and concise emergency communication. The focus is on incidents beyond quick access to professional rescue. diff --git a/test-server/hosts/showcase/content/departures/alps-june/index.md b/test-server/hosts/showcase/content/departures/alps-june/index.md new file mode 100644 index 000000000..bd184e6b0 --- /dev/null +++ b/test-server/hosts/showcase/content/departures/alps-june/index.md @@ -0,0 +1,21 @@ +--- +contentType: event +title: Alpine Hut-to-Hut Hike +description: A six-day guided hike through Tyrol with welcoming huts, regional food and immense mountain views. +template: departure.html +startDate: 2027-06-19 +day: 19 +month: Jun +year: 2027 +location: Tyrol, Austria +durationLabel: 6 days +relatedContent: /trips/alpine-hut-hike/ +availablePlaces: 8 +maximumPlaces: 10 +bookingStatus: available +statusLabel: Available +price: 1290 +menu: + position: 3 +status: published +--- diff --git a/test-server/hosts/showcase/content/departures/index.md b/test-server/hosts/showcase/content/departures/index.md new file mode 100644 index 000000000..bfaf46b13 --- /dev/null +++ b/test-server/hosts/showcase/content/departures/index.md @@ -0,0 +1,10 @@ +--- +title: Upcoming adventures +eyebrow: Dates & availability +description: All scheduled trips and courses at a glance. Small groups mean it is worth planning ahead. +template: departures.html +status: published +menu: + visible: true + position: 3 +--- diff --git a/test-server/hosts/showcase/content/departures/northern-norway-february/index.md b/test-server/hosts/showcase/content/departures/northern-norway-february/index.md new file mode 100644 index 000000000..866830045 --- /dev/null +++ b/test-server/hosts/showcase/content/departures/northern-norway-february/index.md @@ -0,0 +1,21 @@ +--- +contentType: event +title: Northern Norway Winter Adventure +description: A confirmed seven-day winter departure from Tromsø into the mountains and fjords of Northern Norway. +template: departure.html +startDate: 2027-02-14 +day: 14 +month: Feb +year: 2027 +location: Tromsø, Norway +durationLabel: 7 days +relatedContent: /trips/northern-norway-winter-adventure/ +availablePlaces: 3 +maximumPlaces: 10 +bookingStatus: limited +statusLabel: Few places left +price: 1890 +menu: + position: 1 +status: published +--- diff --git a/test-server/hosts/showcase/content/departures/sarek-august/index.md b/test-server/hosts/showcase/content/departures/sarek-august/index.md new file mode 100644 index 000000000..a7aa4842c --- /dev/null +++ b/test-server/hosts/showcase/content/departures/sarek-august/index.md @@ -0,0 +1,21 @@ +--- +contentType: event +title: Sarek Wilderness Trek +description: Nine self-supported days through the immense valleys and open wilderness of Swedish Lapland. +template: departure.html +startDate: 2027-08-21 +day: 21 +month: Aug +year: 2027 +location: Swedish Lapland +durationLabel: 9 days +relatedContent: /trips/sarek-wilderness-trek/ +availablePlaces: 5 +maximumPlaces: 8 +bookingStatus: available +statusLabel: Available +price: 2190 +menu: + position: 4 +status: published +--- diff --git a/test-server/hosts/showcase/content/departures/survival-april/index.md b/test-server/hosts/showcase/content/departures/survival-april/index.md new file mode 100644 index 000000000..2b66e217f --- /dev/null +++ b/test-server/hosts/showcase/content/departures/survival-april/index.md @@ -0,0 +1,21 @@ +--- +contentType: event +title: Survival Basics +description: A practical two-day course covering the essential skills for an outdoor emergency. +template: departure.html +startDate: 2027-04-10 +day: 10 +month: Apr +year: 2027 +location: Harz Mountains, Germany +durationLabel: 2 days +relatedContent: /courses/survival-basics/ +availablePlaces: 6 +maximumPlaces: 10 +bookingStatus: available +statusLabel: Available +price: 249 +menu: + position: 2 +status: published +--- diff --git a/test-server/hosts/showcase/content/destinations/index.md b/test-server/hosts/showcase/content/destinations/index.md new file mode 100644 index 000000000..dbebed2cc --- /dev/null +++ b/test-server/hosts/showcase/content/destinations/index.md @@ -0,0 +1,22 @@ +--- +title: The north is calling +eyebrow: Destinations +description: Rugged coasts, quiet forests and high passes. Explore the places we know best. +template: page.html +status: published +menu: + visible: true + position: 4 +--- +## Norway + +Steep fjords, arctic light and winter trails leading deep into silence. Our journeys focus on Northern Norway around Tromsø and the Lyngen Alps. + +## Sweden + +In Sarek, wilderness means exactly what it should: no roads, no huts, immense valleys and space to become truly self-reliant. + +## The Alps + +Across Tyrol and Graubünden, we combine well-chosen trails with welcoming huts, regional food and trusted mountain expertise. + diff --git a/test-server/hosts/showcase/content/faq/index.md b/test-server/hosts/showcase/content/faq/index.md new file mode 100644 index 000000000..00059f776 --- /dev/null +++ b/test-server/hosts/showcase/content/faq/index.md @@ -0,0 +1,23 @@ +--- +title: Frequently asked questions +eyebrow: Arrive prepared +description: Clear answers to common questions about bookings, equipment and safety. +template: page.html +status: published +--- +## How fit do I need to be? + +Every trip has an honest difficulty rating. A normal level of fitness is enough for trips marked Easy. Challenging treks require previous experience on multi-day hikes. + +## Can I join on my own? + +Absolutely. Many of our guests arrive solo. Small groups usually make it easy to settle in and connect from the first day. + +## What equipment do I need? + +You receive a detailed packing list well before departure. Specialist equipment such as snowshoes and group safety gear is included where stated. + +## What happens in bad weather? + +Our guides adapt the route and schedule. Safety comes before a fixed itinerary, while a meaningful day outside remains the goal. + diff --git a/test-server/hosts/showcase/content/index.md b/test-server/hosts/showcase/content/index.md new file mode 100644 index 000000000..b49438224 --- /dev/null +++ b/test-server/hosts/showcase/content/index.md @@ -0,0 +1,10 @@ +--- +title: Nordlicht Outdoor +description: Small-group guided adventures and hands-on outdoor courses. +template: home.html +status: published +seo: + title: Nordlicht Outdoor – Guided Adventures & Outdoor Courses + description: Discover guided hiking trips, winter expeditions and practical outdoor courses in small groups. +--- + diff --git a/test-server/hosts/showcase/content/journal/index.md b/test-server/hosts/showcase/content/journal/index.md new file mode 100644 index 000000000..ae7229a77 --- /dev/null +++ b/test-server/hosts/showcase/content/journal/index.md @@ -0,0 +1,24 @@ +--- +title: Stories for the trail +eyebrow: Nordlicht Journal +description: Field notes, trip stories and practical gear advice for people who prefer being prepared over being overpacked. +template: page.html +status: published +menu: + visible: true + position: 5 +--- +## Latest from the journal + +### Stay warm without overheating + +A practical guide to layering for active winter days, explained clearly and tested in the field. + +### Five mistakes new map readers make + +Why north is not always up — and how to plan a realistic route before you leave home. + +### One night under the northern lights + +Guide Lena recalls a perfectly clear February evening beside the Lyngenfjord. + diff --git a/test-server/hosts/showcase/content/trips/alpine-hut-hike/index.md b/test-server/hosts/showcase/content/trips/alpine-hut-hike/index.md new file mode 100644 index 000000000..97957991b --- /dev/null +++ b/test-server/hosts/showcase/content/trips/alpine-hut-hike/index.md @@ -0,0 +1,31 @@ +--- +contentType: trip +title: Alpine Hut-to-Hut Hike +description: Walk from hut to hut with wide-open views and a light pack. +template: detail.html +parentUrl: /trips/ +region: Tyrol +country: Austria +duration: 6 +difficulty: Easy +groupSize: + maximum: 10 +price: 1290 +featuredImage: /assets/images/alpine-hut-hike.png +taxonomy: + tags: [alps, hiking, beginners] +menu: + position: 3 +status: published +--- +## One step at a time + +This journey combines rewarding mountain paths, welcoming huts and immense views. We walk for four to six hours each day, leaving room for breaks, regional food and stories from the mountains. + +## Included + +- Five nights in carefully selected mountain huts +- Breakfast and dinner featuring regional food +- A qualified mountain hiking guide +- Route planning and group safety equipment +- Optional luggage transfer on selected stages diff --git a/test-server/hosts/showcase/content/trips/index.md b/test-server/hosts/showcase/content/trips/index.md new file mode 100644 index 000000000..9c5b14470 --- /dev/null +++ b/test-server/hosts/showcase/content/trips/index.md @@ -0,0 +1,12 @@ +--- +title: Journeys that stay with you +eyebrow: Guided outdoor adventures +description: From deep fjords to high passes and open wilderness. Find a journey that matches your experience and your sense of adventure. +template: listing.html +source: /trips/* +status: published +menu: + visible: true + position: 1 +--- + diff --git a/test-server/hosts/showcase/content/trips/northern-norway-winter-adventure/index.md b/test-server/hosts/showcase/content/trips/northern-norway-winter-adventure/index.md new file mode 100644 index 000000000..5e68d144b --- /dev/null +++ b/test-server/hosts/showcase/content/trips/northern-norway-winter-adventure/index.md @@ -0,0 +1,40 @@ +--- +contentType: trip +title: Northern Norway Winter Adventure +description: Seven days among quiet fjords, deep snow and the northern lights. +template: detail.html +parentUrl: /trips/ +destination: Tromsø +region: Northern Norway +country: Norway +duration: 7 +difficulty: Moderate +minimumAge: 16 +groupSize: + minimum: 4 + maximum: 10 +price: 1890 +currency: EUR +featuredImage: /assets/images/northern-norway-winter.png +featured: true +taxonomy: + tags: [norway, winter, snowshoeing] +menu: + position: 1 +status: published +--- +## When the north begins to glow + +On snowshoes, we follow quiet trails above the fjords, learn to read the winter landscape and wait by the fire for the aurora. Our small, welcoming lodges are run by local hosts. + +## Highlights + +- Three guided snowshoe hikes with sweeping fjord views +- One night in a comfortable winter camp +- An introduction to navigation and winter survival +- A visit to one of our local partner businesses +- Flexible aurora outings whenever the sky is clear + +## Good to know + +You need a normal level of fitness and an appetite for active winter days. Specialist equipment including snowshoes, poles and group safety gear is provided. diff --git a/test-server/hosts/showcase/content/trips/sarek-wilderness-trek/index.md b/test-server/hosts/showcase/content/trips/sarek-wilderness-trek/index.md new file mode 100644 index 000000000..b05838b26 --- /dev/null +++ b/test-server/hosts/showcase/content/trips/sarek-wilderness-trek/index.md @@ -0,0 +1,32 @@ +--- +contentType: trip +title: Sarek Wilderness Trek +description: Nine days through one of Europe's last great wilderness areas. +template: detail.html +parentUrl: /trips/ +region: Swedish Lapland +country: Sweden +duration: 9 +difficulty: Challenging +groupSize: + maximum: 8 +price: 2190 +featuredImage: /assets/images/hero-northern-norway.png +taxonomy: + tags: [sweden, trekking, summer] +menu: + position: 2 +status: published +--- +## Wilderness without signposts + +There are no marked trails and no huts in Sarek. We carry what we need, navigate through immense valleys and pitch our tents wherever the day comes to an end. + +## Highlights + +- Multi-day trekking far from roads and settlements +- Practical navigation with map and compass +- Safe river crossings with an experienced guide +- A flexible route adapted to weather and group conditions + +This journey is for sure-footed hikers with previous multi-day trekking experience. diff --git a/test-server/hosts/showcase/data/metadata/index/_0.cfe b/test-server/hosts/showcase/data/metadata/index/_0.cfe new file mode 100644 index 000000000..dcb6494b4 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_0.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_0.cfs b/test-server/hosts/showcase/data/metadata/index/_0.cfs new file mode 100644 index 000000000..919266d10 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_0.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_0.si b/test-server/hosts/showcase/data/metadata/index/_0.si new file mode 100644 index 000000000..c31dd544e Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_0.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/_0_5.liv b/test-server/hosts/showcase/data/metadata/index/_0_5.liv new file mode 100644 index 000000000..b9744a8e1 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_0_5.liv differ diff --git a/test-server/hosts/showcase/data/metadata/index/_1.cfe b/test-server/hosts/showcase/data/metadata/index/_1.cfe new file mode 100644 index 000000000..712c790b8 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_1.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_1.cfs b/test-server/hosts/showcase/data/metadata/index/_1.cfs new file mode 100644 index 000000000..40d68f340 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_1.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_1.si b/test-server/hosts/showcase/data/metadata/index/_1.si new file mode 100644 index 000000000..ac632fa14 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_1.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/_2.cfe b/test-server/hosts/showcase/data/metadata/index/_2.cfe new file mode 100644 index 000000000..44bd5d99a Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_2.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_2.cfs b/test-server/hosts/showcase/data/metadata/index/_2.cfs new file mode 100644 index 000000000..1ce074f8c Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_2.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_2.si b/test-server/hosts/showcase/data/metadata/index/_2.si new file mode 100644 index 000000000..4ab6640da Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_2.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/_3.cfe b/test-server/hosts/showcase/data/metadata/index/_3.cfe new file mode 100644 index 000000000..e65455196 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_3.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_3.cfs b/test-server/hosts/showcase/data/metadata/index/_3.cfs new file mode 100644 index 000000000..b57c262b3 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_3.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_3.si b/test-server/hosts/showcase/data/metadata/index/_3.si new file mode 100644 index 000000000..3a4f4892d Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_3.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/_4.cfe b/test-server/hosts/showcase/data/metadata/index/_4.cfe new file mode 100644 index 000000000..a8f28da15 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_4.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_4.cfs b/test-server/hosts/showcase/data/metadata/index/_4.cfs new file mode 100644 index 000000000..c1ab4ce3f Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_4.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_4.si b/test-server/hosts/showcase/data/metadata/index/_4.si new file mode 100644 index 000000000..07d5d9a0c Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_4.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/_5.cfe b/test-server/hosts/showcase/data/metadata/index/_5.cfe new file mode 100644 index 000000000..ccf7f4a9d Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_5.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_5.cfs b/test-server/hosts/showcase/data/metadata/index/_5.cfs new file mode 100644 index 000000000..f96696970 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_5.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_5.si b/test-server/hosts/showcase/data/metadata/index/_5.si new file mode 100644 index 000000000..0695b8ea7 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_5.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/_5_1.liv b/test-server/hosts/showcase/data/metadata/index/_5_1.liv new file mode 100644 index 000000000..62edf4cf5 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_5_1.liv differ diff --git a/test-server/hosts/showcase/data/metadata/index/_7.cfe b/test-server/hosts/showcase/data/metadata/index/_7.cfe new file mode 100644 index 000000000..e9426f614 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_7.cfe differ diff --git a/test-server/hosts/showcase/data/metadata/index/_7.cfs b/test-server/hosts/showcase/data/metadata/index/_7.cfs new file mode 100644 index 000000000..56665ed6f Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_7.cfs differ diff --git a/test-server/hosts/showcase/data/metadata/index/_7.si b/test-server/hosts/showcase/data/metadata/index/_7.si new file mode 100644 index 000000000..a355549dc Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/_7.si differ diff --git a/test-server/hosts/showcase/data/metadata/index/segments_7 b/test-server/hosts/showcase/data/metadata/index/segments_7 new file mode 100644 index 000000000..9031ec29a Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/index/segments_7 differ diff --git a/test-server/hosts/showcase/data/metadata/index/write.lock b/test-server/hosts/showcase/data/metadata/index/write.lock new file mode 100644 index 000000000..e69de29bb diff --git a/test-server/hosts/showcase/data/metadata/store/data.db b/test-server/hosts/showcase/data/metadata/store/data.db new file mode 100644 index 000000000..86a2371a1 Binary files /dev/null and b/test-server/hosts/showcase/data/metadata/store/data.db differ diff --git a/test-server/hosts/showcase/messages/messages.properties b/test-server/hosts/showcase/messages/messages.properties new file mode 100644 index 000000000..c00d5752f --- /dev/null +++ b/test-server/hosts/showcase/messages/messages.properties @@ -0,0 +1,9 @@ +site.name=Nordlicht Outdoor +navigation.trips=Trips +navigation.courses=Courses +navigation.departures=Departures +navigation.destinations=Destinations +navigation.journal=Journal +navigation.about=About +action.discover=Explore + diff --git a/test-server/hosts/showcase/site-dev.toml b/test-server/hosts/showcase/site-dev.toml new file mode 100644 index 000000000..3ac8997ce --- /dev/null +++ b/test-server/hosts/showcase/site-dev.toml @@ -0,0 +1,7 @@ +# site configuration for dev environment + +hostname = [ "localhost" ] # hostnames for this site, used for request matching + +[api] +enabled = true +whitelist = ["meta.*", "title"] \ No newline at end of file diff --git a/test-server/hosts/showcase/site.toml b/test-server/hosts/showcase/site.toml new file mode 100644 index 000000000..c0f5c5294 --- /dev/null +++ b/test-server/hosts/showcase/site.toml @@ -0,0 +1,9 @@ +id = "outdoor" +hostname = [ "localhost", "127.0.0.1" ] +baseurl = "http://localhost:2020" +context_path = "/" + +# ui manager application configuration +[ui] +force2fa = false # force 2fa for all users +managerEnabled = true # enable the ui manager application \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/base.html b/test-server/hosts/showcase/templates/base.html new file mode 100644 index 000000000..6c31b8df0 --- /dev/null +++ b/test-server/hosts/showcase/templates/base.html @@ -0,0 +1,63 @@ + + + + + + + {{ node.meta.getOrDefault("seo.title", node.meta.getOrDefault("title", "Nordlicht Outdoor")) }} + + + + + + + + + + + +
{% block content %}{{ node.content | raw }}{% endblock %}
+ + + + + \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/contact.html b/test-server/hosts/showcase/templates/contact.html new file mode 100644 index 000000000..9497b0ecb --- /dev/null +++ b/test-server/hosts/showcase/templates/contact.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} +{% block content %}
+
+

Here when you need us

+

Let's talk about your
next adventure.

+

Not sure which trip is right for you? Send us a note — our advice is honest, personal and without obligation. +

+
+
+
+
+

Get in touch

+

Monday to Friday, 9 am–5 pm CET

+

Emailhello@nordlicht-outdoor.com

+

Phone+49 40 555 71 920

+

OfficeAm Sandtorkai 27, Hamburg +

+
+
+
+
+
{% endblock %} \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/departure.html b/test-server/hosts/showcase/templates/departure.html new file mode 100644 index 000000000..3e033a7b2 --- /dev/null +++ b/test-server/hosts/showcase/templates/departure.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block content %} +
+
All departures +

{{ node.meta.statusLabel }}

+

{{ node.meta.title }}

+

{{ node.meta.description }}

+
+
+
+
Start date{{ node.meta.day }} {{ + node.meta.month }} {{ node.meta.year }}Duration{{ node.meta.durationLabel + }}Location{{ + node.meta.location }}Availability{{ node.meta.availablePlaces }} places + left
+
+
+
+

Your departure

{{ node.content | raw }}

Ready to join?

+

Send us a short enquiry. We will confirm availability, answer your questions and share all details before you + make a booking decision.

View the full trip or + course +
+ +
+{% endblock %} \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/departures.html b/test-server/hosts/showcase/templates/departures.html new file mode 100644 index 000000000..d67818c05 --- /dev/null +++ b/test-server/hosts/showcase/templates/departures.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} +{% block content %} +
+
+

{{ node.meta.eyebrow }}

+

{{ node.meta.title }}

+

{{ node.meta.description }}

+
+
+{% assign pageNumber = requestContext.getQueryParameter('page', '1') %} +{% assign page = cms.nodeList.from("/departures/*").sort("startDate").page(pageNumber).size(12).list() %} +
+
+
+
+

Choose your date

+

{{ page.totalItems }} upcoming departures.

+
+

Every departure is led by an experienced guide and limited to a small group.

+
+ +
+
+ +{% endblock %} \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/detail.html b/test-server/hosts/showcase/templates/detail.html new file mode 100644 index 000000000..8f7b24550 --- /dev/null +++ b/test-server/hosts/showcase/templates/detail.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% block content %} +
{{ node.meta.title }} +
+
Back to + overview{{ node.meta.getOrDefault("country", node.meta.location) }} +

{{ node.meta.title }}

+

{{ node.meta.description }}

+
+
+
+
Duration{{ node.meta.duration }} + daysLevel{{ + node.meta.getOrDefault("difficulty", node.meta.level) }}Group4–{{ node.meta.getOrDefault("groupSize.maximum", + "10") }} peopleRegion{{ + node.meta.getOrDefault("region", node.meta.location) }}
+
+
+
+

What to expect

{{ node.content | raw }} +
+ +
+{% endblock %} \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/home.html b/test-server/hosts/showcase/templates/home.html new file mode 100644 index 000000000..07256abe0 --- /dev/null +++ b/test-server/hosts/showcase/templates/home.html @@ -0,0 +1,129 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Guided adventures across Europe's wild north

+

Where the trail ends,
adventure begins.

+

Small groups, seasoned guides and trails far from the crowds. For people who want to feel + nature, not just see it.

+ +
+
+
12+ years of experience8 expert + guidesmax. 10 guests per group + Safety first
+
+
+ +{% assign trips = cms.nodeList.from("/trips/*").sort("menu.position").page(1).size(3).list() %} +
+
+
+

Hand-picked journeys

+

Leave the everyday.
Enter the wild.

+
All trips +
+ +
+ +
+
+
A small hiking group approaching a mountain hut850+ guests have + explored with us
+
+

What drives us

+

Small groups.
Big experiences.

+

We believe the best stories begin where phone reception ends. We take you beyond the familiar — thoughtfully, + personally and with deep respect for the places we visit.

+
    +
  • Personally guidedSeasoned guides who truly know + their regions.
  • +
  • Travel with careSmall groups and partners rooted + in each destination.
  • +
  • Ready and safeThorough planning and honest + difficulty ratings.
  • +
More about us +
+
+
+ +{% assign events = cms.nodeList.from("/departures/*").sort("startDate").page(1).size(4).list() %} +
+ +
+ +{% assign courses = cms.nodeList.from("/courses/*").sort("menu.position").page(1).size(3).list() %} +
+
+
+

Skills that matter outside

+

Get ready.

+
+

Our courses build calm confidence and practical skill — clearly taught and tested outside. +

+
+ +
+ +
+
+
“I left with a healthy respect for the cold — and came home with an entirely new trust in myself.” +
+

Mara, 34 · Northern Norway Winter Adventure

+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/listing.html b/test-server/hosts/showcase/templates/listing.html new file mode 100644 index 000000000..36a1b9f24 --- /dev/null +++ b/test-server/hosts/showcase/templates/listing.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% block content %} +
+
+

{{ node.meta.eyebrow }}

+

{{ node.meta.title }}

+

{{ node.meta.description }}

+
+
+{% assign pageNumber = requestContext.getQueryParameter('page', '1') %} +{% assign page = cms.nodeList.from(node.meta.source).sort("menu.position").page(pageNumber).size(9).list() %} +
+
{{ page.totalItems }} adventures +
+
+ +
+{% endblock %} \ No newline at end of file diff --git a/test-server/hosts/showcase/templates/page.html b/test-server/hosts/showcase/templates/page.html new file mode 100644 index 000000000..160c50b6e --- /dev/null +++ b/test-server/hosts/showcase/templates/page.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %}
+
+

{{ node.meta.eyebrow }}

+

{{ node.meta.title }}

+

{{ node.meta.description }}

+
+
+
+
{{ node.content | raw }}
+
{% endblock %} \ No newline at end of file