From 6729b029bebb6c62b833fdaae9b042508e9476a7 Mon Sep 17 00:00:00 2001 From: Ryuz Date: Sat, 24 Oct 2026 17:07:53 +0200 Subject: [PATCH 1/2] Console: daisyUI 5 components, Lucide icons, overflow armor (#37) * Re-adopt daisyUI 5 (Tailwind v4 plugin, console-only scope, @source '.'): custom 'outer' (default) + 'outer-dark' (prefersdark) themes matching the reference (soft gray canvas, white panels, near-black primary/neutral, radius-box 1.25rem, muted status colors). Components used: menu (sidebar, dropdown popovers), card, stats/stat, badge (badge-soft pills), table + table-fixed w/ colgroup, join (range picker), tabs-box (mobile view tabs), btn, drawer + drawer-toggle/content/side/overlay (mobile sidebar, md:drawer-open on desktop), dropdown, tooltip, skeleton, alert, collapse (deploy rows), kbd (Esc hints), loading, divider, indicator (rail status dots, error count), avatar (rail tiles, account). Deleted the custom CSS daisyUI replaces; kept layout glue, charts, log list, app-tile tints. * Lucide via the 'lucide' package's IconNode exports ([tag, attrs][] nodes rendered through a tiny Ilha component using ilha's h(); pinned 1.61.0): no CDN, no createIcons DOM scanning, CSP-safe. OuterMark stays custom. * Overflow impossible: truncate + min-w-0 on every flex/grid text child, table-fixed with column widths, break-words only for logs/deploy message (break-all for unbroken error runs), title on everything truncated. Main panel and grids fill available width (drawer-content min-w-0, stats stack below xl). * CSP unchanged, zero style= attributes. Verified: bun build + validate clean; Playwright Chromium vs real router with seeded absurd data (500-char summaries, 300-char paths, 63-char slugs, long errors/secrets): Overview/Actions/Errors/Deploys (expanded)/ Secrets at 1440 and 1024, mobile 390 drawer open in /tmp/outer-console-v3-*; no horizontal document scroll, no element box outside its panel, zero CSP violations and console errors. cargo fmt/clippy -D warnings/test green (438 passed). Harness test deleted after verification. --- web/bun.lock | 3 + web/package.json | 1 + web/pages/console/_islands/common.tsx | 2 +- web/pages/console/_islands/console.tsx | 562 +++++++------ web/pages/console/_islands/icons.tsx | 197 ++--- web/pages/console/_islands/views.tsx | 1038 ++++++++++++----------- web/pages/console/console.css | 1059 ++++-------------------- 7 files changed, 1106 insertions(+), 1756 deletions(-) diff --git a/web/bun.lock b/web/bun.lock index afe612c..2d67cb3 100644 --- a/web/bun.lock +++ b/web/bun.lock @@ -9,6 +9,7 @@ "blume": "^2.2.4", "daisyui": "^5.7.50", "ilha": "^0.16.0", + "lucide": "1.61.0", "tailwindcss": "^4.3.3", }, }, @@ -1064,6 +1065,8 @@ "lru_map": ["lru_map@0.4.1", "", {}, "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg=="], + "lucide": ["lucide@1.61.0", "", {}, "sha512-RPNMBgej6WjPKuCNEODg83CF8lnraCeDOsZ3HZ7KvUYf0O5hdJBzer/Ax/meBHl3xvrp5NmKX0IDA5myyzlvGw=="], + "magic-string": ["magic-string@1.4.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ=="], "magicast": ["magicast@0.5.5", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA=="], diff --git a/web/package.json b/web/package.json index f436596..87be709 100644 --- a/web/package.json +++ b/web/package.json @@ -16,6 +16,7 @@ "blume": "^2.2.4", "daisyui": "^5.7.50", "ilha": "^0.16.0", + "lucide": "1.61.0", "tailwindcss": "^4.3.3" } } diff --git a/web/pages/console/_islands/common.tsx b/web/pages/console/_islands/common.tsx index 9d6f61a..af0ed16 100644 --- a/web/pages/console/_islands/common.tsx +++ b/web/pages/console/_islands/common.tsx @@ -100,7 +100,7 @@ export function CopyButton({ value, label }: { value: string; label: string }) { return ( ))} -
+
{ui().createOpen && ( -