Replaces the generic shadcn/ui gray theme + horizontal top-bar shell with
the paper-and-ink language from the Claude Design handoff bundle: warm
off-white paper, near-black ink, Source Serif 4 + Inter, hairline borders,
muted ink accents (clay/indigo/sage/plum/ochre) used functionally for
calendars and share scopes.
Theme switcher expanded from 2 dimensions (theme × mode) to 7: palette ×
mode × fontPair × density × dashLayout × calView × navStyle. All exposed
in Settings → Appearance and persisted on the users row. Pre-paint script
applies all four data-* attributes from localStorage so reload doesn't
flash.
App shell restructured to a CSS-grid driven by data-nav on <html>: sidebar
on desktop, bottom-nav + FAB under 760px. Four desktop nav modes wired
(sidebar/rail/top/fab-only). Topbar gets a search-→-CommandPalette button,
notification bell, "+ New" quick-add, avatar.
Dashboard, calendar, lists, notes, settings, login, public share viewer,
and quick-add sheet all reskinned. Dashboard editor gains a Preset menu
(classic/split/glance) that fills the layout from the registered widgets.
FullCalendar wrapped in .fc-skin and inherits all paper-and-ink tokens via
CSS variable overrides. Public share viewer (/s/<token>) rebuilt around
ShareFrame: expiration banner, brand strip, eyebrow chip, 38px serif
title, mini-day + mini-map cards, share-rows.
Schema: drops users.theme; adds theme_palette, theme_font_pair,
theme_density, theme_dash_layout, theme_cal_view, theme_nav_style with
defaults that match the design (clay / serif-sans / regular / classic /
month / rail-desktop). Migration 0014_paper_ink_theme.
Middleware sets x-pathname so the AppShell server component can render
bare for /s/* and /login without a route-group refactor.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- PushOptIn now accepts vapidKey as a prop from its server-component
parent (settings page reads VAPID_PUBLIC_KEY at runtime) — eliminates
the NEXT_PUBLIC_* build-time dependency so pre-built GHCR images work
without a build arg.
- deploy/compose.yaml: famapp exposes 3010:3000, authentik-server exposes
9200:9000 so the existing Caddy stack can proxy by IP, matching every
other service in the homelab. NEXT_PUBLIC_APP_URL replaced by AUTH_URL
(correct next-auth v5 var).
- deploy/Caddyfile.snippet: updated to 192.168.1.69:3010 / :9200.
- .env.production.example: AUTH_URL, ntfy pre-wired to ntfy.ginnoir.com,
VAPID_SUBJECT prefilled with real email.
- typecheck and pnpm build both pass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Items on the lists page and dashboard widget now show as crossed-out for
a configurable duration (default 3s) before vanishing. Unchecking within
the window cancels the removal. The delay is stored in localStorage and
configurable via Settings → Lists (options: 1s / 3s / 5s / 10s / 30s).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>