Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
e9d388b
[fix] quality governor flap lock: auto-quality toggles stop switching…
AlexZ005 Oct 8, 2026
081162b
[feat] general-purpose motion nodes: follow path, wander, orient to v…
AlexZ005 Oct 8, 2026
9072869
[fix] a big image becomes a texture instead of being refused; texture…
AlexZ005 Oct 8, 2026
d4cfb20
[feat] fish-scale look: thin-film presets and a per-device look tier …
AlexZ005 Oct 8, 2026
3a3b023
[feat] auto-quality notice: one "Lowered ... to keep it smooth · Keep…
AlexZ005 Oct 8, 2026
3112c54
[fix] 40 F6-F11 dock and window chrome from the 1.31 review
AlexZ005 Oct 8, 2026
d5020d0
[feat] the Aquarium becomes a reef: fallback LOD groups + Meshy fish …
AlexZ005 Oct 8, 2026
58db817
[feat] phone sheets: one gesture for every drawer (40 F1) + profile m…
AlexZ005 Oct 8, 2026
8c7d38e
[feat] image editor: crop, rotate/flip, resize, adjust, save, copy, v…
AlexZ005 Oct 8, 2026
e537c2a
[test] 40 F6-F11 dock-chrome-40 suite + suite migrations; sheet/dialo…
AlexZ005 Oct 8, 2026
72568a0
[wip] explorer on the phone: long-press action sheet, rename selectio…
AlexZ005 Oct 8, 2026
e9d206f
[wip] lodGroup pass counter + want in stats (debug the stalled pass);…
AlexZ005 Oct 8, 2026
ccd9b93
[fix] a nested render no longer freezes every LOD group (40 F14)
AlexZ005 Oct 10, 2026
73a63bc
[fix] aquarium-reef 1.2 measures the half-lap offset by its real prop…
AlexZ005 Oct 10, 2026
7646998
[feat] explorer on the phone: long-press action sheet, rename selecti…
AlexZ005 Oct 10, 2026
291d8cb
[fix] image editor on a phone: a stacked sheet between the top bar an…
AlexZ005 Oct 10, 2026
2b36cb7
[fix] no more "ResizeObserver loop" crash toast on the phone (40 F5)
AlexZ005 Oct 10, 2026
8f59ee2
[test] explorer-header-panels: the phone shell's toolbar strip contra…
AlexZ005 Oct 10, 2026
37bab1a
[fix] image editor: Versions opens at its top; Crop brings Apply into…
AlexZ005 Oct 10, 2026
a2bc7d7
[fix] 40 F10 a header click over a tab group never merges; sharper F1…
AlexZ005 Oct 10, 2026
d61dc67
Merge feat/40-sheets into feat/40-int
AlexZ005 Oct 10, 2026
aec9e07
Merge feat/40-docks into feat/40-int
AlexZ005 Oct 10, 2026
4086e8e
Merge feat/40-render into feat/40-int
AlexZ005 Oct 10, 2026
5a67474
Merge feat/40-image into feat/40-int
AlexZ005 Oct 10, 2026
15892a8
Merge feat/40-aquarium into feat/40-int
AlexZ005 Oct 10, 2026
9de6d1f
[release] CHANGELOG 1.32.0 — Your 1.31 review, fixed (40-int)
AlexZ005 Oct 10, 2026
3e7e375
[fix] 40-int: the preview header's Edit image button joins the width …
AlexZ005 Oct 10, 2026
2b19eed
[test] 40-int: place-drag-cache §7 follows the 40 F3 long-press contr…
AlexZ005 Oct 10, 2026
924c59f
[test] 40-int: place-drag-cache §7 holds past HOLD_MS (450 ms since 4…
AlexZ005 Oct 10, 2026
324eb7b
[test] 40-int: re-record lock-search — four queries grow by exactly '…
AlexZ005 Oct 10, 2026
9671003
[fix] 40-int: a kit Sheet lifted above the phone bar never covers Pla…
AlexZ005 Oct 10, 2026
bcbd983
[fix] 40-int: no ResizeObserver loop when every docked view mounts on…
AlexZ005 Oct 10, 2026
71b5f79
[fix] 40-int: a lifted kit Sheet stacks under the phone bar (the rais…
AlexZ005 Oct 10, 2026
ad9a69a
[test] 40-int: dock-chrome-40 F9.1d (unique label for the phone Play …
AlexZ005 Oct 10, 2026
0811986
[test] 40-int: image-editor §11 reads the phone crop size once it has…
AlexZ005 Oct 10, 2026
d0383d9
[feat] 41-modals G3b: one z-index scale as tokens; modals cover the l…
AlexZ005 Oct 10, 2026
846a3c0
[feat] node editor: one-line breadcrumb bar with sibling dropdowns + …
AlexZ005 Oct 10, 2026
1abe3e4
[fix] 41 G23: toolbar order survives a reload (hydrate the default, t…
AlexZ005 Oct 11, 2026
71efb07
[feat] 41-modals G16: blocking and destructive questions are kit moda…
AlexZ005 Oct 11, 2026
4ab1b66
[feat] 41 G5: professional drawers — the nested-scroll hand-off in th…
AlexZ005 Oct 11, 2026
4b56097
[fix] 41 G3a + G20: a press outside closes the burger menu; nothing f…
AlexZ005 Oct 11, 2026
6e7a595
[feat] 41 G12: notes on a phone — a note is a page of the Notes sheet
AlexZ005 Oct 11, 2026
f0bab7d
[feat] 41-modals G19: settings rows reflow by their own width (contai…
AlexZ005 Oct 11, 2026
916a7a8
[feat] 41-modals G21: the Connect pill is a status dot, reconnecting …
AlexZ005 Oct 11, 2026
2de0191
[docs] 41-modals: CLAUDE.md z-index gotcha points at the one scale
AlexZ005 Oct 11, 2026
69a04ef
[feat] 41-character: customize character studio, fold-proof framing, …
AlexZ005 Oct 11, 2026
d009970
[test] 41-modals: fbInput pins the docked panel root by --z-dock (ren…
AlexZ005 Oct 11, 2026
32e7050
[test] 41 G12: notes-phone-drillin waits for its objects before addin…
AlexZ005 Oct 11, 2026
5a57a08
[test] 41-modals: settings-narrow takes THEME= for the light-theme sc…
AlexZ005 Oct 11, 2026
9ef6314
[fix] 41-modals G21: the connecting dot is amber in light too (--stat…
AlexZ005 Oct 11, 2026
93b117d
[feat] 41-windows G6+G7: tabbed floating windows drag by touch; drop …
AlexZ005 Oct 11, 2026
fb91047
[feat] 41-windows G24: the Image editor can be a bottom-dock tab
AlexZ005 Oct 11, 2026
d55b1c4
Merge remote-tracking branch 'origin/feat/41-modals' into feat/41-win…
AlexZ005 Oct 11, 2026
2ac0f74
[fix] 41-windows: dock caret + docked Image editor on the 41-modals z…
AlexZ005 Oct 11, 2026
a99845a
[fix] 41-windows: docked Image editor on --z-dock (the 41-modals scal…
AlexZ005 Oct 11, 2026
43fb21d
[revert] node editor: drop the "+ Add node" button (G22 is the dock "…
AlexZ005 Oct 11, 2026
09db2fe
[feat] 41 G12: the note card walks ALL notes from any entry point; op…
AlexZ005 Oct 11, 2026
4a4d41d
[feat] 41-select: creation never opens the Inspector, Inspect toggles…
AlexZ005 Oct 11, 2026
7910aa0
[feat] 41-select: a finger's tap on a selected object lets go of it (…
AlexZ005 Oct 11, 2026
40b8429
[feat] 41-select: Interact carries a body from where it was taken, fi…
AlexZ005 Oct 11, 2026
419fecd
Merge origin/feat/41-modals (the z-index scale) into feat/41-sheets
AlexZ005 Oct 11, 2026
96fcb69
[feat] 41-windows G22: the desktop dock "+" lists every window the ph…
AlexZ005 Oct 11, 2026
dc8887f
[fix] phone: the Explorer long-press menu stays open; docked windows …
AlexZ005 Oct 11, 2026
110f4f6
[feat] profiler: hideable recordings sidebar, a Details + Settings ri…
AlexZ005 Oct 11, 2026
8305144
[test] 41-character: avatar-customise 5.9 accepts a view-offset re-frame
AlexZ005 Oct 11, 2026
9e1006c
[test] 41: seed notes the notes-v2 way (addAnnotation opens a draft, …
AlexZ005 Oct 11, 2026
d9a6f73
[test] 41 G12: open the first visible note row (labels do not matter …
AlexZ005 Oct 11, 2026
4669ecb
[test] 41-modals: suites fit the runner — split settings-narrow (480 …
AlexZ005 Oct 11, 2026
ad3710d
[test] 41-windows dock-strip-drop 2.4: release beside the Controls pi…
AlexZ005 Oct 11, 2026
fb7a594
[test] 41-windows dock-chrome 11.2: the floating row's verb is the G2…
AlexZ005 Oct 11, 2026
5bf966b
[fix] 41 G20/G12: the selection strip rides above the phone note card…
AlexZ005 Oct 11, 2026
8f459e3
[test] phone-sidebars: the long press happens ABOVE the action sheet,…
AlexZ005 Oct 11, 2026
079ad45
[test] 41 G3a/G20: clear the transient quality toast on the unfolded/…
AlexZ005 Oct 11, 2026
c53e656
[test] 41-windows dock-tab-drag 7.1: move the re-floated window a cle…
AlexZ005 Oct 11, 2026
5d9efa4
[fix] 41 sheets on the 41-modals z-scale: the bar + strip rise over t…
AlexZ005 Oct 11, 2026
917f621
[test] 41-modals: mobile-map finds the copy-invite button as the pill…
AlexZ005 Oct 11, 2026
3cb1d0c
[feat] 41 G1: Edit positions for the toolbar + the round corner butto…
AlexZ005 Oct 11, 2026
c9349c6
Merge origin/feat/41-modals (z-index scale) into feat/41-controls
AlexZ005 Oct 11, 2026
2f17bb2
[chore] 41 G1: svelte-check warnings baseline 40 -> 39 (VoiceChat's o…
AlexZ005 Oct 11, 2026
d11ba9f
Merge remote-tracking branch 'origin/feat/41-modals' into feat/41-win…
AlexZ005 Oct 11, 2026
8fd4c79
Merge feat/41-select (#354) into feat/41-int
AlexZ005 Oct 11, 2026
5313bf4
Merge feat/41-character (#355) into feat/41-int
AlexZ005 Oct 11, 2026
b6fd7da
Merge feat/41-editors (#356) into feat/41-int
AlexZ005 Oct 11, 2026
905766e
Merge feat/41-modals (#357) into feat/41-int
AlexZ005 Oct 11, 2026
eee0825
Merge feat/41-sheets (#359) into feat/41-int
AlexZ005 Oct 11, 2026
7b013d3
Merge feat/41-windows (#358) into feat/41-int
AlexZ005 Oct 11, 2026
ad9d6eb
Merge feat/41-controls (#360) into feat/41-int
AlexZ005 Oct 11, 2026
f113c50
[test] 41-int: dock-chrome 10.1 + roadmap-13 A6 follow 41-modals' z s…
AlexZ005 Oct 11, 2026
5221100
[docs] CHANGELOG 1.32.0: the 41 section (your review of the 1.32 prev…
AlexZ005 Oct 11, 2026
f802aa8
[fix] 41-int: a press-and-hold pick-up keeps its touch from the sheet…
AlexZ005 Oct 11, 2026
62773b0
[test] 41-int: profiler-sidebars answers the restore MODAL after its …
AlexZ005 Oct 11, 2026
353dfea
[fix] 41-int: Frame all no longer reserves room for the old floating …
AlexZ005 Oct 11, 2026
367b230
[fix] 41b H3: the phone selection strip follows a drawer being resize…
AlexZ005 Oct 11, 2026
dd0bc63
[feat] 41b H4 + H11: the phone Connect chip says its state when there…
AlexZ005 Oct 11, 2026
d8aac42
[feat] 41b H6 + H7: phone Edit bar — More removable, Play movable, Pl…
AlexZ005 Oct 11, 2026
43606ec
[feat] 41b H15: the connected-peers panel is wide enough, and a drawe…
AlexZ005 Oct 11, 2026
437423c
[fix] 41b H12/H13: settings rows decide by real fit — compact control…
AlexZ005 Oct 11, 2026
d4176aa
[feat] 41b H14: the burger's PROJECT section — Compact grid + Save op…
AlexZ005 Oct 11, 2026
89a714c
[fix] minimalScroll: a scroller whose content shrinks clamps at once …
AlexZ005 Oct 11, 2026
1329a87
[feat] modules window: phone layout, independent install jobs, Core o…
AlexZ005 Oct 11, 2026
9498886
[feat] 41b H1+H5: phone content panels are dock tabs; the bar toggles…
AlexZ005 Oct 11, 2026
849ae9a
[feat] 41b H2: burger > Configure Scene closes the burger on the phon…
AlexZ005 Oct 11, 2026
7401323
[test] 41b: phone-dock-tabs (H1 H2 H5, folded / unfolded / desktop)
AlexZ005 Oct 11, 2026
dc017f0
Merge feat/41b-modules into feat/41-int (round 2)
AlexZ005 Oct 11, 2026
9487cd1
Merge feat/41b-settings into feat/41-int (round 2)
AlexZ005 Oct 11, 2026
6ed1376
Merge feat/41b-bar into feat/41-int (round 2)
AlexZ005 Oct 11, 2026
c7d0ce6
Merge feat/41b-docks into feat/41-int (round 2)
AlexZ005 Oct 11, 2026
344d19d
[test] 41b-int: strip-follow drives Chat as its framed sheet; ratchet…
AlexZ005 Oct 11, 2026
a3be22d
[docs] CHANGELOG 1.32.0: round 2 of the 1.32 preview review (41b H1-H15)
AlexZ005 Oct 11, 2026
ab66862
[test] 41b-int: lock fixtures follow round 2 — 'Project actions' (H14…
AlexZ005 Oct 11, 2026
8a26e5a
[test] 41b-int: modules-phone-jobs skips its /src primitive probe on …
AlexZ005 Oct 11, 2026
6ff5e32
[fix] 41b-int: GLTF tooltips say it exports the selection (nothing se…
AlexZ005 Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ jobs:
# `tokens-ok: <reason>` on its line; scripts/check-tokens.cjs says how.
- name: redesign tokens
run: node scripts/check-tokens.cjs
# 41 G3b: ONE z-index scale (src/styles/ui.css). A page-level literal z-index fails;
# `z-ok: <reason>` on its line for a number code reads back.
- name: z-index scale
run: node scripts/check-zindex.cjs

# 34 B3: scene-lint over every scene core ships (the seed) and every scene of the scenes ref
# the perf budget is about (perf/budgets.json), with the packs checkout for the kit rules.
Expand Down
108 changes: 108 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,114 @@
per release, newest first. HTML comments like this one are stripped before
rendering, so maintainer notes stay out of the user-facing window. -->

## 1.32.0 — Your 1.31 review, fixed: sheets that swipe away, tidy docks and a reef that swims 🐠

Everything you flagged in 1.31 and in the 1.32 preview, fixed — plus an Image editor and a real reef in the Aquarium.

### 📱 On a phone

- 👆 **Every sheet has one grab bar**: menus, the Inspector, Configure Scene, Add, the Explorer and every docked window,
the profile menu, notes and Customize character. Drag the bar to resize (each sheet remembers its height), swipe it
down to the bottom to close. The bar never scrolls away, and no sheet covers **Play** or the selection toolbar.
- 👤 **Customize character and Profile settings open again** from the profile menu.
- 🗂️ **Explorer: press and hold a file or folder** for its action sheet — no more browser image callout; hold and move
to pick it up. The rename field's selected text is readable, and the toolbar scrolls sideways so the project name
is always reachable.
- ➕ **The dock's "+" lists every window** with a show/hide switch.
- 🛠️ Fixed a "Something went wrong: ResizeObserver loop" message with the Explorer docked.

### 🪟 Docked and floating windows

- ✖️ **Close a docked window from its tab** — the window itself has no ✕ any more. **Undock** moves to the dock strip,
left of *Minimize the dock*, and undocks the window you are looking at (**Settings ▸ Interface ▸ Windows & chrome ▸
Undock button** → *All as one tabbed group* takes them all out together).
- 📥 **A floating tab group has a "Dock all tabs" button**, and **dropping a docked tab onto a floating window adds it as
a tab** instead of opening another window. Tab groups no longer lose their header after switching tabs.
- 🏷️ **Long object and file names stay on one line** with "…" (hover or press and hold for the full name) and never
push a window's controls out of place.
- 🧭 The dock's tab strip stays painted behind every tab and **keeps its scroll** when you pick a tab.
- 🗔 **Workspace layouts** is a proper dialog on desktop and phone.

### 🖼️ Images

- 📷 **A big photo becomes a texture** instead of being refused — it is scaled to 1024 px.
- ✂️ **New Image editor** (Explorer ▸ Edit image…, the preview's pencil, or Edit beside a texture): crop, rotate, flip,
resize, brightness / contrast / saturation, **Save** or **Save as copy**, and a version history with **Restore
original**. Saving updates every texture made from the image, for everyone in the session.

### 🌊 Smoother, and honest about it

- 💧 **Water refraction (and every other automatic quality setting) no longer switches off and on by itself** on phones:
a setting that had to be lowered again right after coming back stays lowered for that scene.
- 🔔 **One notice when quality is lowered for you** — *"Lowered water quality to keep it smooth · Keep full quality"* —
replacing the "Simplified water" strip and the object list's quality toast.

### 🐠 The Aquarium is a reef

- 🐟 **Templates ▸ Examples ▸ Aquarium**: clownfish, regal blue tangs and emperor angelfish swim around a reef arch,
staghorn coral, eelgrass and Amazon swords from the new **Aquarium Kit** pack. Simple stand-ins show at once and turn
into the real fish as they download.
- 🧭 **Four new motion nodes for anything** (node editor ▸ Animation): **Follow Path** (speed, loop / ping-pong,
banking), **Wander**, **Orient to Velocity** and **Body Wave** — a wave travelling along a fish, snake, flag or tail.
- ✨ **Fish scales material preset**: an iridescent thin film over a scale relief, drawn lighter on phones and headsets.
- 🛠️ Fixed: LOD groups stuck on their first level in scenes with water.

### 🔁 …and your review of the 1.32 preview

- 🎛️ **Toolbar ▸ Edit positions** (right-click or press and hold any toolbar button): drag the toolbar and corner
buttons into place, remove one with the red **−**, add one with the green **+** (up to three in each corner, Play
always stays), then the green **✓** applies. A custom button order no longer shows the wrong icons after a reload.
- ✋ **Selection toolbar**: **Inspect** is an icon that opens *and closes* the properties, and only looks pressed when
they are open; **Select multiple** and **Interact** sit after Scale. Interact clears the selection and gives it back
when you leave it. On touch, **tap a selected object to deselect it**. Adding an object no longer opens the
properties (an open panel follows the new object).
- 🫳 **Carrying things in Interact** follows your finger or cursor from the point you grabbed — no more objects
flung at the camera — and lets go with a gentle throw.
- 📱 **Phone drawers behave like a phone's sheets**: lists scroll, and at the top of the list a pull down (or a
flick) closes the drawer, with resistance and snap points. The main menu closes when you press outside it, the
selection toolbar no longer floats over menus or drawers, and an open note steps through **all** notes (‹ ›) and
returns to where you opened it.
- 🪟 **Tabbed floating windows drag smoothly by touch** (tab names too); press and hold a tab for **Ungroup / Dock /
Close**. On desktop, **drop a window or tab onto the dock's tab bar** to dock it exactly where the marker shows. The
dock's **+** lists every window — **Node editor** and **Image editor** included — and the Image editor can be a
dock tab.
- 🧑‍🎨 **Customize character opens a studio** around your character (**Show in scene** previews it in the world),
keeps it fully framed when you fold or unfold the phone, and **Surprise me** deals a new look on every press;
presets show their defaults and your edits become a **Custom** entry.
- 🪜 **Dialogs cover the whole screen** (the logo included) and What's new sits above every button. Questions about
deleting, restoring or replacing things are **dialogs** instead of toasts (*Delete flow*, *Restore previous
session?*, …). **Settings rows fit their window**: a switch, a short
list, a colour, a button or a small set of choices stays beside its label, and only what cannot fit (wide choices,
text fields) moves underneath — on a phone, an unfolded phone and a narrow desktop window alike.
- 🟢 **The connection pill shows a coloured dot** (grey, pulsing yellow, green, red) and says **Connecting… /
Connected / Offline** beside it whenever there is room; when the top bar is crowded it shrinks to the dot alone —
and **reconnecting after switching tabs no longer toasts**. Only a connection that gives up leaves one notification.
- 👥 **The connected-people panel is wider**: one row per person (name, then where they are underneath, actions on the
right), nothing wraps or breaks; on a phone it is a drawer like the notifications.
- 🧩 **Node editor**: a one-line breadcrumb bar — tap a crumb to jump to its siblings, hold for the full name.
- 📈 **Profiler**: hideable sidebars, a **Details** + **Settings** sidebar on the right and a resizable split between
the graph and the list.
- 🗂️ On a phone the Explorer's press-and-hold menu stays open, and docked windows open with their sidebars hidden
until you show them.
- 📱 **On a phone, Properties, Objects, Notes, Layouts and Configure Scene are tabs of the bottom dock** (beside the
Explorer and the Node editor) instead of drawers behind it: **Inspect** brings Properties to the front, nothing
covers the Play button, and when you unfold the phone or switch to a desktop each panel goes back to its sidebar or
window — and returns when you fold it again. Menus, notifications, your profile and Add stay drawers. Tapping the
bottom-bar button of the view on screen minimizes it (with undocking on, it shows and hides that floating window),
and the main menu closes as Configure Scene opens on a phone (on a desktop it stays open).
- 🎮 **Phone bottom bar**: **More** can be taken off the bar (a one-time note tells you to press and hold any bar item
to get it back), the press-and-hold menu's header reads **More ▸ Edit bar…** and opens More, and **Play can move**
along the bar. Play starts as plain **Play**, like on a desktop; pick VR or AR from its press-and-hold menu and its
icon follows. The selection toolbar now follows a drawer as you resize it, without lagging behind, and the profile
drawer no longer repeats your picture.
- 📂 **Main menu ▸ Project** has a compact two-column layout — **New from template…**, **Load** | **Save ▾**,
**Import** | **Export…** — where **▾** opens one **Save options** dialog with every save setting. A phone keeps the
list; **Settings ▸ Interface ▸ Project actions** switches between Auto, Compact and List.
- 🧩 **Modules on a phone**: Enable/Download/Remove sit to the right of each module, a long description expands when
you tap it (tap again to fold it), and the dev-URL row fits the screen. In Browse, **Install** several modules at
once: each card keeps **Installing…** until it is done, none cancels another, and a failed one says why with
**Retry**. Core no longer opens on a long empty scrollbar after a long Browse list.

## 1.31.0 — Drag to place: see the size and the spot before you let go 📦

Drag any object from the Explorer onto the scene and see exactly where it will land and how big it is — the way a
Expand Down
19 changes: 11 additions & 8 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4611,14 +4611,17 @@ loadable play content. Everything a user does must be visible to connected peers
- The camera PiP frame deliberately sits BELOW the tiers (z-index 2): it is a
viewport overlay whose picture is drawn by the render loop, so panels and HUD must
cover it (16-Q6).
- **z-index tiers** (`ui.css` `:root`): viewport 0 · drawer 30 · bottom 35 · window 40 ·
hud 45 · **modal 1100 · toast 1200 · menu 1300**. The high modal/toast/menu values
clear the ad-hoc persistent chrome that lives OUTSIDE the scale — Users (avatar/peers)
~996-998, Connect 300, ContextMenu 999-1001, ThemedSelect 9999. flowbite Modal
hardcodes its dialog z-50 + backdrop z-40, remapped onto `--z-modal` by an UNLAYERED
`[role='dialog'][aria-modal='true']` rule (unlayered beats Tailwind's layered utility
without !important). The logo/burger menu sits at `--z-menu` (top-most); opening a
modal from it calls `closeMenu.set(true)` so the menu can't cover the modal.
- **z-index: ONE SCALE (41 G3b), `ui.css` `:root`, lowest first** — `--z-canvas` 0 · `--z-canvas-overlay` 2 ·
`--z-chrome` 30 (FABs, Controls pill, side drawers) · `--z-selection` 32 (phone strip, under every sheet) ·
`--z-dock` 35 · `--z-sheet` 38 · `--z-window` 40..44 · `--z-phone-bar` 44 · `--z-hud` 45 · `--z-side-panel` 50 ·
`--z-chrome-top` 300 (logo, undo/redo, Connect, the top-right corner) · `--z-popover` 1000 (main menu, profile,
Add, search) · `--z-toast-low` 1050 · `--z-modal` 1100 · `--z-onboarding` 1150 (What's new, Welcome, tours) ·
`--z-portal` 1180 (selects, context menus, drag ghosts — above the modals that open them) · `--z-toast` 1200
(approvals). Modals COVER the logo (the old logo-above-modals one-click trick is gone). Use `var(--z-…)` /
`z-(--z-…)` or `calc(var(--z-…) ± n)`; `npm run check:zindex` (CI) fails a page-level literal ≥ 30, a
number code reads back carries `// z-ok: <reason>`. Old names (`--z-drawer/-bottom/-viewport/-menu`) are
aliases. The camera PiP is `--z-canvas-overlay`. App modals are non-modal `<dialog>`s on `--z-modal`;
`ConfirmModal`/`SessionPrompts` are true modals (top layer).
- **flowbite 1.x Dropdowns are TOP-LAYER popovers** (`popover="manual"`, `:popover-open`)
— they paint above the ENTIRE page whatever the z-index (measured: a panel at 996
covered the profile avatar at 2000, in the same stacking context). No z-index on an
Expand Down
6 changes: 3 additions & 3 deletions check-baseline.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"comment": "27-I: the svelte-check floor, read ONLY by scripts/check-ratchet.cjs. It used to be hardcoded in release.yml's shell block, where it went stale (362 while the tree measured 359). Ratchet it DOWN whenever a change legitimately removes errors - that is the project convention, and --update does it in one command.",
"errors": 300,
"warnings": 41,
"measured": "2026-10-07"
"errors": 299,
"warnings": 39,
"measured": "2026-10-11"
}
3 changes: 2 additions & 1 deletion docs/settings-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ The sticky footer with three big buttons is removed.
| 19 | Windows & chrome | Window positions | btn "Reset" | — | `resetWindowLayout()` | | btn "Reset" | |
| 20 | Windows & chrome | Touch tools | toggle | D | `touchTools` → `touchTools` | | toggle | |
| 21 | Windows & chrome | Allow undocking (touch) | toggle | D | `mobileUndockAllowed` → `mobileUndockAllowed` | Allow undocking on touch screens | toggle | |
| 21b | Lists & menus | **NEW** (41b H14) | — | D | `projectActions` → `ui:projectActions` (absent = Auto) | Project actions | segmented Auto / Compact / List | badge *This device*. The burger menu's PROJECT section: Compact = a two-column grid (New from template… / Load · Save ▾ / Import · Export…), List = the 1.32 rows; Auto = List on the phone shell, Compact elsewhere. Keywords: burger, main menu, compact grid. |
| 22 | Lists & menus | Advanced mode | check | D | `advancedMode` → `advancedMode` | Show system objects in the object list | **toggle** | old label kept as a keyword |
| 23 | Lists & menus | Environment in list | check | D | `showEnvInList` → `showEnvInList` | Show the environment in the object list | **toggle** | |
| 24 | Lists & menus | Object search in menu | check | D | `objectSearchEnabled` → `objectSearchEnabled` | Object search in the right-click menu | **toggle** | |
Expand Down Expand Up @@ -406,7 +407,7 @@ behind a store's back.

| Category | Keys (localStorage, via safeStorage) |
|---|---|
| Interface | `allowTextSelection` `avatars:peersClassic` `theme` `customThemes`* `game:soundVolume` `game:musicVolume` `showWelcomeOnStart` `showWhatsNewNotice` `toastsInDrawerOnly` `toursAutoStart` `xrOfferSession` `showRoomsButton` `floatingToolbar` `toolbarOnTop` `touchTools` `mobileUndockAllowed` `advancedMode` `showEnvInList` `objectSearchEnabled` `perfStats:show` `perfReports:send` `viewPrefs.dockPushesViewport` `ui:density` (NEW) |
| Interface | `allowTextSelection` `avatars:peersClassic` `theme` `customThemes`* `game:soundVolume` `game:musicVolume` `showWelcomeOnStart` `showWhatsNewNotice` `toastsInDrawerOnly` `toursAutoStart` `xrOfferSession` `showRoomsButton` `floatingToolbar` `toolbarOnTop` `touchTools` `mobileUndockAllowed` `advancedMode` `showEnvInList` `objectSearchEnabled` `perfStats:show` `perfReports:send` `viewPrefs.dockPushesViewport` `ui:density` (NEW) `ui:projectActions` (NEW, 41b) |
| Controls | `enableShiftAdd` `helpersInPlay` `noteDoubleClickToOpen` `trackpadMode` `trackpadPanEnabled` `trackpadReversePan` `trackpadPinchZoom` `allowBrowserZoom` |
| Input | `gamepadPrefs` `flow:mouseBindings` `flow:opens` |
| Touch controls | `touchControlsPrefs` `touchLookSpeed` `touchControlsTextures` `touchControlsLayouts` |
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"sync-llms": "node scripts/sync-llms.cjs",
"test:unit": "vitest run",
"check:storage": "node scripts/check-storage.cjs",
"check:tokens": "node scripts/check-tokens.cjs"
"check:tokens": "node scripts/check-tokens.cjs",
"check:zindex": "node scripts/check-zindex.cjs"
},
"devDependencies": {
"@sveltejs/adapter-static": "^3.0.10",
Expand Down
Loading
Loading