Implements full admin interface for managing units and groups.
Migrates converter from static imports to server-side data loading.
- Switch adapter-static → adapter-node
- Add bcryptjs session auth with HMAC-signed cookies
- Add data/units.json and data/config.json data layer
- Add atomic file writes via temp-file rename
- Add public GET /api/units endpoint
- Add auth-gated admin CRUD API for units and groups
- Add two-panel admin UI with group tree and edit forms
- Add YOLO mode toggle for cross-group conversions
- Add visual group dividers in converter results grid
- Update ResultItem type for nullable convertedValue and isYolo flag
- Group deletion supports reassign/orphan with toBase recalculation
Rollback point: 067fd44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dan Mode: pure white backgrounds, electric blue text (#0000ff), nuclear
yellow accents (#ffff00), hot magenta borders (#ff00ff), red labels,
glowing box-shadows. Maximum saturation. Hostile to human vision by design.
Theme toggle now cycles light → dark → dan → light (icons: 🌙😎☀️).
PICO_CSS.md: documents [role=button] color clobber, palette scoping rules,
and theme toggling pattern for future reference.
Root cause: .result-tile has role="button", which triggers Pico's button
rule setting --pico-color: var(--pico-primary-inverse) = #fff in light mode.
Text inherited this white color, invisible on white card backgrounds.
Fix: override --pico-color: initial and set explicit color: var(--pico-contrast)
on .result-tile. --pico-contrast is #181c25 in light mode and #dfe3eb in dark —
both legible against their respective card backgrounds.
Fix: .result-value was using color: var(--pico-color) which broke when
our custom palette variables weren't in scope. Now inherits body color —
Pico handles light/dark correctly without us needing to re-assert it.
Feat: unit symbol merged inline into label as 'Blurbs (bl)', replacing
the separate third line. Removes .result-symbol CSS rule. Cards are
shorter and less cluttered.
Fix: palette overrides now use @media(prefers-color-scheme:light) +
[data-theme=light] only — no more :root:not([data-theme=dark]) which
incorrectly matched OS-dark with no attribute set.
Feat: theme toggle button in nav (🌙/☀️), persisted to localStorage,
applied via data-theme attribute on <html>. Respects OS preference on
first visit.
Root cause: --pico-color and --pico-card-background-color were overridden
unconditionally at :root, clobbering Pico's dark mode tokens. Light-colored
text (#2C2C2C) became invisible against dark card backgrounds (#181c25).
Fix: move Pico token overrides under light-mode selectors only. Dark mode
now inherits Pico's correct dark palette. --color-label (app-specific var)
gets an explicit dark-mode value since Pico doesn't define it.
- From and result now on one line: '1.00 Units = 0.09 OtherUnits'
- Same font size and color for both sides (pico-color, 600 weight)
- Container query switches to over-under at <420px with '= ' prefix on result line
- Separator '=' shown inline; muted color/normal weight to visually anchor the equation
- Removed old two-tier font sizing (small grey from, large blue result)
- shift+click now only sets fromUnitId; inputValue is unchanged so all outputs
recalculate correctly from the original user input
- Ctrl+click is a new gesture that sets both fromUnitId and inputValue to the
tile's displayed converted value (the "pivot" action)
- highlighted-result block always renders with min-height:8rem so the page
below it never jumps when a highlight is added or cleared
- hotkey hint updated to document all three click gestures
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace 5 hardcoded #2C2C2C/#555550/#888880 literals with var(--pico-color),
var(--color-label), var(--pico-muted-color); add --color-label token to :root
- Remove inline Big(inputValue) ternary in results derived — convert.ts already
handles same-unit identity via its own from.id === to.id guard
- Drop now-unused Big import from +page.svelte
- Guard onshiftclick in ConversionResult: no-op when tile is already the from-unit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Explicit dark colors on .result-value, .result-label, .result-symbol, .highlighted-value, .highlighted-label
- Include from-unit in results grid (stable definition-order); from-unit tile shows Big(inputValue) and gets is-input-unit dashed-border class
- Shift+click no longer clears highlightedUnitId — fromUnitId and highlightedUnitId are now fully independent states
- Add × dismiss button (aria-label="Remove highlight") to .highlighted-result banner; .highlighted-result gains position:relative
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>