Tab layout for plan entity pages
Add a tab panel to plan entity pages (spec, work, bug, decision) that separates the main authored content from pipeline-generated metadata views. Each entity page gets tabs:
Add a tab panel to plan entity pages (spec, work, bug, decision) that separates the main authored content from pipeline-generated metadata views. Each entity page gets tabs:
No incremental history — criteria tracking started on Apr 19.
The desktop TOC sidebar and mobile section-nav dropdown must remain generic — they know nothing about tabs. A plan-specific coordinator behavior bridges the two systems:
hashchange) where the target #id is inside an inactive tab panelThis coordinator lives in the plan package's behaviors map alongside the existing milestone-backlog entry. The TOC scrollspy behavior and section-nav behavior remain untouched.
postProcess wraps entity content in a tab-group structure with Overview, Relationships, and History panelstabsBehavior (tablist buttons + tabpanel divs)tabsBehavior is registered for plan entity tab groups in the plan package behaviors mapbuildRelationshipsSection output (currently appended inline)buildAutoHistorySection output (currently appended inline)runes/plan/src/pipeline.ts)In postProcess, instead of appending relationship and history sections as children of the rune tag, wrap them in a tab-group structure:
buildRelationshipsSection (already implemented)buildAutoHistorySection (already implemented)data-rune="plan-entity-tabs" containing:[data-name="tabs"] div with role="tablist" and three buttons[data-name="panels"] div with three role="tabpanel" divsrunes/plan/src/index.ts)Add 'plan-entity-tabs': tabsBehavior to the plan package's behaviors map so the tab interaction is wired up automatically.
runes/plan/src/behaviors/tab-nav-coordinator.ts)A small behavior registered for plan-entity-tabs elements that:
hashchange for the same purpose (back/forward navigation)runes/plan/styles/)[data-state="inactive"] on panels hides content (standard tabs pattern).rf-plan-toc gets opacity/pointer-events reduction when a [data-active-tab] attribute is not "overview" (CSS-only, scoped to plan layout)runes/plan/src/config.ts)Add a PlanEntityTabs rune config entry with block: 'plan-entity-tabs' for BEM class generation.
runes/plan/src/pipeline.ts — postProcess hook (lines 640-664) where relationship/history injection currently happenspackages/behaviors/src/behaviors/tabs.ts — tabsBehavior HTML contractpackages/behaviors/src/behaviors/scrollspy.ts — TOC scrollspy (must not be modified)packages/behaviors/src/behaviors/section-nav.ts — mobile section nav (must not be modified)runes/plan/src/config.ts — plan rune configsCompleted: 2026-04-13
Branch: claude/work-item-tab-layout-dm34n
runes/plan/src/pipeline.ts — Modified postProcess to partition entity children into structural (header, meta fields) and body content, wrapping the body in a tab-group with Overview/Relationships/History panels via new buildEntityTabGroup function. Tabs only emitted when at least one metadata panel has content.runes/plan/src/entity-tabs-behavior.ts — New composite behavior wrapping tabsBehavior with: anchor navigation coordination (intercepts TOC/section-nav clicks and hashchange to activate the correct panel before scrolling), MutationObserver tracking aria-selected to expose data-active-tab attribute for CSS.runes/plan/src/config.ts — Added PlanEntityTabs rune config (block: 'plan-entity-tabs') for BEM class generation.runes/plan/src/index.ts — Registered entityTabsBehavior for plan-entity-tabs in the package's behaviors map.runes/plan/src/commands/plan-behaviors.ts — Registered entityTabsBehavior for client-side behavior initialization.packages/lumina/styles/runes/plan-entity-tabs.css — Tab bar and panel styling (underline indicator, active state, consistent with core tabs rune), TOC dimming via :has([data-active-tab]) when a non-Overview tab is active.packages/lumina/index.css — Added CSS import for new file.runes/plan/tsconfig.json — Added DOM lib for client-side behavior types.contracts/structures.json — Regenerated with new rune config (117 runes).