Skip to content

feat(console): modular panels, AI at bottom, Space Grotesk wordmark, light/dark/auto theme - #36

Merged
bring42 merged 2 commits into
mainfrom
claude/modular-ui-ai-box-bottom-95b664
Jul 24, 2026
Merged

feat(console): modular panels, AI at bottom, Space Grotesk wordmark, light/dark/auto theme#36
bring42 merged 2 commits into
mainfrom
claude/modular-ui-ai-box-bottom-95b664

Conversation

@bring42

@bring42 bring42 commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Console skin (/) only — Euclid untouched.

What changed

  • Modular panels — every main-view block (Master, Channels, Visualizer, Controls, AI) is now a self-contained .module with a uniform header that doubles as a drag handle and hosts a collapse chevron. Collapse state and module order persist in localStorage.
  • AI box moved to the bottom — the AI Prompt panel is now the last module (scroll-to-reach) instead of pinned near the top. All wiring intact.
  • Wordmark → Space Grotesk via a scoped --font-brand var; editorial module titles keep Fraunces.
  • Light / Dark / Auto theme — new Settings → 03 · Appearance control. Light is a warm-paper theme sharing the accent palette; an inline <head> script resolves the theme before first paint (no flash). Auto tracks the system scheme live; preference persists.

Safety / scope

  • All element IDs preserved → engine/app.js device bindings untouched. The new initModules/initTheme logic is pure DOM + localStorage, no network surface.
  • localStorage reads are try/catch-wrapped; stored values only touch classList/attributes/order (no innerHTML).

Verification

Served locally and verified in-browser (demo mode, zero console errors): collapse + drag-reorder + persistence work; Light/Dark flips both Console and Settings views cleanly; Space Grotesk renders; theme + layout survive reload.

Review

Self-reviewed via /code-review. One low-severity robustness nit fixed in a follow-up commit (guard collapse-state restore against non-array localStorage, symmetric with the order-restore guard).

Source-only; device deploy is still python3 scripts/sync_web.pypio run -t uploadfs.

🤖 Generated with Claude Code

benno6 and others added 2 commits July 24, 2026 10:59
…Space Grotesk wordmark, light/dark/auto theme

- Wrap each main-view block as a self-contained .module with a uniform
  header that doubles as a drag handle and hosts a collapse chevron.
  Collapse state and module order persist in localStorage.
- Move the AI Prompt panel to the bottom of the main view (scroll-to-reach
  instead of pinned near the top).
- Wordmark now uses Space Grotesk via a scoped --font-brand var; editorial
  module titles keep Fraunces.
- Add Auto/Light/Dark theme control (Settings > Appearance). Light is a
  warm-paper theme sharing the accent palette; an inline head script
  resolves the theme before first paint to avoid a flash. Preference
  persists and Auto tracks the system scheme live.
- All element IDs preserved, so engine/app.js bindings are untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ocalStorage

Symmetric with the order-restore Array.isArray guard: a corrupted or
future-shaped lume.console.moduleCollapsed value is non-iterable, so
new Set(...) would throw and abort initModules, disabling both collapse
and drag. Guard it and clarify the order-restore comment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 24, 2026 09:02
@bring42
bring42 merged commit 32f094b into main Jul 24, 2026
2 checks passed
@bring42
bring42 deleted the claude/modular-ui-ai-box-bottom-95b664 branch July 24, 2026 09:03

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the Console skin (/) UI concept (Euclid) to support a more flexible layout and appearance: panels become modular/collapsible/reorderable with persistence, AI Prompt moves to the bottom, the wordmark font switches to Space Grotesk, and a Light/Dark/Auto theme preference is added (resolved pre-paint to avoid flashing).

Changes:

  • Introduces .module panels with a uniform header/drag-handle + collapse control; order and collapse state persist via localStorage.
  • Adds Light/Dark/Auto theme selection in Settings, with an inline <head> resolver and live “auto” tracking of system scheme.
  • Updates branding typography (Space Grotesk for the wordmark) and adds styling for modules + theme segmented control.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
ui-concepts/console-euclid-live/styles.css Adds brand font var, light theme palette overrides, module UI styling, and theme segmented control styling.
ui-concepts/console-euclid-live/index.html Adds pre-paint theme resolution, converts main panels into reorderable/collapsible modules, moves AI Prompt to bottom, and adds Appearance/Theme control in Settings.
ui-concepts/console-euclid-live/app.js Adds initModules() (collapse + drag reorder + persistence) and initTheme() (persisted preference + live system tracking).
Comments suppressed due to low confidence (2)

ui-concepts/console-euclid-live/app.js:1449

  • Theme preference read from localStorage isn’t validated. If the stored value is anything other than auto|light|dark (e.g. manual edits or stale data), it will set an unexpected data-theme and the UI can end up in a partially styled state. Clamp the value to the known set.
  let pref = store.get() || "auto"; // "auto" | "light" | "dark"
  const btns = $$("#themeSeg .theme-seg-btn");

ui-concepts/console-euclid-live/app.js:1455

  • The theme segmented control only updates a CSS class; assistive tech won’t get an explicit pressed/selected state. Set aria-pressed (or a radio-style pattern) when applying the active choice so screen readers announce the current selection.
  const apply = () => {
    root.setAttribute("data-theme", resolve(pref));
    btns.forEach((b) => b.classList.toggle("active", b.dataset.themeChoice === pref));
  };

Comment on lines +16 to +19
var p = localStorage.getItem("lume.console.theme") || "auto";
var d = p === "auto"
? (window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark")
: p;
Comment on lines +427 to +428
.module.drop-before{ box-shadow: inset 0 2px 0 0 var(--c-red); }
.module.drop-after{ box-shadow: inset 0 -2px 0 0 var(--c-red); }
Comment on lines +1421 to +1424
e.preventDefault();
if (e.dataTransfer) e.dataTransfer.dropEffect = "move";
const target = e.target.closest("[data-module]");
if (!target || target === dragEl || target.parentElement !== view) return;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants