Skip to content

[fix] roadmap #15 batches B+C: UI quick fixes + color picker revival - #82

Merged
AlexZ005 merged 2 commits into
release/nextfrom
fix/roadmap15-b-ui
Aug 5, 2026
Merged

[fix] roadmap #15 batches B+C: UI quick fixes + color picker revival#82
AlexZ005 merged 2 commits into
release/nextfrom
fix/roadmap15-b-ui

Conversation

@AlexZ005

@AlexZ005 AlexZ005 commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Roadmap #15 Opus lane (plans: cloud repo plans-core/roadmap-15-editmesh-notes-polish.md, specs inline). Two commits, independent of PR #81.

B — UI quick fixes (8)

Fix
B1 ThemedSelect popup width — it copied the trigger's width, and the trigger sizes to the selected label, so picking "Box" ellipsised every longer option on reopen. Trigger width is now a minimum; the popup fits its content (capped at 28rem/viewport) and clamps back on screen. Fixes all ~22 dropdowns.
B2 Duplicate tint bug — a multi-select member wears an emissive highlight and the clone's fresh material baked it in, so the first clone stayed selection-blue forever. Clones restore the source's real emissive, and duplicateSelection selects the clone set once at the end instead of per-item mid-loop.
B3 Pack double-click now shows the same dismissible loading toast the drag path shows (shared holdLoadingToast).
B4 Connect chevron badge counts toasts held by a closed drawer when toastsInDrawerOnly is on.
B5 Sessions save + rename are inline textboxes (Enter/Esc), no window.prompt.
B6 Modal key gate — modals are non-modal <dialog>s so the page stays live; WASD flew the camera behind Settings. New derived anyModalOpen gates shortcuts, editorNavigation (keydown + per-frame, clearing held keys) and inputRuntime. Only Settings was guarded before.
B7 dragWindow opt-in resize (corner grabber, persists {w,h}, re-clamps on viewport resize) + What's New goes full-screen below the Connect bar at ≤640px.
B8 Edit mesh / Sculpt hide for multi-select (single-object modes that silently acted on the last-picked object).

C — color picker revival

svelte-awesome-color-picker 3.x→4.1.3 is a runes rewrite with no component events, so every on:input handler died silently — the reported "changing color does nothing". Fixed across all five pickers (material, light, hemisphere ground, background, fog):

  • onInput prop + c.hex (v4 passes the payload directly, not event.detail).
  • One-way hex=: v4 writes its own snapshot back through a binding and clobbers external writes (a plain backgroundColor.set() was reverted while the picker was mounted). Also drops 14 svelte-check errors (435 → 421); release gate ratcheted.
  • Sky edits go through the environment: background/fog wrote the scene directly and the next applyEnvironment() restored the preset — so the colour snapped back even with a live handler. New editEnvSky() detaches a live custom preset (the editRigComponent precedent), so it sticks, persists and replicates.
  • Typed hex routes through materialsHandler.setObjectColor (undo + replication); the drag keeps its 600 ms debounce = one undo entry per gesture.
  • C2: the picker's hex/rgb/hsv text inputs + mode cycle enabled in mesh properties and configure scene.

Verification

  • New tests/e2e/ui-fixes-15b.test.cjs (22 checks) and tests/e2e/color-picker-15c.test.cjs (12 checks); themed-select extended for B1.
  • Green: ui-fixes-15b, color-picker-15c, themed-select, sessions (two-peer), whats-new, inspector, environment, environment-v2.
  • npm run build green; npx svelte-check 421/62 (down from 435).

Companion docs commit (batch I, theprototype-docs @ da30813): the 9 missing node pages — collider, motor, angularvelocity, onenter, onexit, velocity, flowinput, flowoutput, objectflow. Every catalog node type now has a page.

🤖 Generated with Claude Code

AlexZ005 and others added 2 commits August 1, 2026 15:26
…w resize

Roadmap #15 batch B (plan: cloud repo plans-core/roadmap-15, specs inline):

- B1 ThemedSelect: the portaled popup copied the TRIGGER's width, and the
  trigger is sized to the SELECTED label - picking a short option ("Box")
  ellipsised every longer name on reopen. The trigger width is now a MINIMUM;
  the popup sizes to its content (capped at 28rem / the viewport) and is
  clamped back on screen when that overflows the right edge. Fixes all ~22
  call sites at once.
- B2 duplicate: a multi-select member wears an emissive highlight, and the
  clone's fresh material baked it in - the FIRST clone stayed selection-blue
  forever (its tinted value got recorded as its "original"). Clones now
  restore the source's recorded emissive (stripSelectionTint), and
  duplicateSelection no longer selects each clone mid-loop (which collapsed
  the set and restored sources one at a time); it selects the whole clone set
  once at the end.
- B3 packs: double-click / Enter / "Place in scene" now show the same
  dismissible loading toast the viewport DROP path shows (shared
  holdLoadingToast helper) - a slow CDN fetch used to look like nothing
  happened.
- B4 Connect: the chevron badges the toast count the CLOSED drawer is holding
  when toasts are routed drawer-only (mirrors the drawer tab badge; amber when
  approvals are pending).
- B5 Sessions: naming a session (save + rename) is an inline textbox instead
  of window.prompt - Enter commits, Esc cancels, focus is taken automatically.
- B6 modals: app modals are non-modal <dialog>s, so the page behind them is
  NOT inert and window key handlers still fired (WASD flew the camera behind
  Settings). New derived `anyModalOpen` gates shortcuts.js, editorNavigation
  (keydown AND the per-frame fly, which also clears held keys) and
  inputRuntime; only Settings was guarded before.
- B7 windows: dragWindow gains an opt-in `resizable` corner grabber that
  persists {w,h} in the same win:<key> record and re-clamps on viewport
  resize; What's New opts in and goes full-screen below the Connect bar at
  <=640px (the .tp-modal-frame treatment).
- B8 context menu: Edit mesh / Sculpt hide for a multi-selection - they are
  single-object modes and silently acted on the last-picked object only.

Verification: new tests/e2e/ui-fixes-15b.test.cjs (22 checks covering B2/B4/
B5/B6/B7/B8), themed-select extended for B1; sessions + whats-new + the new
suite green; build green; svelte-check baseline 435/62 held.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Roadmap #15 batch C. svelte-awesome-color-picker 3.x -> 4.1.3 (deps
housekeeping) is a Svelte-5 runes rewrite with NO component events, so every
`on:input` handler in the Inspector silently stopped firing - the swatch still
tracked the drag (bind:hex) while nothing was applied. That is the reported
"changing color in mesh properties does nothing".

- C1 mechanism: all five pickers (material, light, hemisphere ground, scene
  background, fog) move to the v4 `onInput` PROP and read `c.hex` (v4 passes
  {color,hsv,rgb,hex} directly, not event.detail).
- C1 binding: the pickers now take `hex` ONE-WAY. v4's ColorPicker writes its
  own snapshot back through a binding, which CLOBBERS external writes - a
  plain `backgroundColor.set(...)` was reverted while the picker was mounted.
  onInput is the input channel, so a binding buys nothing and costs
  correctness. (Also drops 14 svelte-check errors: 435 -> 421, gate updated.)
- C1 sky: background/fog edits wrote scene.background / scene.fog directly and
  the next applyEnvironment() restored the preset values - so even with the
  handler alive the color snapped back. New `editEnvSky()` in environment.js
  detaches a live custom preset (the editRigComponent precedent), so sky edits
  stick, persist and replicate as {type:'environment'} instead of the old
  point-fix {type:'color', uuid:'background'} messages.
- C1 material: the typed hex box routes through the shared
  materialsHandler.setObjectColor (undo + replication); the picker drag keeps
  its 600ms gesture debounce so a drag is ONE undo entry, not one per frame.
- C2: the picker's hex/rgb/hsv text inputs are enabled everywhere
  (isTextInput + textInputModes), with the built-in mode cycle button - in
  both mesh properties and configure scene.

Verification: new tests/e2e/color-picker-15c.test.cjs (12 checks - modes
render, the picker applies + replicates + records one debounced undo entry,
undo steps back, the scene background reaches three.js); inspector,
environment, environment-v2 and ui-fixes-15b green; build green; svelte-check
421/62 (down from 435, release.yml gate ratcheted).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.

1 participant