Repository navigation
Lazurio shell slot: rail, column head and Buddy from /.lazurio/shell.js (#16) - #20
Conversation
The overlay places the Lazurio shell that the Environment's Launchpad serves at /.lazurio/shell.js (LazurioPlatform F36). index.html loads it with a vite-ignore module tag, puts <lazurio-rail> before #root and <lazurio-buddy> after it, and pads #root by --lazurio-rail-width (padding, not margin, because #root is full width under an overflow-hidden body). The sidebar renders <lazurio-column-head active="automate"> as the first child of its top bar, above upstream's own top row, which keeps all its controls: upstream's look and brand stay (root decision 0179 point 6). Outside Lazurio the script is absent, the elements stay undefined and the rail's width is 0, so the app behaves as upstream. Both files join allowed_upstream_changes under one reason, and the release contract test checks the slot so that a rebuild on a new upstream tag cannot lose it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agentrozjedemeai
left a comment
There was a problem hiding this comment.
Exact-head QA: 3890944. APPROVED for review, not for merging while its #19 dependency remains a candidate. The five-file change leaves the shell in the Platform: index.html adds the same-origin unbundled module loader, rail before #root, Buddy after it and padding; Sidebar.tsx puts the column head first in GlassBar, above the unchanged upstream top row. The two paths are allowlisted and the contract pins placement. Local contract tests passed 7/7 and the exact-head CI overlay, archive and all four vitest shards are green. The supplied Chrome visual proof was not independently repeated in this review; that is not a code defect. After the Admin replaces main for #19, retarget #20 and re-check the new exact-head gates before merge. No merge or release performed.
The base branch was changed.
Status: ready for review. Stacked on #19 (rebuild on v0.1.95); retarget to
mainonce the Admin has replacedmainwith #19's head.Closes #16.
Why
Chat, Apps and Automate share one Lazurio shell: the rail of spaces and Environments on the left, and at the top of each app's own left column the Environment picker, the Settings gear and the switch Chat · Apps · Automate. Buddy's bubble comes later. The shell is one library in LazurioPlatform (decision F36), served by the Environment's Launchpad at
/.lazurio/shell.json every origin of the Environment. The fork only places the elements and fetches no data, so a new rail, picker or data source never needs a release of this fork.What changes (two upstream files)
index.html:<script type="module" src="/.lazurio/shell.js" vite-ignore>. Vite leaves the tag as it is; checked withvite build.<lazurio-rail>before#rootand<lazurio-buddy>after it.#root { box-sizing: border-box; padding-left: var(--lazurio-rail-width, 0px); }. This is padding, not margin, because#rootis full width under an overflow-hidden body.src/components/Sidebar.tsx:createElement("lazurio-column-head", { active: "automate" })as the first child of the sidebar's top bar, above upstream's own top row. Upstream's controls, look and brand stay, per root decision 0179 point 6 and the placement clarified for Lazurio shell slot: load /.lazurio/shell.js and place the rail, the app switch and Buddy (upstream look stays) #16 on 2026-10-04 ("above the brand row, not instead of it").allowed_upstream_changeslists both files under one reason.LAZURIO.md"The Lazurio shell" describes the slot as built.What does not change
/.lazurio/shell.js(MausBot's SPA fallback answers HTML and the browser refuses it as a module). The elements stay undefined, the rail width is 0 and MausBot behaves as upstream.Depends on
GET /.lazurio/*from themausbot.origin to the Launchpad (PR in preparation). Until then the script 404s on hosted Environments and nothing renders.Verification
node --test scripts/lazurio-release-contract.node-test.mjs: 7/7 pass.pnpm typecheckandpnpm lint: ok.vitest run src/components/Sidebar*: 19 files, 257 tests pass./.lazurio/shell.jsthat draws a 64 px rail and a 96 px column head.#rootis padded by 64 px, the sidebar starts at x=64, the column head sits at the top of the sidebar above the upstream top row, and the document width stays 1440, so there is no overflow.Risks
Low. A missing script costs only a console error. The upstream sidebar keeps its own layout; the column head adds height to its top bar.
🤖 Generated with Claude Code