build(web): generate the UI's Tailwind CSS with the pinned standalone CLI (#685)

Replaces the hand-written Tailwind subset in app.css with a real, purged
Tailwind build: scripts/build_css.py runs the pinned, SHA-256-checked
standalone Tailwind CLI (no Node), the generated tailwind.css and
plugin-frame.css are committed, and CI fails when they are stale. The Pi
never builds anything. The login page (#683) now links tailwind.css too,
and the load-order test covers every template that links app.css.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Chuck
2026-09-30 09:38:16 -04:00
committed by GitHub
co-authored by Claude Opus 5.5
parent 5ea0d511dc
commit ba6eccb489
23 changed files with 899 additions and 665 deletions
@@ -354,6 +354,12 @@ widget on one of those is ignored.
selector: allow only `[A-Za-z0-9_-]`. `BaseWidget` has `sanitizeId()`.
- Associate labels with inputs and keep the widget usable from the keyboard.
- Debounce events that fire on every keystroke.
- Style with the Tailwind utility classes the core UI already uses (`px-3`,
`border-gray-300`, `rounded`, `text-sm`, ...). `static/v3/tailwind.css` is
generated from the core templates and JS, so it only contains classes core
uses, plus everything the hand-written stylesheet defined before the build.
A rarer class a plugin widget needs belongs in a `<style>` the widget
injects, since core can't scan plugin repos.
## Troubleshooting