@ashlr/hub 3.10.1 → 3.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +151 -0
- package/README.md +343 -82
- package/dist/authority-surface.json +80 -15
- package/dist/build-identity.json +2 -2
- package/dist/cli/cloud.d.ts +39 -0
- package/dist/cli/cloud.js +448 -0
- package/dist/cli/cloud.js.map +1 -0
- package/dist/cli/completions.js +4 -0
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/cloud/backlog.d.ts +17 -0
- package/dist/core/cloud/backlog.js +177 -0
- package/dist/core/cloud/backlog.js.map +1 -0
- package/dist/core/cloud/budget.d.ts +19 -0
- package/dist/core/cloud/budget.js +99 -0
- package/dist/core/cloud/budget.js.map +1 -0
- package/dist/core/cloud/checkout.d.ts +41 -0
- package/dist/core/cloud/checkout.js +168 -0
- package/dist/core/cloud/checkout.js.map +1 -0
- package/dist/core/cloud/cloud-api.d.ts +86 -0
- package/dist/core/cloud/cloud-api.js +599 -0
- package/dist/core/cloud/cloud-api.js.map +1 -0
- package/dist/core/cloud/delivery-contract.d.ts +25 -0
- package/dist/core/cloud/delivery-contract.js +138 -0
- package/dist/core/cloud/delivery-contract.js.map +1 -0
- package/dist/core/cloud/improvement-backlog.d.ts +11 -0
- package/dist/core/cloud/improvement-backlog.js +26 -0
- package/dist/core/cloud/improvement-backlog.js.map +1 -0
- package/dist/core/cloud/launcher.d.ts +68 -0
- package/dist/core/cloud/launcher.js +312 -0
- package/dist/core/cloud/launcher.js.map +1 -0
- package/dist/core/cloud/service.d.ts +51 -0
- package/dist/core/cloud/service.js +215 -0
- package/dist/core/cloud/service.js.map +1 -0
- package/dist/core/cloud/store.d.ts +41 -0
- package/dist/core/cloud/store.js +278 -0
- package/dist/core/cloud/store.js.map +1 -0
- package/dist/core/cloud/tracker.d.ts +30 -0
- package/dist/core/cloud/tracker.js +152 -0
- package/dist/core/cloud/tracker.js.map +1 -0
- package/dist/core/cloud/types.d.ts +233 -0
- package/dist/core/cloud/types.js +73 -0
- package/dist/core/cloud/types.js.map +1 -0
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +5 -4
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +4 -3
- package/dist/core/universe/campaign.js +9 -1
- package/dist/core/universe/campaign.js.map +1 -1
- package/dist/core/universe/runner.d.ts +3 -0
- package/dist/core/universe/runner.js +7 -3
- package/dist/core/universe/runner.js.map +1 -1
- package/dist/core/verse/activity-api.d.ts +3 -1
- package/dist/core/verse/activity-api.js +16 -1
- package/dist/core/verse/activity-api.js.map +1 -1
- package/dist/core/verse/activity.d.ts +7 -0
- package/dist/core/verse/activity.js +23 -0
- package/dist/core/verse/activity.js.map +1 -1
- package/dist/core/verse/compaction-point.d.ts +55 -0
- package/dist/core/verse/compaction-point.js +75 -0
- package/dist/core/verse/compaction-point.js.map +1 -0
- package/dist/core/verse/context-math.d.ts +1 -38
- package/dist/core/verse/context-math.js +5 -59
- package/dist/core/verse/context-math.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +1 -1
- package/dist/core/verse/verse-api.js +2 -0
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/vision/leader-cloud.d.ts +63 -0
- package/dist/core/vision/leader-cloud.js +134 -0
- package/dist/core/vision/leader-cloud.js.map +1 -0
- package/dist/core/vision/leader.d.ts +6 -0
- package/dist/core/vision/leader.js +12 -1
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-BBB7VYjz.js → ActionMenu-_DhtX2gO.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-BBB7VYjz.js.map → ActionMenu-_DhtX2gO.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-CAAfaBke.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-CAAfaBke.js.map +1 -0
- package/dist/core/web/public/next/assets/App-BAywyjE8.js +7 -0
- package/dist/core/web/public/next/assets/{App-CbDCLAxn.js.map → App-BAywyjE8.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-CUypKeog.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-CUypKeog.js.map +1 -0
- package/dist/core/web/public/next/assets/{AreaTrend-BgnK0wAy.js → AreaTrend-CblDqC8Q.js} +2 -2
- package/dist/core/web/public/next/assets/{AreaTrend-BgnK0wAy.js.map → AreaTrend-CblDqC8Q.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-D3d8lYO3.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-BF5UCsMv.js.map → AutonomySection-D3d8lYO3.js.map} +1 -1
- package/dist/core/web/public/next/assets/BranchBar-DU0jAV1E.js +2 -0
- package/dist/core/web/public/next/assets/{BranchBar-nfSb59Kv.js.map → BranchBar-DU0jAV1E.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BudgetControl-BESM12dO.js → BudgetControl-Mm1ZL4u6.js} +2 -2
- package/dist/core/web/public/next/assets/{BudgetControl-BESM12dO.js.map → BudgetControl-Mm1ZL4u6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BurnDown-D1AfskPT.js → BurnDown-C1fgcFqo.js} +2 -2
- package/dist/core/web/public/next/assets/{BurnDown-D1AfskPT.js.map → BurnDown-C1fgcFqo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-Cr_qkQEc.js → Button-DqgLUZvd.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-Cr_qkQEc.js.map → Button-DqgLUZvd.js.map} +1 -1
- package/dist/core/web/public/next/assets/CapacityStrip-nWFHvqFB.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nWFHvqFB.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DUZNpiVr.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-DUZNpiVr.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-2OW38o_C.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-2OW38o_C.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-C5w2o1-r.js +2 -0
- package/dist/core/web/public/next/assets/{CommandPalette-lLV-OR63.js.map → CommandPalette-C5w2o1-r.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandSection-Bx2knNqY.js +2 -0
- package/dist/core/web/public/next/assets/CommandSection-Bx2knNqY.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B7ZwCQOX.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B7ZwCQOX.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-Dx15x0Ho.css +1 -0
- package/dist/core/web/public/next/assets/Dialog-BpgcEW6b.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-BpgcEW6b.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
- package/dist/core/web/public/next/assets/{DiffPane-BVxhK-cy.js → DiffPane-DpqRUtCx.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-BVxhK-cy.js.map → DiffPane-DpqRUtCx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-yCdw9J-Y.js → DiffViewer-CoV5-nUf.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-yCdw9J-Y.js.map → DiffViewer-CoV5-nUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-C0Pq7Jak.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-BZReKwos.js.map → DockHost-C0Pq7Jak.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-D1GDxVZy.js → EmptyState-DYW29ncw.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-D1GDxVZy.js.map → EmptyState-DYW29ncw.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-DRp4dBfB.js → Epistemic-DVx6oHzp.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-DRp4dBfB.js.map → Epistemic-DVx6oHzp.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-DSETviPK.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-DSETviPK.js.map +1 -0
- package/dist/core/web/public/next/assets/{Funnel-zvDj3He4.js → Funnel-DxiGqJrt.js} +2 -2
- package/dist/core/web/public/next/assets/{Funnel-zvDj3He4.js.map → Funnel-DxiGqJrt.js.map} +1 -1
- package/dist/core/web/public/next/assets/GearTray-C3I89sIt.js +2 -0
- package/dist/core/web/public/next/assets/{GearTray-CkviqjYr.js.map → GearTray-C3I89sIt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{GrowthSection-Bg5sW0jI.js → GrowthSection-C3m2bPEz.js} +2 -2
- package/dist/core/web/public/next/assets/{GrowthSection-Bg5sW0jI.js.map → GrowthSection-C3m2bPEz.js.map} +1 -1
- package/dist/core/web/public/next/assets/HandoffDialog-Bjb96a0N.js +2 -0
- package/dist/core/web/public/next/assets/{HandoffDialog-DcPj1ri9.js.map → HandoffDialog-Bjb96a0N.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-Ci7TD96x.js → Input-ekTehVaH.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-Ci7TD96x.js.map → Input-ekTehVaH.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-85VBbbaZ.js +2 -0
- package/dist/core/web/public/next/assets/{LeaderCard-BSFTlMRF.js.map → LeaderCard-85VBbbaZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MatrixHeatmap-DojKZe9L.js → MatrixHeatmap-Bo8j0QPC.js} +2 -2
- package/dist/core/web/public/next/assets/{MatrixHeatmap-DojKZe9L.js.map → MatrixHeatmap-Bo8j0QPC.js.map} +1 -1
- package/dist/core/web/public/next/assets/McpSection-DvHFaVyp.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-CvcYu1X_.js.map → McpSection-DvHFaVyp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-BrLCrb73.js → MessageMarkdown-fsY_ltVa.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-BrLCrb73.js.map → MessageMarkdown-fsY_ltVa.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CjmdBw2p.js → MessageMarkdownRenderer-DDdtu82l.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CjmdBw2p.js.map → MessageMarkdownRenderer-DDdtu82l.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-DTHbmhQg.js → Meter-CeGDXdDM.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-DTHbmhQg.js.map → Meter-CeGDXdDM.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-CDVhHvXl.js +2 -0
- package/dist/core/web/public/next/assets/{MindSection-DcO9fmYe.js.map → MindSection-CDVhHvXl.js.map} +1 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-CrfJ0PdD.css +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DTQzEOHR.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DTQzEOHR.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6AuN0BF3.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouDrawer-hiTINupk.js.map → NeedsYouDrawer-6AuN0BF3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{NeedsYouList-B4Z37Phx.js → NeedsYouList-ChnRmbSk.js} +2 -2
- package/dist/core/web/public/next/assets/{NeedsYouList-B4Z37Phx.js.map → NeedsYouList-ChnRmbSk.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-B06E7sqg.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-utSckh7C.js.map → NewChatDialog-B06E7sqg.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-C2M3zov9.js +2 -0
- package/dist/core/web/public/next/assets/{OnboardingFlow-7N3YSUHN.js.map → OnboardingFlow-C2M3zov9.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-Bd6HsX1k.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-CqzkaAjG.js.map → PreviewPane-Bd6HsX1k.js.map} +1 -1
- package/dist/core/web/public/next/assets/ProviderLogo-Bz7KR5j3.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-Bz7KR5j3.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-CctCuuLy.js +2 -0
- package/dist/core/web/public/next/assets/{RailStatus-sZhApA8k.js.map → RailStatus-CctCuuLy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-C1uQIegT.js → RefreshIndicator-CKY5BGdD.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-C1uQIegT.js.map → RefreshIndicator-CKY5BGdD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CM_8pJs6.css → ResourcePoolConsoleApp-BX9JLkT4.css} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DXjjV6Sh.js → ResourcePoolConsoleApp-CspIsW_G.js} +5 -5
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DXjjV6Sh.js.map → ResourcePoolConsoleApp-CspIsW_G.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-B7fHZ6zX.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-B7fHZ6zX.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-uZEqC2EM.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B7-N9n7-.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B7-N9n7-.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-C_B11J0s.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-C_B11J0s.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DdxhTdZ6.css +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-_juw4EXd.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-_juw4EXd.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-D_YXvkPy.js +3 -0
- package/dist/core/web/public/next/assets/{SeatSelector-CT92PqM_.js.map → SeatSelector-D_YXvkPy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-BMvq-FfD.js → Segmented-DnKP6rr7.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-BMvq-FfD.js.map → Segmented-DnKP6rr7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-DkdeoSQn.js → Select-DlbUupTX.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-DkdeoSQn.js.map → Select-DlbUupTX.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionGate-DnuTZACL.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-DnuTZACL.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-DvMpXNpJ.css +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-C33-k-Q5.js +2 -0
- package/dist/core/web/public/next/assets/{SessionInsightChip-CwlakUYU.js.map → SessionInsightChip-C33-k-Q5.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-DFByh2NZ.js → SessionSearch-DhhR9Csg.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-DFByh2NZ.js.map → SessionSearch-DhhR9Csg.js.map} +1 -1
- package/dist/core/web/public/next/assets/SettingsSection-C0xQvCz3.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C0xQvCz3.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-BvNYOYv5.js +2 -0
- package/dist/core/web/public/next/assets/{Sheet-C7APkGPt.js.map → Sheet-BvNYOYv5.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-1nUBVO-Z.js +2 -0
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-ZPyXUS_I.js.map → ShortcutsOverlay-1nUBVO-Z.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-YrVvvBNM.js +3 -0
- package/dist/core/web/public/next/assets/{Sidebar-Chsgazmk.js.map → Sidebar-YrVvvBNM.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Slider-B0kjW7cd.js → Slider-B2c-dbQb.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-B0kjW7cd.js.map → Slider-B2c-dbQb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatusBadge-wv4e6f8b.js → StatusBadge-Q9YYkijx.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-wv4e6f8b.js.map → StatusBadge-Q9YYkijx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js → StepBand-Ci-C0GUG.js} +2 -2
- package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js.map → StepBand-Ci-C0GUG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js → Surface-DBovMq4P.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js.map → Surface-DBovMq4P.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Swimlane-Dcve56cP.js → Swimlane-Cdc4TqDe.js} +2 -2
- package/dist/core/web/public/next/assets/{Swimlane-Dcve56cP.js.map → Swimlane-Cdc4TqDe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Switch-DamlpSMY.js → Switch-CUrvzO2k.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-DamlpSMY.js.map → Switch-CUrvzO2k.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-Cs4tudBN.js → Tag-Bv8u6APt.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-Cs4tudBN.js.map → Tag-Bv8u6APt.js.map} +1 -1
- package/dist/core/web/public/next/assets/TerminalPane-BE4Xlqi5.js +7 -0
- package/dist/core/web/public/next/assets/{TerminalPane-BDkKFych.js.map → TerminalPane-BE4Xlqi5.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BGwejf0m.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-BE72VyBL.js.map → UniverseConsoleApp-BGwejf0m.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-Dh7A-hLD.css → UniverseConsoleApp-DfuT-wFw.css} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-BbmYY2P4.js → UniverseView-CgKa-WXC.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-BbmYY2P4.js.map → UniverseView-CgKa-WXC.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-CazsHm1f.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-CazsHm1f.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CTF3Shs0.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CTF3Shs0.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
- package/dist/core/web/public/next/assets/Workspace-CgdyXiEV.js +10 -0
- package/dist/core/web/public/next/assets/Workspace-CgdyXiEV.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-Dwri2jFJ.css +1 -0
- package/dist/core/web/public/next/assets/actions-MtxBGS5B.js +2 -0
- package/dist/core/web/public/next/assets/{actions-BnjZy8a-.js.map → actions-MtxBGS5B.js.map} +1 -1
- package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-CP7hgR-p.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-Cp6vO7FH.js.map → budget-queries-CP7hgR-p.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-9-Yb211u.js → capacity-strip-model-fHfu5cph.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-9-Yb211u.js.map → capacity-strip-model-fHfu5cph.js.map} +1 -1
- package/dist/core/web/public/next/assets/{charts-BmbKhjqw.js → charts-Bis9WSiS.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-BmbKhjqw.js.map → charts-Bis9WSiS.js.map} +1 -1
- package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-BsOepFz6.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-BsOepFz6.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud.module-DoFnr8ZH.js +2 -0
- package/dist/core/web/public/next/assets/cloud.module-DoFnr8ZH.js.map +1 -0
- package/dist/core/web/public/next/assets/{command-bus-DHJJLWh8.js → command-bus-CMvbYP5K.js} +2 -2
- package/dist/core/web/public/next/assets/{command-bus-DHJJLWh8.js.map → command-bus-CMvbYP5K.js.map} +1 -1
- package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +1 -0
- package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js +2 -0
- package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js.map +1 -0
- package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-su0g1h9o.js} +2 -2
- package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-su0g1h9o.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-Ci3Ch9t5.js +2 -0
- package/dist/core/web/public/next/assets/{context-model-DeJ28uSZ.js.map → context-model-Ci3Ch9t5.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-CjiJTnf1.js +2 -0
- package/dist/core/web/public/next/assets/{context-model-BGznyHNQ.js.map → context-model-CjiJTnf1.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-BDXT6LQ3.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-_mEgy4eg.js.map → context-queries-BDXT6LQ3.js.map} +1 -1
- package/dist/core/web/public/next/assets/control-queries-Dv-h1Clu.js +2 -0
- package/dist/core/web/public/next/assets/{control-queries-C4TG8blN.js.map → control-queries-Dv-h1Clu.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-icons-BB7Fi6hT.js → dock-icons-t--Eugrd.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-BB7Fi6hT.js.map → dock-icons-t--Eugrd.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-store-CdHQRP8s.js → dock-store-qIu7kSQE.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-store-CdHQRP8s.js.map → dock-store-qIu7kSQE.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-B4FKC7fH.js → fleet-model-IRbwfhkR.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-B4FKC7fH.js.map → fleet-model-IRbwfhkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/fleet-queries-7FVNByX1.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-7FVNByX1.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-QqQxQdvH.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-QqQxQdvH.js.map +1 -0
- package/dist/core/web/public/next/assets/{format-lW58rL2y.js → format-CaMmVQCn.js} +2 -2
- package/dist/core/web/public/next/assets/{format-lW58rL2y.js.map → format-CaMmVQCn.js.map} +1 -1
- package/dist/core/web/public/next/assets/git-model-B4S_GUNA.js +5 -0
- package/dist/core/web/public/next/assets/{git-model-DaGw1SzS.js.map → git-model-B4S_GUNA.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-BkNl4e6E.js +2 -0
- package/dist/core/web/public/next/assets/global-BkNl4e6E.js.map +1 -0
- package/dist/core/web/public/next/assets/global-BlI2BYa1.css +1 -0
- package/dist/core/web/public/next/assets/guarded-action-DHiL8tY5.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-DHiL8tY5.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-DmGEkM2P.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-DmGEkM2P.js.map +1 -0
- package/dist/core/web/public/next/assets/icon-base-NtFmP2yB.js +2 -0
- package/dist/core/web/public/next/assets/icon-base-NtFmP2yB.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C5EFt_Ts.js +2 -0
- package/dist/core/web/public/next/assets/icons-C5EFt_Ts.js.map +1 -0
- package/dist/core/web/public/next/assets/{index-Dk8R-3a7.js → index-DbDw9UAs.js} +3 -3
- package/dist/core/web/public/next/assets/{index-Dk8R-3a7.js.map → index-DbDw9UAs.js.map} +1 -1
- package/dist/core/web/public/next/assets/{live-model-44wEU6I8.js → live-model-DEwrl7_A.js} +2 -2
- package/dist/core/web/public/next/assets/{live-model-44wEU6I8.js.map → live-model-DEwrl7_A.js.map} +1 -1
- package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
- package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
- package/dist/core/web/public/next/assets/{mind.module-BOABBdi_.js → mind.module-CLhqMQak.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-BOABBdi_.js.map → mind.module-CLhqMQak.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-Kvzsg-iK.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-DjXM3IDg.js.map → mutations-Kvzsg-iK.js.map} +1 -1
- package/dist/core/web/public/next/assets/nav-C0IunEYF.js +2 -0
- package/dist/core/web/public/next/assets/nav-C0IunEYF.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-C_AfcL7q.js +2 -0
- package/dist/core/web/public/next/assets/{overnight-queries-Be_eossf.js.map → overnight-queries-C_AfcL7q.js.map} +1 -1
- package/dist/core/web/public/next/assets/preloaded-CctOitLu.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-CctOitLu.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-CbAGCNKt.js +1 -0
- package/dist/core/web/public/next/assets/{queries-CYEVCq5r.js → queries-THD05gHP.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-CYEVCq5r.js.map → queries-THD05gHP.js.map} +1 -1
- package/dist/core/web/public/next/assets/reasoning-pref-BVPu0SME.js +2 -0
- package/dist/core/web/public/next/assets/{reasoning-pref-a_ZP6GzU.js.map → reasoning-pref-BVPu0SME.js.map} +1 -1
- package/dist/core/web/public/next/assets/reveal-anchor-wCT5b4m3.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-wCT5b4m3.js.map +1 -0
- package/dist/core/web/public/next/assets/seat-subscription-CR_VylsK.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-CRigL-GE.js.map → seat-subscription-CR_VylsK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{section-visibility-u7q-Q9AA.js → section-visibility-B0xXUQJ0.js} +2 -2
- package/dist/core/web/public/next/assets/{section-visibility-u7q-Q9AA.js.map → section-visibility-B0xXUQJ0.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-i4WRuQ6j.js → sidebar-model-C5wVXGpb.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-i4WRuQ6j.js.map → sidebar-model-C5wVXGpb.js.map} +1 -1
- package/dist/core/web/public/next/assets/slots-DDd8cEoh.js +3 -0
- package/dist/core/web/public/next/assets/{slots-CV9ZuLQU.js.map → slots-DDd8cEoh.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-data-BFxAlefI.js +2 -0
- package/dist/core/web/public/next/assets/{surface-data-DLvmUX9z.js.map → surface-data-BFxAlefI.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-DWs5u9RO.js → tasks-model-DvkWveXs.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-DWs5u9RO.js.map → tasks-model-DvkWveXs.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-Ct9cZsEK.js → terminal-icons-Dp6pJgV2.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-Ct9cZsEK.js.map → terminal-icons-Dp6pJgV2.js.map} +1 -1
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-CI_y9oWZ.js → usage-queries-CUTmnegA.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-CI_y9oWZ.js.map → usage-queries-CUTmnegA.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-guarded-action-UCX2u1t1.js +2 -0
- package/dist/core/web/public/next/assets/{use-guarded-action-DVCtLzSo.js.map → use-guarded-action-UCX2u1t1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-C3LQ2IYs.js → use-ticker-OXAjob3y.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-C3LQ2IYs.js.map → use-ticker-OXAjob3y.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-token-gate-CDDRAoKH.js +2 -0
- package/dist/core/web/public/next/assets/{use-token-gate-B5gOFkeH.js.map → use-token-gate-CDDRAoKH.js.map} +1 -1
- package/dist/core/web/public/next/assets/useChartWidth-BW6SwYIK.css +1 -0
- package/dist/core/web/public/next/assets/useChartWidth-D9M7kUw7.js +2 -0
- package/dist/core/web/public/next/assets/{useChartWidth-0APW0BR3.js.map → useChartWidth-D9M7kUw7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BN8bso-n.js → useSeatsRefresh-B2dCVcj9.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BN8bso-n.js.map → useSeatsRefresh-B2dCVcj9.js.map} +1 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BL3CljSI.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BL3CljSI.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-DASWdYuE.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-DASWdYuE.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-BQ0Y2CSr.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-BQ0Y2CSr.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +3 -0
- package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-ui-store-D7YXi63q.js +3 -0
- package/dist/core/web/public/next/assets/{verse-ui-store-Dy4HuDBV.js.map → verse-ui-store-D7YXi63q.js.map} +1 -1
- package/dist/core/web/public/next/assets/{viewport-DDoJ_xVq.js → viewport-BYGH5EgA.js} +2 -2
- package/dist/core/web/public/next/assets/{viewport-DDoJ_xVq.js.map → viewport-BYGH5EgA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-BsL2LdR-.js → warmup-AsqwWCUi.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-BsL2LdR-.js.map → warmup-AsqwWCUi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-Dd3LmIym.js → workspace-model-CXorJr0G.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-Dd3LmIym.js.map → workspace-model-CXorJr0G.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +5 -2
- package/dist/cli/activation.d.ts +0 -41
- package/dist/cli/activation.js +0 -485
- package/dist/cli/activation.js.map +0 -1
- package/dist/core/fleet/generated-repair-resolution.d.ts +0 -36
- package/dist/core/fleet/generated-repair-resolution.js +0 -245
- package/dist/core/fleet/generated-repair-resolution.js.map +0 -1
- package/dist/core/local-runtime/llama/port.d.ts +0 -17
- package/dist/core/local-runtime/llama/port.js +0 -47
- package/dist/core/local-runtime/llama/port.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-host.d.ts +0 -54
- package/dist/core/local-runtime/llama/proxy-host.js +0 -159
- package/dist/core/local-runtime/llama/proxy-host.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-process.d.ts +0 -148
- package/dist/core/local-runtime/llama/proxy-process.js +0 -250
- package/dist/core/local-runtime/llama/proxy-process.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-record.d.ts +0 -40
- package/dist/core/local-runtime/llama/proxy-record.js +0 -133
- package/dist/core/local-runtime/llama/proxy-record.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +0 -118
- package/dist/core/local-runtime/llama/proxy-supervisor.js +0 -511
- package/dist/core/local-runtime/llama/proxy-supervisor.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CbDCLAxn.js +0 -7
- package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-BF5UCsMv.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-lLV-OR63.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BZReKwos.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BSFTlMRF.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-CvcYu1X_.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Cum_DqQZ.css +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js +0 -2
- package/dist/core/web/public/next/assets/NewChatDialog-utSckh7C.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-7N3YSUHN.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-6RMd_aZg.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-D1LZxQjN.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-D1LZxQjN.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-CT92PqM_.js +0 -3
- package/dist/core/web/public/next/assets/SessionInsightChip-CwlakUYU.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-C7APkGPt.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-ZPyXUS_I.js +0 -2
- package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js +0 -7
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BE72VyBL.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-CXJWDiEM.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +0 -1
- package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js +0 -10
- package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-BnjZy8a-.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-Cp6vO7FH.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js +0 -2
- package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-C4TG8blN.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-DaGw1SzS.js +0 -5
- package/dist/core/web/public/next/assets/global-DG1fmn4y.js +0 -2
- package/dist/core/web/public/next/assets/global-DG1fmn4y.js.map +0 -1
- package/dist/core/web/public/next/assets/global-_tOCFt9y.css +0 -1
- package/dist/core/web/public/next/assets/guarded-action--lguLXfz.js +0 -2
- package/dist/core/web/public/next/assets/guarded-action--lguLXfz.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-YPgbel-I.js +0 -2
- package/dist/core/web/public/next/assets/icons-YPgbel-I.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DjXM3IDg.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-Be_eossf.js +0 -2
- package/dist/core/web/public/next/assets/primitives-Dl3SEQvh.js +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-a_ZP6GzU.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js +0 -2
- package/dist/core/web/public/next/assets/slots-CV9ZuLQU.js +0 -3
- package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js +0 -2
- package/dist/core/web/public/next/assets/useActivity-C3R1Sudh.js +0 -2
- package/dist/core/web/public/next/assets/useActivity-C3R1Sudh.js.map +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js +0 -2
- package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +0 -1
- package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-queries-2PxoBISm.js +0 -2
- package/dist/core/web/public/next/assets/verse-queries-2PxoBISm.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js +0 -3
- package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-ui-store-Dy4HuDBV.js +0 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-Dk8R-3a7.js";import{D as r,L as i,S as a,T as ee,_ as o,c as s,d as c,f as te,h as l,i as ne,l as re,m as ie,n as ae,o as oe,r as se,s as ce,t as le,u,w as ue,x as d}from"./useChartWidth-0APW0BR3.js";import{c as f,i as p,l as m,m as h,n as de,p as fe,r as pe}from"./colors-BZ3a9wFf.js";import{l as me,n as g,o as _,t as he}from"./format-DKrNjdwD.js";var v=n(e(),1),y=t(),b=8,x=16,S=2,C=28,w=16,T=4,E=[`Mon`,``,`Wed`,``,`Fri`,``,``],D=[``,`Mon`,``,`Wed`,``,`Fri`,``];function O({title:e,description:t,caveat:n,status:r,days:i,weekStart:a=1,width:ee,formatValue:o=he,unit:c=``,ariaLabel:te}){let ie=(0,v.useRef)(null),se=le(ie,ee),u=(0,v.useId)(),ue=fe((0,v.useId)()),f=(0,v.useMemo)(()=>l(i,a),[i,a]),[p,m]=(0,v.useState)(null),de=Math.max(0,...i.map(e=>e.value??0)),pe=i.some(e=>e.value!==null),me=r??(i.length===0?{kind:`empty`}:pe?{kind:`ready`}:{kind:`unknown`}),_=se-C,O=Math.max(1,Math.floor((_+S)/10)),k=Math.min(f.weeks,O),A=f.weeks-k,j=Math.max(b,Math.min(x,Math.floor((_+S)/Math.max(1,k))-S)),M=A,N=f.cells.filter(e=>e.week>=M),P=C+k*(j+S),F=w+7*(j+S),I=e=>C+(e.week-M)*(j+S),L=e=>w+e.weekday*(j+S),R=c?` ${c}`:``,z=e=>`${g(e.day)}: ${e.value===null?`no data`:`${o(e.value)}${R}`}`,B=[];for(let e of f.months){if(e.week<M)continue;let t=B[B.length-1];t&&e.week-t.week<3||B.push(e)}let V=N.filter(e=>!e.outside),H=p===null?void 0:V[p];function U(e){if(V.length===0)return;let t=p??V.length-1,n=e.key===`ArrowLeft`?-7:e.key===`ArrowRight`?7:e.key===`ArrowUp`?-1:e.key===`ArrowDown`?1:null,r=null;n===null?e.key===`Home`?r=0:e.key===`End`&&(r=V.length-1):r=t+n,r!==null&&(e.preventDefault(),m(Math.max(0,Math.min(V.length-1,r))))}let W=i.filter(e=>e.value!==null),ge=W.reduce((e,t)=>e+(t.value??0),0),G=W.reduce((e,t)=>!e||(t.value??0)>(e.value??0)?t:e,null),K=te??`${e}: ${i.length} days, ${o(ge)}${R} in total`+(G&&(G.value??0)>0?`, busiest ${g(G.day)} with ${o(G.value)}`:``)+(i.length-W.length>0?`, ${i.length-W.length} days without data`:``)+`.`,_e=[{key:`day`,label:`Day`,render:e=>g(e.day)},{key:`value`,label:c?c[0].toUpperCase()+c.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:o(e.value)}],ve=(0,y.jsxs)(`div`,{className:s.legend,"aria-hidden":`true`,children:[(0,y.jsx)(`span`,{className:s.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,y.jsx)(`span`,{className:s.swatch,style:{background:h(t)}},t)),(0,y.jsx)(`span`,{className:s.legendItem,children:`More`}),(0,y.jsxs)(`span`,{className:s.legendItem,children:[(0,y.jsx)(`span`,{className:s.swatchHatch}),`no data`]})]});return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:me,table:(0,y.jsx)(re,{caption:e,columns:_e,rows:[...i].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,y.jsxs)(y.Fragment,{children:[ve,A>0?(0,y.jsxs)(`p`,{className:s.note,children:[`Showing the latest `,k,` weeks; `,A,` earlier weeks are in the table.`]}):null]}),children:(0,y.jsxs)(`div`,{ref:ie,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":u,onFocus:()=>m(e=>e??(V.length?V.length-1:null)),onBlur:()=>m(null),onKeyDown:U,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:P,height:F,viewBox:`0 0 ${P} ${F}`,role:`img`,"aria-label":K,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:ue})}),B.map(e=>(0,y.jsx)(`text`,{className:s.tick,x:C+(e.week-M)*(j+S),y:11,children:e.label},`${e.week}${e.label}`)),(a===1?E:D).map((e,t)=>e&&j>=10?(0,y.jsx)(`text`,{className:s.tick,x:0,y:w+t*(j+S)+j/2,dy:`0.32em`,children:e},t):null),N.map(e=>{if(e.outside)return null;let t=d(e.value,de,T),n=H?.day===e.day;return(0,y.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:I(e),y:L(e),width:j,height:j,rx:2,className:t===null?s.unknownMark:void 0,fill:t===null?`url(#${ue})`:h(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>m(V.indexOf(e)),onPointerLeave:()=>m(null)},e.day)})]}),(0,y.jsx)(`span`,{id:u,className:s.srOnly,"aria-live":`polite`,children:H?z(H):``}),H?(0,y.jsx)(ne,{left:ce(I(H)+j/2,P,60),top:L(H),title:g(H.day),rows:[{key:`v`,label:c||`Value`,value:H.value===null?null:o(H.value)}]}):null]})})}var k={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function A(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var j={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function M(e){return e===`positive`?p:e===`negative`?pe:`var(--text-secondary)`}function N(e,t){return e>0?`+${t(e)}`:t(e)}var P=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),F=28,I=22,L=12,R=480;function z({title:e,description:t,caveat:n,status:i,rows:a,unit:ee=``,gate:o,formatValue:c,unknownText:l=`not enough pairs yet`,width:ne,ariaLabel:ce}){let u=c??P,ue=(0,v.useRef)(null),d=le(ue,ne),[f,m]=(0,v.useState)(null),h=(0,v.useId)(),me=fe((0,v.useId)()),g=ee?` ${ee}`:``,_=a.filter(e=>A(e)!==`unknown`),he=i??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),b=d<R,x=Math.max(84,Math.min(180,Math.round(d*(b?.3:.26)))),S=b?0:118,C=x+8,w=Math.max(C+40,d-S-L),T=_.flatMap(e=>[e.low,e.high]),E=Math.min(0,o?.value??0,...T),D=Math.max(0,o?.value??0,...T),O=ie(E,D===E?E+1:D,{count:b?3:5,integer:te([...T,o?.value??0]),format:c?e=>e===0?`0`:N(e,c):void 0}),z=O.ticks,B=c?O.labels:O.labels.map((e,t)=>z[t]>0?`+${e}`:e),V=r(z[0],z[z.length-1],C,w),H=a.length*F,U=H+I,W=e=>{let t=A(e);return t===`unknown`?`${e.label}: ${l}`:`${e.label}: ${N(e.estimate,u)}${g}, 95% interval ${N(e.low,u)} to ${N(e.high,u)}; ${j[t]}`},ge=_.filter(e=>A(e)===`positive`).length,G=ce??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=f??0,n=e.key===`ArrowDown`?t+1:e.key===`ArrowUp`?t-1:e.key===`Home`?0:e.key===`End`?a.length-1:null;n!==null&&(e.preventDefault(),m(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${g}`,numeric:!0,render:e=>e.estimate===null?`—`:N(e.estimate,u)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${N(e.low,u)} to ${N(e.high,u)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>A(e)===`unknown`?l:j[A(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=f===null?void 0:a[f],q=Math.floor(x/7);return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:he,table:(0,y.jsx)(re,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,y.jsx)(se,{min:1,items:[{label:`Helped`,color:p},{label:`Hurt`,color:pe},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>_.length?[{label:l,kind:`hatch`}]:[]]}),children:(0,y.jsxs)(`div`,{ref:ue,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":h,onFocus:()=>m(e=>e??(a.length?0:null)),onBlur:()=>m(null),onKeyDown:K,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:d,height:U,viewBox:`0 0 ${d} ${U}`,role:`img`,"aria-label":G,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:me})}),z.map((e,t)=>(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{className:s.grid,x1:V(e),x2:V(e),y1:0,y2:H}),(0,y.jsx)(`text`,{className:s.tick,x:V(e),y:U-6,textAnchor:`middle`,children:B[t]})]},e)),(0,y.jsx)(`line`,{"data-role":`zero`,x1:V(0),x2:V(0),y1:0,y2:H,stroke:de,strokeWidth:1.5}),o&&o.value!==0?(0,y.jsx)(`g`,{"data-role":`gate`,children:(0,y.jsx)(`line`,{className:s.reference,x1:V(o.value),x2:V(o.value),y1:0,y2:H})}):null,a.map((e,t)=>{let n=t*F+F/2,r=A(e),i=M(r),a=f===t;return(0,y.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:f!==null&&!a?.55:1,children:[t%2==1?(0,y.jsx)(`rect`,{className:k.band,x:0,y:t*F,width:d,height:F}):null,(0,y.jsx)(`text`,{className:s.label,x,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,y.jsxs)(`g`,{"data-role":`unknown`,children:[(0,y.jsx)(`rect`,{className:s.unknownMark,fill:`url(#${me})`,x:C+.5,y:n-5,width:Math.max(1,w-C-1),height:10,rx:2}),b?null:(0,y.jsx)(`text`,{className:s.tick,x:d-L,y:n,dy:`0.32em`,textAnchor:`end`,children:l})]}):(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{"data-role":`ci`,x1:V(e.low),x2:V(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,y.jsx)(`line`,{x1:V(e.low),x2:V(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,y.jsx)(`line`,{x1:V(e.high),x2:V(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,y.jsx)(`rect`,{"data-role":`estimate`,className:s.marker,x:V(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),b?null:(0,y.jsxs)(`text`,{className:s.tick,x:d-L,y:n,dy:`0.32em`,textAnchor:`end`,children:[N(e.estimate,u),` [`,N(e.low,u),`, `,N(e.high,u),`]`]})]}),a?(0,y.jsx)(`rect`,{className:k.focusRing,x:1,y:t*F+1,width:d-2,height:26,rx:3}):null]},e.id)})]}),(0,y.jsx)(`span`,{id:h,className:s.srOnly,"aria-live":`polite`,children:ve?W(ve):``})]})})}function B(e,t){let n=[...e].filter(e=>Number.isFinite(e.at)).sort((e,t)=>e.at-t.at);return n.map((e,r)=>({...e,until:Math.max(e.at,r+1<n.length?n[r+1].at:t)}))}var V=18,H=26,U=14,W=864e5,ge=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1);function G(e,t){return e>0?`+${t(e)}`:t(e)}function K({title:e,description:t,caveat:n,status:l,steps:d,markers:p=[],now:h,from:de,baseline:g,unit:he=``,formatValue:b,formatTime:x,height:S=200,width:C,ariaLabel:w}){let T=b??ge,E=e=>a(e)?(x??_)(e):`—`,D=(0,v.useRef)(null),O=le(D,C),k=u(),[A,j]=(0,v.useState)(null),M=(0,v.useId)(),N=fe((0,v.useId)()),P=he?` ${he}`:``,F=h??Date.now(),I=B(d,F),L=p.filter(e=>a(e.at)),R=I.filter(e=>e.value!==null),z=l??(I.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:R.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),K=[...I.map(e=>e.at),...L.map(e=>e.at)].filter(a),_e=Math.max(a(F)?F:0,...K,...I.map(e=>e.until).filter(a)),ve=de!==void 0&&a(de)?de:K.length?Math.min(...K):_e-W,[q,ye]=o(ve,_e,c,`end`),be=R.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(g?.value??0,...be),Se=Math.max(g?.value??0,...be),Ce=ie(xe,Se===xe?xe+1:Se,{count:4,integer:te([...be,g?.value??0]),format:b?e=>e===0?`0`:G(e,b):void 0}),we=Ce.ticks,Te=b?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=i(Te,30,56,k),Y=Math.max(40,O-J-U),Ee=S-V-H,De=r(q,ye,J,J+Y),X=r(we[0],we[we.length-1],V+Ee,V),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=me(q,ye,x,[q,ye]),ke=ee([{key:`start`,x:J,anchor:`start`,priority:2,variants:Oe.map(e=>e(q))},{key:`end`,x:J+Y,anchor:`end`,priority:3,variants:Oe.map(e=>e(ye))}],{min:J,max:J+Y,charPx:ue(k)}),Ae=[],Q=[],je=null;for(let e of I){if(e.value===null){Q.length&&Ae.push(Q.join(` `)),Q=[],je=null;continue}let t=X(e.value),n=Z(e.at),r=Z(e.until);Q.push(je===null?`M${n.toFixed(1)},${t.toFixed(1)}`:`L${n.toFixed(1)},${t.toFixed(1)}`),Q.push(`L${r.toFixed(1)},${t.toFixed(1)}`),je=t}Q.length&&Ae.push(Q.join(` `));let Me=e=>`${e.label}${e.detail?` (${e.detail})`:``}, ${E(e.at)} to ${E(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,T)}${P}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,T)} to ${G(e.high,T)}`:``)),Ne=R[R.length-1],Pe=L.filter(e=>e.kind===`rollback`).length,Fe=w??`${e}: ${I.length} step${I.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,T)}${P}`:``)+(Pe?`, ${Pe} rollback${Pe===1?``:`s`}`:``)+`.`;function Ie(e){if(I.length===0)return;let t=A??I.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?I.length-1:null;n!==null&&(e.preventDefault(),j(Math.max(0,Math.min(I.length-1,n))))}let Le=[...I.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:G(e.value,T),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,T)} to ${G(e.high,T)}`})),...L.map(e=>({id:`m:${e.id}`,when:e.at,what:`${e.kind===`rollback`?`▼ Rolled back`:`▲ Adopted`}: ${e.label}`,value:``,interval:``}))].sort((e,t)=>e.when-t.when),Re=[{key:`when`,label:`When`,render:e=>E(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${P}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=A===null?void 0:I[A];return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:z,table:(0,y.jsx)(re,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,y.jsx)(se,{items:[{label:`Level`,color:f,kind:`line`},{label:`95% interval`,color:m},...Pe?[{label:`▼ rollback`,color:pe}]:[],...I.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,y.jsxs)(`div`,{ref:D,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":M,onFocus:()=>j(e=>e??(I.length?I.length-1:null)),onBlur:()=>j(null),onKeyDown:Ie,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:O,height:S,viewBox:`0 0 ${O} ${S}`,role:`img`,"aria-label":Fe,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:N})}),we.map((e,t)=>(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{className:s.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,y.jsx)(`text`,{className:s.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:s.tick,x:e.x,y:S-8,textAnchor:e.anchor,children:e.text},e.key)),g?(0,y.jsxs)(`g`,{"data-role":`baseline`,children:[(0,y.jsx)(`line`,{className:s.reference,x1:J,x2:J+Y,y1:X(g.value),y2:X(g.value)}),(0,y.jsx)(`text`,{className:`${s.tick} ${s.halo}`,x:J+4,y:X(g.value)-5,children:g.label})]}):null,I.map((e,t)=>{let n=Z(e.at),r=Math.max(n+1,Z(e.until));if(e.value===null)return(0,y.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:s.unknownMark,fill:`url(#${N})`,x:n,y:V,width:r-n,height:Ee,opacity:.6},e.id);let i=e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0;return(0,y.jsx)(`g`,{"data-step":e.id,opacity:A!==null&&A!==t?.6:1,children:i?(0,y.jsx)(`rect`,{"data-role":`band`,x:n,y:X(e.high),width:r-n,height:Math.max(1,X(e.low)-X(e.high)),fill:m,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,y.jsx)(`path`,{"data-role":`level`,className:s.line,stroke:f,d:e},t)),I.map(e=>e.value===null?null:(0,y.jsx)(`circle`,{className:s.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:f},`p${e.id}`)),L.map(e=>{let t=Z(e.at),n=e.kind===`rollback`?`M${t-5},8 L${t+5},8 L${t},16 Z`:`M${t-5},16 L${t+5},16 L${t},8 Z`;return(0,y.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?pe:f,children:(0,y.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${E(e.at)}`})},e.id)})]}),(0,y.jsx)(`span`,{id:M,className:s.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,y.jsx)(ne,{left:ce((Z($.at)+Z($.until))/2,O),top:$.value===null?V+Ee/2:X($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${G($.value,T)}${P}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,T)} to ${G($.high,T)}`},{key:`t`,label:`From`,value:E($.at)}]}):null]})})}export{z as n,O as r,K as t};
|
|
2
|
-
//# sourceMappingURL=StepBand-
|
|
1
|
+
import{a as e,n as t,s as n}from"./index-DbDw9UAs.js";import{D as r,L as i,S as a,T as ee,_ as o,c as s,d as c,f as te,h as l,i as ne,l as re,m as ie,n as ae,o as oe,r as se,s as ce,t as le,u,w as ue,x as d}from"./useChartWidth-D9M7kUw7.js";import{c as f,i as p,l as m,m as h,n as de,p as fe,r as pe}from"./colors-BZ3a9wFf.js";import{l as me,n as g,o as _,t as he}from"./format-DKrNjdwD.js";var v=n(e(),1),y=t(),b=8,x=16,S=2,C=28,w=16,T=4,E=[`Mon`,``,`Wed`,``,`Fri`,``,``],D=[``,`Mon`,``,`Wed`,``,`Fri`,``];function O({title:e,description:t,caveat:n,status:r,days:i,weekStart:a=1,width:ee,formatValue:o=he,unit:c=``,ariaLabel:te}){let ie=(0,v.useRef)(null),se=le(ie,ee),u=(0,v.useId)(),ue=fe((0,v.useId)()),f=(0,v.useMemo)(()=>l(i,a),[i,a]),[p,m]=(0,v.useState)(null),de=Math.max(0,...i.map(e=>e.value??0)),pe=i.some(e=>e.value!==null),me=r??(i.length===0?{kind:`empty`}:pe?{kind:`ready`}:{kind:`unknown`}),_=se-C,O=Math.max(1,Math.floor((_+S)/10)),k=Math.min(f.weeks,O),A=f.weeks-k,j=Math.max(b,Math.min(x,Math.floor((_+S)/Math.max(1,k))-S)),M=A,N=f.cells.filter(e=>e.week>=M),P=C+k*(j+S),F=w+7*(j+S),I=e=>C+(e.week-M)*(j+S),L=e=>w+e.weekday*(j+S),R=c?` ${c}`:``,z=e=>`${g(e.day)}: ${e.value===null?`no data`:`${o(e.value)}${R}`}`,B=[];for(let e of f.months){if(e.week<M)continue;let t=B[B.length-1];t&&e.week-t.week<3||B.push(e)}let V=N.filter(e=>!e.outside),H=p===null?void 0:V[p];function U(e){if(V.length===0)return;let t=p??V.length-1,n=e.key===`ArrowLeft`?-7:e.key===`ArrowRight`?7:e.key===`ArrowUp`?-1:e.key===`ArrowDown`?1:null,r=null;n===null?e.key===`Home`?r=0:e.key===`End`&&(r=V.length-1):r=t+n,r!==null&&(e.preventDefault(),m(Math.max(0,Math.min(V.length-1,r))))}let W=i.filter(e=>e.value!==null),ge=W.reduce((e,t)=>e+(t.value??0),0),G=W.reduce((e,t)=>!e||(t.value??0)>(e.value??0)?t:e,null),K=te??`${e}: ${i.length} days, ${o(ge)}${R} in total`+(G&&(G.value??0)>0?`, busiest ${g(G.day)} with ${o(G.value)}`:``)+(i.length-W.length>0?`, ${i.length-W.length} days without data`:``)+`.`,_e=[{key:`day`,label:`Day`,render:e=>g(e.day)},{key:`value`,label:c?c[0].toUpperCase()+c.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:o(e.value)}],ve=(0,y.jsxs)(`div`,{className:s.legend,"aria-hidden":`true`,children:[(0,y.jsx)(`span`,{className:s.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,y.jsx)(`span`,{className:s.swatch,style:{background:h(t)}},t)),(0,y.jsx)(`span`,{className:s.legendItem,children:`More`}),(0,y.jsxs)(`span`,{className:s.legendItem,children:[(0,y.jsx)(`span`,{className:s.swatchHatch}),`no data`]})]});return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:me,table:(0,y.jsx)(re,{caption:e,columns:_e,rows:[...i].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,y.jsxs)(y.Fragment,{children:[ve,A>0?(0,y.jsxs)(`p`,{className:s.note,children:[`Showing the latest `,k,` weeks; `,A,` earlier weeks are in the table.`]}):null]}),children:(0,y.jsxs)(`div`,{ref:ie,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":u,onFocus:()=>m(e=>e??(V.length?V.length-1:null)),onBlur:()=>m(null),onKeyDown:U,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:P,height:F,viewBox:`0 0 ${P} ${F}`,role:`img`,"aria-label":K,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:ue})}),B.map(e=>(0,y.jsx)(`text`,{className:s.tick,x:C+(e.week-M)*(j+S),y:11,children:e.label},`${e.week}${e.label}`)),(a===1?E:D).map((e,t)=>e&&j>=10?(0,y.jsx)(`text`,{className:s.tick,x:0,y:w+t*(j+S)+j/2,dy:`0.32em`,children:e},t):null),N.map(e=>{if(e.outside)return null;let t=d(e.value,de,T),n=H?.day===e.day;return(0,y.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:I(e),y:L(e),width:j,height:j,rx:2,className:t===null?s.unknownMark:void 0,fill:t===null?`url(#${ue})`:h(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>m(V.indexOf(e)),onPointerLeave:()=>m(null)},e.day)})]}),(0,y.jsx)(`span`,{id:u,className:s.srOnly,"aria-live":`polite`,children:H?z(H):``}),H?(0,y.jsx)(ne,{left:ce(I(H)+j/2,P,60),top:L(H),title:g(H.day),rows:[{key:`v`,label:c||`Value`,value:H.value===null?null:o(H.value)}]}):null]})})}var k={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function A(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var j={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function M(e){return e===`positive`?p:e===`negative`?pe:`var(--text-secondary)`}function N(e,t){return e>0?`+${t(e)}`:t(e)}var P=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),F=28,I=22,L=12,R=480;function z({title:e,description:t,caveat:n,status:i,rows:a,unit:ee=``,gate:o,formatValue:c,unknownText:l=`not enough pairs yet`,width:ne,ariaLabel:ce}){let u=c??P,ue=(0,v.useRef)(null),d=le(ue,ne),[f,m]=(0,v.useState)(null),h=(0,v.useId)(),me=fe((0,v.useId)()),g=ee?` ${ee}`:``,_=a.filter(e=>A(e)!==`unknown`),he=i??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),b=d<R,x=Math.max(84,Math.min(180,Math.round(d*(b?.3:.26)))),S=b?0:118,C=x+8,w=Math.max(C+40,d-S-L),T=_.flatMap(e=>[e.low,e.high]),E=Math.min(0,o?.value??0,...T),D=Math.max(0,o?.value??0,...T),O=ie(E,D===E?E+1:D,{count:b?3:5,integer:te([...T,o?.value??0]),format:c?e=>e===0?`0`:N(e,c):void 0}),z=O.ticks,B=c?O.labels:O.labels.map((e,t)=>z[t]>0?`+${e}`:e),V=r(z[0],z[z.length-1],C,w),H=a.length*F,U=H+I,W=e=>{let t=A(e);return t===`unknown`?`${e.label}: ${l}`:`${e.label}: ${N(e.estimate,u)}${g}, 95% interval ${N(e.low,u)} to ${N(e.high,u)}; ${j[t]}`},ge=_.filter(e=>A(e)===`positive`).length,G=ce??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=f??0,n=e.key===`ArrowDown`?t+1:e.key===`ArrowUp`?t-1:e.key===`Home`?0:e.key===`End`?a.length-1:null;n!==null&&(e.preventDefault(),m(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${g}`,numeric:!0,render:e=>e.estimate===null?`—`:N(e.estimate,u)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${N(e.low,u)} to ${N(e.high,u)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>A(e)===`unknown`?l:j[A(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=f===null?void 0:a[f],q=Math.floor(x/7);return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:he,table:(0,y.jsx)(re,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,y.jsx)(se,{min:1,items:[{label:`Helped`,color:p},{label:`Hurt`,color:pe},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>_.length?[{label:l,kind:`hatch`}]:[]]}),children:(0,y.jsxs)(`div`,{ref:ue,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":h,onFocus:()=>m(e=>e??(a.length?0:null)),onBlur:()=>m(null),onKeyDown:K,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:d,height:U,viewBox:`0 0 ${d} ${U}`,role:`img`,"aria-label":G,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:me})}),z.map((e,t)=>(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{className:s.grid,x1:V(e),x2:V(e),y1:0,y2:H}),(0,y.jsx)(`text`,{className:s.tick,x:V(e),y:U-6,textAnchor:`middle`,children:B[t]})]},e)),(0,y.jsx)(`line`,{"data-role":`zero`,x1:V(0),x2:V(0),y1:0,y2:H,stroke:de,strokeWidth:1.5}),o&&o.value!==0?(0,y.jsx)(`g`,{"data-role":`gate`,children:(0,y.jsx)(`line`,{className:s.reference,x1:V(o.value),x2:V(o.value),y1:0,y2:H})}):null,a.map((e,t)=>{let n=t*F+F/2,r=A(e),i=M(r),a=f===t;return(0,y.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:f!==null&&!a?.55:1,children:[t%2==1?(0,y.jsx)(`rect`,{className:k.band,x:0,y:t*F,width:d,height:F}):null,(0,y.jsx)(`text`,{className:s.label,x,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,y.jsxs)(`g`,{"data-role":`unknown`,children:[(0,y.jsx)(`rect`,{className:s.unknownMark,fill:`url(#${me})`,x:C+.5,y:n-5,width:Math.max(1,w-C-1),height:10,rx:2}),b?null:(0,y.jsx)(`text`,{className:s.tick,x:d-L,y:n,dy:`0.32em`,textAnchor:`end`,children:l})]}):(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{"data-role":`ci`,x1:V(e.low),x2:V(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,y.jsx)(`line`,{x1:V(e.low),x2:V(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,y.jsx)(`line`,{x1:V(e.high),x2:V(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,y.jsx)(`rect`,{"data-role":`estimate`,className:s.marker,x:V(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),b?null:(0,y.jsxs)(`text`,{className:s.tick,x:d-L,y:n,dy:`0.32em`,textAnchor:`end`,children:[N(e.estimate,u),` [`,N(e.low,u),`, `,N(e.high,u),`]`]})]}),a?(0,y.jsx)(`rect`,{className:k.focusRing,x:1,y:t*F+1,width:d-2,height:26,rx:3}):null]},e.id)})]}),(0,y.jsx)(`span`,{id:h,className:s.srOnly,"aria-live":`polite`,children:ve?W(ve):``})]})})}function B(e,t){let n=[...e].filter(e=>Number.isFinite(e.at)).sort((e,t)=>e.at-t.at);return n.map((e,r)=>({...e,until:Math.max(e.at,r+1<n.length?n[r+1].at:t)}))}var V=18,H=26,U=14,W=864e5,ge=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1);function G(e,t){return e>0?`+${t(e)}`:t(e)}function K({title:e,description:t,caveat:n,status:l,steps:d,markers:p=[],now:h,from:de,baseline:g,unit:he=``,formatValue:b,formatTime:x,height:S=200,width:C,ariaLabel:w}){let T=b??ge,E=e=>a(e)?(x??_)(e):`—`,D=(0,v.useRef)(null),O=le(D,C),k=u(),[A,j]=(0,v.useState)(null),M=(0,v.useId)(),N=fe((0,v.useId)()),P=he?` ${he}`:``,F=h??Date.now(),I=B(d,F),L=p.filter(e=>a(e.at)),R=I.filter(e=>e.value!==null),z=l??(I.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:R.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),K=[...I.map(e=>e.at),...L.map(e=>e.at)].filter(a),_e=Math.max(a(F)?F:0,...K,...I.map(e=>e.until).filter(a)),ve=de!==void 0&&a(de)?de:K.length?Math.min(...K):_e-W,[q,ye]=o(ve,_e,c,`end`),be=R.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(g?.value??0,...be),Se=Math.max(g?.value??0,...be),Ce=ie(xe,Se===xe?xe+1:Se,{count:4,integer:te([...be,g?.value??0]),format:b?e=>e===0?`0`:G(e,b):void 0}),we=Ce.ticks,Te=b?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=i(Te,30,56,k),Y=Math.max(40,O-J-U),Ee=S-V-H,De=r(q,ye,J,J+Y),X=r(we[0],we[we.length-1],V+Ee,V),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=me(q,ye,x,[q,ye]),ke=ee([{key:`start`,x:J,anchor:`start`,priority:2,variants:Oe.map(e=>e(q))},{key:`end`,x:J+Y,anchor:`end`,priority:3,variants:Oe.map(e=>e(ye))}],{min:J,max:J+Y,charPx:ue(k)}),Ae=[],Q=[],je=null;for(let e of I){if(e.value===null){Q.length&&Ae.push(Q.join(` `)),Q=[],je=null;continue}let t=X(e.value),n=Z(e.at),r=Z(e.until);Q.push(je===null?`M${n.toFixed(1)},${t.toFixed(1)}`:`L${n.toFixed(1)},${t.toFixed(1)}`),Q.push(`L${r.toFixed(1)},${t.toFixed(1)}`),je=t}Q.length&&Ae.push(Q.join(` `));let Me=e=>`${e.label}${e.detail?` (${e.detail})`:``}, ${E(e.at)} to ${E(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,T)}${P}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,T)} to ${G(e.high,T)}`:``)),Ne=R[R.length-1],Pe=L.filter(e=>e.kind===`rollback`).length,Fe=w??`${e}: ${I.length} step${I.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,T)}${P}`:``)+(Pe?`, ${Pe} rollback${Pe===1?``:`s`}`:``)+`.`;function Ie(e){if(I.length===0)return;let t=A??I.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?I.length-1:null;n!==null&&(e.preventDefault(),j(Math.max(0,Math.min(I.length-1,n))))}let Le=[...I.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:G(e.value,T),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,T)} to ${G(e.high,T)}`})),...L.map(e=>({id:`m:${e.id}`,when:e.at,what:`${e.kind===`rollback`?`▼ Rolled back`:`▲ Adopted`}: ${e.label}`,value:``,interval:``}))].sort((e,t)=>e.when-t.when),Re=[{key:`when`,label:`When`,render:e=>E(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${P}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=A===null?void 0:I[A];return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:z,table:(0,y.jsx)(re,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,y.jsx)(se,{items:[{label:`Level`,color:f,kind:`line`},{label:`95% interval`,color:m},...Pe?[{label:`▼ rollback`,color:pe}]:[],...I.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,y.jsxs)(`div`,{ref:D,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":M,onFocus:()=>j(e=>e??(I.length?I.length-1:null)),onBlur:()=>j(null),onKeyDown:Ie,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:O,height:S,viewBox:`0 0 ${O} ${S}`,role:`img`,"aria-label":Fe,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:N})}),we.map((e,t)=>(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{className:s.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,y.jsx)(`text`,{className:s.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:s.tick,x:e.x,y:S-8,textAnchor:e.anchor,children:e.text},e.key)),g?(0,y.jsxs)(`g`,{"data-role":`baseline`,children:[(0,y.jsx)(`line`,{className:s.reference,x1:J,x2:J+Y,y1:X(g.value),y2:X(g.value)}),(0,y.jsx)(`text`,{className:`${s.tick} ${s.halo}`,x:J+4,y:X(g.value)-5,children:g.label})]}):null,I.map((e,t)=>{let n=Z(e.at),r=Math.max(n+1,Z(e.until));if(e.value===null)return(0,y.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:s.unknownMark,fill:`url(#${N})`,x:n,y:V,width:r-n,height:Ee,opacity:.6},e.id);let i=e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0;return(0,y.jsx)(`g`,{"data-step":e.id,opacity:A!==null&&A!==t?.6:1,children:i?(0,y.jsx)(`rect`,{"data-role":`band`,x:n,y:X(e.high),width:r-n,height:Math.max(1,X(e.low)-X(e.high)),fill:m,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,y.jsx)(`path`,{"data-role":`level`,className:s.line,stroke:f,d:e},t)),I.map(e=>e.value===null?null:(0,y.jsx)(`circle`,{className:s.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:f},`p${e.id}`)),L.map(e=>{let t=Z(e.at),n=e.kind===`rollback`?`M${t-5},8 L${t+5},8 L${t},16 Z`:`M${t-5},16 L${t+5},16 L${t},8 Z`;return(0,y.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?pe:f,children:(0,y.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${E(e.at)}`})},e.id)})]}),(0,y.jsx)(`span`,{id:M,className:s.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,y.jsx)(ne,{left:ce((Z($.at)+Z($.until))/2,O),top:$.value===null?V+Ee/2:X($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${G($.value,T)}${P}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,T)} to ${G($.high,T)}`},{key:`t`,label:`From`,value:E($.at)}]}):null]})})}export{z as n,O as r,K as t};
|
|
2
|
+
//# sourceMappingURL=StepBand-Ci-C0GUG.js.map
|
package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js.map → StepBand-Ci-C0GUG.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StepBand-Db8WPw8J.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/CalendarHeatmap.tsx","../../../../../../src/web-ui/components/charts/ForestPlot.module.css","../../../../../../src/web-ui/components/charts/ForestPlot.tsx","../../../../../../src/web-ui/components/charts/StepBand.tsx"],"sourcesContent":["/**\n * components/charts/CalendarHeatmap.tsx — one value per day on a weeks ×\n * weekdays grid (activity by day across months). Sequential: ONE hue, four\n * steps light → dark mixed from the theme's own tokens, with a Less → More\n * key. A TRUE ZERO is the faint step-0 cell; UNKNOWN (null, or a day missing\n * from the data) is the 45° unknown hatch with an outline (V3.10) and its own\n * \"no data\" key entry — the two are never the same colour, and texture keeps\n * them apart under colour-blindness too.\n *\n * Width: the cell size adapts (8–16 px). When even 8 px cells cannot fit the\n * whole span at 375 px, the grid shows the most recent weeks that fit and says\n * how many are hidden; the Table view always has every day.\n *\n * Keyboard: the grid is one tab stop; ← → move a week, ↑ ↓ move a day (rows\n * are weekdays), Home/End jump to the ends; the focused day is announced.\n */\nimport { useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { hatchPatternId, heatColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { calendarGrid, heatBucket, type CalendarCell } from './chart-math.js';\nimport { formatCompact, formatDayLabel } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface CalendarDatum {\n day: string;\n value: number | null;\n}\n\nexport interface CalendarHeatmapProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n days: CalendarDatum[];\n /** 1 = Monday (ISO, default), 0 = Sunday. */\n weekStart?: 0 | 1;\n width?: number;\n formatValue?: (v: number) => string;\n /** Unit for the spoken/tooltip text, e.g. \"runs\". */\n unit?: string;\n ariaLabel?: string;\n}\n\nconst MIN_CELL = 8;\nconst MAX_CELL = 16;\nconst GAP = 2;\nconst DAY_LABEL_W = 28;\nconst MONTH_H = 16;\nconst STEPS = 4;\nconst WEEKDAYS_MON = ['Mon', '', 'Wed', '', 'Fri', '', ''];\nconst WEEKDAYS_SUN = ['', 'Mon', '', 'Wed', '', 'Fri', ''];\n\nexport function CalendarHeatmap({\n title,\n description,\n caveat,\n status,\n days,\n weekStart = 1,\n width: fixedWidth,\n formatValue = formatCompact,\n unit = '',\n ariaLabel,\n}: CalendarHeatmapProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const grid = useMemo(() => calendarGrid(days, weekStart), [days, weekStart]);\n const [focus, setFocus] = useState<number | null>(null);\n\n const max = Math.max(0, ...days.map((d) => d.value ?? 0));\n const anyKnown = days.some((d) => d.value !== null);\n const resolvedStatus: ChartStatus = status ?? (days.length === 0 ? { kind: 'empty' } : anyKnown ? { kind: 'ready' } : { kind: 'unknown' });\n\n const avail = width - DAY_LABEL_W;\n const fitWeeks = Math.max(1, Math.floor((avail + GAP) / (MIN_CELL + GAP)));\n const shownWeeks = Math.min(grid.weeks, fitWeeks);\n const hiddenWeeks = grid.weeks - shownWeeks;\n const cell = Math.max(MIN_CELL, Math.min(MAX_CELL, Math.floor((avail + GAP) / Math.max(1, shownWeeks)) - GAP));\n const firstWeek = hiddenWeeks;\n const visible = grid.cells.filter((c) => c.week >= firstWeek);\n const svgW = DAY_LABEL_W + shownWeeks * (cell + GAP);\n const svgH = MONTH_H + 7 * (cell + GAP);\n const xOf = (c: CalendarCell) => DAY_LABEL_W + (c.week - firstWeek) * (cell + GAP);\n const yOf = (c: CalendarCell) => MONTH_H + c.weekday * (cell + GAP);\n const unitText = unit ? ` ${unit}` : '';\n const describe = (c: CalendarCell) => `${formatDayLabel(c.day)}: ${c.value === null ? 'no data' : `${formatValue(c.value)}${unitText}`}`;\n\n const monthLabels: { week: number; label: string }[] = [];\n for (const m of grid.months) {\n if (m.week < firstWeek) continue;\n const prev = monthLabels[monthLabels.length - 1];\n if (prev && m.week - prev.week < 3) continue;\n monthLabels.push(m);\n }\n\n const inside = visible.filter((c) => !c.outside);\n const focusCell = focus !== null ? inside[focus] : undefined;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (inside.length === 0) return;\n const cur = focus ?? inside.length - 1;\n const delta = e.key === 'ArrowLeft' ? -7 : e.key === 'ArrowRight' ? 7 : e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : null;\n let next: number | null = null;\n if (delta !== null) next = cur + delta;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = inside.length - 1;\n if (next === null) return;\n e.preventDefault();\n setFocus(Math.max(0, Math.min(inside.length - 1, next)));\n }\n\n const knownDays = days.filter((d) => d.value !== null);\n const total = knownDays.reduce((s, d) => s + (d.value ?? 0), 0);\n const busiest = knownDays.reduce<CalendarDatum | null>((b, d) => (!b || (d.value ?? 0) > (b.value ?? 0) ? d : b), null);\n const summary = ariaLabel ?? `${title}: ${days.length} days, ${formatValue(total)}${unitText} in total` +\n (busiest && (busiest.value ?? 0) > 0 ? `, busiest ${formatDayLabel(busiest.day)} with ${formatValue(busiest.value!)}` : '') +\n (days.length - knownDays.length > 0 ? `, ${days.length - knownDays.length} days without data` : '') + '.';\n\n const columns: TableColumn<CalendarDatum>[] = [\n { key: 'day', label: 'Day', render: (d) => formatDayLabel(d.day) },\n { key: 'value', label: unit ? unit[0]!.toUpperCase() + unit.slice(1) : 'Value', numeric: true, render: (d) => (d.value === null ? '—' : formatValue(d.value)) },\n ];\n\n const legend = (\n <div className={plot.legend} aria-hidden=\"true\">\n <span className={plot.legendItem}>Less</span>\n {Array.from({ length: STEPS + 1 }, (_, i) => (\n <span key={i} className={plot.swatch} style={{ background: heatColor(i) }} />\n ))}\n <span className={plot.legendItem}>More</span>\n <span className={plot.legendItem}>\n <span className={plot.swatchHatch} />\n no data\n </span>\n </div>\n );\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={[...days].sort((a, b) => a.day.localeCompare(b.day))} rowKey={(d) => d.day} />}\n footer={\n <>\n {legend}\n {hiddenWeeks > 0 ? (\n <p className={plot.note}>Showing the latest {shownWeeks} weeks; {hiddenWeeks} earlier weeks are in the table.</p>\n ) : null}\n </>\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the arrow keys to move between days.`}\n aria-describedby={liveId}\n onFocus={() => setFocus((f) => f ?? (inside.length ? inside.length - 1 : null))}\n onBlur={() => setFocus(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={svgW} height={svgH} viewBox={`0 0 ${svgW} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {monthLabels.map((m) => (\n <text key={`${m.week}${m.label}`} className={plot.tick} x={DAY_LABEL_W + (m.week - firstWeek) * (cell + GAP)} y={11}>\n {m.label}\n </text>\n ))}\n {(weekStart === 1 ? WEEKDAYS_MON : WEEKDAYS_SUN).map((label, i) =>\n label && cell >= 10 ? (\n <text key={i} className={plot.tick} x={0} y={MONTH_H + i * (cell + GAP) + cell / 2} dy=\"0.32em\">{label}</text>\n ) : null,\n )}\n {visible.map((c) => {\n if (c.outside) return null;\n const bucket = heatBucket(c.value, max, STEPS);\n const isFocus = focusCell?.day === c.day;\n return (\n <rect\n key={c.day}\n data-day={c.day}\n data-bucket={bucket === null ? 'unknown' : bucket}\n x={xOf(c)}\n y={yOf(c)}\n width={cell}\n height={cell}\n rx={2}\n className={bucket === null ? plot.unknownMark : undefined}\n fill={bucket === null ? `url(#${hatchId})` : heatColor(bucket)}\n style={isFocus ? { stroke: 'var(--border-focus)', strokeWidth: 2, strokeDasharray: 'none' } : undefined}\n onPointerEnter={() => setFocus(inside.indexOf(c))}\n onPointerLeave={() => setFocus(null)}\n />\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{focusCell ? describe(focusCell) : ''}</span>\n {focusCell ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(focusCell) + cell / 2, svgW, 60)}\n top={yOf(focusCell)}\n title={formatDayLabel(focusCell.day)}\n rows={[{ key: 'v', label: unit || 'Value', value: focusCell.value === null ? null : formatValue(focusCell.value) }]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/* ForestPlot — row banding and the keyboard focus ring. Colours are chart\n tokens only (style-scan-310 bans raw hex and px font sizes here). */\n.band {\n fill: var(--chart-grid);\n opacity: 0.35;\n}\n\n.focusRing {\n fill: none;\n stroke: var(--border-focus);\n stroke-width: 1.5;\n pointer-events: none;\n}\n","/**\n * components/charts/ForestPlot.tsx — one row per experiment: the point\n * estimate with its 95% confidence interval as a whisker, against a zero line\n * (V3.10, SPEC-310C §5 Growth; r5/visual.md §2 \"ForestPlot\").\n *\n * The question it answers is \"which changes REALLY helped?\", so the encoding\n * is about the interval, not the dot:\n * - interval entirely above zero → the positive diverging pole (azure),\n * - entirely below zero → the negative pole (danger),\n * - straddling zero → neutral ink (\"no detectable effect\"),\n * and the verdict is also written in words in every row's spoken label and\n * in the table — colour is never the only carrier.\n *\n * Honesty: a row whose estimate is still null (fewer pairs than the gate\n * needs) draws the unknown hatch across the plot with \"not enough pairs yet\",\n * never a dot at zero. An optional `gate` draws the adoption threshold as a\n * labelled dashed reference (the gate is \"CI low > gate\", SPEC-310B §5).\n *\n * Keyboard: the plot is one tab stop; ↑/↓ (Home/End) walk the rows and the\n * focused row is announced. Works at 375 px: the numeric column folds away\n * (it is in the table) and labels truncate with the full text spoken.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_MID, CHART_DIVERGING_NEG, CHART_DIVERGING_POS, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, HatchPattern } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { allIntegers, axisTicks, linearScale } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\nimport styles from './ForestPlot.module.css';\n\nexport interface ForestRow {\n id: string;\n label: string;\n /** Point estimate (e.g. lift in percentage points); null = not estimable yet. */\n estimate: number | null;\n /** 95% CI bounds; null when the estimate is null. */\n low: number | null;\n high: number | null;\n /** Sample size behind the row (pairs); null = unknown. */\n n?: number | null;\n /** One short qualifier for the table (\"adopted\", \"running\", \"rejected\"). */\n detail?: string;\n}\n\nexport interface ForestPlotProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n rows: ForestRow[];\n /** Unit word after numbers in words and the table (\"pts\"). */\n unit?: string;\n /** A labelled reference the CI low must clear, e.g. { value: 0, label: 'Adoption gate' }. Drawn only when ≠ 0. */\n gate?: { value: number; label: string };\n formatValue?: (v: number) => string;\n /** What an unknown row says (default \"not enough pairs yet\"). */\n unknownText?: string;\n width?: number;\n ariaLabel?: string;\n}\n\nexport type ForestVerdict = 'positive' | 'negative' | 'none' | 'unknown';\n\n/** Where a row's interval sits relative to zero. */\nexport function forestVerdict(row: Pick<ForestRow, 'estimate' | 'low' | 'high'>): ForestVerdict {\n if (row.estimate === null || row.low === null || row.high === null) return 'unknown';\n if (row.low > 0) return 'positive';\n if (row.high < 0) return 'negative';\n return 'none';\n}\n\nconst VERDICT_WORDS: Record<ForestVerdict, string> = {\n positive: 'helped (interval above zero)',\n negative: 'hurt (interval below zero)',\n none: 'no clear effect (interval crosses zero)',\n unknown: 'unknown',\n};\n\nfunction verdictColor(verdict: ForestVerdict): string {\n if (verdict === 'positive') return CHART_DIVERGING_POS;\n if (verdict === 'negative') return CHART_DIVERGING_NEG;\n return 'var(--text-secondary)';\n}\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\n\nconst ROW_H = 28;\nconst AXIS_H = 22;\nconst PAD_R = 12;\nconst NARROW = 480;\n\nexport function ForestPlot({\n title,\n description,\n caveat,\n status,\n rows,\n unit = '',\n gate,\n formatValue: formatValueProp,\n unknownText = 'not enough pairs yet',\n width: fixedWidth,\n ariaLabel,\n}: ForestPlotProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n\n const known = rows.filter((r) => forestVerdict(r) !== 'unknown');\n const resolvedStatus: ChartStatus = status ?? (rows.length === 0 ? { kind: 'empty', message: 'No experiments have run yet.' } : { kind: 'ready' });\n\n const narrow = width < NARROW;\n const labelW = Math.max(84, Math.min(180, Math.round(width * (narrow ? 0.3 : 0.26))));\n const valueW = narrow ? 0 : 118;\n const plotX0 = labelW + 8;\n const plotX1 = Math.max(plotX0 + 40, width - valueW - PAD_R);\n const bounds = known.flatMap((r) => [r.low!, r.high!]);\n const lo = Math.min(0, gate?.value ?? 0, ...bounds);\n const hi = Math.max(0, gate?.value ?? 0, ...bounds);\n // Tick labels at the step's own precision (a lift axis of 0.25 steps\n // printed at one decimal read \"+0.3 / +0.8\"); a caller's formatter is\n // held to printing every tick faithfully.\n const xAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: narrow ? 3 : 5,\n integer: allIntegers([...bounds, gate?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = xAxis.ticks;\n const tickLabels = formatValueProp ? xAxis.labels : xAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const xs = linearScale(ticks[0]!, ticks[ticks.length - 1]!, plotX0, plotX1);\n const bodyH = rows.length * ROW_H;\n const svgH = bodyH + AXIS_H;\n\n const spoken = (r: ForestRow): string => {\n const v = forestVerdict(r);\n if (v === 'unknown') return `${r.label}: ${unknownText}`;\n return `${r.label}: ${signed(r.estimate!, formatValue)}${unitText}, 95% interval ${signed(r.low!, formatValue)} to ${signed(r.high!, formatValue)}; ${VERDICT_WORDS[v]}`;\n };\n\n const positive = known.filter((r) => forestVerdict(r) === 'positive').length;\n const summary = ariaLabel ?? `${title}: ${rows.length} experiment${rows.length === 1 ? '' : 's'}, ${positive} with an interval above zero.`;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? 0;\n const next = e.key === 'ArrowDown' ? cur + 1 : e.key === 'ArrowUp' ? cur - 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const columns: TableColumn<ForestRow>[] = [\n { key: 'label', label: 'Experiment', render: (r) => r.label },\n { key: 'est', label: `Estimate${unitText}`, numeric: true, render: (r) => (r.estimate === null ? '—' : signed(r.estimate, formatValue)) },\n {\n key: 'ci',\n label: '95% interval',\n numeric: true,\n render: (r) => (r.low === null || r.high === null ? '—' : `${signed(r.low, formatValue)} to ${signed(r.high, formatValue)}`),\n },\n { key: 'n', label: 'Pairs', numeric: true, render: (r) => (r.n === null || r.n === undefined ? '—' : String(r.n)) },\n { key: 'verdict', label: 'Reading', render: (r) => (forestVerdict(r) === 'unknown' ? unknownText : VERDICT_WORDS[forestVerdict(r)]) },\n ...(rows.some((r) => r.detail) ? [{ key: 'detail', label: 'Status', render: (r: ForestRow) => r.detail ?? '' }] : []),\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n const labelChars = Math.floor(labelW / 7);\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n min={1}\n items={[\n { label: 'Helped', color: CHART_DIVERGING_POS },\n { label: 'Hurt', color: CHART_DIVERGING_NEG },\n { label: 'No clear effect', color: 'var(--text-secondary)' },\n ...(rows.length > known.length ? [{ label: unknownText, kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the up and down arrow keys to read each experiment.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? 0 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={svgH} viewBox={`0 0 ${width} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={xs(t)} x2={xs(t)} y1={0} y2={bodyH} />\n <text className={plot.tick} x={xs(t)} y={svgH - 6} textAnchor=\"middle\">\n {tickLabels[i]}\n </text>\n </g>\n ))}\n <line data-role=\"zero\" x1={xs(0)} x2={xs(0)} y1={0} y2={bodyH} stroke={CHART_DIVERGING_MID} strokeWidth={1.5} />\n {gate && gate.value !== 0 ? (\n <g data-role=\"gate\">\n <line className={plot.reference} x1={xs(gate.value)} x2={xs(gate.value)} y1={0} y2={bodyH} />\n </g>\n ) : null}\n {rows.map((r, i) => {\n const y = i * ROW_H + ROW_H / 2;\n const v = forestVerdict(r);\n const color = verdictColor(v);\n const isActive = active === i;\n return (\n <g key={r.id} data-row={r.id} data-verdict={v} opacity={active !== null && !isActive ? 0.55 : 1}>\n {i % 2 === 1 ? <rect className={styles.band} x={0} y={i * ROW_H} width={width} height={ROW_H} /> : null}\n <text className={plot.label} x={labelW} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {r.label.length > labelChars ? `${r.label.slice(0, labelChars - 1)}…` : r.label}\n </text>\n {v === 'unknown' ? (\n <g data-role=\"unknown\">\n <rect\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={plotX0 + 0.5}\n y={y - 5}\n width={Math.max(1, plotX1 - plotX0 - 1)}\n height={10}\n rx={2}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">{unknownText}</text>\n ) : null}\n </g>\n ) : (\n <g>\n <line data-role=\"ci\" x1={xs(r.low!)} x2={xs(r.high!)} y1={y} y2={y} stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n <line x1={xs(r.low!)} x2={xs(r.low!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <line x1={xs(r.high!)} x2={xs(r.high!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <rect\n data-role=\"estimate\"\n className={plot.marker}\n x={xs(r.estimate!) - 5}\n y={y - 5}\n width={10}\n height={10}\n rx={2}\n fill={color}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {signed(r.estimate!, formatValue)} [{signed(r.low!, formatValue)}, {signed(r.high!, formatValue)}]\n </text>\n ) : null}\n </g>\n )}\n {isActive ? <rect className={styles.focusRing} x={1} y={i * ROW_H + 1} width={width - 2} height={ROW_H - 2} rx={3} /> : null}\n </g>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow ? spoken(activeRow) : ''}\n </span>\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/StepBand.tsx — a value that changes in discrete steps,\n * with an uncertainty band around each step and markers for events (V3.10,\n * SPEC-310C §5 Growth: \"Harness StepBand with CI band and ▼ rollbacks\").\n *\n * The harness does not drift continuously — a version is adopted, holds,\n * and is replaced or rolled back — so a smoothed line would lie about WHEN\n * things changed. Each step holds its value flat from its own time until the\n * next step (the last one holds to `now`); the band is that step's 95%\n * interval, drawn as a soft wash of the quantity ramp; an event marker (▼ for\n * a rollback, ▲ for an adoption) sits on the top edge at its time, danger for\n * rollbacks, and every marker is also a row in the table.\n *\n * Honesty: a step whose value is null (a version with no measured lift yet)\n * is a GAP in the line with the unknown hatch across its span — never a\n * carried-over value. The baseline reference (usually 0 = \"the compiled\n * defaults\") is a labelled dashed line.\n *\n * Keyboard: one tab stop; ←/→ (Home/End) walk the steps, each announced\n * with its interval and span.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_NEG, CHART_SEQUENTIAL, CHART_SEQUENTIAL_SOFT, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { MIN_TIME_SPAN_MS, allIntegers, axisTicks, ensureSpan, isPlausibleTime, labelCharPx, layoutAxisLabels, linearScale, tickGutter } from './chart-math.js';\nimport { formatTimeLabel, timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface StepPoint {\n id: string;\n /** Epoch ms the step took effect. */\n at: number;\n /** The level from `at` until the next step; null = not measured. */\n value: number | null;\n /** 95% interval for this step; null / absent = no band. */\n low?: number | null;\n high?: number | null;\n /** Short name (\"h-0007\"). */\n label: string;\n /** One qualifier for the table and tooltip (\"adopted\", \"canary\"). */\n detail?: string;\n}\n\nexport interface StepMarker {\n id: string;\n at: number;\n kind: 'rollback' | 'adopt';\n label: string;\n}\n\nexport interface StepBandProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n steps: StepPoint[];\n markers?: StepMarker[];\n /** Right edge of the last step (default: now). */\n now?: number;\n /** Left edge (default: the first step). */\n from?: number;\n baseline?: { value: number; label: string };\n /** Unit word (\"pts\"). */\n unit?: string;\n formatValue?: (v: number) => string;\n formatTime?: (ms: number) => string;\n height?: number;\n width?: number;\n ariaLabel?: string;\n}\n\nexport interface StepSpan extends StepPoint {\n /** Where this step's flat segment ends (the next step's `at`, or `now`). */\n until: number;\n}\n\n/** Sort steps by time and give each the span it holds for. Pure. */\nexport function stepSpans(steps: ReadonlyArray<StepPoint>, now: number): StepSpan[] {\n const sorted = [...steps].filter((s) => Number.isFinite(s.at)).sort((a, b) => a.at - b.at);\n return sorted.map((s, i) => ({ ...s, until: Math.max(s.at, i + 1 < sorted.length ? sorted[i + 1]!.at : now) }));\n}\n\nconst PAD_T = 18;\nconst PAD_B = 26;\nconst PAD_R = 14;\n/** With no plausible time at all, the window shown ends now and spans a day. */\nconst FALLBACK_SPAN_MS = 86_400_000;\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nexport function StepBand({\n title,\n description,\n caveat,\n status,\n steps,\n markers: markersProp = [],\n now: nowProp,\n from: fromProp,\n baseline,\n unit = '',\n formatValue: formatValueProp,\n formatTime: formatTimeProp,\n height = 200,\n width: fixedWidth,\n ariaLabel,\n}: StepBandProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n // A 0 / pre-2000 time is a null timestamp that leaked through (a baseline\n // \"created\" at epoch 0): it is spoken and tabled as \"—\", never \"Dec 31\".\n const formatTime = (ms: number): string => (isPlausibleTime(ms) ? (formatTimeProp ?? formatTimeLabel)(ms) : '—');\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n const now = nowProp ?? Date.now();\n const spans = stepSpans(steps, now);\n // A marker at an implausible time has nowhere honest to sit on the axis.\n const markers = markersProp.filter((m) => isPlausibleTime(m.at));\n const known = spans.filter((s) => s.value !== null);\n const resolvedStatus: ChartStatus = status ?? (spans.length === 0\n ? { kind: 'empty', message: 'No versions yet — the compiled defaults are in force.' }\n : known.length === 0 ? { kind: 'unknown', reason: 'no version has a measured value yet.' } : { kind: 'ready' });\n\n // The domain comes from plausible times only; a step stamped at epoch 0\n // still draws — held from the left edge — but no longer drags the axis to\n // 1970. A degenerate span widens to MIN_TIME_SPAN_MS, ending at `now`.\n const starts = [...spans.map((s) => s.at), ...markers.map((m) => m.at)].filter(isPlausibleTime);\n const right = Math.max(isPlausibleTime(now) ? now : 0, ...starts, ...spans.map((s) => s.until).filter(isPlausibleTime));\n const left = fromProp !== undefined && isPlausibleTime(fromProp) ? fromProp : starts.length ? Math.min(...starts) : right - FALLBACK_SPAN_MS;\n const [x0, x1] = ensureSpan(left, right, MIN_TIME_SPAN_MS, 'end');\n const ys0 = known.flatMap((s) => [s.value!, s.low ?? s.value!, s.high ?? s.value!]);\n const lo = Math.min(baseline?.value ?? 0, ...ys0);\n const hi = Math.max(baseline?.value ?? 0, ...ys0);\n const yAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: 4,\n integer: allIntegers([...ys0, baseline?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = yAxis.ticks;\n // Kit labels take their precision from the step; a lift above zero wears \"+\".\n const tickLabels = formatValueProp ? yAxis.labels : yAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const padL = tickGutter(tickLabels, 30, 56, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const xs = linearScale(x0, x1, padL, padL + plotW);\n const ys = linearScale(ticks[0]!, ticks[ticks.length - 1]!, PAD_T + plotH, PAD_T);\n const cx = (t: number) => Math.min(padL + plotW, Math.max(padL, xs(t)));\n\n // Start / end labels, collision-free at the operator's Display size: the\n // end (now) outranks the start.\n const ladder = timeLabelLadder(x0, x1, formatTimeProp, [x0, x1]);\n const xLabels = layoutAxisLabels(\n [\n { key: 'start', x: padL, anchor: 'start', priority: 2, variants: ladder.map((f) => f(x0)) },\n { key: 'end', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => f(x1)) },\n ],\n { min: padL, max: padL + plotW, charPx: labelCharPx(textScale) },\n );\n\n // One path per run of known steps; a null step breaks the line.\n const runs: string[] = [];\n let current: string[] = [];\n let prevY: number | null = null;\n for (const s of spans) {\n if (s.value === null) {\n if (current.length) runs.push(current.join(' '));\n current = [];\n prevY = null;\n continue;\n }\n const y = ys(s.value);\n const a = cx(s.at);\n const b = cx(s.until);\n current.push(prevY === null ? `M${a.toFixed(1)},${y.toFixed(1)}` : `L${a.toFixed(1)},${y.toFixed(1)}`);\n current.push(`L${b.toFixed(1)},${y.toFixed(1)}`);\n prevY = y;\n }\n if (current.length) runs.push(current.join(' '));\n\n const spoken = (s: StepSpan): string =>\n `${s.label}${s.detail ? ` (${s.detail})` : ''}, ${formatTime(s.at)} to ${formatTime(s.until)}: ` +\n (s.value === null\n ? 'not measured'\n : `${signed(s.value, formatValue)}${unitText}` +\n (s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined\n ? `, 95% interval ${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`\n : ''));\n\n const last = known[known.length - 1];\n const rollbacks = markers.filter((m) => m.kind === 'rollback').length;\n const summary = ariaLabel ?? `${title}: ${spans.length} step${spans.length === 1 ? '' : 's'}` +\n (last ? `, now ${signed(last.value!, formatValue)}${unitText}` : '') +\n (rollbacks ? `, ${rollbacks} rollback${rollbacks === 1 ? '' : 's'}` : '') + '.';\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (spans.length === 0) return;\n const cur = active ?? spans.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? spans.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(spans.length - 1, next)));\n }\n\n interface Row { id: string; when: number; what: string; value: string; interval: string }\n const tableRows: Row[] = [\n ...spans.map((s) => ({\n id: `s:${s.id}`,\n when: s.at,\n what: `${s.label}${s.detail ? ` · ${s.detail}` : ''}`,\n value: s.value === null ? '—' : signed(s.value, formatValue),\n interval: s.low === null || s.low === undefined || s.high === null || s.high === undefined ? '—' : `${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`,\n })),\n ...markers.map((m) => ({ id: `m:${m.id}`, when: m.at, what: `${m.kind === 'rollback' ? '▼ Rolled back' : '▲ Adopted'}: ${m.label}`, value: '', interval: '' })),\n ].sort((a, b) => a.when - b.when);\n const columns: TableColumn<Row>[] = [\n { key: 'when', label: 'When', render: (r) => formatTime(r.when) },\n { key: 'what', label: 'Step', render: (r) => r.what },\n { key: 'value', label: `Level${unitText}`, numeric: true, render: (r) => r.value },\n { key: 'ci', label: '95% interval', numeric: true, render: (r) => r.interval },\n ];\n\n const activeSpan = active !== null ? spans[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={tableRows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n items={[\n { label: 'Level', color: CHART_SEQUENTIAL, kind: 'line' },\n { label: '95% interval', color: CHART_SEQUENTIAL_SOFT },\n ...(rollbacks ? [{ label: '▼ rollback', color: CHART_DIVERGING_NEG }] : []),\n ...(spans.some((s) => s.value === null) ? [{ label: 'not measured', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each step.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (spans.length ? spans.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{tickLabels[i]}</text>\n </g>\n ))}\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={height - 8} textAnchor={l.anchor}>{l.text}</text>\n ))}\n {baseline ? (\n <g data-role=\"baseline\">\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(baseline.value)} y2={ys(baseline.value)} />\n <text className={`${plot.tick} ${plot.halo}`} x={padL + 4} y={ys(baseline.value) - 5}>{baseline.label}</text>\n </g>\n ) : null}\n {spans.map((s, i) => {\n const a = cx(s.at);\n const b = Math.max(a + 1, cx(s.until));\n if (s.value === null) {\n return (\n <rect key={s.id} data-step={s.id} data-unknown=\"true\" className={plot.unknownMark} fill={`url(#${hatchId})`} x={a} y={PAD_T} width={b - a} height={plotH} opacity={0.6} />\n );\n }\n const hasBand = s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined;\n return (\n <g key={s.id} data-step={s.id} opacity={active !== null && active !== i ? 0.6 : 1}>\n {hasBand ? (\n <rect data-role=\"band\" x={a} y={ys(s.high!)} width={b - a} height={Math.max(1, ys(s.low!) - ys(s.high!))} fill={CHART_SEQUENTIAL_SOFT} opacity={0.35} />\n ) : null}\n </g>\n );\n })}\n {runs.map((d, i) => (\n <path key={i} data-role=\"level\" className={plot.line} stroke={CHART_SEQUENTIAL} d={d} />\n ))}\n {spans.map((s) =>\n s.value === null ? null : <circle key={`p${s.id}`} className={plot.marker} cx={cx(s.at)} cy={ys(s.value)} r={3.5} fill={CHART_SEQUENTIAL} />,\n )}\n {markers.map((m) => {\n const x = cx(m.at);\n const y = PAD_T - 2;\n const d = m.kind === 'rollback' ? `M${x - 5},${y - 8} L${x + 5},${y - 8} L${x},${y} Z` : `M${x - 5},${y} L${x + 5},${y} L${x},${y - 8} Z`;\n return (\n <path key={m.id} data-marker={m.kind} d={d} fill={m.kind === 'rollback' ? CHART_DIVERGING_NEG : CHART_SEQUENTIAL}>\n <title>{`${m.kind === 'rollback' ? 'Rolled back' : 'Adopted'}: ${m.label} · ${formatTime(m.at)}`}</title>\n </path>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{activeSpan ? spoken(activeSpan) : ''}</span>\n {activeSpan ? (\n <ChartTooltip\n left={clampTooltipLeft((cx(activeSpan.at) + cx(activeSpan.until)) / 2, width)}\n top={activeSpan.value === null ? PAD_T + plotH / 2 : ys(activeSpan.high ?? activeSpan.value)}\n title={`${activeSpan.label}${activeSpan.detail ? ` · ${activeSpan.detail}` : ''}`}\n rows={[\n { key: 'v', label: 'Level', value: activeSpan.value === null ? null : `${signed(activeSpan.value, formatValue)}${unitText}` },\n {\n key: 'ci',\n label: '95% interval',\n value: activeSpan.low === null || activeSpan.low === undefined || activeSpan.high === null || activeSpan.high === undefined\n ? null\n : `${signed(activeSpan.low, formatValue)} to ${signed(activeSpan.high, formatValue)}`,\n },\n { key: 't', label: 'From', value: formatTime(activeSpan.at) },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StepBand-Ci-C0GUG.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/CalendarHeatmap.tsx","../../../../../../src/web-ui/components/charts/ForestPlot.module.css","../../../../../../src/web-ui/components/charts/ForestPlot.tsx","../../../../../../src/web-ui/components/charts/StepBand.tsx"],"sourcesContent":["/**\n * components/charts/CalendarHeatmap.tsx — one value per day on a weeks ×\n * weekdays grid (activity by day across months). Sequential: ONE hue, four\n * steps light → dark mixed from the theme's own tokens, with a Less → More\n * key. A TRUE ZERO is the faint step-0 cell; UNKNOWN (null, or a day missing\n * from the data) is the 45° unknown hatch with an outline (V3.10) and its own\n * \"no data\" key entry — the two are never the same colour, and texture keeps\n * them apart under colour-blindness too.\n *\n * Width: the cell size adapts (8–16 px). When even 8 px cells cannot fit the\n * whole span at 375 px, the grid shows the most recent weeks that fit and says\n * how many are hidden; the Table view always has every day.\n *\n * Keyboard: the grid is one tab stop; ← → move a week, ↑ ↓ move a day (rows\n * are weekdays), Home/End jump to the ends; the focused day is announced.\n */\nimport { useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { hatchPatternId, heatColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { calendarGrid, heatBucket, type CalendarCell } from './chart-math.js';\nimport { formatCompact, formatDayLabel } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface CalendarDatum {\n day: string;\n value: number | null;\n}\n\nexport interface CalendarHeatmapProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n days: CalendarDatum[];\n /** 1 = Monday (ISO, default), 0 = Sunday. */\n weekStart?: 0 | 1;\n width?: number;\n formatValue?: (v: number) => string;\n /** Unit for the spoken/tooltip text, e.g. \"runs\". */\n unit?: string;\n ariaLabel?: string;\n}\n\nconst MIN_CELL = 8;\nconst MAX_CELL = 16;\nconst GAP = 2;\nconst DAY_LABEL_W = 28;\nconst MONTH_H = 16;\nconst STEPS = 4;\nconst WEEKDAYS_MON = ['Mon', '', 'Wed', '', 'Fri', '', ''];\nconst WEEKDAYS_SUN = ['', 'Mon', '', 'Wed', '', 'Fri', ''];\n\nexport function CalendarHeatmap({\n title,\n description,\n caveat,\n status,\n days,\n weekStart = 1,\n width: fixedWidth,\n formatValue = formatCompact,\n unit = '',\n ariaLabel,\n}: CalendarHeatmapProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const grid = useMemo(() => calendarGrid(days, weekStart), [days, weekStart]);\n const [focus, setFocus] = useState<number | null>(null);\n\n const max = Math.max(0, ...days.map((d) => d.value ?? 0));\n const anyKnown = days.some((d) => d.value !== null);\n const resolvedStatus: ChartStatus = status ?? (days.length === 0 ? { kind: 'empty' } : anyKnown ? { kind: 'ready' } : { kind: 'unknown' });\n\n const avail = width - DAY_LABEL_W;\n const fitWeeks = Math.max(1, Math.floor((avail + GAP) / (MIN_CELL + GAP)));\n const shownWeeks = Math.min(grid.weeks, fitWeeks);\n const hiddenWeeks = grid.weeks - shownWeeks;\n const cell = Math.max(MIN_CELL, Math.min(MAX_CELL, Math.floor((avail + GAP) / Math.max(1, shownWeeks)) - GAP));\n const firstWeek = hiddenWeeks;\n const visible = grid.cells.filter((c) => c.week >= firstWeek);\n const svgW = DAY_LABEL_W + shownWeeks * (cell + GAP);\n const svgH = MONTH_H + 7 * (cell + GAP);\n const xOf = (c: CalendarCell) => DAY_LABEL_W + (c.week - firstWeek) * (cell + GAP);\n const yOf = (c: CalendarCell) => MONTH_H + c.weekday * (cell + GAP);\n const unitText = unit ? ` ${unit}` : '';\n const describe = (c: CalendarCell) => `${formatDayLabel(c.day)}: ${c.value === null ? 'no data' : `${formatValue(c.value)}${unitText}`}`;\n\n const monthLabels: { week: number; label: string }[] = [];\n for (const m of grid.months) {\n if (m.week < firstWeek) continue;\n const prev = monthLabels[monthLabels.length - 1];\n if (prev && m.week - prev.week < 3) continue;\n monthLabels.push(m);\n }\n\n const inside = visible.filter((c) => !c.outside);\n const focusCell = focus !== null ? inside[focus] : undefined;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (inside.length === 0) return;\n const cur = focus ?? inside.length - 1;\n const delta = e.key === 'ArrowLeft' ? -7 : e.key === 'ArrowRight' ? 7 : e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : null;\n let next: number | null = null;\n if (delta !== null) next = cur + delta;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = inside.length - 1;\n if (next === null) return;\n e.preventDefault();\n setFocus(Math.max(0, Math.min(inside.length - 1, next)));\n }\n\n const knownDays = days.filter((d) => d.value !== null);\n const total = knownDays.reduce((s, d) => s + (d.value ?? 0), 0);\n const busiest = knownDays.reduce<CalendarDatum | null>((b, d) => (!b || (d.value ?? 0) > (b.value ?? 0) ? d : b), null);\n const summary = ariaLabel ?? `${title}: ${days.length} days, ${formatValue(total)}${unitText} in total` +\n (busiest && (busiest.value ?? 0) > 0 ? `, busiest ${formatDayLabel(busiest.day)} with ${formatValue(busiest.value!)}` : '') +\n (days.length - knownDays.length > 0 ? `, ${days.length - knownDays.length} days without data` : '') + '.';\n\n const columns: TableColumn<CalendarDatum>[] = [\n { key: 'day', label: 'Day', render: (d) => formatDayLabel(d.day) },\n { key: 'value', label: unit ? unit[0]!.toUpperCase() + unit.slice(1) : 'Value', numeric: true, render: (d) => (d.value === null ? '—' : formatValue(d.value)) },\n ];\n\n const legend = (\n <div className={plot.legend} aria-hidden=\"true\">\n <span className={plot.legendItem}>Less</span>\n {Array.from({ length: STEPS + 1 }, (_, i) => (\n <span key={i} className={plot.swatch} style={{ background: heatColor(i) }} />\n ))}\n <span className={plot.legendItem}>More</span>\n <span className={plot.legendItem}>\n <span className={plot.swatchHatch} />\n no data\n </span>\n </div>\n );\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={[...days].sort((a, b) => a.day.localeCompare(b.day))} rowKey={(d) => d.day} />}\n footer={\n <>\n {legend}\n {hiddenWeeks > 0 ? (\n <p className={plot.note}>Showing the latest {shownWeeks} weeks; {hiddenWeeks} earlier weeks are in the table.</p>\n ) : null}\n </>\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the arrow keys to move between days.`}\n aria-describedby={liveId}\n onFocus={() => setFocus((f) => f ?? (inside.length ? inside.length - 1 : null))}\n onBlur={() => setFocus(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={svgW} height={svgH} viewBox={`0 0 ${svgW} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {monthLabels.map((m) => (\n <text key={`${m.week}${m.label}`} className={plot.tick} x={DAY_LABEL_W + (m.week - firstWeek) * (cell + GAP)} y={11}>\n {m.label}\n </text>\n ))}\n {(weekStart === 1 ? WEEKDAYS_MON : WEEKDAYS_SUN).map((label, i) =>\n label && cell >= 10 ? (\n <text key={i} className={plot.tick} x={0} y={MONTH_H + i * (cell + GAP) + cell / 2} dy=\"0.32em\">{label}</text>\n ) : null,\n )}\n {visible.map((c) => {\n if (c.outside) return null;\n const bucket = heatBucket(c.value, max, STEPS);\n const isFocus = focusCell?.day === c.day;\n return (\n <rect\n key={c.day}\n data-day={c.day}\n data-bucket={bucket === null ? 'unknown' : bucket}\n x={xOf(c)}\n y={yOf(c)}\n width={cell}\n height={cell}\n rx={2}\n className={bucket === null ? plot.unknownMark : undefined}\n fill={bucket === null ? `url(#${hatchId})` : heatColor(bucket)}\n style={isFocus ? { stroke: 'var(--border-focus)', strokeWidth: 2, strokeDasharray: 'none' } : undefined}\n onPointerEnter={() => setFocus(inside.indexOf(c))}\n onPointerLeave={() => setFocus(null)}\n />\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{focusCell ? describe(focusCell) : ''}</span>\n {focusCell ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(focusCell) + cell / 2, svgW, 60)}\n top={yOf(focusCell)}\n title={formatDayLabel(focusCell.day)}\n rows={[{ key: 'v', label: unit || 'Value', value: focusCell.value === null ? null : formatValue(focusCell.value) }]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/* ForestPlot — row banding and the keyboard focus ring. Colours are chart\n tokens only (style-scan-310 bans raw hex and px font sizes here). */\n.band {\n fill: var(--chart-grid);\n opacity: 0.35;\n}\n\n.focusRing {\n fill: none;\n stroke: var(--border-focus);\n stroke-width: 1.5;\n pointer-events: none;\n}\n","/**\n * components/charts/ForestPlot.tsx — one row per experiment: the point\n * estimate with its 95% confidence interval as a whisker, against a zero line\n * (V3.10, SPEC-310C §5 Growth; r5/visual.md §2 \"ForestPlot\").\n *\n * The question it answers is \"which changes REALLY helped?\", so the encoding\n * is about the interval, not the dot:\n * - interval entirely above zero → the positive diverging pole (azure),\n * - entirely below zero → the negative pole (danger),\n * - straddling zero → neutral ink (\"no detectable effect\"),\n * and the verdict is also written in words in every row's spoken label and\n * in the table — colour is never the only carrier.\n *\n * Honesty: a row whose estimate is still null (fewer pairs than the gate\n * needs) draws the unknown hatch across the plot with \"not enough pairs yet\",\n * never a dot at zero. An optional `gate` draws the adoption threshold as a\n * labelled dashed reference (the gate is \"CI low > gate\", SPEC-310B §5).\n *\n * Keyboard: the plot is one tab stop; ↑/↓ (Home/End) walk the rows and the\n * focused row is announced. Works at 375 px: the numeric column folds away\n * (it is in the table) and labels truncate with the full text spoken.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_MID, CHART_DIVERGING_NEG, CHART_DIVERGING_POS, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, HatchPattern } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { allIntegers, axisTicks, linearScale } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\nimport styles from './ForestPlot.module.css';\n\nexport interface ForestRow {\n id: string;\n label: string;\n /** Point estimate (e.g. lift in percentage points); null = not estimable yet. */\n estimate: number | null;\n /** 95% CI bounds; null when the estimate is null. */\n low: number | null;\n high: number | null;\n /** Sample size behind the row (pairs); null = unknown. */\n n?: number | null;\n /** One short qualifier for the table (\"adopted\", \"running\", \"rejected\"). */\n detail?: string;\n}\n\nexport interface ForestPlotProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n rows: ForestRow[];\n /** Unit word after numbers in words and the table (\"pts\"). */\n unit?: string;\n /** A labelled reference the CI low must clear, e.g. { value: 0, label: 'Adoption gate' }. Drawn only when ≠ 0. */\n gate?: { value: number; label: string };\n formatValue?: (v: number) => string;\n /** What an unknown row says (default \"not enough pairs yet\"). */\n unknownText?: string;\n width?: number;\n ariaLabel?: string;\n}\n\nexport type ForestVerdict = 'positive' | 'negative' | 'none' | 'unknown';\n\n/** Where a row's interval sits relative to zero. */\nexport function forestVerdict(row: Pick<ForestRow, 'estimate' | 'low' | 'high'>): ForestVerdict {\n if (row.estimate === null || row.low === null || row.high === null) return 'unknown';\n if (row.low > 0) return 'positive';\n if (row.high < 0) return 'negative';\n return 'none';\n}\n\nconst VERDICT_WORDS: Record<ForestVerdict, string> = {\n positive: 'helped (interval above zero)',\n negative: 'hurt (interval below zero)',\n none: 'no clear effect (interval crosses zero)',\n unknown: 'unknown',\n};\n\nfunction verdictColor(verdict: ForestVerdict): string {\n if (verdict === 'positive') return CHART_DIVERGING_POS;\n if (verdict === 'negative') return CHART_DIVERGING_NEG;\n return 'var(--text-secondary)';\n}\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\n\nconst ROW_H = 28;\nconst AXIS_H = 22;\nconst PAD_R = 12;\nconst NARROW = 480;\n\nexport function ForestPlot({\n title,\n description,\n caveat,\n status,\n rows,\n unit = '',\n gate,\n formatValue: formatValueProp,\n unknownText = 'not enough pairs yet',\n width: fixedWidth,\n ariaLabel,\n}: ForestPlotProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n\n const known = rows.filter((r) => forestVerdict(r) !== 'unknown');\n const resolvedStatus: ChartStatus = status ?? (rows.length === 0 ? { kind: 'empty', message: 'No experiments have run yet.' } : { kind: 'ready' });\n\n const narrow = width < NARROW;\n const labelW = Math.max(84, Math.min(180, Math.round(width * (narrow ? 0.3 : 0.26))));\n const valueW = narrow ? 0 : 118;\n const plotX0 = labelW + 8;\n const plotX1 = Math.max(plotX0 + 40, width - valueW - PAD_R);\n const bounds = known.flatMap((r) => [r.low!, r.high!]);\n const lo = Math.min(0, gate?.value ?? 0, ...bounds);\n const hi = Math.max(0, gate?.value ?? 0, ...bounds);\n // Tick labels at the step's own precision (a lift axis of 0.25 steps\n // printed at one decimal read \"+0.3 / +0.8\"); a caller's formatter is\n // held to printing every tick faithfully.\n const xAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: narrow ? 3 : 5,\n integer: allIntegers([...bounds, gate?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = xAxis.ticks;\n const tickLabels = formatValueProp ? xAxis.labels : xAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const xs = linearScale(ticks[0]!, ticks[ticks.length - 1]!, plotX0, plotX1);\n const bodyH = rows.length * ROW_H;\n const svgH = bodyH + AXIS_H;\n\n const spoken = (r: ForestRow): string => {\n const v = forestVerdict(r);\n if (v === 'unknown') return `${r.label}: ${unknownText}`;\n return `${r.label}: ${signed(r.estimate!, formatValue)}${unitText}, 95% interval ${signed(r.low!, formatValue)} to ${signed(r.high!, formatValue)}; ${VERDICT_WORDS[v]}`;\n };\n\n const positive = known.filter((r) => forestVerdict(r) === 'positive').length;\n const summary = ariaLabel ?? `${title}: ${rows.length} experiment${rows.length === 1 ? '' : 's'}, ${positive} with an interval above zero.`;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? 0;\n const next = e.key === 'ArrowDown' ? cur + 1 : e.key === 'ArrowUp' ? cur - 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const columns: TableColumn<ForestRow>[] = [\n { key: 'label', label: 'Experiment', render: (r) => r.label },\n { key: 'est', label: `Estimate${unitText}`, numeric: true, render: (r) => (r.estimate === null ? '—' : signed(r.estimate, formatValue)) },\n {\n key: 'ci',\n label: '95% interval',\n numeric: true,\n render: (r) => (r.low === null || r.high === null ? '—' : `${signed(r.low, formatValue)} to ${signed(r.high, formatValue)}`),\n },\n { key: 'n', label: 'Pairs', numeric: true, render: (r) => (r.n === null || r.n === undefined ? '—' : String(r.n)) },\n { key: 'verdict', label: 'Reading', render: (r) => (forestVerdict(r) === 'unknown' ? unknownText : VERDICT_WORDS[forestVerdict(r)]) },\n ...(rows.some((r) => r.detail) ? [{ key: 'detail', label: 'Status', render: (r: ForestRow) => r.detail ?? '' }] : []),\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n const labelChars = Math.floor(labelW / 7);\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n min={1}\n items={[\n { label: 'Helped', color: CHART_DIVERGING_POS },\n { label: 'Hurt', color: CHART_DIVERGING_NEG },\n { label: 'No clear effect', color: 'var(--text-secondary)' },\n ...(rows.length > known.length ? [{ label: unknownText, kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the up and down arrow keys to read each experiment.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? 0 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={svgH} viewBox={`0 0 ${width} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={xs(t)} x2={xs(t)} y1={0} y2={bodyH} />\n <text className={plot.tick} x={xs(t)} y={svgH - 6} textAnchor=\"middle\">\n {tickLabels[i]}\n </text>\n </g>\n ))}\n <line data-role=\"zero\" x1={xs(0)} x2={xs(0)} y1={0} y2={bodyH} stroke={CHART_DIVERGING_MID} strokeWidth={1.5} />\n {gate && gate.value !== 0 ? (\n <g data-role=\"gate\">\n <line className={plot.reference} x1={xs(gate.value)} x2={xs(gate.value)} y1={0} y2={bodyH} />\n </g>\n ) : null}\n {rows.map((r, i) => {\n const y = i * ROW_H + ROW_H / 2;\n const v = forestVerdict(r);\n const color = verdictColor(v);\n const isActive = active === i;\n return (\n <g key={r.id} data-row={r.id} data-verdict={v} opacity={active !== null && !isActive ? 0.55 : 1}>\n {i % 2 === 1 ? <rect className={styles.band} x={0} y={i * ROW_H} width={width} height={ROW_H} /> : null}\n <text className={plot.label} x={labelW} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {r.label.length > labelChars ? `${r.label.slice(0, labelChars - 1)}…` : r.label}\n </text>\n {v === 'unknown' ? (\n <g data-role=\"unknown\">\n <rect\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={plotX0 + 0.5}\n y={y - 5}\n width={Math.max(1, plotX1 - plotX0 - 1)}\n height={10}\n rx={2}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">{unknownText}</text>\n ) : null}\n </g>\n ) : (\n <g>\n <line data-role=\"ci\" x1={xs(r.low!)} x2={xs(r.high!)} y1={y} y2={y} stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n <line x1={xs(r.low!)} x2={xs(r.low!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <line x1={xs(r.high!)} x2={xs(r.high!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <rect\n data-role=\"estimate\"\n className={plot.marker}\n x={xs(r.estimate!) - 5}\n y={y - 5}\n width={10}\n height={10}\n rx={2}\n fill={color}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {signed(r.estimate!, formatValue)} [{signed(r.low!, formatValue)}, {signed(r.high!, formatValue)}]\n </text>\n ) : null}\n </g>\n )}\n {isActive ? <rect className={styles.focusRing} x={1} y={i * ROW_H + 1} width={width - 2} height={ROW_H - 2} rx={3} /> : null}\n </g>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow ? spoken(activeRow) : ''}\n </span>\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/StepBand.tsx — a value that changes in discrete steps,\n * with an uncertainty band around each step and markers for events (V3.10,\n * SPEC-310C §5 Growth: \"Harness StepBand with CI band and ▼ rollbacks\").\n *\n * The harness does not drift continuously — a version is adopted, holds,\n * and is replaced or rolled back — so a smoothed line would lie about WHEN\n * things changed. Each step holds its value flat from its own time until the\n * next step (the last one holds to `now`); the band is that step's 95%\n * interval, drawn as a soft wash of the quantity ramp; an event marker (▼ for\n * a rollback, ▲ for an adoption) sits on the top edge at its time, danger for\n * rollbacks, and every marker is also a row in the table.\n *\n * Honesty: a step whose value is null (a version with no measured lift yet)\n * is a GAP in the line with the unknown hatch across its span — never a\n * carried-over value. The baseline reference (usually 0 = \"the compiled\n * defaults\") is a labelled dashed line.\n *\n * Keyboard: one tab stop; ←/→ (Home/End) walk the steps, each announced\n * with its interval and span.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_NEG, CHART_SEQUENTIAL, CHART_SEQUENTIAL_SOFT, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { MIN_TIME_SPAN_MS, allIntegers, axisTicks, ensureSpan, isPlausibleTime, labelCharPx, layoutAxisLabels, linearScale, tickGutter } from './chart-math.js';\nimport { formatTimeLabel, timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface StepPoint {\n id: string;\n /** Epoch ms the step took effect. */\n at: number;\n /** The level from `at` until the next step; null = not measured. */\n value: number | null;\n /** 95% interval for this step; null / absent = no band. */\n low?: number | null;\n high?: number | null;\n /** Short name (\"h-0007\"). */\n label: string;\n /** One qualifier for the table and tooltip (\"adopted\", \"canary\"). */\n detail?: string;\n}\n\nexport interface StepMarker {\n id: string;\n at: number;\n kind: 'rollback' | 'adopt';\n label: string;\n}\n\nexport interface StepBandProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n steps: StepPoint[];\n markers?: StepMarker[];\n /** Right edge of the last step (default: now). */\n now?: number;\n /** Left edge (default: the first step). */\n from?: number;\n baseline?: { value: number; label: string };\n /** Unit word (\"pts\"). */\n unit?: string;\n formatValue?: (v: number) => string;\n formatTime?: (ms: number) => string;\n height?: number;\n width?: number;\n ariaLabel?: string;\n}\n\nexport interface StepSpan extends StepPoint {\n /** Where this step's flat segment ends (the next step's `at`, or `now`). */\n until: number;\n}\n\n/** Sort steps by time and give each the span it holds for. Pure. */\nexport function stepSpans(steps: ReadonlyArray<StepPoint>, now: number): StepSpan[] {\n const sorted = [...steps].filter((s) => Number.isFinite(s.at)).sort((a, b) => a.at - b.at);\n return sorted.map((s, i) => ({ ...s, until: Math.max(s.at, i + 1 < sorted.length ? sorted[i + 1]!.at : now) }));\n}\n\nconst PAD_T = 18;\nconst PAD_B = 26;\nconst PAD_R = 14;\n/** With no plausible time at all, the window shown ends now and spans a day. */\nconst FALLBACK_SPAN_MS = 86_400_000;\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nexport function StepBand({\n title,\n description,\n caveat,\n status,\n steps,\n markers: markersProp = [],\n now: nowProp,\n from: fromProp,\n baseline,\n unit = '',\n formatValue: formatValueProp,\n formatTime: formatTimeProp,\n height = 200,\n width: fixedWidth,\n ariaLabel,\n}: StepBandProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n // A 0 / pre-2000 time is a null timestamp that leaked through (a baseline\n // \"created\" at epoch 0): it is spoken and tabled as \"—\", never \"Dec 31\".\n const formatTime = (ms: number): string => (isPlausibleTime(ms) ? (formatTimeProp ?? formatTimeLabel)(ms) : '—');\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n const now = nowProp ?? Date.now();\n const spans = stepSpans(steps, now);\n // A marker at an implausible time has nowhere honest to sit on the axis.\n const markers = markersProp.filter((m) => isPlausibleTime(m.at));\n const known = spans.filter((s) => s.value !== null);\n const resolvedStatus: ChartStatus = status ?? (spans.length === 0\n ? { kind: 'empty', message: 'No versions yet — the compiled defaults are in force.' }\n : known.length === 0 ? { kind: 'unknown', reason: 'no version has a measured value yet.' } : { kind: 'ready' });\n\n // The domain comes from plausible times only; a step stamped at epoch 0\n // still draws — held from the left edge — but no longer drags the axis to\n // 1970. A degenerate span widens to MIN_TIME_SPAN_MS, ending at `now`.\n const starts = [...spans.map((s) => s.at), ...markers.map((m) => m.at)].filter(isPlausibleTime);\n const right = Math.max(isPlausibleTime(now) ? now : 0, ...starts, ...spans.map((s) => s.until).filter(isPlausibleTime));\n const left = fromProp !== undefined && isPlausibleTime(fromProp) ? fromProp : starts.length ? Math.min(...starts) : right - FALLBACK_SPAN_MS;\n const [x0, x1] = ensureSpan(left, right, MIN_TIME_SPAN_MS, 'end');\n const ys0 = known.flatMap((s) => [s.value!, s.low ?? s.value!, s.high ?? s.value!]);\n const lo = Math.min(baseline?.value ?? 0, ...ys0);\n const hi = Math.max(baseline?.value ?? 0, ...ys0);\n const yAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: 4,\n integer: allIntegers([...ys0, baseline?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = yAxis.ticks;\n // Kit labels take their precision from the step; a lift above zero wears \"+\".\n const tickLabels = formatValueProp ? yAxis.labels : yAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const padL = tickGutter(tickLabels, 30, 56, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const xs = linearScale(x0, x1, padL, padL + plotW);\n const ys = linearScale(ticks[0]!, ticks[ticks.length - 1]!, PAD_T + plotH, PAD_T);\n const cx = (t: number) => Math.min(padL + plotW, Math.max(padL, xs(t)));\n\n // Start / end labels, collision-free at the operator's Display size: the\n // end (now) outranks the start.\n const ladder = timeLabelLadder(x0, x1, formatTimeProp, [x0, x1]);\n const xLabels = layoutAxisLabels(\n [\n { key: 'start', x: padL, anchor: 'start', priority: 2, variants: ladder.map((f) => f(x0)) },\n { key: 'end', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => f(x1)) },\n ],\n { min: padL, max: padL + plotW, charPx: labelCharPx(textScale) },\n );\n\n // One path per run of known steps; a null step breaks the line.\n const runs: string[] = [];\n let current: string[] = [];\n let prevY: number | null = null;\n for (const s of spans) {\n if (s.value === null) {\n if (current.length) runs.push(current.join(' '));\n current = [];\n prevY = null;\n continue;\n }\n const y = ys(s.value);\n const a = cx(s.at);\n const b = cx(s.until);\n current.push(prevY === null ? `M${a.toFixed(1)},${y.toFixed(1)}` : `L${a.toFixed(1)},${y.toFixed(1)}`);\n current.push(`L${b.toFixed(1)},${y.toFixed(1)}`);\n prevY = y;\n }\n if (current.length) runs.push(current.join(' '));\n\n const spoken = (s: StepSpan): string =>\n `${s.label}${s.detail ? ` (${s.detail})` : ''}, ${formatTime(s.at)} to ${formatTime(s.until)}: ` +\n (s.value === null\n ? 'not measured'\n : `${signed(s.value, formatValue)}${unitText}` +\n (s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined\n ? `, 95% interval ${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`\n : ''));\n\n const last = known[known.length - 1];\n const rollbacks = markers.filter((m) => m.kind === 'rollback').length;\n const summary = ariaLabel ?? `${title}: ${spans.length} step${spans.length === 1 ? '' : 's'}` +\n (last ? `, now ${signed(last.value!, formatValue)}${unitText}` : '') +\n (rollbacks ? `, ${rollbacks} rollback${rollbacks === 1 ? '' : 's'}` : '') + '.';\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (spans.length === 0) return;\n const cur = active ?? spans.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? spans.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(spans.length - 1, next)));\n }\n\n interface Row { id: string; when: number; what: string; value: string; interval: string }\n const tableRows: Row[] = [\n ...spans.map((s) => ({\n id: `s:${s.id}`,\n when: s.at,\n what: `${s.label}${s.detail ? ` · ${s.detail}` : ''}`,\n value: s.value === null ? '—' : signed(s.value, formatValue),\n interval: s.low === null || s.low === undefined || s.high === null || s.high === undefined ? '—' : `${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`,\n })),\n ...markers.map((m) => ({ id: `m:${m.id}`, when: m.at, what: `${m.kind === 'rollback' ? '▼ Rolled back' : '▲ Adopted'}: ${m.label}`, value: '', interval: '' })),\n ].sort((a, b) => a.when - b.when);\n const columns: TableColumn<Row>[] = [\n { key: 'when', label: 'When', render: (r) => formatTime(r.when) },\n { key: 'what', label: 'Step', render: (r) => r.what },\n { key: 'value', label: `Level${unitText}`, numeric: true, render: (r) => r.value },\n { key: 'ci', label: '95% interval', numeric: true, render: (r) => r.interval },\n ];\n\n const activeSpan = active !== null ? spans[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={tableRows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n items={[\n { label: 'Level', color: CHART_SEQUENTIAL, kind: 'line' },\n { label: '95% interval', color: CHART_SEQUENTIAL_SOFT },\n ...(rollbacks ? [{ label: '▼ rollback', color: CHART_DIVERGING_NEG }] : []),\n ...(spans.some((s) => s.value === null) ? [{ label: 'not measured', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each step.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (spans.length ? spans.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{tickLabels[i]}</text>\n </g>\n ))}\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={height - 8} textAnchor={l.anchor}>{l.text}</text>\n ))}\n {baseline ? (\n <g data-role=\"baseline\">\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(baseline.value)} y2={ys(baseline.value)} />\n <text className={`${plot.tick} ${plot.halo}`} x={padL + 4} y={ys(baseline.value) - 5}>{baseline.label}</text>\n </g>\n ) : null}\n {spans.map((s, i) => {\n const a = cx(s.at);\n const b = Math.max(a + 1, cx(s.until));\n if (s.value === null) {\n return (\n <rect key={s.id} data-step={s.id} data-unknown=\"true\" className={plot.unknownMark} fill={`url(#${hatchId})`} x={a} y={PAD_T} width={b - a} height={plotH} opacity={0.6} />\n );\n }\n const hasBand = s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined;\n return (\n <g key={s.id} data-step={s.id} opacity={active !== null && active !== i ? 0.6 : 1}>\n {hasBand ? (\n <rect data-role=\"band\" x={a} y={ys(s.high!)} width={b - a} height={Math.max(1, ys(s.low!) - ys(s.high!))} fill={CHART_SEQUENTIAL_SOFT} opacity={0.35} />\n ) : null}\n </g>\n );\n })}\n {runs.map((d, i) => (\n <path key={i} data-role=\"level\" className={plot.line} stroke={CHART_SEQUENTIAL} d={d} />\n ))}\n {spans.map((s) =>\n s.value === null ? null : <circle key={`p${s.id}`} className={plot.marker} cx={cx(s.at)} cy={ys(s.value)} r={3.5} fill={CHART_SEQUENTIAL} />,\n )}\n {markers.map((m) => {\n const x = cx(m.at);\n const y = PAD_T - 2;\n const d = m.kind === 'rollback' ? `M${x - 5},${y - 8} L${x + 5},${y - 8} L${x},${y} Z` : `M${x - 5},${y} L${x + 5},${y} L${x},${y - 8} Z`;\n return (\n <path key={m.id} data-marker={m.kind} d={d} fill={m.kind === 'rollback' ? CHART_DIVERGING_NEG : CHART_SEQUENTIAL}>\n <title>{`${m.kind === 'rollback' ? 'Rolled back' : 'Adopted'}: ${m.label} · ${formatTime(m.at)}`}</title>\n </path>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{activeSpan ? spoken(activeSpan) : ''}</span>\n {activeSpan ? (\n <ChartTooltip\n left={clampTooltipLeft((cx(activeSpan.at) + cx(activeSpan.until)) / 2, width)}\n top={activeSpan.value === null ? PAD_T + plotH / 2 : ys(activeSpan.high ?? activeSpan.value)}\n title={`${activeSpan.label}${activeSpan.detail ? ` · ${activeSpan.detail}` : ''}`}\n rows={[\n { key: 'v', label: 'Level', value: activeSpan.value === null ? null : `${signed(activeSpan.value, formatValue)}${unitText}` },\n {\n key: 'ci',\n label: '95% interval',\n value: activeSpan.low === null || activeSpan.low === undefined || activeSpan.high === null || activeSpan.high === undefined\n ? null\n : `${signed(activeSpan.low, formatValue)} to ${signed(activeSpan.high, formatValue)}`,\n },\n { key: 't', label: 'From', value: formatTime(activeSpan.at) },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=Surface-
|
|
1
|
+
import{a as e,n as t,s as n}from"./index-DbDw9UAs.js";import{n as r}from"./viewport-BYGH5EgA.js";var i=n(e(),1),a={surface:`_surface_1nwjs_6`,strip:`_strip_1nwjs_14`,title:`_title_1nwjs_29`,stripActions:`_stripActions_1nwjs_39`,scroll:`_scroll_1nwjs_45`,body:`_body_1nwjs_53`,grid:`_grid_1nwjs_62`,cell:`_cell_1nwjs_69`,card:`_card_1nwjs_82`,cardHead:`_cardHead_1nwjs_98`,cardHeading:`_cardHeading_1nwjs_105`,cardTitle:`_cardTitle_1nwjs_113`,cardCaption:`_cardCaption_1nwjs_121`,cardActions:`_cardActions_1nwjs_127`,note:`_note_1nwjs_134`,micro:`_micro_1nwjs_155`},o=t();function s(e,t){let n=Math.max(1,Math.min(12,Math.round(t)));return e===`compact`?12:e===`medium`?n<=6?6:12:n}function c({title:e,actions:t,lead:n,children:s}){let c=(0,i.useId)(),{viewport:l}=r();return(0,o.jsxs)(`section`,{className:a.surface,"aria-labelledby":c,"data-viewport":l,children:[(0,o.jsxs)(`header`,{className:a.strip,"data-app-region":`drag`,children:[(0,o.jsx)(`h2`,{id:c,className:a.title,children:e}),t?(0,o.jsx)(`div`,{className:a.stripActions,children:t}):null]}),(0,o.jsx)(`div`,{className:a.scroll,children:(0,o.jsxs)(`div`,{className:a.body,children:[n,(0,o.jsx)(`div`,{className:a.grid,children:s})]})})]})}function l({span:e,children:t,className:n,id:i}){let{viewport:c}=r(),l={gridColumn:`span ${s(c,e)}`};return(0,o.jsx)(`div`,{id:i,className:`${a.cell} ${n??``}`,style:l,"data-span":e,children:t})}function u({title:e,caption:t,actions:n,children:r,tone:s,labelledBy:c}){let l=(0,i.useId)(),u=c??l;return(0,o.jsxs)(`section`,{className:a.card,"aria-labelledby":u,"data-tone":s,children:[(0,o.jsxs)(`header`,{className:a.cardHead,children:[(0,o.jsxs)(`span`,{className:a.cardHeading,children:[(0,o.jsx)(`h3`,{id:u,className:a.cardTitle,children:e}),t?(0,o.jsx)(`span`,{className:a.cardCaption,children:t}):null]}),n?(0,o.jsx)(`span`,{className:a.cardActions,children:n}):null]}),r]})}function d({children:e,tone:t=`muted`}){return(0,o.jsx)(`p`,{className:a.note,"data-tone":t,role:t===`danger`?`alert`:`note`,children:e})}function f({children:e}){return(0,o.jsx)(`span`,{className:a.micro,children:e})}export{c as a,f as i,d as n,l as r,u as t};
|
|
2
|
+
//# sourceMappingURL=Surface-DBovMq4P.js.map
|
package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js.map → Surface-DBovMq4P.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Surface-BkDrQ4t3.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface.module.css","../../../../../../src/web-ui/routes/verse/command/Surface.tsx"],"sourcesContent":["/*\n * routes/verse/command/surface.module.css — the shared chrome of the four\n * 3.10 surfaces: strip, scroll region, 12-column grid, card frame. Tokens\n * only (style-scan-310: no raw hex, no px font sizes).\n */\n.surface {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.strip {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n height: var(--strip-height);\n padding: 0 var(--space-5);\n /* Desktop shell: only the traffic-light overlap past the rail is owed. */\n padding-left: max(var(--space-5), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n/* Surface title: Grotesk 20/28, −0.02em (SPEC-310C §6). */\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n max-width: 1440px;\n margin: 0 auto;\n padding: var(--space-5) var(--space-5) var(--space-16);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--surface-columns), minmax(0, 1fr));\n gap: var(--surface-gap);\n align-items: start;\n}\n\n.cell {\n min-width: 0;\n}\n\n.surface[data-viewport='compact'] .body {\n padding: var(--space-4) var(--space-4) var(--space-12);\n}\n\n.surface[data-viewport='compact'] .strip {\n padding: 0 var(--space-4);\n}\n\n/* Card frame — identical to ChartFrame so chart and non-chart cards read as one set. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.card[data-tone='attention'] {\n border-color: var(--border-default);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.cardHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.cardHeading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n/* Card title 13/18, 600. */\n.cardTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.cardCaption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.cardActions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n}\n\n.note {\n margin: 0;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.note[data-tone='unknown'] {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n}\n\n.note[data-tone='danger'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n/* Micro-label 11/14 uppercase (SPEC-310C §6). */\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n","/**\n * routes/verse/command/Surface.tsx — the layout every 3.10 surface shares\n * (Command, Fleet, Growth, Mind; SPEC-310C §5 + DESIGN.md §13.4).\n *\n * - a 48px strip with the surface title (Grotesk 20/28) and its actions;\n * - one scroll region;\n * - a 12-column grid (`--surface-columns`) with 16px gaps and\n * `align-items: start` — a card is never stretched to the tallest card\n * in its row (the 3.9 harness showed half-empty chart cards);\n * - spans come from the viewport class, never a hard-coded breakpoint:\n * wide uses the span as written, medium folds a span ≤ 6 to half width\n * and anything wider to full width, compact (375) is one column in DOM\n * order — which is why every surface writes its cards in the order the\n * phone should show them.\n */\nimport { useId, type CSSProperties, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\n/** The grid span a card gets at a viewport class. Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = Math.max(1, Math.min(12, Math.round(span)));\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\nexport interface SurfaceProps {\n /** Accessible name and visible title (\"Command\"). */\n title: string;\n /** Right side of the strip (refresh indicator, etc.). */\n actions?: ReactNode;\n /** Rendered above the grid, full width (the Command top bar, the verdict). */\n lead?: ReactNode;\n children: ReactNode;\n}\n\nexport function Surface({ title, actions, lead, children }: SurfaceProps) {\n const titleId = useId();\n const { viewport } = useViewport();\n return (\n <section className={styles.surface} aria-labelledby={titleId} data-viewport={viewport}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 id={titleId} className={styles.title}>{title}</h2>\n {actions ? <div className={styles.stripActions}>{actions}</div> : null}\n </header>\n <div className={styles.scroll}>\n <div className={styles.body}>\n {lead}\n <div className={styles.grid}>{children}</div>\n </div>\n </div>\n </section>\n );\n}\n\n/** One grid cell. `span` is the 1440 layout's column count (SPEC-310C §5 table). */\nexport function Cell({ span, children, className, id }: { span: number; children: ReactNode; className?: string; id?: string }) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${spanFor(viewport, span)}` };\n return (\n <div id={id} className={`${styles.cell} ${className ?? ''}`} style={style} data-span={span}>\n {children}\n </div>\n );\n}\n\n/**\n * A non-chart card with the same frame as ChartFrame: title (13/18 600),\n * one caption line, then the body. Charts bring their own frame.\n */\nexport function Card({\n title,\n caption,\n actions,\n children,\n tone,\n labelledBy,\n}: {\n title: ReactNode;\n caption?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n /** A quiet emphasis for the one card that needs the operator (Needs you). */\n tone?: 'attention';\n labelledBy?: string;\n}) {\n const ownId = useId();\n const titleId = labelledBy ?? ownId;\n return (\n <section className={styles.card} aria-labelledby={titleId} data-tone={tone}>\n <header className={styles.cardHead}>\n <span className={styles.cardHeading}>\n <h3 id={titleId} className={styles.cardTitle}>{title}</h3>\n {caption ? <span className={styles.cardCaption}>{caption}</span> : null}\n </span>\n {actions ? <span className={styles.cardActions}>{actions}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n\n/** A designed not-available / unknown line inside a card. */\nexport function CardNote({ children, tone = 'muted' }: { children: ReactNode; tone?: 'muted' | 'unknown' | 'danger' }) {\n return (\n <p className={styles.note} data-tone={tone} role={tone === 'danger' ? 'alert' : 'note'}>\n {children}\n </p>\n );\n}\n\n/** The micro-label (11/14 uppercase) used for group headings inside cards. */\nexport function MicroLabel({ children }: { children: ReactNode }) {\n return <span className={styles.micro}>{children}</span>;\n}\n"],"mappings":"2jBCoBA,SAAgB,EAAQ,EAAyB,EAAsB,CACrE,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,KAAK,MAAM,CAAI,CAAC,CAAC,EAGpD,OAFI,IAAa,UAAkB,GAC/B,IAAa,SAAiB,GAAK,EAAI,EAAI,GACxC,CACT,CAYA,SAAgB,EAAQ,CAAE,QAAO,UAAS,OAAM,YAA0B,CACxE,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,CAAE,YAAa,EAAY,EACjC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,kBAAiB,EAAS,gBAAe,EAA7E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,MAAO,kBAAgB,OAAjD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAAQ,SAAA,CAAU,CAAA,EACpD,GAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAe,SAAA,CAAa,CAAA,EAAI,IAC5D,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,UAAc,CAAA,CACzC,GACF,CAAA,CACE,GAEb,CAGA,SAAgB,EAAK,CAAE,OAAM,WAAU,YAAW,MAA8E,CAC9H,GAAM,CAAE,YAAa,EAAY,EAC3B,EAAuB,CAAE,WAAY,QAAQ,EAAQ,EAAU,CAAI,GAAI,EAC7E,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAS,KAAI,UAAW,GAAG,EAAO,KAAK,GAAG,GAAa,KAAa,QAAO,YAAW,EACnF,UACE,CAAA,CAET,CAMA,SAAgB,EAAK,CACnB,QACA,UACA,UACA,WACA,OACA,cASC,CACD,IAAM,GAAA,EAAQ,EAAA,MAAA,CAAM,EACd,EAAU,GAAc,EAC9B,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KAAM,kBAAiB,EAAS,YAAW,EAAtE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,SAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,EACxD,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC/D,CACL,CAAA,EAAA,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC7D,CACP,CAAA,EAAA,CACM,GAEb,CAGA,SAAgB,EAAS,CAAE,WAAU,OAAO,SAA2E,CACrH,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,YAAW,EAAM,KAAM,IAAS,SAAW,QAAU,OAC7E,UACA,CAAA,CAEP,CAGA,SAAgB,EAAW,CAAE,YAAqC,CAChE,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,UAAe,CAAA,CACxD"}
|
|
1
|
+
{"version":3,"file":"Surface-DBovMq4P.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface.module.css","../../../../../../src/web-ui/routes/verse/command/Surface.tsx"],"sourcesContent":["/*\n * routes/verse/command/surface.module.css — the shared chrome of the four\n * 3.10 surfaces: strip, scroll region, 12-column grid, card frame. Tokens\n * only (style-scan-310: no raw hex, no px font sizes).\n */\n.surface {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.strip {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n height: var(--strip-height);\n padding: 0 var(--space-5);\n /* Desktop shell: only the traffic-light overlap past the rail is owed. */\n padding-left: max(var(--space-5), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n/* Surface title: Grotesk 20/28, −0.02em (SPEC-310C §6). */\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n max-width: 1440px;\n margin: 0 auto;\n padding: var(--space-5) var(--space-5) var(--space-16);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--surface-columns), minmax(0, 1fr));\n gap: var(--surface-gap);\n align-items: start;\n}\n\n.cell {\n min-width: 0;\n}\n\n.surface[data-viewport='compact'] .body {\n padding: var(--space-4) var(--space-4) var(--space-12);\n}\n\n.surface[data-viewport='compact'] .strip {\n padding: 0 var(--space-4);\n}\n\n/* Card frame — identical to ChartFrame so chart and non-chart cards read as one set. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.card[data-tone='attention'] {\n border-color: var(--border-default);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.cardHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.cardHeading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n/* Card title 13/18, 600. */\n.cardTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.cardCaption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.cardActions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n}\n\n.note {\n margin: 0;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.note[data-tone='unknown'] {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n}\n\n.note[data-tone='danger'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n/* Micro-label 11/14 uppercase (SPEC-310C §6). */\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n","/**\n * routes/verse/command/Surface.tsx — the layout every 3.10 surface shares\n * (Command, Fleet, Growth, Mind; SPEC-310C §5 + DESIGN.md §13.4).\n *\n * - a 48px strip with the surface title (Grotesk 20/28) and its actions;\n * - one scroll region;\n * - a 12-column grid (`--surface-columns`) with 16px gaps and\n * `align-items: start` — a card is never stretched to the tallest card\n * in its row (the 3.9 harness showed half-empty chart cards);\n * - spans come from the viewport class, never a hard-coded breakpoint:\n * wide uses the span as written, medium folds a span ≤ 6 to half width\n * and anything wider to full width, compact (375) is one column in DOM\n * order — which is why every surface writes its cards in the order the\n * phone should show them.\n */\nimport { useId, type CSSProperties, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\n/** The grid span a card gets at a viewport class. Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = Math.max(1, Math.min(12, Math.round(span)));\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\nexport interface SurfaceProps {\n /** Accessible name and visible title (\"Command\"). */\n title: string;\n /** Right side of the strip (refresh indicator, etc.). */\n actions?: ReactNode;\n /** Rendered above the grid, full width (the Command top bar, the verdict). */\n lead?: ReactNode;\n children: ReactNode;\n}\n\nexport function Surface({ title, actions, lead, children }: SurfaceProps) {\n const titleId = useId();\n const { viewport } = useViewport();\n return (\n <section className={styles.surface} aria-labelledby={titleId} data-viewport={viewport}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 id={titleId} className={styles.title}>{title}</h2>\n {actions ? <div className={styles.stripActions}>{actions}</div> : null}\n </header>\n <div className={styles.scroll}>\n <div className={styles.body}>\n {lead}\n <div className={styles.grid}>{children}</div>\n </div>\n </div>\n </section>\n );\n}\n\n/** One grid cell. `span` is the 1440 layout's column count (SPEC-310C §5 table). */\nexport function Cell({ span, children, className, id }: { span: number; children: ReactNode; className?: string; id?: string }) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${spanFor(viewport, span)}` };\n return (\n <div id={id} className={`${styles.cell} ${className ?? ''}`} style={style} data-span={span}>\n {children}\n </div>\n );\n}\n\n/**\n * A non-chart card with the same frame as ChartFrame: title (13/18 600),\n * one caption line, then the body. Charts bring their own frame.\n */\nexport function Card({\n title,\n caption,\n actions,\n children,\n tone,\n labelledBy,\n}: {\n title: ReactNode;\n caption?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n /** A quiet emphasis for the one card that needs the operator (Needs you). */\n tone?: 'attention';\n labelledBy?: string;\n}) {\n const ownId = useId();\n const titleId = labelledBy ?? ownId;\n return (\n <section className={styles.card} aria-labelledby={titleId} data-tone={tone}>\n <header className={styles.cardHead}>\n <span className={styles.cardHeading}>\n <h3 id={titleId} className={styles.cardTitle}>{title}</h3>\n {caption ? <span className={styles.cardCaption}>{caption}</span> : null}\n </span>\n {actions ? <span className={styles.cardActions}>{actions}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n\n/** A designed not-available / unknown line inside a card. */\nexport function CardNote({ children, tone = 'muted' }: { children: ReactNode; tone?: 'muted' | 'unknown' | 'danger' }) {\n return (\n <p className={styles.note} data-tone={tone} role={tone === 'danger' ? 'alert' : 'note'}>\n {children}\n </p>\n );\n}\n\n/** The micro-label (11/14 uppercase) used for group headings inside cards. */\nexport function MicroLabel({ children }: { children: ReactNode }) {\n return <span className={styles.micro}>{children}</span>;\n}\n"],"mappings":"2jBCoBA,SAAgB,EAAQ,EAAyB,EAAsB,CACrE,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,KAAK,MAAM,CAAI,CAAC,CAAC,EAGpD,OAFI,IAAa,UAAkB,GAC/B,IAAa,SAAiB,GAAK,EAAI,EAAI,GACxC,CACT,CAYA,SAAgB,EAAQ,CAAE,QAAO,UAAS,OAAM,YAA0B,CACxE,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,CAAE,YAAa,EAAY,EACjC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,kBAAiB,EAAS,gBAAe,EAA7E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,MAAO,kBAAgB,OAAjD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAAQ,SAAA,CAAU,CAAA,EACpD,GAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAe,SAAA,CAAa,CAAA,EAAI,IAC5D,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,UAAc,CAAA,CACzC,GACF,CAAA,CACE,GAEb,CAGA,SAAgB,EAAK,CAAE,OAAM,WAAU,YAAW,MAA8E,CAC9H,GAAM,CAAE,YAAa,EAAY,EAC3B,EAAuB,CAAE,WAAY,QAAQ,EAAQ,EAAU,CAAI,GAAI,EAC7E,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAS,KAAI,UAAW,GAAG,EAAO,KAAK,GAAG,GAAa,KAAa,QAAO,YAAW,EACnF,UACE,CAAA,CAET,CAMA,SAAgB,EAAK,CACnB,QACA,UACA,UACA,WACA,OACA,cASC,CACD,IAAM,GAAA,EAAQ,EAAA,MAAA,CAAM,EACd,EAAU,GAAc,EAC9B,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KAAM,kBAAiB,EAAS,YAAW,EAAtE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,SAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,EACxD,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC/D,CACL,CAAA,EAAA,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC7D,CACP,CAAA,EAAA,CACM,GAEb,CAGA,SAAgB,EAAS,CAAE,WAAU,OAAO,SAA2E,CACrH,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,YAAW,EAAM,KAAM,IAAS,SAAW,QAAU,OAC7E,UACA,CAAA,CAEP,CAGA,SAAgB,EAAW,CAAE,YAAqC,CAChE,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,UAAe,CAAA,CACxD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=Swimlane-
|
|
1
|
+
import{a as e,n as t,s as n}from"./index-DbDw9UAs.js";import{D as r,S as i,T as a,_ as o,a as s,c,d as l,i as u,l as d,n as f,o as p,r as m,s as h,t as g,u as ee,w as te}from"./useChartWidth-D9M7kUw7.js";import{p as ne,s as re,v as _}from"./colors-BZ3a9wFf.js";var v={sparkline:`_sparkline_kr10w_1`,line:`_line_kr10w_6`,dot:`_dot_kr10w_14`,area:`_area_kr10w_18`,flat:`_flat_kr10w_25`},y=t();function b(e,t){let n=e.filter(e=>e!==null&&Number.isFinite(e));if(n.length===0)return`no data`;let r=n[0],i=n[n.length-1],a=e.length-n.length;return`from ${t(r)} to ${t(i)}, range ${t(Math.min(...n))} to ${t(Math.max(...n))}`+(a>0?`, ${a} point${a===1?``:`s`} without data`:``)}function x({points:e,width:t=72,height:n=24,ariaLabel:r,area:i=!1,describe:a}){let o=a?`${r}: ${b(e,a)}`:r,s=e.filter(e=>e!==null);if(s.length<2)return(0,y.jsx)(`svg`,{className:v.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:(0,y.jsx)(`line`,{className:v.flat,x1:1,x2:t-1,y1:n-1.5,y2:n-1.5})});let c=Math.min(...s,0),l=Math.max(...s,0)-c||1,u=t/Math.max(1,e.length-1),d=e=>n-(e-c)/l*(n-2)-1,f=[],p=[];e.forEach((e,t)=>{if(e===null){p.length&&f.push(p),p=[];return}p.push({x:t*u,y:d(e)})}),p.length&&f.push(p);let m=e.map(e=>e!==null).lastIndexOf(!0),h=m>=0?{x:m*u,y:d(e[m])}:null,g=d(Math.max(c,0));return(0,y.jsxs)(`svg`,{className:v.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:[i?f.map((e,t)=>e.length>1?(0,y.jsx)(`path`,{className:v.area,d:`${e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)} L${e[e.length-1].x.toFixed(1)},${g.toFixed(1)} L${e[0].x.toFixed(1)},${g.toFixed(1)} Z`},`a${t}`):null):null,f.map((e,t)=>(0,y.jsx)(`path`,{className:v.line,d:e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)},t)),h?(0,y.jsx)(`circle`,{className:v.dot,cx:h.x,cy:h.y,r:2}):null]})}var S=n(e(),1),C={scroller:`_scroller_1b51y_1`,band:`_band_1b51y_7`,bar:`_bar_1b51y_12`,stale:`_stale_1b51y_18`,open:`_open_1b51y_22`,now:`_now_1b51y_27`,laneStops:`_laneStops_1b51y_33`,laneStop:`_laneStop_1b51y_33`,outline:`_outline_1b51y_51`},w=new Set([`queued`,`parked`,`waiting`]);function T(e){return e.outline??w.has(e.status.toLowerCase())}var ie=14,ae=6,E=22,D=3,O={done:`success`,success:`success`,merged:`success`,failed:`danger`,error:`danger`,aborted:`neutral`,cancelled:`neutral`,running:`running`,queued:`neutral`,parked:`neutral`};function oe(e){return O[e.toLowerCase()]??`unknown`}function se(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}function ce(e,t){let n=t-e>1296e5;return e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:n?t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`}):t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`})}}function le(e,t){return e.length>t?`${e.slice(0,Math.max(1,t-1))}…`:e}function k(e){if(!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e/6e4);if(t<1)return`<1m`;if(t<60)return`${t}m`;let n=Math.floor(t/60);return n<48?`${n}h ${t%60}m`:`${Math.round(n/24)}d`}function ue({title:e,description:t,caveat:n,status:v,lanes:b,from:x,to:w,now:O,width:ue,toneOf:A=oe,formatTime:j=se,formatTick:de,ariaLabel:fe}){let M=b.flatMap(e=>e.items.flatMap(e=>[e.start,e.end??NaN])).filter(i),pe=i(w)?w:O!==void 0&&i(O)?O:M.length?Math.max(...M):Date.now(),me=i(x)?x:M.length?Math.min(...M):pe-864e5,[N,P]=o(me,pe,l,`end`),he=de??ce(N,P),F=(0,S.useRef)(null),I=g(F,ue),L=ee(),[R,ge]=(0,S.useState)(0),[z,B]=(0,S.useState)(null),V=(0,S.useId)(),H=ne((0,S.useId)()),U=O??P,W=b.reduce((e,t)=>e+t.items.length,0),_e=v??(W===0?{kind:`empty`,message:`No runs in this window.`}:{kind:`ready`}),ve=b.some(e=>e.engine!==void 0)?18:0,G=Math.max(72,Math.min(160,Math.round(I*.24)))+ve,ye=Math.floor((G-ve)/(7*L)),K=Math.max(40,I-G-8),q=r(N,Math.max(P,N+1),G,G+K),J=b.length>50,Y=J?Math.max(0,Math.floor(R/24)-ae):0,X=J?Math.min(b.length,Math.ceil(R/24)+ie+ae):b.length,Z=b.length*24,be=(0,S.useMemo)(()=>{let e=new Map;for(let t of b)for(let n of t.items){let t=A(n.status),r=T(n)?`outline`:t===`unknown`?`hatch`:t,i=r===`outline`?{kind:`empty`}:r===`hatch`?{kind:`hatch`}:{color:_(t)};e.has(r)||e.set(r,{item:i,names:new Set}),e.get(r).names.add(n.status.toLowerCase())}return[...e.values()].map(({item:e,names:t})=>({...e,label:[...t].sort().join(` / `)}))},[b,A]),xe=b.some(e=>e.engine!==void 0),Q=(0,S.useMemo)(()=>{let e=Math.max(2,Math.floor(K/90)),t=(P-N)/Math.max(1,e);return Array.from({length:e+1},(e,n)=>N+t*n)},[N,P,K]),Se=(0,S.useMemo)(()=>b.flatMap(e=>e.items.map(t=>({...t,lane:e.label,engine:e.engine}))),[b]);function Ce(e){let t=new Map;for(let n of e.items)t.set(n.status,(t.get(n.status)??0)+1);let n=[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${t} ${e}`),r=e.engine?` (${e.engine})`:``;return`${e.label}${r}: ${e.items.length} run${e.items.length===1?``:`s`}${n.length?` (${n.join(`, `)})`:``}`}let we=fe??`${e}: ${W} runs across ${b.length} lanes from ${j(N)} to ${j(P)}.`,Te=[{key:`lane`,label:`Lane`,render:e=>e.lane},...xe?[{key:`engine`,label:`Engine`,render:e=>e.engine??`—`}]:[],{key:`status`,label:`Status`,render:e=>`${e.status}${e.stale?` (stale)`:``}`},{key:`start`,label:`Started`,render:e=>j(e.start)},{key:`dur`,label:`Duration`,numeric:!0,render:e=>e.end===null?`${k(U-e.start)}+`:k(e.end-e.start)},{key:`detail`,label:`Detail`,render:e=>e.detail??``}],$=z?b[z.lane]?.items[z.item]:void 0;function Ee(e,t){let n=t*24;return(0,y.jsxs)(`g`,{"data-lane":e.id,children:[t%2==1?(0,y.jsx)(`rect`,{className:C.band,x:0,y:n,width:I,height:24}):null,e.engine?(0,y.jsx)(s,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,y.jsx)(`text`,{className:c.label,x:G-8,y:n+12,dy:`0.32em`,textAnchor:`end`,children:le(e.label,ye)}),e.items.map((e,r)=>{let i=Math.max(N,e.start),a=Math.min(P,e.end??U);if(a<N||i>P)return null;let o=q(i),s=Math.max(D,q(Math.max(a,i))-o),l=A(e.status),u=T(e),d=!u&&l===`unknown`;return(0,y.jsx)(`rect`,{"data-item":e.id,"data-status":e.status,"data-open":e.end===null?`true`:void 0,"data-style":u?`outline`:d?`hatch`:`fill`,className:`${C.bar} ${e.stale?C.stale:``} ${e.end===null?C.open:``} ${u?C.outline:``} ${d?c.unknownMark:``}`,x:u?o+.5:o,y:u?n+5.5:n+5,width:u?Math.max(D,s-1):s,height:u?13:14,rx:3,fill:u?`none`:d?`url(#${H})`:_(l),stroke:u?re:void 0,onPointerEnter:()=>B({lane:t,item:r}),onPointerLeave:()=>B(e=>e&&e.lane===t&&e.item===r?null:e)},e.id)})]},e.id)}let De=a(Q.map((e,t)=>({key:String(t),x:q(e),anchor:t===0?`start`:t===Q.length-1?`end`:`middle`,priority:t===Q.length-1?3:t===0?2:1,required:t===0||t===Q.length-1,variants:[he(e)]})),{min:G,max:G+K,charPx:te(L)}),Oe=(0,y.jsxs)(`svg`,{className:c.svg,width:I,height:E,viewBox:`0 0 ${I} ${E}`,"aria-hidden":`true`,children:[(0,y.jsx)(`line`,{className:c.axis,x1:G,x2:G+K,y1:21,y2:21}),De.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:c.tick,x:e.x,y:15,textAnchor:e.anchor,children:e.text},e.key))]});return(0,y.jsx)(f,{title:e,description:t,caveat:n,status:_e,table:(0,y.jsx)(d,{caption:e,columns:Te,rows:Se,rowKey:e=>e.id}),footer:(0,y.jsx)(m,{min:1,items:be}),children:(0,y.jsxs)(`div`,{ref:F,className:c.plotWrap,children:[Oe,(0,y.jsxs)(`div`,{className:J?C.scroller:void 0,style:J?{height:336}:void 0,onScroll:J?e=>ge(e.currentTarget.scrollTop):void 0,"data-virtualized":J?`true`:void 0,children:[(0,y.jsxs)(`svg`,{className:c.svg,width:I,height:Z,viewBox:`0 0 ${I} ${Z}`,role:`img`,"aria-label":we,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(p,{id:H})}),Q.map(e=>(0,y.jsx)(`line`,{className:c.grid,x1:q(e),x2:q(e),y1:0,y2:Z},e)),U>=N&&U<=P?(0,y.jsx)(`line`,{className:C.now,x1:q(U),x2:q(U),y1:0,y2:Z}):null,b.slice(Y,X).map((e,t)=>Ee(e,Y+t))]}),(0,y.jsx)(`ul`,{className:C.laneStops,style:{height:Z},"aria-label":`${e} lanes`,"aria-describedby":V,children:b.slice(Y,X).map((e,t)=>(0,y.jsx)(`li`,{tabIndex:0,className:`${C.laneStop} ${c.focusable}`,style:{top:(Y+t)*24,height:24},"aria-label":Ce(e),onFocus:()=>B(e.items.length?{lane:Y+t,item:e.items.length-1}:null),onBlur:()=>B(null)},e.id))})]}),(0,y.jsx)(`span`,{id:V,className:c.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),z&&$?(0,y.jsx)(u,{left:h(q(Math.max(N,$.start)),I),top:E+z.lane*24-(J?R:0),title:b[z.lane].label,rows:[{key:`s`,label:`Status`,value:`${$.status}${$.stale?` (stale)`:``}`,...T($)||A($.status)===`unknown`?{}:{color:_(A($.status))}},{key:`t`,label:`Started`,value:j($.start)},{key:`d`,label:`Duration`,value:$.end===null?`${k(U-$.start)} so far`:k($.end-$.start)},...$.detail?[{key:`x`,label:`Detail`,value:$.detail}]:[]]}):null]})})}export{x as n,ue as t};
|
|
2
|
+
//# sourceMappingURL=Swimlane-Cdc4TqDe.js.map
|