Skip to content

Lazurio shell slot: rail, column head and Buddy from /.lazurio/shell.js (#16) - #20

Merged
immakermatty merged 1 commit into
mainfrom
lazurio/shell-slot
Oct 4, 2026
Merged

immakermatty merged 1 commit into
mainfrom
lazurio/shell-slot

Conversation

@immakermatty

Copy link
Copy Markdown

Status: ready for review. Stacked on #19 (rebuild on v0.1.95); retarget to main once the Admin has replaced main with #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.js on 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 with vite build.
    • <lazurio-rail> before #root and <lazurio-buddy> after it.
    • #root { box-sizing: border-box; padding-left: var(--lazurio-rail-width, 0px); }. This is padding, not margin, because #root is 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_changes lists both files under one reason.
  • The release contract test checks the slot (loader, rail, padding, Buddy, and the column head first in the top bar, exactly once), so a rebuild on a new upstream tag that loses it fails CI.
  • LAZURIO.md "The Lazurio shell" describes the slot as built.

What does not change

  • Outside Lazurio there is no /.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.
  • No router, state or data changes, and no recolouring or renaming.
  • The picker's dropdown must render in the top layer (Popover API or fixed position from the shadow root) so the sidebar's overflow cannot clip it. That belongs to the shell library, not this fork.

Depends on

  • HumanAndMachine-ai/Machines: the gateway proxies GET /.lazurio/* from the mausbot. origin to the Launchpad (PR in preparation). Until then the script 404s on hosted Environments and nothing renders.
  • LazurioPlatform: the reworked shell (second wireframe iteration) in the next prerelease.

Verification

  • node --test scripts/lazurio-release-contract.node-test.mjs: 7/7 pass.
  • pnpm typecheck and pnpm lint: ok.
  • vitest run src/components/Sidebar*: 19 files, 257 tests pass.
  • Visual layout check: a local MausBot server (isolated HOME) serving this build with a stub /.lazurio/shell.js that draws a 64 px rail and a 96 px column head.
    • At 1440×900 #root is 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.
    • At 390×844 the rail stays visible beside the app. How the shell collapses on a phone is an open point of the shell, not this fork.
    • Screenshots are kept locally, not attached.

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

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 agentrozjedemeai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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.

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.

Lazurio shell slot: load /.lazurio/shell.js and place the rail, the app switch and Buddy (upstream look stays)

2 participants