Vonheim
Ideas
-
Bookings now have optional start_time and end_time fields in the database, but there is no UI to set them. The inline booking form in the day view needs time inputs so users can specify when their meeting starts and ends.
This depends on the day view hub being built (which has the inline form). The calendar already renders times when they're present — this issue is about letting users enter them.
-
After logging in (via magic link or passkey), the user is always redirected to /calendar. The design spec says they should be redirected back to the page they were trying to reach — for example, if they clicked "Logg inn" from a day view, they should land back on that day after authentication.
This requires capturing the return URL before the login flow starts and passing it through the email token or session state.
History
-
The admin page used card-based booking display and lacked clear tab navigation between requests and users. The design spec shows a sub-nav tab pattern with table layouts for both sections.
Adds sub-nav tabs (Forespørsler | Brukere) to the page header. Replaces the pending bookings card list with a table (Dato, Tid, Formål, Kontakt, Innsendt) where rows link to the day view for inline approval. Cleans up the users table to match the design (Navn, E-post, Rolle, Rediger). Removes the now-unused booking-card component.
-
The list page used a card-based layout and required navigating to a separate my-bookings page to see your own reservations. The design spec replaces this with a flat table and a "Vis mine" filter toggle.
Replaces cards with a table (Dato, Tid, Formål, Status, Kontakt columns). Rows link to the day view. Adds "Vis mine" checkbox that filters by the current user's bookings. Removes the separate my-bookings page and handler.
Changes
- List template rewritten with table layout and HTMX filters
- ListBookings handler accepts
mineparam for user-filtered results - Removed MyBookingsPage handler, route, and template
Kept
- booking-card.html component (still used by admin pending list)
-
The day view was a minimal page showing booking cards with a link to the separate booking form. The design spec makes it the central hub where all booking interactions happen — viewing details, creating, editing, and approving — without navigating away.
What changed
- Expandable booking rows: each booking is a
<details>element with summary (time, title, rooms, status badge) and detail section (contact info, action buttons). Logged-out visitors see read-only rows. - Inline booking form: create and edit forms are embedded in the day view. On free days the form is visible by default; on busy days it's collapsed behind "+ Ny reservasjon". Edit mode loads via HTMX fragment.
- HTMX actions: approve, reject, and cancel update the booking row in-place without page reload. Edit loads the form fragment inline.
- Four page variants: busy day, free day, full-day booking, logged-out — all in one template with conditional blocks.
- Mobile responsive: summary rows wrap, detail sections stack, touch targets are tappable.
Removed
booking-detail.html,booking-form.html,booking-confirm.htmltemplates and their handlers (-616 lines)- Old routes redirect to
/day/{date}or/calendarfor backward compat
New files
templates/components/day-booking-row.html— booking row componenttemplates/components/booking-form-inline.html— inline form component
Follow-ups
- Add time input to booking form (issue #11) — fields exist, UI included
- Booking list page redesign (Orbit idea)
- Admin interface redesign (Orbit idea)
- Expandable booking rows: each booking is a
-
The calendar showed status-colored fills with text like "1 møte" or "Opptatt" — useful for occupancy at a glance, but it hid what was actually happening each day. The design system specifies a content-first approach where day cells show actual booking titles and times.
Replaces the status-colored calendar with content-first day cells. Each cell now shows up to two booking previews (time + title), a full-day title for all-day bookings, and a "+N mer" overflow indicator. Adds a minimal day view page that calendar cells link to, replacing the old HTMX inline panel.
Changes
- Data model: Added
start_timeandend_timecolumns to bookings (migration 6). Empty string = not set. Time input UI deferred to issue #11. - Handler: Rewrote
buildCalendarDatato populate booking previews, full-day titles, overflow counts, month labels, and past-day classes. AddedDayPagehandler atGET /day/{date}. - Templates: Content-first
calendar-grid.htmlwith<a>links to day view. Newday.htmlpage with prev/next navigation, booking cards, and booking button. - CSS: Removed dead compat rules (
.cal-day.booked,.has-meetings,.day-detail-panel,.day-bookings,.day-status,.day-notice). - Tests: New tests for booking previews, overflow, past days, month labels. Updated day view tests.
Follow-ups
- Add time input to booking form (issue #11)
- Full day view hub with inline form and admin actions (Orbit idea)
- Data model: Added
-
The login page had passkey as the primary method with email magic link below and a recovery key fallback. The design spec makes email the primary login method since it works on any device without setup.
Flips the login page so the email form is on top (primary) and passkey is secondary below an "eller" divider. Removes the recovery key login flow and the separate registration page entirely — accounts are auto-created on first email login.
Removed
- Recovery key handler, route, config, and env var
- Registration handlers, routes, template, and JS
- All associated tests (~150 lines of test code)
- CSRF exemptions for register endpoints
Changed
- Login template: email form primary, passkey secondary
- Handler constructor: no longer accepts recoveryKey parameter
Follow-up
- Redirect to original page after login (issue #9)
-
The design spec simplifies the navigation to: Kalender | Liste | Admin | Om. The separate "Mine reservasjoner" page is being replaced by a "Vis mine" toggle on the list page (tracked as a separate idea).
Removes the nav link now. The route and handler stay in place so existing bookmarks still work — cleanup happens when the list page redesign lands.
Closes #4
-
The about page at /about was a single paragraph placeholder. The design preview specifies a full info page with sections for spaces, booking process, pricing, and contact.
Replaces the placeholder with the full content structure from the design preview. All content is placeholder data — real information to be filled in later. Uses existing design system components (detail-list, table) with no new CSS beyond a max-width rule for readability.
Closes #5
-
The live app's stylesheet uses hardcoded color values and old class names that diverge from the design system built in
design/style.css. This makes it impossible to port new design work (calendar redesign, day view, about page) without reconciling the two stylesheets first.Replaces
static/css/style.csswholesale with the design system stylesheet (tokens, reset, elements, forms, components) and updates all Go templates to use the new class names. A temporary compat section covers template classes that the design system doesn't define yet (day-detail-panel, auth-divider, calendar day modifiers).Changes
- CSS: design system tokens (9-color warm palette, deep umber accent,
spacing scale, radius variants, mono font stack),
color-mix()badge derivations, 18px serif body, content-first calendar grid rules - Templates:
<header>→<header class="site-header">, calendar classes renamed (calendar-*→cal-*,day-num→cal-num), removed redundant.calendarwrapper div - Tests: updated template stubs for new class names
Known cuts
- Calendar content-first markup (
.cal-list,.cal-item) — calendar redesign idea - Navigation link changes — issue #4
- Dark mode design pass — deferred
Closes #3
- CSS: design system tokens (9-color warm palette, deep umber accent,
spacing scale, radius variants, mono font stack),
-
Summary
Builds out the
design/directory as a living style guide and interactive page preview system. The design system establishes visual tokens, typography, components, and page flows — then 10 preview pages demonstrate every user-facing screen using only those decisions.Design system
- Reduced palette: 9 color tokens — warm neutrals + deep umber accent + positive/critical status. Derived colors via
color-mix(). - Typography: Libre Caslon Text (serif) body at 18px, Inter (sans) for UI chrome.
- Components: buttons, inputs, tables (cream header), badges, cards, content-first calendar, detail lists, filter forms.
Content-first calendar
Each day cell shows actual booking content: two-line meeting rows (time above, title below), full-cell burgundy for full-day bookings, "I dag" in the month-label slot, rounded cells with transparent gaps, fixed row heights.
Simplified page flows
Day view is the central hub — inline expanding booking rows + inline form + admin approve/reject. Nav: Kalender | Liste | Admin | Om. Eliminated: booking-detail, booking-form, my-bookings (all absorbed).
Login flow
Email magic link primary, passkey secondary. Email-sent confirmation. Logged-out day view with login CTA. Recovery key removed.
Preview pages (10)
calendar, day (4 variants), list, login + email-sent, admin + admin-users, about. All cross-linked.
Design spec
Finalized at docs/superpowers/specs/2026-04-05-design-styleguide-retrofit.md.
Out of scope
- No changes to static/css/style.css or Go templates
- Dark mode functional only
- No Go code or database changes
Test plan
- [ ] Open design/index.html — verify tokens, typography, component demos
- [ ] Walk calendar → day → booking flow
- [ ] Walk logged-out flow: calendar → day-logged-out → login → login-sent
- [ ] Walk admin flow: admin → admin-users
- [ ] Toggle theme — dark mode legible
- [ ] go build ./... passes
- Reduced palette: 9 color tokens — warm neutrals + deep umber accent + positive/critical status. Derived colors via