Site structure: page inventory, the homepage pre-camp section, navigation, footer, hero CTAs, accordions, anchor IDs.
Part of the requirements index. Section IDs (02-§N.M) are stable and cited from code; they do not encode the file path.
The following pages must exist:
| ID | Page | URL | Audience |
|---|---|---|---|
02-§2.1 |
Homepage | / |
Prospective families, participants |
02-§2.2 |
Weekly schedule | /schema.html |
Participants |
02-§2.4 |
Today view | /idag.html |
Participants |
02-§2.4a |
Display view | /live.html |
Shared screens |
02-§2.5 |
Add activity | /lagg-till.html |
Participants |
02-§2.6 |
Archive | /arkiv.html |
Prospective families, returning participants |
02-§2.7 |
RSS feed | /schema.rss |
Anyone subscribing to the schedule |
02-§2.11 |
Edit activity | /redigera.html |
Participants who submitted the event |
02-§2.12 |
iCal feed | /schema.ics |
Anyone subscribing to the schedule |
02-§2.13 |
Calendar tips | /kalender.html |
Participants wanting to sync the schedule |
02-§2.14 |
Admin activation | /admin.html |
Administrators |
The homepage, schedule pages, add-activity form, and archive share the same header and navigation. None require login.
The Today view (/idag.html) uses the standard site layout with header and navigation.
The Display view (/live.html) has no header or navigation — it is a minimal, full-screen display intended for shared screens around the camp.
Both show today’s activities; they differ only in presentation context.
The homepage is for families who know nothing about the camp.
It must answer, in order:
It must also include a frequently asked questions section.
The homepage must feel complete and trustworthy even when no camp is currently active. When a camp is active or upcoming, the schedule and add-activity links are prominent. The upcoming-camps list renders each camp as a compact one-liner (icon, name, location, and dates on a single line) with no visual separators between items.
The registration section must link to the external booking site, where families complete the full sign-up form. The specific URL lives in the build code, not in this requirement.
The pricing and rules sections must document the cancellation refund tiers and the organiser’s right to refuse participation, matching the terms that bind participants at the point of registration.
Tone: Warm, calm, and clear. Written in Swedish. Not corporate. Not promotional. The goal is that a parent visiting for the first time leaves thinking: “I understand what this is. I know how it works. I feel comfortable taking the next step.”
The site must:
The purpose of the schedule is coordination, not administration.
A shared footer must appear at the bottom of every page. Its content is maintained in a single Markdown file so non-technical contributors can update it without touching any template or layout code.
<body>. source/content/footer.md. footer.md, converts it to HTML using the same Markdown pipeline
as other content pages, and injects the result into every page via the shared
rendering layer. footer.md does not exist at build time, every page must still render
successfully with an empty footer. The build must not crash or exit with an error. footer.md and running the build must change the footer on all pages
without modifying any other file. The site must have exactly one navigation component, appearing at the top of every page. There must be no secondary or duplicate navigation menus elsewhere on any page.
The navigation must contain links to all main pages:
index.html)schema.html)idag.html)lagg-till.html)arkiv.html)The link for the current page must be visually marked as active.
On desktop, the page links use the short labels listed above and are
displayed in uppercase via CSS (text-transform: uppercase).
On mobile, the hamburger menu uses longer, more descriptive labels:
The navigation must also include anchor links to the main sections of the index page.
sections.yaml via the nav: field. index.html#id. aria-label). aria-expanded to communicate state to
assistive technologies. The Lokaler section on the index page must display each location from local.yaml
as an individual accordion item. The section heading and introductory text remain
visible; only the individual locations are collapsible.
## Lokaler in locations.md) must render as a regular
heading, not wrapped in an accordion. local.yaml must render as a separate
<details class="accordion"> element. name must appear as the <summary> text. information text must appear inside the accordion body. image_path values must render each image as an
<img> inside the accordion body, below the information text. information and empty image_path must still render as
an accordion (summary only, empty body). local.yaml. collapsible: true flag in sections.yaml must be removed for the lokaler
section (individual location accordions replace it). The mobile hamburger menu has usability problems on long pages: it scrolls out of view so users cannot access navigation without scrolling back to the top, and its visual design (same cream background as the page) makes it hard to distinguish from surrounding content. These issues were identified through manual testing on mobile devices.
var(--color-terracotta))
background with white icon bars so it is clearly visible against the
page background. var(--radius-md)) for a softer
appearance. var(--color-white) to meet WCAG AA contrast
for large text (14 px bold qualifies as large text; contrast ratio
≥ 3:1). var(--radius-lg)) and
horizontal inset margins so it appears as a floating card. Every HTML page must contain a <main> landmark element so that screen
readers can let users skip past navigation directly to the page content.
This addresses the PageSpeed Accessibility audit flag for missing <main>
landmark.
<main> element. <main> element must wrap all page content between the navigation
and the footer (or end of content if there is no footer). <main> element must NOT contain <nav> or <footer>
elements. <main> must not change any visual styling — it is a semantic
element only. <main> element is permitted per page (HTML spec
requirement). When a camp is active and within its editing period, three quick-access action buttons must appear directly below the hero image on the index page. The buttons provide fast navigation to the most-used pages during an active camp.
idag.html), Schema
(schema.html), and Lägg till (lagg-till.html). [opens_for_editing, end_date + 1 day]. hidden attribute). border-radius: 999px),
terracotta background, white text, bold weight. index.html. 07-DESIGN.md §7. On the schedule page (schema.html), day accordions for dates that have
already passed should be collapsed by default, so that the visitor sees
current and future days open and past days closed.
open attribute from <details class="day"> elements whose
id (ISO date) is before today. open attribute at build
time, so that the page is fully usable without JavaScript. <details> elements, only
day-level <details class="day"> elements. Navigation labels follow the principle: short where space is limited, descriptive where there is room.
text-transform: uppercase. <h1> page title on schema.html is
“Lägrets schema – {campName}”. <h1> page title on idag.html is
“Dagens aktiviteter”. <title> element on schema.html is
“Lägrets schema – {campName}”. <title> element on idag.html is
“Dagens aktiviteter – {campName}”. Section anchor IDs on the index page must match their navigation labels.
The id field in sections.yaml is the single source of truth for both
the <section id="…"> attribute and the href="#…" in navigation links.
id="roster". id="kostnader". #roster. #kostnader.