Release planning

CadCraft 1.0 impact map

Every fix and feature lined up for 1.0, and what each one touches: which apps, and which layers of the stack.

ProjectCadCraft
Sheet0.10 impact
Items110
Date2026-11-09
51Fix
22Feature
0Spike
28Platform
0Site ops
8Sanity check
1Decision
≈ 319days in the written 0.10 plans
  • Planned 101 on the plan for the release it is filed under
  • Built 0 built and working in /lab (the dev builds). Whether the public has it is its reach: "in the lab", "Live" (the last gate) or "switched off"; see docs/REACH-LIVE.md
  • Partly built 1 part of it is built in /lab; the rest waits (see "Waits on")
  • Promised 0 the live site already says it is coming
  • Moved 0 moved here from an earlier release or wishlist
  • Found 0 bug found after a release shipped; fixed in a point release or the next one
  • Candidate 3 recommended in a spike or session log; owner to choose
  • Community please test 0 built and in /use; a Discord post gives the steps and the expected result and asks people to try it on their own devices, files or know-how
  • Decision Time 5 a decision, check, file, key, flag or go only you can give; folds into the list once answered

Built means built and working in the lab. Live means the public can use it, and is the last gate: 0 Built · Live, 0 Built · in the lab.

Sheet 1 · impact areas

Where 0.10 lands

How many items touch each app and each layer, by kind. One item can touch several areas, so the rows add up to more than the item count. Pick a row to filter the schedule below.

Impact areaFixFeatureSpikePlatformSite opsSanity checkDecisionAll
Apps
CadCraft 20 17 – 10 – 3 1 51
BimCraft 18 20 – 9 – 4 1 52
ModelCraft 19 20 – 10 – 3 1 53
MarkupCraft 12 16 – 9 – 3 1 41
TakeoffCraft 14 16 – 9 – 3 1 43
CivilCraft 21 18 – 10 – 4 1 54
DetailCraft 15 17 – 9 – 4 1 46
PartCraft 15 17 – 9 – 3 1 45
Studio – 1 – – – – – 1
SuperCad Studio – 6 – 6 – 1 1 14
Layers
Site and services 13 3 – 8 – 1 – 25
Desktop host – 1 – 1 – – – 2
App shell 5 15 – 8 – 2 1 31
App code 23 4 – 3 – – – 30
Our engines 8 – – 1 – 1 – 10
Vendor engines – – – – – – – 0
Drawing surface 3 – – – – – – 3
Help and words 2 1 – – – 1 – 4
Tests and tooling 2 1 – 2 – 3 – 8

Sheet 2 · schedule

Every fix and feature

Grouped by track. App chips carry each app’s layer colour; Studio is in ink. "Waits on" names what has to happen first; the small lines under it say who asked and where the item is written up.

Add an item Fork map (Rust and C++ forks) The roadmap

Issues sync every 10 minutes; last sync Nov 9, 2026 7:00 pm.

ItemWhatAppsLayersStatusDaysWaits onIssues
Performance roadmap — wave 3 60
FixPERF.24 Link to PERF.24Comment on PERF.24 Scale: autosave rewrites the whole document every couple of seconds of editing, in every app (extends PERF.5)

Measured and read: CadCraft autosave writes a full DWG (dwg-autosave.js:39 saveDwg; 4.8 s today, 66 s at 10x), BimCraft the full IFC bytes (bimcraft.js:585 to model.js save), MarkupCraft the whole PDF Blob (markupcraft.js:4715; TakeoffCraft stops at 64 MB, takeoffcraft.js:4313), ModelCraft the JSON (modelcraft.js:3883). On a big file autosave is the longest task the person sees while working. Change: journal autosave, keeping the opened file's bytes or handle plus the edits map (IfcFile already holds exactly that in memory), snapshots taken in a worker from transferred buffers, and a clear cap with a message above a size. Shared piece in the shell's app-autosave.js, one snapshot function per app.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shellApp code Planned 4 – docs/0.9-sessions/perf-wave3/
FixPERF.52 Link to PERF.52Comment on PERF.52 Apps: the add-on loader is serial and imports every add-on's help at activation: 13 add-ons on = 235 requests, 3.0 MB, 2.5 s of steps

addons.js (the shell copy synced into every build) awaits each bundled addon.json in turn (:390-396; 13 in CadCraft, default-off ones too), activates one after another (:381) and imports each add-on's help module at activation (:572-589; Electrical's 58 KB every start). Measured with 13 add-ons on (tools/perf/addons-load.mjs): 235 requests, 3.0 MB, 2,552 ms of serial steps, longest step 382 ms; in parallel the same work is about 0.4 s. Baseline CadCraft with nothing on: 13 serial addon.json round trips, about 0.9 s on a real line. Change: put every bundled manifest into addons/index.json at release time (one request) or Promise.all the discovery, import all entries in parallel and activate() in index order, import help lazily from api.help on F1.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 3 – docs/0.9-sessions/perf-wave3/
PlatformPERF.53 Link to PERF.53Comment on PERF.53 Apps: 29.6 MB of byte-identical files under different URLs across the eight releases, and every new release re-downloads 98 % unchanged files

tools/perf/addons-shared.mjs hashed every file of the eight current releases: 665 distinct contents under 2,163 URLs, 29.6 MB extra on the wire for a person who opens more than one app (cabinetcraft add-on in four apps 5.8 MB, dwg/ 3.0 MB, ifc schemas in four apps 2.3 MB, regs in four 2.3 MB, m3d 1.3 MB, crs-db.json 914 KB three times, host.js / addons.js / libitem.js eight times). Across releases: CadCraft 0.8.1 → 0.8.2 kept 2,084 of 2,127 files byte-identical (158 MB) and every one is re-downloaded under the new version URL; the same for every app and every "Save for offline" re-save (PERF.15). Vendor libraries are fine (one URL each, pinCurrent works). Change: a shared /assets/lib/<name>/<content-hash>/ URL for lib/* copies and shared add-ons (release-app.php pins it like vendor paths; the import map aliases ./dwg/x.js to it), or content-hashed file names so an unchanged file keeps its URL across releases. Both shrink the import map, which lists every file because ?v= busting needs an entry per module (499 entries / 48 KB in CadCraft, 772 / 78 KB in BimCraft per page view; AppBuilds.php:391-397).

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Site and servicesApp shell Planned 8 – docs/0.9-sessions/perf-wave3/
FixPERF.55 Link to PERF.55Comment on PERF.55 Apps: 84 to 95 % of the language keys shipped on an app page are never read; split the catalog by namespace (extends PERF.2)

Instrumented t() on the current releases: CadCraft ships 8,818 keys / 529 KB in #cc-lang, 442 are read by the end of idle and 1,024 after a first command; 70 namespaces (198 KB) are never touched in the first minute (frame 32 KB, m3d 29 KB …); BimCraft 117 namespaces / 300 KB untouched; PartCraft's script namespace 1,140 keys / 73 KB with 13 read; the shell's 1,515 keys / 82 KB with about 300 read in every app. Parsing is cheap (5 to 11 ms); the bytes are the cost, 400 to 500 KB of every page view. Change: split the catalog by namespace at build time (tools/lang), inline shell plus the entry's namespaces, load a namespace on the first t() miss or together with the module that owns it (the dynamic-import row gives the boundary); Lang::merged() key prefix is the split key.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Help and wordsApp shell Planned 3 – docs/0.9-sessions/perf-wave3/
FixPERF.56 Link to PERF.56Comment on PERF.56 Apps: the shell costs 154 to 257 ms of main thread per start, and three document-wide MutationObservers fire 100+ times a second while drawing

Measured per app: app-phone.js 17 to 56 ms running the phone layout on a desktop viewport; app-boot.js 10 to 73 ms with a body-subtree MutationObserver whose say() rewrites the DOM on every mutation (app-boot.js:82-83) and never settles while the pointer moves (141 to 221 boot-step rewrites in 3 s of drawing); three observers cascade (app-shell.js:477-482, app-phone.js:421 and :483; CadCraft 360 observer callbacks in 3 s of drawing); app-settings.js 15 to 65 ms; app-devices-ui.js 26 ms. Shell bytes: 1.35 MB fetched, about 780 KB never run (app-addons-account.js 59 KB when signed out, calc.js, ai-*.js, app-devices-ui.js, app-propgrid.js). Change: app-phone returns after the matchMedia check on wide pointer-fine screens and attaches its observers only when cc-phone is on; app-boot ignores mutations inside output-like elements and disconnects on settle; app-shell observes dialog additions only (or an attributeFilter without childList on the whole tree); dynamic-import addons-account, calc, ai-*, devices-ui on first use.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 3 – docs/0.9-sessions/perf-wave3/
PlatformPERF.58 Link to PERF.58Comment on PERF.58 Apps: an installed add-on package is relinked from blob modules on every start (hvac 334 ms, plant 756 ms) and ships as base64 JSON

addons.js linkPackage turns each verified package into blob: module URLs every start: hvac 0.9.0 (193 files, 1.8 MB; 2.4 MB as base64 JSON) costs 334 ms per start (link 115, import 55, verify 6); plant 756 ms (import 447). The Ed25519 plus sha256 check is cheap (6 to 11 ms for 100 to 193 files); blob modules get no HTTP cache and no V8 code cache, so the cost repeats on every visit and grows with file count. Change: keep the signature check but serve verified packages from the service worker under a stable /addons/pkg/<sha>/<path> scope (or cache the linked texts and import() a persistent URL) so modules get code caching; stop base64 in the package JSON (binary zip, about 34 % smaller). AddonPackages.php, addons.js, sw.js.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shellSite and services Planned 3 – docs/0.9-sessions/perf-wave3/
PlatformPERF.59 Link to PERF.59Comment on PERF.59 Apps: no service worker until someone clicks "Save for offline"; every repeat visit is a cold start minus the 7-day HTTP cache

app-offline.js:160 registers /sw.js only on the click, and sw.js:46 installs nothing on its own; the PWA manifest promises more than the page delivers. Every visit refetches the 830 to 940 KB app page (PERF.2, PERF.3) and relies on the HTTP cache for the 300 to 500 module files (which Vary: Referer defeats, see the server rows). Change: register /sw.js on every /use page; cache-first for immutable URLs (?v= and pinned vendor/app folders: the worker already knows the rule, sw.js:33-40), stale-while-revalidate for the page; "Save for offline" stays the explicit full copy. Pairs with the shared-URL row (a shared lib URL is cached once for all apps) and the installed-package row.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 3 – docs/0.9-sessions/perf-wave3/
FixPERF.74 Link to PERF.74Comment on PERF.74 Code: shared utilities written hundreds of times: vector math 2,088 implementations, csv cell 431, point-in-polygon 243, esc 198, uid 188, download 163

tools/perf/quality-utils.mjs counted 6,943 implementations of 24 utility names (21,260 lines): vector math 2,088 (516 distinct bodies in 1,094 files), area 299, point-in-polygon 243 (identical clusters of 17, 12, 9, 8 and 6), bbox 190, lerp 69, clamp 68; text and bytes: esc 198, uid 188, download/saveBlob 163, csv cell 431, base64 59. The shell exports none of these; lib/units is the one shared table that is used everywhere. Change: lib/geom2d (vec, bbox, area, point-in-polygon, lerp, clamp) and a shell util.js (esc, uid, download, csv, base64) synced into the builds like host.js; mechanical replacement guided by the cluster list, with the quality scripts kept as the check so the count only goes down. Also shell-mount.js (a 48-line block identical in seven apps) and ui-util.js (eight variants of one 45 to 76 line file) become synced shell files, and the Studio Live stateCore plus diff and invert hand-copied in three apps and joinFromPage in six become a shell live-state.js.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App codeApp shell Planned 6 – docs/0.9-sessions/perf-wave3/
Interface roadmap — wave 1 26
PlatformUI.1 Link to UI.1Comment on UI.1 Interface pattern: one slot system every layout maps onto, written down, with a reference mockup

Owner 2026-11-09: our layout efforts do not feel "strong and stable and consistent"; main menu bars, ribbons, panels and footer bars from every mainstream interface must fit one patterned system cleanly. What exists: the layout engine (assets/js/app-workspace.js, 1,050 lines) with 15 block kinds over 12 fixed places (app-workspace-format.js PLACES: top, bottom, left-panel, right-panel, stage-top/bottom/left/right, view-top/bottom, float, none) and six built-in layouts (docked, toolbox, autorev, duncan, vector, sketch), each a data file. The pattern is real but was never drawn or written as a rule book, so each new layout (Duncan, Vector, Sketch) added its own block and its own CSS section. This row: (1) the mockup made today, pattern.html: the slot map, the seven layouts (the six plus the Drafting layout of UI.12) drawn on the same slots, the block families (menu bars, ribbons and tool rows, palettes and panels, bars, overlays, windows) and the consistency rules; (2) a spec docs/INTERFACE-PATTERN.md from it: the places (adding view-corner overlays, UI.10, and windows, UI.2/UI.3), what each family may do in each place, the one tear-off, one "…" menu, one pressed/disabled/hover state, one dialog baseline, one icon set, one keyboard contract, one storage key family; (3) the conformance test (bin/test-app-workspaces.mjs, 12 contract points) gains a point per rule, so every layout in every app is held to the same pattern from then on. Every later row in this wave builds inside this spec; a new block that does not fit it is refused. Owner addition the same day (see UI.21): the pattern is zones and dockable units, a ribbon being tool units docked along the top of the canvas and a palette the same unit docked at a side, the way panels dock, group and collapse in image editors; the mockup and spec state it that way.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Partly built 2 Owner look at the mockup (docs/0.9-sessions/interface-wave1/pattern.html); the spec is written after that look. docs/0.9-sessions/interface-wave1/SUMMARY.md
PlatformUI.2 Link to UI.2Comment on UI.2 One tear-off: every bar, menu, palette and panel moves to its own window the same way

Today there are four ways to put a piece of the interface in a window: the ribbon has its own tearOff()/dockRibbon() in app-workspace.js (window.open, stylesheet copy, key forwarding, about 60 lines), the toolbox, tool rows and status bar use app-workspace-popout.js popout(), the app panels use app-panels.js (its own ONE "panels window", adoptNode, Window Management API), and the classic toolbar and SuperCad walls use app-toolbar-tear.js and api.tearable(). Each copies stylesheets and theme differently, forwards keys differently and remembers (or does not remember) its window differently; closing behaviour differs too. Change: one window service in the shell (app-windows.js, grown from popout.js) that every piece uses: open from a click, move the nodes (handlers and state go along), mirror <html>/<body> attributes, stylesheets, interface size and icon style, forward keys that are not typing, give the window a title and the app's icon, dock back on close, on "Put it back" or by dragging the grip back over a drop target (UI.5). The ribbon, panels, toolbar and SuperCad code become callers of it. One "…" menu (shell-panel-menu) for all of them with the same entries in the same order: Move to a new window / Put it back / Float / Dock left / right / bottom / Hide. Test: the conformance test tears off every block that allows it and brings it back, in every layout.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Planned 4 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.3 Link to UI.3Comment on UI.3 Multi-monitor: any number of windows, remembered per app and layout, restored in one click

Owner: "one of our biggest desires is to be multi monitor capable". Today the panels window is one window for both panels (app-panels.js), each torn-off block is one more pop-up, and only the panels window remembers its position and screen (cc-app-settings:<slug> panels.wins, Window Management API "Put it on my other screen" in Chromium); a block's pop-up opens at a default size at the pointer's screen and is forgotten on reload; a browser cannot reopen windows without a click, so after a reload the shell can only offer "Open it". Change, on the one window service (UI.2): each window keeps {screen, x, y, w, h, contents} under cc-windows:<slug>:<layout>, the left and right panels may be two windows, a palette may leave its panel for a window of its own, several bars may share one window (a tool strip window), and on start the status line offers "Restore my 3 windows" (one click opens them all, the browser allows that inside one click), with getScreenDetails() where the browser has it and the last position elsewhere. The layout file (format v2, UI.6) may say a block starts in a window ("place": "window"), so a layout made for two screens is shareable. Studio does the same through real windows (UI.4). Works on the page too: a floating palette or bar (place float) can be dragged anywhere over the drawing and is remembered the same way, so "reorganized on the page/canvas" is the same feature with the window left out.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shellDesktop host Planned 5 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.5 Link to UI.5Comment on UI.5 Arrange by dragging: move any block, palette or bar to another place and save it as your own layout

Owner: each layout can be customized, or a person creates their own. Today "Arrange your own layout" (WS.25, app-workspace-arrange.js) is a form: a dialog with radio buttons for where the toolbox goes, which panel holds which palette, which bars show; one palette stack, no split editors; a new layout is made from the form, not from the screen. Change: an Arrange mode (Settings › Layout › Arrange, or the grip's "…" › Arrange) that draws the slot map of UI.1 over the live page as drop targets and lets the person drag every block (ribbon, tool rows, menu bar, toolbox, palettes, info box, quick bar, view tabs, status bar, command line) by its grip to another allowed place, to float, or to a window (UI.3); blocks that cannot go there say so on hover (the format's places list is the rule); a palette may be dragged out of its stack into the other panel or into a stack of its own (two palette stacks: a format v2 change, UI.6). Done = the result saved as "My <layout name>" (file:my-<id>, the existing WS.17 path) and chosen; Reset puts the built-in back. Every drag is also an undoable step while the mode is on. Replaces the form, keeps its validation (validateLayout, resolveLayout). Test: a drag of each block kind in CadCraft and BimCraft, saved, reloaded, exported and imported again byte-identical. Owner addition the same day (UI.21): the drop targets are the dock zones of the one dock manager, so a ribbon group dragged to a side column becomes a palette there, a palette dragged to the top joins the ribbon, and either dropped on another unit joins it as a tab.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 6 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.6 Link to UI.6Comment on UI.6 Customize what a layout holds: the tools in each ribbon tab, tool row, palette and menu; layout format v2

A layout today says WHERE the app's blocks go; what a ribbon tab or tool row holds comes from the app's adapter (its ribbon(), toolbox() and the input registry) and cannot be changed, except My tools (8 slots, WS.21) and the menu style's toolbar arrangement. Change: layout format v2 (app-workspace-format.js VERSION 2; v1 files still read): an optional "tools" section per block with add / remove / move / rename of tools and groups by registry id ("ribbon": {"tabs": [{"id": "home", "groups": [{"id": "draw", "tools": ["line", "polyline", "circle", "+cmd:layer.new"]}]}]}), a "menubar.menus" override, "palettes.stacks" (two stacks, UI.5), "place": "window" (UI.3), and "look.tone" (UI.16); every id checked against the app at resolve time, unknown ones dropped with a note as today. The UI: right-click a tool › Remove from here / Add a tool… (the My tools picker, grown to any group) / Move left / right / New group, in every block, saved into the person's derived layout (UI.5). Reset per block. The add-ons repo carries a byte-identical copy of the format (examples/layout-drawing-first/tools/workspace-format.js; the test checks it) and docs/LAYOUTS.md gains the v2 section. The 20-tool "visible" count of tool rows and the ribbon's large/small split become per-group choices here too. Owner addition the same day: where a ribbon group's name sits is a layout setting, not a constant: look.names "below" (under the tools, the ribbon default) or "above" (over them, the palette and tool-row default), overridable per zone in the layout file and switchable in Settings › Layout; the dock manager (UI.21) and the ribbon (UI.11) read it, and the mockup's demo has the switch. Also (owner): a bar never wraps; look.overflow = "more" (default: items that do not fit fold from the right into ⋯, Add-ons stays last), "compact" (one ☰ button) or "drop" (the bar takes its own row in the top zone until there is room); for the menu bar, tool rows and the status bar.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 6 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.7 Link to UI.7Comment on UI.7 A layout per app, finished: each app remembers its own, a switcher in the title bar, SuperCad Studio lists every layout

Owner: each app can use a different interface. FX.82 (0.9, partial) added a checkbox in Settings › Layout that keeps the pick for that app alone; the rest is open. Change: (1) the per-app pick is the default (cc-workspace:<slug> first, the global cc-workspace as the fallback), shown in Settings as "This app" / "Every app" with the app's name; (2) a workspace switcher in the title bar and the Vector/Drafting menu bars (the "2D Drafting ▾" drop-down of the owner's reference screenshot): the list of layouts with the person's own first, switching in place without a reload (the engine's decide() already does this; Work environments WS.24 still reload: they stop reloading when only the layout changes); (3) SuperCad Studio's manifest lists all seven layouts, not only docked, and its hosted apps follow the host's pick or keep their own (the guest rule stays: a guest never lays out the host's page); (4) ?workspace=<id> stays for one page. Help common/layout-ribbon, layout-toolbox and layout-own updated; words shell.ws.switch*.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Planned 3 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.8 Link to UI.8Comment on UI.8 Title bar: quick-access tools you choose, the workspace switcher, the document name and a command search box

The owner's reference (testfiles/dropai-BkUApXoy/paste-2026-11-09T00-47-03.png, a drafting program in the browser) has a second strip under the menu bar: app mark, quick-access tools (new, open, save, save as, print, undo ▾, redo ▾), the workspace drop-down, the document name centred, and "Type a keyword or phrase" search at the right. Our titlebar block has quick (the well-known actions only: open save undo redo select clear fit), the document name, Help and Settings. Change: quick takes any registry command id (format v2, UI.6) and a person adds or removes tools there by right-click (the My tools picker); undo and redo get a ▾ with the last steps when the app's history offers them (CadCraft has one); the switcher (UI.7); a search box that is the command finder (Ctrl+K, ccPalette) inline, with help topics and Library items in its results as the finder already lists them; the name shows the dirty mark and a tooltip with the path. One titlebar for the menu-bar layouts too: the Vector menu bar's brand slot and the title bar merge into one block with a "menus" option, so a layout never has two brand marks (owner rule 2026-11-05: the brand always visible, once). Owner addition the same day: the title bar is the ABSOLUTE TOP of every app and layout: the app mark and name at the far left with the area chip (Browser / Lab / Studio and the version), which open the Craft menu (UI.24); a dock zone beside them where the menu bar sits by default (it can also dock underneath in the top zone, or tear off like any unit, UI.21); this row's quick-access tools and workspace switcher; and Find, the search box, at the far right. Nothing else is in that row: the module buttons of the owner's screenshot (Find, Help, Save for offline, Problems, Calc sheets, Design reasons, Lessons, Field packs, Engines, Drawing details, Settings, Full screen, Paper / Model) move into the Craft menu, the Add-ons list or the title bar's own blocks as UI.24 says. The mockup's demo draws it.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 2 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.9 Link to UI.9Comment on UI.9 Command line anywhere: docked in the status strip, floating over the drawing, in its own window, or hidden

Duncan docks a command line in the status strip (statusbar.command, 0.9 DU.1), and it only hands its text to the command finder; the reference screenshot floats one over the drawing with history above it and a ▾ to open the log. CadCraft has a real command line of its own (cad-cmdline-09.md) in the classic layout only. Change: a commandline block of its own (places: stage-bottom, bottom, float, window; options history, log, width), filled by the app when it has one (CadCraft's, with its LISP and keyword prompts) and by the finder elsewhere; dragged by its grip to float anywhere over the drawing or to a window (UI.2/UI.3), remembered; Ctrl+9 shows/hides it as people expect; typed input goes to it from anywhere in the drawing when the layout says so (the classic rule). Works in every layout the person adds it to (UI.5), default in Drafting (UI.12) and Duncan.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shellApp code Planned 3 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.10 Link to UI.10Comment on UI.10 View overlays: view cube and compass, navigation bar, viewport label, axes icon, in the corners of the drawing

The drafting reference shows four things over the drawing itself: a view cube with a compass (N/E/S/W, "TOP", a WCS drop-down) top right, a navigation bar (a Discord member, zoom, zoom window, orbit) at the right edge, a viewport label "[-][Top][2D Wireframe]" top left, and an axes (UCS) icon bottom left. The engine has no corner places: view-top and view-bottom are full-width strips, and each app draws its own view cube (BimCraft's display modes beside the view cube, GH.3-B) or none. Change: four view-corner places (view-tl, view-tr, view-bl, view-br) in the format, each a small stack of overlays that never take pointer events outside their boxes; shared overlay blocks: viewcube (the app's 3D view orientation through the adapter's views API, with the compass and the named views), navbar (a Discord member, zoom extents, zoom window, orbit, walk from the registry), viewlabel (view name, display mode, scale, the [-] menu with the app's view commands), axes (the app's UCS/axes drawing, or the shared one). Each is a block a layout turns on, so Drafting (UI.12) and Sketch have them and Toolbox does not. Apps keep their own where they have more (BimCraft's display modes feed viewlabel). Test: each overlay present and placed in every app that has 3D, with the drawing's pointer events untouched between them.

CadCraftBimCraftModelCraftCivilCraftDetailCraftPartCraft App shellApp code Planned 4 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.11 Link to UI.11Comment on UI.11 Ribbon and footer: group flyouts, inline controls in a group, contextual tabs that light up; a status bar with toggles and a customize menu

Ribbons: our ribbon block draws each group's large tools and stacked small tools with the group's name under it; the reference adds a ▾ on the group title that opens the rest of the group (tool rows have this: details.tr-more), inline controls inside a group (the layer drop-down, colour / linetype / lineweight pickers "ByLayer" in the Properties group, a measure field), and a contextual tab that appears lit in the app's colour when something is selected (ours exists, A.contextTab, but looks like the others). Change: ribbon groups take "more" (the rest of the group under ▾) and "slots" (the adapter's slot controls moved in, as the info box does), large / small per tool from format v2 (UI.6), a contextual tab coloured by the app's layer and a one-line label of what is selected, keyboard access by Alt. Footer bars: the status bar today holds the app's status line, the selection count and the layout's name; the reference's holds the Model / Layout tabs, mode toggles (grid, snap, ortho, polar, object snap, tracking, lineweight, transparency, selection cycling, annotation scale 1:1, workspace, isolate) and a gear that chooses which toggles show. Change: statusbar takes "toggles" (registry commands with pressed state, drawn as icon buttons lit when on, the app says which it has through pressed()), a scale slot, and a customize menu (the gear) that ticks toggles on and off, saved in the person's layout. Model / Layout tabs are viewtabs mode "all" at view-bottom, with a "+" when the app can add a view (CadCraft paper space, BimCraft sheets). Owner addition the same day: a ribbon group has no collapse control; collapsing belongs to palettes and floating panels (UI.26), and a unit dropped into a ribbon zone opens. The ribbon as a whole still minimizes to its tab strip (DF.27), from the tab strip, never per group.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 4 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.12 Link to UI.12Comment on UI.12 Drafting layout: menu bar, quick-access strip, ribbon, file tabs, view cube and navigation bar, command line, Model / Layout tabs, status toggles

The owner's reference screenshot is a 2D drafting workspace of the kind people who come from the long-established drafting program know: a menu bar (File Edit View Insert Format Tools Draw Dimension Modify Window Help), the quick-access strip with the workspace drop-down and search, a ribbon (Home Insert Annotate Parametric View Manage Output Add-ins Collaborate) with Draw / Modify / Annotation / Layers / Block / Properties / Groups / Utilities / Clipboard / View groups, file tabs (Start, Drawing1*, +), the drawing with a viewport label, a view cube with compass, a navigation bar and an axes icon, a floating command line, Model / Layout1 / Layout2 tabs and a status bar of toggles with the scale and a customize gear, in a dark chrome. None of our six built-ins is this one (docked and autorev are BIM ribbons, Vector and Sketch are palette layouts). This row: a seventh built-in, "Drafting" (assets/workspaces/drafting.ccworkspace.json; the name is ours, never the program's: the vendor-names rule), made only of the engine's blocks (menubar set "drafting", titlebar with quick + switcher + search, ribbon with more/slots/contextual, viewtabs open at view-top, the four view overlays, commandline float, viewtabs all at view-bottom, statusbar toggles + scale + customize, look.tone dark), listed in all eight apps and SuperCad Studio; CadCraft's adapter fills every slot, the other apps fill what they have (resolveLayout drops the rest with a note, as today). Every pixel from our tokens and icons: the layout copies where things are, never another program's artwork. Conformance test, help topic common/layout-drafting, es-MX and id words, a screenshot for /download and the release note.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shellApp code Planned 4 UI.8 to UI.11 (the blocks it is made of); the owner's look at the mockup (UI.1). docs/0.9-sessions/interface-wave1/SUMMARY.md
Sanity checkUI.13 Link to UI.13Comment on UI.13 Icon quality bar: a review sheet of every icon at 16, 20, 24 and 32 px in every style and both themes; redraw what fails

Owner 2026-11-09: "Our icons look like crap. We want cleaner colorful and theme colored icons." The CadCraft set (assets/js/app-workspace-icons.js, 0.9 DU.1, 2026-11-05) has 114 drawings on a 32-unit grid with a 1.5-unit round stroke and flat two-tone fills (roles w, a to e, s1/s2, t); 37 wall-tool icons were added by WT.1. It was drawn in one day, reviewed on one sheet at one size, and used only where a layout opts in (toolrows.icons "set", the Vector palettes); everywhere else the apps show Bootstrap Icons (one weight, grey) or their own drawings, so the screen mixes three icon families. This row, before more drawing: (1) a review sheet page (tools/icons/sheet.mjs → a static HTML in the lab) rendering every icon at 16 / 20 / 24 / 32 px, full colour, outline colorized and theme colour (UI.15), light and dark, next to the Bootstrap icon and the app drawing it replaces; (2) drawing rules written in the module header from the owner's look: grid, stroke and corner radius, the five fills and when each is used, what a 16 px icon may still show (no text, no detail under 2 units, one idea), silhouette first; (3) a lint (tools/icons/lint.mjs) that fails an icon off the grid, with a stroke under 1 or a sub-2-unit detail; (4) redraw every icon the sheet shows as muddy at 16 px (a first look at the set suggests the dimension, text and view icons). The sheet stays as the standing check (the test runs the lint).

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 3 Owner look at the sheet; his word on the drawing rules (stroke, corner radius, fill palette) before the volume row UI.14. docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.14 Link to UI.14Comment on UI.14 One icon family everywhere: the CadCraft set in every layout's ribbon, toolbar, toolbox, menu and palette, and the missing tools drawn

Today the set shows only in Duncan's tool rows and the Vector/Sketch palettes; the ribbon, the classic toolbars, the menu styles, the toolbox, the File menu, the pet palette and the status bar still show Bootstrap Icons or the app's own drawings, and about 270 specialist tools (the 2026-11-05 count: BimCraft MEP and families, CivilCraft alignments and water, DetailCraft connections, PartCraft features, MarkupCraft and TakeoffCraft marks) have no drawing in the set at all. Change: (1) the engine's tool() and the input registry's icon lookup ask the set first for EVERY block and the classic toolbars (iconKey → iconNode; Bootstrap only as the last fallback, logged in the lab so the missing list is real); (2) draw the missing tools in sets per app, each set reviewed on the UI.13 sheet, one agent per app with the rules, about 30 icons a day; (3) the eight apps' own toolbar drawings (CadCraft's 1.6 px line icons, BimCraft's, …) retire where the set covers them, kept under Settings › Icons "Each app's own drawings" for people who prefer them; (4) add-ons name icons from the set by key (api.icons) so an add-on's tools match. Measured at the end: zero Bootstrap fallbacks in the eight apps' default toolbars and ribbons in the lab; the number of set icons in the release note. Owner addition the same day (UI.22): the drawings themselves, the inventory and the icon repo are UI.22, the library; this row is wiring that library into every block, layout and app so one family shows everywhere.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shellApp code Planned 8 UI.13 (the rules) first. docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.15 Link to UI.15Comment on UI.15 Theme-coloured icons, and the colorize colour carried to labels and eyebrows

Settings › Global › Icons offers Full colour (fixed pastel fills: --ic-a #8fd3f5, --ic-b #ffb870, …, the same on light and dark), Outline colorized (one colour the person picks, --cc-icon-color) and Each app's own drawings. Owner: "cleaner colorful and theme colored icons (see color, colorize setting of icons - labels/eyebrows should follow)". Change: (1) a Theme colour style: the fills and accent lines derived from the theme tokens at render time (the app's layer colour --layer-<app> for the accent s1, its complement for s2, fills as tints of the sheet toward the layer colour with the ink as the line), so icons follow light / dark and change with the app, and a "Colour" pick (app colour, a layer colour, or any colour) under it; (2) the Full colour fills get a dark-theme set (today the same pastels sit on #1D232B and look washed); (3) "Labels and eyebrows follow": a switch that gives group titles (the ribbon's group names, the tool rows' group labels, palette headers, tab labels, the status bar's section names) the icon colour too, finishing FX.91 (group names in the app's colour, partial) with one rule for every block; disabled stays plainly grey (FX.90) in every style; (4) a contrast check in Settings: the picked colour is shown against both sheets and a warning says when it fails 3:1 on either. CSS stays token-only (--ic-* in app-workspace.css); the icon module reads the theme once and on the cc-space change.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 3 – docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.16 Link to UI.16Comment on UI.16 Layout chrome tone: a layout may be dark, light or follow the theme, with its own chrome tokens

The reference drafting interface is dark chrome around the drawing whatever the OS theme; ours takes --ws-chrome, --ws-line, --ws-blue from the site theme (cc-space light / dark), so a layout cannot ask for a dark frame on a light theme or a paper-white frame on dark. Change: look.tone in the layout format (format v2, UI.6): "theme" (default, as today), "dark", "light"; the engine sets data-ws-tone on the layout's regions and app-workspace.css defines the chrome tokens per tone (sheet, chrome, line, ink, muted, the blue, the tab colours) once, so every block in every layout reads the same six tokens and no block carries a literal colour (a lint over app-workspace.css for hex values outside the token block). The drawing surface keeps the app's own background setting. Settings › Layout shows the tone under the layout name and lets the person override it per layout. Icons follow the tone through UI.15's theme colours.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App shell Planned 2 – docs/0.9-sessions/interface-wave1/SUMMARY.md
Sanity checkUI.17 Link to UI.17Comment on UI.17 Stability pass: every app × every layout × both themes × three widths on one contact sheet, the engine gaps closed, tests that hold

Owner: "I personally dont feel like our efforts are strong and stable and consistent." What exists: bin/test-app-workspaces.mjs (12 contract points per app and layout, green on 2026-10-24 for the two layouts of that day); the newer layouts were checked in CadCraft and BimCraft only (DU.1, VEC.1, SK.1 all "partial"); the engine inbox (docs/0.7-sessions/workspace-layouts.md § Inbox) lists gaps the per-app sessions found, most closed in the follow-up run, some still worked around in app CSS (z-index lifts, canvas sizing); FX.37 (tablets in portrait), FX.43 (packaged editions print no mount for toolbar tear) and FX.82 to FX.85 are partial. This row: (1) a contact sheet tool (tools/workspace-test/contact-sheet.mjs) that opens every app (eight plus SuperCad) in every layout, light and dark, at 1920, 1280 and 760 px wide with a showcase file, and writes one page of screenshots for the owner, re-run before every release and kept in the release notes results section; (2) run the conformance test for every app × layout and fix what fails, including the new points from UI.1; (3) remove the per-app CSS workarounds the engine now covers; (4) the partial rows above closed or re-filed; (5) a flake budget: the suite runs three times green on the VPS before this row is Built.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shellTests and tooling Planned 3 – docs/0.9-sessions/interface-wave1/SUMMARY.md
DecisionUI.19 Link to UI.19Comment on UI.19 Owner: which mainstream interfaces to mock next, per app, for interface wave 2

Built-in layouts after this wave: Ribbon and project browser (docked), Toolbox and info box, AutoRev, Duncan, Vector, Sketch, Drafting (UI.12). Owner 2026-11-09: each app has several mainstream interfaces people like; mock them so a person picks the one they like per app. Candidates not yet mocked, by app, for your pick (names here are for you; the layout names stay ours, see the vendor-names rule): CadCraft: the classic toolbars-and-command-line drafting screen of the 2000s (menu bar, docked toolbars on four sides, command window, no ribbon). BimCraft: the Toolbox layout already follows the Archicad pattern and AutoRev the Revit one; a Vectorworks Architect pattern is Vector. ModelCraft: Sketch is there; a Blender-style editor-areas layout (split editors, header per area, N-panel) and a Rhino-style layout (four viewports, command line, toolbar tabs, right panels). MarkupCraft and TakeoffCraft: the Bluebeam pattern (left thumbnails, tool chest and markups list in right tabs, a properties toolbar under the ribbon) and the PlanSwift pattern (left pages tree, right takeoff items list, a quantities bar). CivilCraft: the Civil 3D pattern is a ribbon with a Toolspace palette (Prospector / Settings / Survey tabs) at the left. DetailCraft: the Tekla pattern (ribbon, a side pane with Applications & components, a mini toolbar at the selection). PartCraft: the Fusion / SolidWorks pattern (toolbar tabs, a browser tree at the left, a timeline at the bottom, a marking menu at the pointer, a Command Manager). Pick the three or four that matter most for 0.10 and this row becomes wave 2's list; each is one layout file plus the blocks it needs (split editors and a timeline are the two blocks none of the above have).

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Decision Time – Owner's pick. docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.20 Link to UI.20Comment on UI.20 Theme switch: sun and moon icons for light and dark wherever the interface says "Paper" and "Model"

Owner 2026-11-09: where we say "paper/model" we switch to sun/moon icons for the light and dark themes. Today the theme toggle is a two-button form with the words Paper and Model: the site navbar (navbar.inc, titles "Paper space: light theme" / "Model space: dark theme"), the app bar in every app and its More menu on phones (app-bar.inc, words shell.bar.paper / shell.bar.model and their titles), the Settings radios (app-settings.inc already draws bi-sun next to "Paper"; shell.settings.theme.paper / .model), and the pre-paint script and site.js that read them. Change: one shared toggle component (space-toggle.inc) drawn as two icon buttons, a sun for light and a moon for dark, from the CadCraft icon set (UI.14: two new drawings, sun and moon, in all three styles) with the pressed state lit, aria-labels and tooltips "Light theme" / "Dark theme" (plus "Match the system" where Settings offers it), the words shell.bar.light / shell.bar.dark in en, es-MX and id and the old keys retired by bin/test-shell-lang.mjs; the navbar, the app bar, its More menu, Settings and the Studio hub use the one component. What stays: the stored values paper / model (localStorage cc-space, the cc_space cookie, data-space) and the brand file names cadcraft-logo-{paper,model}: internal names, nothing a person reads, so no stored setting breaks. What this does NOT touch: CadCraft's real paper space and model space (the drawing's layouts and the MODEL / PAPER status toggle), which keep their names because that is what they are. Help: the theme line in common/getting-started topics; the FAQ answer that names Paper and Model, if any, re-read. Owner addition the same day: in the apps the sun and moon are one row of two icon buttons inside the Craft menu, which opens from the app mark and name at the far left of the absolute top (UI.8, UI.24); icons in a row, never list items; the website navbar keeps its own pair.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftStudioSuperCad Studio App shellSite and services Planned 1 – docs/0.9-sessions/interface-wave1/SUMMARY.md
PlatformUI.21 Link to UI.21Comment on UI.21 One dock manager: a ribbon set becomes a palette and back; any tool group docks to a canvas edge, tabs, collapses, floats or takes a window

Owner 2026-11-09, on the reference at app.draftcraft.a Discord member: "the ability for a RIBBON set to turn into a palette, like in Adobe Photoshop or something similar, where you can dock panels/palettes, and in this particular case we can dock a ribbon to the top of the canvas." The idea: a ribbon group, a tool row, a toolbox group, Properties, the browser, the info box, the command line and a status strip are one thing, a DOCKABLE UNIT; a ribbon is units docked horizontally along the top of the canvas with a tab strip, a palette the same unit docked vertically in a side column, a tabbed panel several units in one slot, an icon rail a collapsed column, a floating palette a unit over the drawing, a window a unit on another monitor. Today each is its own block kind and code path (15 block kinds, four tear-off paths, the panel manager apart from the engine). Change: one dock manager in the shell (app-dock.js, grown from app-panels.js' dock / float / window logic and the engine's regions; SuperCad Studio's SC.2 panels, "everything is a panel that docks, tears off and groups", become a caller of it): zones = the four canvas edges plus the two panel columns, drawn as drop targets while dragging (UI.5); a unit dropped in a top or bottom zone lays out horizontally (the ribbon look), in a side zone vertically (icon + name rows, the palette look), on another unit it joins as a tab, on the rail it collapses to an icon, over the drawing it floats, past the window edge it tears off (UI.2/UI.3). The orientation belongs to the zone, the tools to the unit (format v2, UI.6), so the same Draw set is a ribbon group at the top and a palette at the side. The layout file says, per unit, which zone and in which order; the block kinds become presets of units in zones, so every built-in layout still reads and every adapter still fills them. Conformance: drag the Draw group from the ribbon to the left column and back in every app; a layout saved that way reloads the same.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Planned 8 UI.1 (the pattern) and UI.2 (one window service) first; UI.5 and UI.6 are built on this. docs/0.9-sessions/interface-wave1/SUMMARY.md
PlatformUI.22 Link to UI.22Comment on UI.22 The icon library: one drawing for every command, option and shell function in the eight apps, kept as data, the same in every layout and app

Owner 2026-11-09: "we need to create an entire library of icons (a task) that covers all of the application options, so that our icons are consistent regardless of the layout/app." What exists: app-workspace-icons.js holds 114 drawings on a 32-unit grid; about 270 specialist tools had no drawing by the 2026-11-05 count; the shell bar, More menu, panel tabs, status bar, menus and dialogs still use Bootstrap Icons (bi-*) and each app draws some of its own, so one command looks different from layout to layout and app to app. This row makes the library its own thing: (1) an inventory tool (tools/icons/inventory.mjs) reads every app's command registry, its toolbar, menu and toolbox definitions, the shell's bar buttons and panel tabs, Settings and the layout blocks, and writes docs/icons/INVENTORY.md: every command or option id, its apps, its drawing key or "missing"; nothing is drawn before the list exists; (2) the library in its own public repo (getcadcraft/icons, Apache-2.0, like every shared library): one SVG source per icon on the 32 grid with the five fills and two strokes as classes, names.json (key, name, aliases, the commands that use it), and a build that packs the set into app-workspace-icons.js, a sprite for the site and the add-ons kit, and the gallery data for UI.23; a hand edit of the packed file is refused by a check; (3) the drawings, under the UI.13 rules, in batches by app with the owner's look at each batch on the review sheet; shared verbs (move, copy, rotate, trim, offset, measure, zoom, undo) drawn once for every app; the shell's own set (home, find, help, settings, sun and moon, full screen, offline, problems, team, lessons, the AI and the panel buttons); (4) a lint in the release freeze: a registered command without a drawing, a drawing without a name, or a bi-* class left in shell or app chrome fails it; (5) the count in the release note (UI.18) comes from the inventory, never typed. Each app's own drawings are migrated or retired by its session.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shellApp codeTests and tooling Planned 10 UI.13 (the owner's drawing rules) first; UI.14 wires the result into every block. docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.24 Link to UI.24Comment on UI.24 The Craft menu at the far right of the absolute top and Add-ons at the far right of the menu bar: the shell's own buttons condensed, pinnable

Owner 2026-11-09: condense "OUR buttons" that extend the site's functions; an absolute top with the logo, the app name, a dock space for the menu bar "and then the CRAFT MENU (far right): settings, full screen, help, support, about, login/logout, account. ADD-ONS goes into the top menu far right and lists all the add-ons and panels"; "some are addon panels, others are part of CRAFT MENU". What exists: app-bar.inc draws the mark, area chip, theme toggle, Find, Help, Save for offline, Settings, Full screen; thirteen modules each insert their own button before Settings. Change: (1) one registration, ccShell.option(), that every module and add-on calls instead of inserting a button; (2) the Craft menu opens from the app mark and name at the far left of the absolute top (UI.8), the same in every app and layout: Settings, Full screen, Help, Support, About (with Report a problem), Save for offline, Visit GetCadCraft.com, the sun and moon as one row of icons (UI.20), Sign in, then Account with sign out inside; (3) Add-ons as the last item of the menu bar in every layout that has one (a title-bar button where none does): every add-on and panel (module, Team, AI and add-on panels), each a dockable unit (UI.21) opening at its remembered place, a tick when open; closing a panel returns it to this list; (4) Find (owner): [ search box | magnifying glass ] at the far right of the absolute top; the box folds to the glass when room is short and a click opens it; Ctrl+K; the area chip stays beside the app name; Problems also keeps its count in the status bar; (5) up to six options pinned in the absolute top as buttons, saved per app and in the layout file (format v2); (6) badges on a pinned button or on the mark; (7) Alt+O opens the Craft menu; options keep their shortcuts. The app's tools are not touched. Words shell.craft.*; help craft-menu; test: every option reachable in every app and layout, no bar button outside the registry.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Planned 4 UI.8 (the title bar block) agrees on where the menu sits; UI.21 makes it a dockable unit. docs/0.9-sessions/interface-wave1/SUMMARY.md
PlatformUI.25 Link to UI.25Comment on UI.25 One state language: an action enables or disables menu items, shows and updates panels, and selects on the canvas; every unit follows the same state

Owner 2026-11-09: "remember that actions can enable or disable menu items or make panels show/update as well as selecting objects on the canvas." What exists: every app wires this by hand in its own code: Properties refreshes on the app's selection event, the project tree selects through app code, the command registry (ccInput) knows commands but no enabled or visible condition, menus and toolbars are static until an app toggles classes, contextual ribbon tabs do not exist (UI.11), Problems and the add-ons read their own events. Change: (1) one state in the shell (ccState): selection (ids, kinds, count), mode (model / paper, 2D / 3D), the active view, the current layer and tool, document dirty; the apps publish into it through the host adapter; nothing else writes it; (2) declarations as data: a command, menu item, button, ribbon tab or panel says when it is enabled, visible or shown (enabled: selection.count > 0; visible: selection.kind == wall; show: problems.count > 0) in the registry and the layout file (format v2), never in per-app DOM code; the dock manager applies them: items dim, contextual tabs appear and go (UI.11), panels show or refresh, badges count; (3) the reverse channel: a unit acts on the canvas through the host (select, reveal, highlight), so a Browser row, a Problems line, a schedule row or a search hit selects and zooms to the objects with the same undoable selection the pointer makes; (4) one action path: every button, menu item and shortcut runs the registry command, so one command in a ribbon, a palette, a menu and the status bar has one enabled state and one label; (5) a check (bin/test-shell-state.mjs) opens every app, selects through the host and asserts Modify enabled, Properties updated, the Browser row lit, a declared contextual tab shown, then selects from the panel and asserts the canvas selection. The mockup's demo shows the behaviour (click a wall, or its Browser row). SuperCad Studio's host is the same contract.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shellApp code Planned 5 UI.21 (units) and UI.6 (format v2) carry the declarations; each app publishes its state in its own session. docs/0.9-sessions/interface-wave1/SUMMARY.md
FeatureUI.26 Link to UI.26Comment on UI.26 One head on every panel and ribbon group: grab handle far left, close far right, and the handle opens the dock menu (Dock to, Float, Window, Pin, Hide)

Owner 2026-11-09: "we should make the grab handle and close x standardized on all panels and ribbons (far left, far right), and a drop-down menu can be click the grab handle (menu: dock to xxx, pin)." What exists: the two app panels have the shell's grip bar (app-panels.js) and Problems a "…" menu (dock right / left, float, window); the ribbon has its own tear-off handle; the toolbox, tool rows and status bar have popout buttons in different corners; the Vector and Sketch palettes draw their own heads. Change: one head component in the dock manager (UI.21) for every unit in every zone and orientation: the grab handle at the far left (drag = move; click = the dock menu), the unit's tabs or name in the middle, collapse, and close at the far right, in that order, always. The dock menu lists Dock to top / canvas top / left panel / right panel / bottom (only the zones the layout allows, UI.1), Float on the drawing, Open in a window (UI.2, UI.3), Pin (the unit stays put: drag, auto-hide and close are off until unpinned), Collapse / Open, Hide (place none; it comes back from Settings › Layout › Hidden or the Craft options menu, UI.24), then the unit's own commands if it registers any. Right-click and a long press open the same menu; the handle is focusable. Head height, glyphs (from the icon library, UI.22) and colours (the zone's family) come from the tokens, so a ribbon group's head and a palette's head differ only in orientation. The ribbon's tear-off handle, the popout buttons and the "…" menus retire into it. Conformance: every unit in every layout shows handle left and close right, the menu opens, and each item does what it says. Owner addition the same day: a visibility order on the head so the close never draws the eye: title or tab name 100 % of the ink, grab handle 70 %, collapse 55 %, close 40 %, full ink on hover and focus; four tokens in app-workspace.css, the same on both themes.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Planned 2 UI.21 (the unit) is where the head lives. docs/0.9-sessions/interface-wave1/SUMMARY.md
Suggest an item

Anyone can send one; no account and no name needed. The team reads each idea, and the ones we take on appear on this page. Please leave out web addresses.