diff --git a/AGENTS.md b/AGENTS.md index 1246b7f..3d44110 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,4 +2,6 @@ Run `npm test` before every commit and whenever changing authentication, API authorization, service-worker behavior, or persistence. Add a regression test under `test/` for every new route and for every security/ownership bug. Tests use an in-memory PostgreSQL-compatible database; production migration is run automatically at startup against `DATABASE_URL`. +Every change pushed to the remote must be deployed to the Unraid Docker service immediately afterward. Verify the deployed container is healthy and the production endpoint responds before reporting completion. + For local development, copy `.env.example`, start `docker compose up --build`, then visit `http://localhost:8090`. Production must set `APP_ORIGIN=https://roast.srmr.xyz`, `COOKIE_SECURE=true`, a strong `POSTGRES_PASSWORD`, and a random `BOOTSTRAP_SETUP_TOKEN`. Bootstrap `snowspeeder@gmail.com` exactly once at `POST /api/auth/bootstrap`, then remove `BOOTSTRAP_SETUP_TOKEN` from deployment configuration. Never commit credentials or a bootstrap password/token. diff --git a/public/app.css b/public/app.css index 94fcf5c..1ab6113 100644 --- a/public/app.css +++ b/public/app.css @@ -45,7 +45,9 @@ html { background: var(--surface); scroll-padding-top: calc(var(--header-h) + 18px); } -.panel-card { scroll-margin-top: calc(var(--header-h) + 18px); } +.panel-card { + scroll-margin-top: calc(var(--header-h) + 18px); +} body { margin: 0; background: var(--surface); @@ -271,9 +273,11 @@ label.filebtn input[type="file"] { background: var(--ink-3); transition: background 0.2s; } -.autosave-chip.failed .dot { background: var(--fail); } +.autosave-chip.failed .dot { + background: var(--fail); +} .autosave-chip.saving .dot { -background: var(--warn); + background: var(--warn); animation: pulse 1s ease-in-out infinite; } .autosave-chip.saved .dot { @@ -544,7 +548,9 @@ background: var(--warn); flex-direction: column; min-width: 0; } -.field-help-host > .field { width: 100%; } +.field-help-host > .field { + width: 100%; +} .field-help { position: absolute; top: -2px; @@ -559,7 +565,10 @@ background: var(--warn); cursor: pointer; z-index: 1; } -.field-help:focus-visible { outline: 2px solid var(--ember); outline-offset: 2px; } +.field-help:focus-visible { + outline: 2px solid var(--ember); + outline-offset: 2px; +} .field-help-text { margin-top: 2px; padding: 8px 10px; @@ -1238,15 +1247,41 @@ body.show-fids .field[data-fid]::after { color: #705318; font-size: 12px; } -.ledger-warnings p { margin: 0; } -.plan-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; } +.ledger-warnings p { + margin: 0; +} +.plan-list { + margin: 0; + padding: 0; + list-style: none; + display: grid; + gap: 8px; +} .plan-list-item { - width: 100%; display: grid; gap: 3px; padding: 12px; text-align: left; border: 1px solid var(--line); - border-radius: var(--radius-sm); background: var(--surface-raised); color: var(--ink); font: inherit; cursor: pointer; + width: 100%; + display: grid; + gap: 3px; + padding: 12px; + text-align: left; + border: 1px solid var(--line); + border-radius: var(--radius-sm); + background: var(--surface-raised); + color: var(--ink); + font: inherit; + cursor: pointer; +} +.plan-list-item:hover, +.plan-list-item.active { + border-color: var(--ember); + background: var(--ember-soft); +} +.plan-list-item strong { + font-size: 13px; +} +.plan-list-item span { + font-size: 11px; + color: var(--ink-3); } -.plan-list-item:hover, .plan-list-item.active { border-color: var(--ember); background: var(--ember-soft); } -.plan-list-item strong { font-size: 13px; } -.plan-list-item span { font-size: 11px; color: var(--ink-3); } /* ─── PWA and mobile layout ───────────────────────────────────────────── */ .connection-status { position: sticky; @@ -1348,9 +1383,16 @@ body.show-fids .field[data-fid]::after { .panel-body { padding: 14px; } - .unknown-condition { margin: 0 14px 4px; } - .field-help { width: 22px; height: 22px; } - .field-help-text { font-size: 12px; } + .unknown-condition { + margin: 0 14px 4px; + } + .field-help { + width: 22px; + height: 22px; + } + .field-help-text { + font-size: 12px; + } .field-grid { grid-template-columns: 1fr; gap: 12px; diff --git a/public/index.html b/public/index.html index c4c63f4..41c37f8 100644 --- a/public/index.html +++ b/public/index.html @@ -76,7 +76,15 @@ > -