Arc opener for v102. Migrates Settings category icons to Lucide, rewrites CategoryTheme with Browse (6 theme cards, double-click to apply) + Active (runtime token inspector), and adds Model-1 drill-collapse sidebar (icon rail on sub-area drill-in).
Adds 11 tests for the palette config fields that landed in v0.3.0 but had zero test coverage — palette section, four global post_color fields, invalid hex rejection, round-trip through parseConfig, and global→per-module inheritance via resolveColors.
Closes the v101 Tile Migration arc. Bumps production semver 0.8.0 → 0.9.0, recanons LUMAWEAVE_NOW to v102 (Theme Menu Integration), backfills all v101 pass SHAs, and sweeps accumulated v101 polish/security debt into the running log.
CSS-only palette pass replacing every hardcoded cool-slate hex in tile/group chrome with Solar Plasma tokens and warm fallbacks. Tiles now share the visual language of the top bar: purple gradient bg, gold-tinted borders and shadow, backdrop blur, Space Grotesk display font.
The post's colorPrimary now reaches the MDX card — DevLogEntry's left border and version label inherit the same color as the page-header version chip, so colored posts are coherent end-to-end.
Adds the click-through E2E test closing v101's named bug. CSS fix was already set (tile-layer { pointer-events: none }); pre-flight caught stale pass description. Uses elementFromPoint grid scan to prove click-through; tiles stay interactive.
Adds a draggingTileId signal to the context so deriveGroups excludes the dragged tile from membership and bbox when it's >BREAK_TOL from all mates. Bar drops live at the threshold; drag back and it reappears. Preview matches the real commit exactly.
Dev-log post colors — version, title, body text, and accent border — are now settable per module from your site's own palette, captured once and reused, so posts match your site on any theme.
Model-B drag (body-grab moves only the grabbed tile) makes BREAK reachable for grouped tiles. GroupBar release now snaps the cluster and reconciles membership. Fixes minEdgeGap with correct rectilinear hypot so groups break when dragged far horizontally at the same height.
Replaces proximity-inferred grouping (computeGroups union-find) with event-driven membership. groupId on TileLayoutEntry is the source of truth; a group forms when a tile snaps flush on drop, breaks when dragged >BREAK_TOL away from all group mates.
Wires the live snap guide so users can see when a snap is armed. The gold guide line appears only when findSnap returns non-null (within 15px of an adjacent edge) and vanishes the instant you're out of range. setSnapGuide is change-gated — no setState on every pointer-move.
Fixed three CI failures: wrong stylelint plugin at ERROR severity replaced with stylelint-plugin-logical-css at warning, generate:graph step added before typecheck, actions bumped to Node 22.
FloatingTile.onUp read tile positions from ctx.tiles (stale render-snapshot), causing snap-back to pre-drag positions. Fixed by exposing getLiveTile/getLiveTiles on TileContextActions backed by getCurrentTiles(). SNAP_TOL bumped 9→15px.