feat(ui): WebUI modernization PR1 — hygiene, design tokens, type floor, self-hosted font#109
Merged
Merged
Conversation
…r, self-hosted font First PR of the WebUI modernization roadmap (Phase 0 + Phase 1 foundation). Phase 0 — hygiene: - Remove dead code: initParticles (targeted nonexistent #particles), addTypingIndicator (never called), #stats-bar element + writes, .li-spinner legacy CSS, dead .approval-dialog fallback branch. - Deduplicate: extract resetTurnState() from the three identical streaming-state reset blocks (send / newSession / loadAndRenderSession); extract ensureSessionToken() from the two identical session-token bootstrap blocks (delete / rename); unify clipboard writes behind copyTextToClipboard() with execCommand fallback. - Micro-bugs: collapse threshold mismatch (JS measured 500px, CSS capped 460px — content could clip with no expander; now shared constant 460), escapeAttr now also escapes < and >, tb- class-prefix collision between topbar and tool blocks resolved (topbar renamed to top-*), Mesage typo. Phase 1 — design system foundation: - Token scales in :root: type (--fs-xs..xl, 11px floor), spacing (--space-1..8, 4px grid), radius (--r-sm/md/lg). - 11px type floor: every font-size below 11px (42 declarations down to 8px) raised to 11px for WCAG AA readability. - Contrast: --text-3 lifted from #706e68 to #8a8880 (~5.5:1 on the carbon background) so tertiary text passes AA at the new floor size. - Self-hosted font: Azeret Mono variable woff2 (26 KB, weights 100-700) embedded at ui/fonts/ and served at /fonts/azeret-mono.woff2 via the static file map; Google Fonts CDN links removed - the UI now works fully offline/air-gapped. Verified: node --check, go vet, full cmd/odek test suite, and a live smoke test of odek serve (/, /style.css, /app.js, /fonts/azeret-mono.woff2 all 200). No behavioral changes beyond readability improvements.
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
odek | 60c2ee1 | Commit Preview URL Branch Preview URL |
Jul 26 2026, 12:22 PM |
This was referenced Jul 26, 2026
This was referenced Jul 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First PR of the WebUI modernization roadmap — Phase 0 (hygiene) + Phase 1 foundation (design tokens, type floor, contrast, self-hosted font). No behavioral changes beyond readability improvements.
Phase 0 — hygiene
Dead code removed:
initParticles()— targeted a nonexistent#particleselementaddTypingIndicator()— defined but never called (also removed the orphaned selector inpruneMessages)#stats-bar— written on connect but never meaningfully displayed.li-spinnerlegacy CSS.approval-dialogfallback branch in the friction-mode code (HTML uses the id, so the?.appendChildpath could never fire)Duplication extracted:
resetTurnState()— replaces three identical streaming/tool-state reset blocks (send,newSession,loadAndRenderSession)ensureSessionToken()— replaces two identical session-token bootstrap blocks (executeDeleteSession,renameSession)copyTextToClipboard()— one clipboard helper withexecCommandfallback, shared bycopyCodeandcopyMessageMicro-bugs fixed:
COLLAPSE_MAX_HEIGHT_PX = 460constant.escapeAttrnow also escapes<and>tb-class-prefix collision (topbar vs tool block) — topbar renamed totop-*Mesagecomment typoPhase 1 — design system foundation
:root: type (--fs-xs…xl), spacing (--space-1…8, 4px grid), radius (--r-sm/md/lg) — the base for component work in later PRs.font-sizedeclarations below 11px (down to 8px) raised to 11px for WCAG AA readability.--text-3lifted#706e68→#8a8880(~5.5:1 on the carbon background).ui/fonts/and served via the static file map; Google Fonts CDN links removed — the UI now works fully offline/air-gapped (and drops the third-party request).Verification
node --check cmd/odek/ui/app.js✅,go vet✅, fullcmd/odektest suite ✅odek serve:/,/style.css,/app.js,/fonts/azeret-mono.woff2all return 200 ✅