SB Sommar – Project Documentation

SB Sommar – Design Specification

Visual design reference for SB Sommar. Inspired by sbsommar.se, the live production site. This document is the single source of truth for design decisions.

All CSS must use the custom properties defined in §7. Do not hardcode colors, spacing, or typography values.


1. Design Philosophy


2. Color Palette

ID Name Hex Use
07-§2.1 Terracotta #C76D48 Primary accent, buttons, links, highlights
07-§2.2 Sage green #ADBF77 Secondary accent, section headers, tags
07-§2.3 Cream #F5EEDF Page background, warm neutral base
07-§2.4 Navy #192A3D Main headings, strong contrast
07-§2.5 Charcoal #3B3A38 Body text, muted dark
07-§2.6 White #FFFFFF Cards, content blocks, contrast surfaces
07-§2.8 Cream light #FAF7EF Countdown background, lighter cream variant

Avoid bright or saturated colors outside this palette. The warmth comes from restraint.


3. Typography

Font families

Scale

ID Element Size Weight Color Notes
07-§3.4 H1 40px 700 #C76D48 Page titles, hero heading
07-§3.5 H2 35px 700 #C76D48 Section headings
07-§3.6 H3 30px 700 #C76D48 Sub-section headings
07-§3.7 Body 16px 400 #3B3A38 All running text
07-§3.8 Small / meta 14px 400 #3B3A38 Dates, labels, captions
07-§3.9 Pull quote 25px 600 #3B3A38 Georgia serif, italic
07-§3.10 Nav links 12px 700 varies Uppercase, spaced out

Line height for body text: 1.65. Generous — makes Swedish long-form text comfortable to read.


4. Layout & Spacing

Containers

ID Type Max-width Use
07-§4.1 Wide 1290px Full layout, header, hero
07-§4.2 Narrow 750px Reading sections, articles

Container is centered with margin: 0 auto and horizontal padding on small screens.

Spacing rhythm

Base unit: 8px. Spacing values are multiples of this.

ID Token name Value Use
07-§4.5 space-xs 8px Tight gaps, icon padding
07-§4.6 space-sm 16px Between inline elements
07-§4.7 space-md 24px Card padding, form fields
07-§4.8 space-lg 40px Between sections within a page
07-§4.9 space-xl 64px Between major page sections
07-§4.10 space-xxl 96px Hero padding, page top/bottom

Grid


5. Responsive Breakpoints

ID Breakpoint Width Description
07-§5.1 Desktop > 1000px Full layout, side-by-side columns
07-§5.2 Tablet 690–999px 2-column grids, condensed header
07-§5.3 Mobile < 690px Single column, stacked layout

6. Components

Header / Navigation

Hero Section

Hero Action Buttons

Registration Banners

Registration CTA (in the anmälan section)

Buttons

Cards (info blocks, testimonials)

Accordion (FAQ)

Section headings

Alternating section backgrounds

Event / schedule items

Display sidebar — portrait layout

/live.html is optimised for portrait-orientation screens (e.g. 1080 × 1920 px). The heading moves into the sidebar so events use the full available height from the top of the page.

Display sidebar status widget

The sidebar of /live.html shows a compact status widget above the descriptive text and QR code.

Form field errors (inline)

Per-field validation errors appear directly below the input they relate to.

Form field info messages (inline)

Per-field informational messages (non-error) appear below the input, reusing the same <span> element as errors but with a different class.

Submit modal (progress / success / error)

The submit modal overlays the page during form submission and shows progress, success, or error states.

Markdown toolbar (description field)

A row of small icon buttons directly above the description <textarea>.

Markdown preview (description field)

A read-only preview area below the description <textarea> that shows live-rendered Markdown.

Scoped headings in descriptions

Headings inside event descriptions (.event-desc, .event-description) and the Markdown preview (.md-preview) must be scaled down from the page-level heading sizes so they fit the smaller context and follow a strictly decreasing hierarchy.

Using em makes the headings proportional to the container’s font-size (e.g. 13 px in .event-extra, 16 px in .md-preview).

Character counter (form fields)

A small counter below text input fields showing how many characters have been typed relative to the maximum.

Day grid (date selection)

A grid of day buttons replaces the native date picker on the add-activity form. The grid is always multi-select — there is no toggle.

Locale overview grid

The /lokaler.html page shows every locale (from source/data/local.yaml) as a row, with the active camp’s dates forming the horizontal axis and existing bookings rendered as time-blocks inside each row. It is a read-only visualisation aimed at spotting free time slots at a glance.

Conflict warning banner

The add-activity form, the edit-activity form, and per-event detail pages at /schema/<slug>/ all render the same conflict-warning banner when the activity’s date/time/place overlaps another booking. The banner deliberately reuses the clash palette from the Locale Overview (.event-block--clash) so the two signals feel like the same thing.


7. CSS Strategy

How to write CSS

Write CSS for a component only once its HTML structure exists. Speculative CSS — written before the markup is settled — creates waste and drift.

Structure

  1. One main CSS file, organized in sections: reset → tokens → base → layout → components → utilities.
  2. No preprocessor required. CSS custom properties (variables) are enough.
  3. No CSS framework. Hand-written, minimal.

CSS custom properties (design tokens)

When CSS is written, start with these at :root:

:root {
  /* Colors */
  --color-terracotta: #C76D48;
  --color-sage: #ADBF77;
  --color-cream: #F5EEDF;
  --color-navy: #192A3D;
  --color-charcoal: #3B3A38;
  --color-white: #FFFFFF;
  --color-cream-light: #FAF7EF;

  /* Typography */
  --font-sans: system-ui, -apple-system, sans-serif;
  --font-serif: Georgia, serif;
  --font-size-base: 16px;
  --font-size-h1: 40px;
  --font-size-h2: 35px;
  --font-size-h3: 30px;
  --font-size-pullquote: 25px;
  --font-size-small: 14px;
  --font-size-nav: 12px;
  --line-height-body: 1.65;

  /* Spacing */
  --space-xs: 8px;
  --space-sm: 16px;
  --space-md: 24px;
  --space-lg: 40px;
  --space-xl: 64px;
  --space-xxl: 96px;

  /* Layout */
  --container-wide: 1290px;
  --container-narrow: 750px;

  /* Shadows */
  --shadow-card: 0 4px 12px rgba(0, 0, 0, 0.04);

  /* Borders */
  --radius-sm: 4px;
  --radius-md: 6px;
  --radius-lg: 16px;
  --radius-full: 50%;
}

These variables make it trivial to adjust the design globally later.


8. Imagery


9. Accessibility


10. What Not to Do