@ashlr/hub 3.11.3 → 3.12.0

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.
Files changed (558) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +44 -18
  3. package/dist/authority-surface.json +74 -59
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +39 -0
  6. package/dist/cli/authority.js +222 -55
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/help.js +1 -1
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/verse.d.ts +3 -0
  11. package/dist/cli/verse.js +10 -0
  12. package/dist/cli/verse.js.map +1 -1
  13. package/dist/core/authority/trust-roots.js +7 -1
  14. package/dist/core/authority/trust-roots.js.map +1 -1
  15. package/dist/core/authority/types.d.ts +2 -2
  16. package/dist/core/cloud/cloud-api.js +1 -1
  17. package/dist/core/cloud/cloud-api.js.map +1 -1
  18. package/dist/core/cloud/delivery-contract.d.ts +1 -1
  19. package/dist/core/cloud/delivery-contract.js +25 -15
  20. package/dist/core/cloud/delivery-contract.js.map +1 -1
  21. package/dist/core/cloud/store.js +6 -0
  22. package/dist/core/cloud/store.js.map +1 -1
  23. package/dist/core/cloud/tracker.d.ts +2 -0
  24. package/dist/core/cloud/tracker.js +140 -37
  25. package/dist/core/cloud/tracker.js.map +1 -1
  26. package/dist/core/cloud/types.d.ts +9 -1
  27. package/dist/core/cloud/types.js.map +1 -1
  28. package/dist/core/comms/dispatch.d.ts +5 -0
  29. package/dist/core/comms/dispatch.js +12 -1
  30. package/dist/core/comms/dispatch.js.map +1 -1
  31. package/dist/core/comms/requests.d.ts +27 -1
  32. package/dist/core/comms/requests.js +50 -1
  33. package/dist/core/comms/requests.js.map +1 -1
  34. package/dist/core/daemon/loop.d.ts +14 -0
  35. package/dist/core/daemon/loop.js +35 -0
  36. package/dist/core/daemon/loop.js.map +1 -1
  37. package/dist/core/fabric/claude-usage.js +23 -1
  38. package/dist/core/fabric/claude-usage.js.map +1 -1
  39. package/dist/core/fleet/dispatch-router.d.ts +7 -0
  40. package/dist/core/fleet/dispatch-router.js +4 -1
  41. package/dist/core/fleet/dispatch-router.js.map +1 -1
  42. package/dist/core/fleet/tick-hooks-live.d.ts +5 -1
  43. package/dist/core/fleet/tick-hooks-live.js +10 -1
  44. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  45. package/dist/core/local-runtime/llama/config.d.ts +14 -0
  46. package/dist/core/local-runtime/llama/config.js +20 -2
  47. package/dist/core/local-runtime/llama/config.js.map +1 -1
  48. package/dist/core/local-runtime/llama/process.d.ts +19 -0
  49. package/dist/core/local-runtime/llama/process.js +67 -17
  50. package/dist/core/local-runtime/llama/process.js.map +1 -1
  51. package/dist/core/local-runtime/llama/supervisor.js +14 -3
  52. package/dist/core/local-runtime/llama/supervisor.js.map +1 -1
  53. package/dist/core/observability/rollup.d.ts +12 -0
  54. package/dist/core/observability/rollup.js +37 -2
  55. package/dist/core/observability/rollup.js.map +1 -1
  56. package/dist/core/observability/usage-source.js +49 -1
  57. package/dist/core/observability/usage-source.js.map +1 -1
  58. package/dist/core/resources/connection-monitor.js +47 -4
  59. package/dist/core/resources/connection-monitor.js.map +1 -1
  60. package/dist/core/resources/engineering-mission-store.d.ts +1 -1
  61. package/dist/core/routing/headroom.js +7 -2
  62. package/dist/core/routing/headroom.js.map +1 -1
  63. package/dist/core/routing/router.d.ts +48 -0
  64. package/dist/core/routing/router.js +129 -13
  65. package/dist/core/routing/router.js.map +1 -1
  66. package/dist/core/run/best-of-n.d.ts +7 -0
  67. package/dist/core/run/best-of-n.js +3 -0
  68. package/dist/core/run/best-of-n.js.map +1 -1
  69. package/dist/core/run/harness-dispatch.d.ts +147 -0
  70. package/dist/core/run/harness-dispatch.js +234 -0
  71. package/dist/core/run/harness-dispatch.js.map +1 -0
  72. package/dist/core/run/orchestrator.js +3 -0
  73. package/dist/core/run/orchestrator.js.map +1 -1
  74. package/dist/core/run/provider-client.d.ts +8 -0
  75. package/dist/core/run/provider-client.js +4 -0
  76. package/dist/core/run/provider-client.js.map +1 -1
  77. package/dist/core/run/sandboxed-engine.d.ts +8 -0
  78. package/dist/core/run/sandboxed-engine.js +60 -7
  79. package/dist/core/run/sandboxed-engine.js.map +1 -1
  80. package/dist/core/types.d.ts +14 -0
  81. package/dist/core/types.js.map +1 -1
  82. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  83. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +188 -6
  84. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +187 -5
  85. package/dist/core/universe/firm-demo.d.ts +1 -1
  86. package/dist/core/universe/firm-graph.d.ts +2 -2
  87. package/dist/core/util/scrub.js +16 -3
  88. package/dist/core/util/scrub.js.map +1 -1
  89. package/dist/core/verse/accounts.d.ts +9 -1
  90. package/dist/core/verse/accounts.js +52 -11
  91. package/dist/core/verse/accounts.js.map +1 -1
  92. package/dist/core/verse/apps-api.d.ts +12 -0
  93. package/dist/core/verse/apps-api.js +22 -4
  94. package/dist/core/verse/apps-api.js.map +1 -1
  95. package/dist/core/verse/apps.js +22 -12
  96. package/dist/core/verse/apps.js.map +1 -1
  97. package/dist/core/verse/local-models.js +3 -7
  98. package/dist/core/verse/local-models.js.map +1 -1
  99. package/dist/core/verse/model-display-name.d.ts +34 -0
  100. package/dist/core/verse/model-display-name.js +125 -0
  101. package/dist/core/verse/model-display-name.js.map +1 -0
  102. package/dist/core/verse/seats.d.ts +11 -2
  103. package/dist/core/verse/seats.js +42 -18
  104. package/dist/core/verse/seats.js.map +1 -1
  105. package/dist/core/verse/transient-events.d.ts +21 -0
  106. package/dist/core/verse/transient-events.js +12 -0
  107. package/dist/core/verse/transient-events.js.map +1 -0
  108. package/dist/core/verse/types.d.ts +6 -13
  109. package/dist/core/verse/types.js +5 -36
  110. package/dist/core/verse/types.js.map +1 -1
  111. package/dist/core/web/public/next/assets/ActionMenu-B4-39f2S.js +2 -0
  112. package/dist/core/web/public/next/assets/{ActionMenu-FxXeRbPx.js.map → ActionMenu-B4-39f2S.js.map} +1 -1
  113. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +2 -0
  114. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js.map +1 -0
  115. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +7 -0
  116. package/dist/core/web/public/next/assets/App-E2zCDRxm.js.map +1 -0
  117. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +2 -0
  118. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js.map +1 -0
  119. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +2 -0
  120. package/dist/core/web/public/next/assets/{AreaTrend-CDxrQU4b.js.map → AreaTrend-BFimExYn.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +2 -0
  122. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +1 -0
  123. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +1 -0
  124. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +2 -0
  125. package/dist/core/web/public/next/assets/{AutonomySection-DuQkHGD_.js.map → AutonomySection-B46igJKR.js.map} +1 -1
  126. package/dist/core/web/public/next/assets/BranchBar-BRkrEQGs.js +2 -0
  127. package/dist/core/web/public/next/assets/{BranchBar-CLsvOcyK.js.map → BranchBar-BRkrEQGs.js.map} +1 -1
  128. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +2 -0
  129. package/dist/core/web/public/next/assets/{BudgetControl-TL3FeZ1D.js.map → BudgetControl-T_RjPrw9.js.map} +1 -1
  130. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js → Button-BhO-WKPp.js} +2 -2
  131. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js.map → Button-BhO-WKPp.js.map} +1 -1
  132. package/dist/core/web/public/next/assets/CapacityStrip-CkFz5vq2.js +2 -0
  133. package/dist/core/web/public/next/assets/{CapacityStrip-qReu0RaF.js.map → CapacityStrip-CkFz5vq2.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/{useChartWidth-BW6SwYIK.css → ChartFrame-BVuBe6RP.css} +1 -1
  135. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +2 -0
  136. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +1 -0
  137. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +3 -0
  138. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +1 -0
  139. package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js +2 -0
  140. package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js.map +1 -0
  141. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +2 -0
  142. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +1 -0
  143. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +1 -0
  144. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +2 -0
  145. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +1 -0
  146. package/dist/core/web/public/next/assets/ConfirmDialog-Bv4hdK2T.js +2 -0
  147. package/dist/core/web/public/next/assets/{ConfirmDialog-DLrLKM0c.js.map → ConfirmDialog-Bv4hdK2T.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js +2 -0
  149. package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js.map +1 -0
  150. package/dist/core/web/public/next/assets/Dialog-BSsIFNqD.js +2 -0
  151. package/dist/core/web/public/next/assets/{Dialog-BS9Dxi3G.js.map → Dialog-BSsIFNqD.js.map} +1 -1
  152. package/dist/core/web/public/next/assets/DiffPane-BpNuJmth.js +2 -0
  153. package/dist/core/web/public/next/assets/{DiffPane-TOmUf3b2.js.map → DiffPane-BpNuJmth.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/DiffViewer-CJarUvs0.js +2 -0
  155. package/dist/core/web/public/next/assets/{DiffViewer-BpH56302.js.map → DiffViewer-CJarUvs0.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +2 -0
  157. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js.map +1 -0
  158. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js → EmptyState-DPrd2aak.js} +2 -2
  159. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js.map → EmptyState-DPrd2aak.js.map} +1 -1
  160. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js → Epistemic-D7MxSmED.js} +2 -2
  161. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js.map → Epistemic-D7MxSmED.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +3 -0
  163. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +1 -0
  164. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +2 -0
  165. package/dist/core/web/public/next/assets/{Funnel-D2u7Wlzc.js.map → Funnel-BeNQZWv2.js.map} +1 -1
  166. package/dist/core/web/public/next/assets/GearTray-CIPtzeIx.js +2 -0
  167. package/dist/core/web/public/next/assets/{GearTray-Cb2npoxM.js.map → GearTray-CIPtzeIx.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +2 -0
  169. package/dist/core/web/public/next/assets/{GrowthSection-C5aDPs8B.js.map → GrowthSection-iiQg6wvK.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/HandoffDialog-DrQ6ofuy.js +2 -0
  171. package/dist/core/web/public/next/assets/{HandoffDialog-BF3AYg-X.js.map → HandoffDialog-DrQ6ofuy.js.map} +1 -1
  172. package/dist/core/web/public/next/assets/Input-C0MQxEM6.js +2 -0
  173. package/dist/core/web/public/next/assets/{Input-B5dmGLZx.js.map → Input-C0MQxEM6.js.map} +1 -1
  174. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +2 -0
  175. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +1 -0
  176. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +2 -0
  177. package/dist/core/web/public/next/assets/{MatrixHeatmap-BgEUs2Eu.js.map → MatrixHeatmap-DZvZeWXL.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +2 -0
  179. package/dist/core/web/public/next/assets/{McpSection-DZkiOuoq.js.map → McpSection-BRuCcTjT.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/MessageMarkdown-bRvD5nSc.js +3 -0
  181. package/dist/core/web/public/next/assets/{MessageMarkdown-BauY8ZTY.js.map → MessageMarkdown-bRvD5nSc.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js → MessageMarkdownRenderer-FjjkPKA2.js} +4 -4
  183. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js.map → MessageMarkdownRenderer-FjjkPKA2.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js → Meter-CFNLpwA-.js} +2 -2
  185. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js.map → Meter-CFNLpwA-.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +2 -0
  187. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +1 -0
  188. package/dist/core/web/public/next/assets/MutationTokenDialog-T7gv3a9r.js +2 -0
  189. package/dist/core/web/public/next/assets/{MutationTokenDialog-mxrw0Yvy.js.map → MutationTokenDialog-T7gv3a9r.js.map} +1 -1
  190. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +2 -0
  191. package/dist/core/web/public/next/assets/{NeedsYouDrawer-CO-Balfp.js.map → NeedsYouDrawer-lYN4G_aM.js.map} +1 -1
  192. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +2 -0
  193. package/dist/core/web/public/next/assets/{NeedsYouList-CzDZbzRD.js.map → NeedsYouList-BgH8ezqf.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +3 -0
  195. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js.map +1 -0
  196. package/dist/core/web/public/next/assets/OnboardingFlow-HUNQGQuU.css +1 -0
  197. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +2 -0
  198. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +1 -0
  199. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +3 -0
  200. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js.map +1 -0
  201. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +2 -0
  202. package/dist/core/web/public/next/assets/{PreviewPane-BS-CleCd.js.map → PreviewPane-BPBbcROb.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js → ProviderLogo-CT2cSfkg.js} +2 -2
  204. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js.map → ProviderLogo-CT2cSfkg.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/RailStatus-Vgl0GYtd.js +2 -0
  206. package/dist/core/web/public/next/assets/{RailStatus-cPRyOmrk.js.map → RailStatus-Vgl0GYtd.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js → RefreshIndicator-CSyqpY_q.js} +2 -2
  208. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js.map → RefreshIndicator-CSyqpY_q.js.map} +1 -1
  209. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js → ResourcePoolConsoleApp-BX2nkdmZ.js} +4 -4
  210. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js.map → ResourcePoolConsoleApp-BX2nkdmZ.js.map} +1 -1
  211. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +3 -0
  212. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +1 -0
  213. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +1 -0
  214. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +2 -0
  215. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +1 -0
  216. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaC7YVzR.js +2 -0
  217. package/dist/core/web/public/next/assets/{RouteErrorBoundary-DYtwc2ja.js.map → RouteErrorBoundary-BaC7YVzR.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/RunInCloudAction-D5PDHJPE.js +2 -0
  219. package/dist/core/web/public/next/assets/{RunInCloudAction-BEGEEM8O.js.map → RunInCloudAction-D5PDHJPE.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/SeatSelector-Cg75LInq.js +3 -0
  221. package/dist/core/web/public/next/assets/{SeatSelector-CYHRR7Wp.js.map → SeatSelector-Cg75LInq.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/Segmented-CametjLt.js +2 -0
  223. package/dist/core/web/public/next/assets/{Segmented-BE53BenI.js.map → Segmented-CametjLt.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/Select-De52fghU.js +2 -0
  225. package/dist/core/web/public/next/assets/{Select-BwSGkHCS.js.map → Select-De52fghU.js.map} +1 -1
  226. package/dist/core/web/public/next/assets/SessionGate-CzlcNq3O.js +2 -0
  227. package/dist/core/web/public/next/assets/{SessionGate-e0dFJm9d.js.map → SessionGate-CzlcNq3O.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/SessionInsightChip-Bk_Owa7u.js +2 -0
  229. package/dist/core/web/public/next/assets/{SessionInsightChip-CxlSyueJ.js.map → SessionInsightChip-Bk_Owa7u.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/SessionSearch-C6C8DHN8.js +2 -0
  231. package/dist/core/web/public/next/assets/{SessionSearch-_yp7S2TP.js.map → SessionSearch-C6C8DHN8.js.map} +1 -1
  232. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js +2 -0
  233. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +1 -0
  234. package/dist/core/web/public/next/assets/Sheet-CJhK9Dqv.js +2 -0
  235. package/dist/core/web/public/next/assets/{Sheet-DVP2Mgy6.js.map → Sheet-CJhK9Dqv.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/ShortcutsOverlay-DDW-i9Fc.js +2 -0
  237. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BcIcoClX.js.map → ShortcutsOverlay-DDW-i9Fc.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +3 -0
  239. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Slider-Bwd9HfXl.js +2 -0
  241. package/dist/core/web/public/next/assets/{Slider-BypUWjpH.js.map → Slider-Bwd9HfXl.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +2 -0
  243. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +1 -0
  244. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js → StatusBadge-DHKRtttH.js} +2 -2
  245. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js.map → StatusBadge-DHKRtttH.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +2 -0
  247. package/dist/core/web/public/next/assets/{StepBand-Duz1PUes.js.map → StepBand-DQykLkk_.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/Surface-D--LXgQm.js +2 -0
  249. package/dist/core/web/public/next/assets/Surface-D--LXgQm.js.map +1 -0
  250. package/dist/core/web/public/next/assets/Surface-e1z6GdZt.css +1 -0
  251. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +2 -0
  252. package/dist/core/web/public/next/assets/{Swimlane-DGcIcnNA.js.map → Swimlane-BzH6OCee.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js → Switch-PMixU6b0.js} +2 -2
  254. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js.map → Switch-PMixU6b0.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js → Tag-fordBsrJ.js} +2 -2
  256. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js.map → Tag-fordBsrJ.js.map} +1 -1
  257. package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js +7 -0
  258. package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js.map +1 -0
  259. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +2 -0
  260. package/dist/core/web/public/next/assets/{UniverseConsoleApp-C8yQ0AaR.js.map → UniverseConsoleApp-DtXFhAhw.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js → UniverseView-sWm3pnTW.js} +3 -3
  262. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js.map → UniverseView-sWm3pnTW.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +3 -0
  264. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +1 -0
  265. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +3 -0
  266. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +1 -0
  267. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +10 -0
  268. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js.map +1 -0
  269. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +1 -0
  270. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +2 -0
  271. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js.map +1 -0
  272. package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js +2 -0
  273. package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js.map +1 -0
  274. package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js +2 -0
  275. package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js.map +1 -0
  276. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js +2 -0
  277. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js.map +1 -0
  278. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js → budget-queries-DsAjH8ac.js} +2 -2
  279. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js.map → budget-queries-DsAjH8ac.js.map} +1 -1
  280. package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js +2 -0
  281. package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js.map +1 -0
  282. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +2 -0
  283. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +1 -0
  284. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +1 -0
  285. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js +2 -0
  286. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js.map +1 -0
  287. package/dist/core/web/public/next/assets/cloud-D-HXms6q.css +1 -0
  288. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +2 -0
  289. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js.map +1 -0
  290. package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js +2 -0
  291. package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js.map +1 -0
  292. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js +2 -0
  293. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js.map +1 -0
  294. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js +2 -0
  295. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js +2 -0
  297. package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js.map +1 -0
  298. package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js +3 -0
  299. package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js.map +1 -0
  300. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js → context-queries-CktFQqSS.js} +2 -2
  301. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js.map → context-queries-CktFQqSS.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js → control-queries-DAvlh_YM.js} +2 -2
  303. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js.map → control-queries-DAvlh_YM.js.map} +1 -1
  304. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +2 -0
  305. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +1 -0
  306. package/dist/core/web/public/next/assets/dock-icons-BFuBbqJl.js +2 -0
  307. package/dist/core/web/public/next/assets/{dock-icons-CUh8dOxJ.js.map → dock-icons-BFuBbqJl.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js.map +1 -0
  310. package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js +2 -0
  311. package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js.map +1 -0
  312. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js → focus-trap-BdrbWfC4.js} +2 -2
  313. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js.map → focus-trap-BdrbWfC4.js.map} +1 -1
  314. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +2 -0
  315. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +1 -0
  316. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js → git-model-_BnI_Ogh.js} +2 -2
  317. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js.map → git-model-_BnI_Ogh.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/global-CNNGMril.js +2 -0
  319. package/dist/core/web/public/next/assets/{global-oEl9Qj8u.js.map → global-CNNGMril.js.map} +1 -1
  320. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js → guarded-runners-DPh2d32e.js} +2 -2
  321. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js.map → guarded-runners-DPh2d32e.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/icons-0haWy6nh.js +2 -0
  323. package/dist/core/web/public/next/assets/icons-0haWy6nh.js.map +1 -0
  324. package/dist/core/web/public/next/assets/{index-BVxOlseC.js → index-QesfXBsb.js} +3 -3
  325. package/dist/core/web/public/next/assets/{index-BVxOlseC.js.map → index-QesfXBsb.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js +2 -0
  327. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +1 -0
  328. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js +2 -0
  329. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js.map +1 -0
  330. package/dist/core/web/public/next/assets/mind.module-BrK2nFOL.js +2 -0
  331. package/dist/core/web/public/next/assets/{mind.module-gTGAuJt1.js.map → mind.module-BrK2nFOL.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +2 -0
  333. package/dist/core/web/public/next/assets/{mutations-C5S7okTW.js.map → mutations-DTCtKCn_.js.map} +1 -1
  334. package/dist/core/web/public/next/assets/nav-KmGX0CVz.js +2 -0
  335. package/dist/core/web/public/next/assets/{nav-NVtnuG7A.js.map → nav-KmGX0CVz.js.map} +1 -1
  336. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js → overnight-queries-mlO0xzsr.js} +2 -2
  337. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js.map → overnight-queries-mlO0xzsr.js.map} +1 -1
  338. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +1 -0
  339. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js → queries-CyBE8nsW.js} +2 -2
  340. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js.map → queries-CyBE8nsW.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/reasoning-pref-CaoA4_Vl.js +2 -0
  342. package/dist/core/web/public/next/assets/{reasoning-pref-BUcFF_5G.js.map → reasoning-pref-CaoA4_Vl.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js → reveal-anchor-BP1VqnPU.js} +2 -2
  344. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js.map → reveal-anchor-BP1VqnPU.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +2 -0
  346. package/dist/core/web/public/next/assets/{seat-subscription-B-f9ViU2.js.map → seat-subscription-C5Tvr0WQ.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js → sidebar-model-B5Qk95k_.js} +2 -2
  348. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js.map → sidebar-model-B5Qk95k_.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/slots-DHKQDoE6.js +3 -0
  350. package/dist/core/web/public/next/assets/{slots-BhP8b8tf.js.map → slots-DHKQDoE6.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/surface-data-CchClvHo.js +2 -0
  352. package/dist/core/web/public/next/assets/surface-data-CchClvHo.js.map +1 -0
  353. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +2 -0
  354. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +1 -0
  355. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js → tasks-model-D6WFVULI.js} +2 -2
  356. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js.map → tasks-model-D6WFVULI.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js → terminal-icons-BvCvuXk2.js} +2 -2
  358. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js.map → terminal-icons-BvCvuXk2.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js +2 -0
  360. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js.map +1 -0
  361. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -1
  362. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js → usage-queries-D1SU1t7r.js} +2 -2
  363. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js.map → usage-queries-D1SU1t7r.js.map} +1 -1
  364. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js → use-guarded-action-BZmBv7CJ.js} +2 -2
  365. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js.map → use-guarded-action-BZmBv7CJ.js.map} +1 -1
  366. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js → use-ticker-CkJ4-0wU.js} +2 -2
  367. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js.map → use-ticker-CkJ4-0wU.js.map} +1 -1
  368. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js → use-token-gate-CYcfk_GS.js} +2 -2
  369. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js.map → use-token-gate-CYcfk_GS.js.map} +1 -1
  370. package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js +2 -0
  371. package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js.map +1 -0
  372. package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js +2 -0
  373. package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js.map +1 -0
  374. package/dist/core/web/public/next/assets/useVerseTranscript-BQ0J6Xhx.js +2 -0
  375. package/dist/core/web/public/next/assets/{useVerseTranscript-CDYrrWOO.js.map → useVerseTranscript-BQ0J6Xhx.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js +2 -0
  377. package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js.map +1 -0
  378. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +2 -0
  379. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js.map +1 -0
  380. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js +2 -0
  381. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js.map +1 -0
  382. package/dist/core/web/public/next/assets/warmup-CNEH_-be.js +3 -0
  383. package/dist/core/web/public/next/assets/{warmup-HG5vYbsN.js.map → warmup-CNEH_-be.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +2 -0
  385. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +1 -0
  386. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js → workspace-model-Dukb2wwv.js} +2 -2
  387. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js.map → workspace-model-Dukb2wwv.js.map} +1 -1
  388. package/dist/core/web/public/next/index.html +1 -1
  389. package/dist/release-dependency-inventory.json +1 -1
  390. package/docs/README.md +2 -1
  391. package/package.json +1 -1
  392. package/dist/core/web/public/next/assets/ActionMenu-FxXeRbPx.js +0 -2
  393. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js +0 -2
  394. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js.map +0 -1
  395. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js +0 -7
  396. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js.map +0 -1
  397. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js +0 -2
  398. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js.map +0 -1
  399. package/dist/core/web/public/next/assets/AreaTrend-CDxrQU4b.js +0 -2
  400. package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +0 -2
  401. package/dist/core/web/public/next/assets/BranchBar-CLsvOcyK.js +0 -2
  402. package/dist/core/web/public/next/assets/BudgetControl-TL3FeZ1D.js +0 -2
  403. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js +0 -2
  404. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js.map +0 -1
  405. package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js +0 -2
  406. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js +0 -3
  407. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js.map +0 -1
  408. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js +0 -2
  409. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js.map +0 -1
  410. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js +0 -2
  411. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js.map +0 -1
  412. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js +0 -2
  413. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js.map +0 -1
  414. package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js +0 -2
  415. package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js +0 -2
  416. package/dist/core/web/public/next/assets/DiffPane-TOmUf3b2.js +0 -2
  417. package/dist/core/web/public/next/assets/DiffViewer-BpH56302.js +0 -2
  418. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js +0 -2
  419. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js.map +0 -1
  420. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js +0 -3
  421. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js.map +0 -1
  422. package/dist/core/web/public/next/assets/Funnel-D2u7Wlzc.js +0 -2
  423. package/dist/core/web/public/next/assets/GearTray-Cb2npoxM.js +0 -2
  424. package/dist/core/web/public/next/assets/GrowthSection-C5aDPs8B.js +0 -2
  425. package/dist/core/web/public/next/assets/HandoffDialog-BF3AYg-X.js +0 -2
  426. package/dist/core/web/public/next/assets/Input-B5dmGLZx.js +0 -2
  427. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js +0 -2
  428. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js.map +0 -1
  429. package/dist/core/web/public/next/assets/MatrixHeatmap-BgEUs2Eu.js +0 -2
  430. package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +0 -2
  431. package/dist/core/web/public/next/assets/MessageMarkdown-BauY8ZTY.js +0 -3
  432. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js +0 -2
  433. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js.map +0 -1
  434. package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js +0 -2
  435. package/dist/core/web/public/next/assets/NeedsYouDrawer-CO-Balfp.js +0 -2
  436. package/dist/core/web/public/next/assets/NeedsYouList-CzDZbzRD.js +0 -2
  437. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js +0 -3
  438. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js.map +0 -1
  439. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js +0 -2
  440. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js.map +0 -1
  441. package/dist/core/web/public/next/assets/OnboardingFlow-DSpPj8UE.css +0 -1
  442. package/dist/core/web/public/next/assets/PreviewPane-BS-CleCd.js +0 -2
  443. package/dist/core/web/public/next/assets/RailStatus-cPRyOmrk.js +0 -2
  444. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js +0 -3
  445. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js.map +0 -1
  446. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js +0 -2
  447. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js.map +0 -1
  448. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +0 -1
  449. package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js +0 -2
  450. package/dist/core/web/public/next/assets/RunInCloudAction-BEGEEM8O.js +0 -2
  451. package/dist/core/web/public/next/assets/SeatSelector-CYHRR7Wp.js +0 -3
  452. package/dist/core/web/public/next/assets/Segmented-BE53BenI.js +0 -2
  453. package/dist/core/web/public/next/assets/Select-BwSGkHCS.js +0 -2
  454. package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js +0 -2
  455. package/dist/core/web/public/next/assets/SessionInsightChip-CxlSyueJ.js +0 -2
  456. package/dist/core/web/public/next/assets/SessionSearch-_yp7S2TP.js +0 -2
  457. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js +0 -2
  458. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js.map +0 -1
  459. package/dist/core/web/public/next/assets/Sheet-DVP2Mgy6.js +0 -2
  460. package/dist/core/web/public/next/assets/ShortcutsOverlay-BcIcoClX.js +0 -2
  461. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js +0 -3
  462. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js.map +0 -1
  463. package/dist/core/web/public/next/assets/Slider-BypUWjpH.js +0 -2
  464. package/dist/core/web/public/next/assets/StepBand-Duz1PUes.js +0 -2
  465. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js +0 -2
  466. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js.map +0 -1
  467. package/dist/core/web/public/next/assets/Surface-DMca0gAe.css +0 -1
  468. package/dist/core/web/public/next/assets/Swimlane-DGcIcnNA.js +0 -2
  469. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js +0 -7
  470. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js.map +0 -1
  471. package/dist/core/web/public/next/assets/UniverseConsoleApp-C8yQ0AaR.js +0 -2
  472. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js +0 -2
  473. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js.map +0 -1
  474. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js +0 -3
  475. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js.map +0 -1
  476. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js +0 -10
  477. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js.map +0 -1
  478. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +0 -1
  479. package/dist/core/web/public/next/assets/actions-tWevL9HV.js +0 -2
  480. package/dist/core/web/public/next/assets/actions-tWevL9HV.js.map +0 -1
  481. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +0 -2
  482. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js +0 -2
  484. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js.map +0 -1
  485. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js +0 -2
  486. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js.map +0 -1
  487. package/dist/core/web/public/next/assets/charts-uSX6xVYN.css +0 -1
  488. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +0 -1
  489. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js +0 -2
  490. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js.map +0 -1
  491. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js +0 -2
  492. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js.map +0 -1
  493. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js +0 -2
  494. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js.map +0 -1
  495. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +0 -2
  496. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +0 -1
  497. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js +0 -2
  498. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js.map +0 -1
  499. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js +0 -2
  500. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js +0 -2
  502. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js.map +0 -1
  503. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +0 -2
  504. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +0 -1
  505. package/dist/core/web/public/next/assets/dock-icons-CUh8dOxJ.js +0 -2
  506. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js +0 -2
  507. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js.map +0 -1
  508. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js +0 -2
  509. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js.map +0 -1
  510. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js +0 -2
  511. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js.map +0 -1
  512. package/dist/core/web/public/next/assets/format-BkWdOQDL.js +0 -2
  513. package/dist/core/web/public/next/assets/format-BkWdOQDL.js.map +0 -1
  514. package/dist/core/web/public/next/assets/global-oEl9Qj8u.js +0 -2
  515. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js +0 -3
  516. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js.map +0 -1
  517. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js +0 -2
  518. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js.map +0 -1
  519. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js +0 -2
  520. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js +0 -2
  522. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js.map +0 -1
  523. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +0 -2
  524. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +0 -1
  525. package/dist/core/web/public/next/assets/mind.module-gTGAuJt1.js +0 -2
  526. package/dist/core/web/public/next/assets/mutations-C5S7okTW.js +0 -2
  527. package/dist/core/web/public/next/assets/nav-NVtnuG7A.js +0 -2
  528. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js +0 -2
  529. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js.map +0 -1
  530. package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +0 -1
  531. package/dist/core/web/public/next/assets/reasoning-pref-BUcFF_5G.js +0 -2
  532. package/dist/core/web/public/next/assets/seat-subscription-B-f9ViU2.js +0 -2
  533. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js +0 -2
  534. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js.map +0 -1
  535. package/dist/core/web/public/next/assets/slots-BhP8b8tf.js +0 -3
  536. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js +0 -2
  537. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js.map +0 -1
  538. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +0 -2
  539. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js.map +0 -1
  540. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js +0 -2
  541. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js.map +0 -1
  542. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js +0 -2
  543. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js.map +0 -1
  544. package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js +0 -2
  545. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js +0 -2
  546. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js.map +0 -1
  547. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js +0 -2
  548. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js.map +0 -1
  549. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +0 -3
  550. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +0 -1
  551. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js +0 -3
  552. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js.map +0 -1
  553. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js +0 -2
  554. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js.map +0 -1
  555. package/dist/core/web/public/next/assets/warmup-HG5vYbsN.js +0 -3
  556. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js +0 -2
  557. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js.map +0 -1
  558. /package/dist/core/web/public/next/assets/{BurnDown-BuLMsJMx.css → StatTile-BuLMsJMx.css} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatTile-DPZ5yyaU.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx"],"sourcesContent":[".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding: var(--card-pad, var(--space-4));\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n /* Dark: a 4% white top hairline lifts the KPI row off the canvas; light:\n the token is transparent and this draws nothing. */\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n/* KPI number: Plex 600, 24/32, tabular numerals (SPEC-310C §6). */\n.value {\n font-family: var(--font-ui);\n font-size: var(--text-2xl-size);\n line-height: var(--text-2xl-line);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n/* The sparkline sits directly under the number it explains. */\n.trend {\n display: block;\n line-height: 0;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n}\n\n.delta {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n\n.deltaGood {\n color: var(--status-success-fg);\n}\n\n.deltaBad {\n color: var(--status-danger-fg);\n}\n\n.deltaNeutral {\n color: var(--text-tertiary);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n","/**\n * components/charts/StatTile.tsx — value + delta + optional sparkline, the\n * figure contract from marks-and-anatomy.md. Use for a single current value\n * (a one-bar bar chart is never the answer — this is). `value` takes a\n * ReactNode (not just a string) so callers can wrap a sourceQuality-bearing\n * field in <Epistemic/> and pass that straight through.\n *\n * V3.10 (SPEC-310C §6 \"StatTile: sparkline goes under the number; deltas show\n * units\"): the 72×24 sparkline used to float top-right, disconnected from the\n * number it explains; it now sits directly under it. A delta reads as a\n * sentence fragment with its unit and its comparison — \"+5 merges vs prior\n * 7d\", never a bare \"-1\". In dark the tile gets the 4% top hairline\n * (`--hairline-lift`, transparent in light) so a KPI row lifts off the canvas.\n */\nimport type { ReactNode } from 'react';\nimport { formatSignedCompact } from './format.js';\nimport { Sparkline } from './Sparkline.js';\nimport styles from './StatTile.module.css';\n\nexport interface StatTileDelta {\n /** Signed raw value, e.g. +12 or -3. */\n value: number;\n /** Whether a positive delta reads as good (green) or bad (red). Omit for\n * a neutral, non-judgmental delta (e.g. \"goals in flight\" — more isn't\n * inherently good or bad). */\n goodWhenPositive?: boolean;\n /** vs which period, e.g. \"vs prior 7d\". */\n versus?: string;\n /** Unit after the number: \"merges\", \"pts\", \"min\". Plural is the caller's call. */\n unit?: string;\n /** Formats the SIGNED value (default: \"+12\" / \"-3\"). Use for percent points, durations, dollars. */\n format?: (signed: number) => string;\n}\n\n/** \"+5 merges vs prior 7d\" — the whole delta as one readable phrase. */\nexport function deltaText(delta: StatTileDelta): string {\n const n = delta.format ? delta.format(delta.value) : formatSignedCompact(delta.value);\n return [n, delta.unit, delta.versus].filter((part) => part !== undefined && part !== '').join(' ');\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n describeTrend,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: string;\n /** Spoken summary formatter for the sparkline (first → latest, range). */\n describeTrend?: (v: number) => string;\n}) {\n const deltaTone =\n delta == null || delta.goodWhenPositive === undefined\n ? styles.deltaNeutral\n : delta.value === 0\n ? styles.deltaNeutral\n : (delta.value > 0) === delta.goodWhenPositive\n ? styles.deltaGood\n : styles.deltaBad;\n\n return (\n <div className={styles.tile} data-stat-tile=\"\">\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{value}</span>\n {trend ? (\n <span className={styles.trend}>\n <Sparkline points={trend} width={112} height={24} area ariaLabel={trendLabel ?? `${label} trend`} describe={describeTrend} />\n </span>\n ) : null}\n {delta || caption ? (\n <div className={styles.meta}>\n {delta ? <span className={`${styles.delta} ${deltaTone}`}>{deltaText(delta)}</span> : null}\n {caption ? <span className={styles.caption}>{caption}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"gZCmCA,SAAgB,EAAU,EAA8B,CAEtD,MAAO,CADG,EAAM,OAAS,EAAM,OAAO,EAAM,KAAK,EAAI,EAAoB,EAAM,KAAK,EACzE,EAAM,KAAM,EAAM,MAAM,CAAC,CAAC,OAAQ,GAAS,IAAS,IAAA,IAAa,IAAS,EAAE,CAAC,CAAC,KAAK,GAAG,CACnG,CAEA,SAAgB,EAAS,CACvB,QACA,QACA,UACA,QACA,QACA,aACA,iBAUC,CACD,IAAM,EACJ,GAAS,MAAQ,EAAM,mBAAqB,IAAA,IAExC,EAAM,QAAU,EADhB,EAAO,aAGJ,EAAM,MAAQ,IAAO,EAAM,iBAC1B,EAAO,UACP,EAAO,SAEjB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,iBAAe,GAA5C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,EAC3C,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MACtB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,OAAQ,EAAO,MAAO,IAAK,OAAQ,GAAI,KAAA,GAAK,UAAW,GAAc,GAAG,EAAM,QAAS,SAAU,CAAgB,CAAA,CACxH,CAAA,EACJ,KACH,GAAS,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,IAAc,SAAA,EAAU,CAAK,CAAQ,CAAA,EAAI,KACrF,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAU,SAAA,CAAc,CAAA,EAAI,IAC5D,CACH,CAAA,EAAA,IACD,GAET"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-BVxOlseC.js";var t={badge:`_badge_ytqgz_4`,dot:`_dot_ytqgz_17`,neutral:`_neutral_ytqgz_24`,info:`_info_ytqgz_32`,running:`_running_ytqgz_40`,pulse:`_pulse_ytqgz_1`,success:`_success_ytqgz_49`,warning:`_warning_ytqgz_57`,danger:`_danger_ytqgz_65`,unknown:`_unknown_ytqgz_73`,phaseDot:`_phaseDot_ytqgz_82`},n=e(),r={pending:`neutral`,queued:`neutral`,waiting:`neutral`,running:`running`,active:`running`,in_progress:`running`,building:`running`,applying:`running`,done:`success`,success:`success`,succeeded:`success`,applied:`success`,merged:`success`,ready:`success`,approved:`success`,ship:`success`,review:`warning`,degraded:`warning`,paused:`warning`,noise:`neutral`,failed:`danger`,error:`danger`,errored:`danger`,rejected:`danger`,harmful:`danger`,cancelled:`neutral`,canceled:`neutral`,unknown:`unknown`};function i(e){return e?r[e.toLowerCase()]??`neutral`:`unknown`}function a({status:e,tone:r,children:a}){let o=r??i(e);return(0,n.jsxs)(`span`,{className:`${t.badge} ${t[o]}`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),a??e]})}function o({index:e}){let r=(e%6+6)%6;return(0,n.jsx)(`span`,{className:t.phaseDot,style:{background:`var(--phase-${r+1})`},"aria-hidden":`true`})}export{a as n,i as r,o as t};
2
- //# sourceMappingURL=StatusBadge-HCZp416_.js.map
1
+ import{n as e}from"./index-QesfXBsb.js";var t={badge:`_badge_ytqgz_4`,dot:`_dot_ytqgz_17`,neutral:`_neutral_ytqgz_24`,info:`_info_ytqgz_32`,running:`_running_ytqgz_40`,pulse:`_pulse_ytqgz_1`,success:`_success_ytqgz_49`,warning:`_warning_ytqgz_57`,danger:`_danger_ytqgz_65`,unknown:`_unknown_ytqgz_73`,phaseDot:`_phaseDot_ytqgz_82`},n=e(),r={pending:`neutral`,queued:`neutral`,waiting:`neutral`,running:`running`,active:`running`,in_progress:`running`,building:`running`,applying:`running`,done:`success`,success:`success`,succeeded:`success`,applied:`success`,merged:`success`,ready:`success`,approved:`success`,ship:`success`,review:`warning`,degraded:`warning`,paused:`warning`,noise:`neutral`,failed:`danger`,error:`danger`,errored:`danger`,rejected:`danger`,harmful:`danger`,cancelled:`neutral`,canceled:`neutral`,unknown:`unknown`};function i(e){return e?r[e.toLowerCase()]??`neutral`:`unknown`}function a({status:e,tone:r,children:a}){let o=r??i(e);return(0,n.jsxs)(`span`,{className:`${t.badge} ${t[o]}`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),a??e]})}function o({index:e}){let r=(e%6+6)%6;return(0,n.jsx)(`span`,{className:t.phaseDot,style:{background:`var(--phase-${r+1})`},"aria-hidden":`true`})}export{a as n,i as r,o as t};
2
+ //# sourceMappingURL=StatusBadge-DHKRtttH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge-HCZp416_.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/StatusBadge.module.css","../../../../../../src/web-ui/components/primitives/StatusBadge.tsx"],"sourcesContent":["/* V2: a tag, not a pill — the design language reserves fully-round shapes\n for dots and avatars. Height derives from the density tokens so a badge in\n a table row lines up with the controls next to it. */\n.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border-radius: var(--radius-xs);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: 1;\n white-space: nowrap;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.neutral {\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n}\n.neutral .dot {\n background: var(--status-neutral-solid);\n}\n\n.info {\n background: var(--status-info-bg);\n color: var(--status-info-fg);\n}\n.info .dot {\n background: var(--status-info-solid);\n}\n\n.running {\n background: var(--status-running-bg);\n color: var(--status-running-fg);\n}\n.running .dot {\n background: var(--status-running-solid);\n animation: pulse 1.6s ease-in-out infinite;\n}\n\n.success {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n.success .dot {\n background: var(--status-success-solid);\n}\n\n.warning {\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n}\n.warning .dot {\n background: var(--status-warning-solid);\n}\n\n.danger {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n.danger .dot {\n background: var(--status-danger-solid);\n}\n\n.unknown {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-style: italic;\n}\n.unknown .dot {\n background: var(--status-unknown-solid);\n}\n\n.phaseDot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .running .dot {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .running .dot {\n animation: none;\n}\n","/**\n * components/primitives/StatusBadge.tsx — the ONE status-color mapping for\n * the whole app. See DESIGN.md \"Status-color semantics\" for the reasoning;\n * the short version: `running` is amber (motion, unresolved — matches\n * Vercel/GitHub Actions \"in progress\"), `done` is green (resolved,\n * successful). Neither reuses the accent color, so \"this is clickable\"\n * (accent) never visually collides with \"this succeeded\" (green).\n *\n * Every view should route run/swarm/proposal/daemon status strings through\n * `statusToTone()` rather than switching on raw strings itself, so adding a\n * new backend status value only ever needs one edit, here.\n */\nimport type { ReactNode } from 'react';\nimport styles from './StatusBadge.module.css';\n\nexport type Tone = 'neutral' | 'info' | 'running' | 'success' | 'warning' | 'danger' | 'unknown';\n\nconst STATUS_TONE: Record<string, Tone> = {\n // Run / swarm / proposal lifecycle.\n pending: 'neutral',\n queued: 'neutral',\n waiting: 'neutral',\n running: 'running',\n active: 'running',\n in_progress: 'running',\n building: 'running',\n applying: 'running',\n done: 'success',\n success: 'success',\n succeeded: 'success',\n applied: 'success',\n merged: 'success',\n ready: 'success',\n approved: 'success',\n ship: 'success',\n review: 'warning',\n degraded: 'warning',\n paused: 'warning',\n noise: 'neutral',\n failed: 'danger',\n error: 'danger',\n errored: 'danger',\n rejected: 'danger',\n harmful: 'danger',\n cancelled: 'neutral',\n canceled: 'neutral',\n unknown: 'unknown',\n};\n\nexport function statusToTone(status: string | undefined | null): Tone {\n if (!status) return 'unknown';\n return STATUS_TONE[status.toLowerCase()] ?? 'neutral';\n}\n\nexport interface StatusBadgeProps {\n status: string;\n /** Override the derived tone (rare — prefer letting statusToTone decide). */\n tone?: Tone;\n children?: ReactNode;\n}\n\nexport function StatusBadge({ status, tone, children }: StatusBadgeProps): ReactNode {\n const resolved = tone ?? statusToTone(status);\n return (\n <span className={`${styles.badge} ${styles[resolved]}`}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {children ?? status}\n </span>\n );\n}\n\n/** A named DAG/milestone phase — categorical color, unrelated to health. */\nexport function PhaseDot({ index }: { index: number }): ReactNode {\n const n = ((index % 6) + 6) % 6; // wrap safely for any index, including negatives\n return <span className={styles.phaseDot} style={{ background: `var(--phase-${n + 1})` }} aria-hidden=\"true\" />;\n}\n"],"mappings":"kVCiBM,EAAoC,CAExC,QAAS,UACT,OAAQ,UACR,QAAS,UACT,QAAS,UACT,OAAQ,UACR,YAAa,UACb,SAAU,UACV,SAAU,UACV,KAAM,UACN,QAAS,UACT,UAAW,UACX,QAAS,UACT,OAAQ,UACR,MAAO,UACP,SAAU,UACV,KAAM,UACN,OAAQ,UACR,SAAU,UACV,OAAQ,UACR,MAAO,UACP,OAAQ,SACR,MAAO,SACP,QAAS,SACT,SAAU,SACV,QAAS,SACT,UAAW,UACX,SAAU,UACV,QAAS,SACX,EAEA,SAAgB,EAAa,EAAyC,CAEpE,OADK,EACE,EAAY,EAAO,YAAY,IAAM,UADxB,SAEtB,CASA,SAAgB,EAAY,CAAE,SAAQ,OAAM,YAAyC,CACnF,IAAM,EAAW,GAAQ,EAAa,CAAM,EAC5C,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,KAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAChD,GAAY,CACT,GAEV,CAGA,SAAgB,EAAS,CAAE,SAAuC,CAChE,IAAM,GAAM,EAAQ,EAAK,GAAK,EAC9B,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,MAAO,CAAE,WAAY,eAAe,EAAI,EAAE,EAAG,EAAG,cAAY,MAAQ,CAAA,CAC/G"}
1
+ {"version":3,"file":"StatusBadge-DHKRtttH.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/StatusBadge.module.css","../../../../../../src/web-ui/components/primitives/StatusBadge.tsx"],"sourcesContent":["/* V2: a tag, not a pill — the design language reserves fully-round shapes\n for dots and avatars. Height derives from the density tokens so a badge in\n a table row lines up with the controls next to it. */\n.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border-radius: var(--radius-xs);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: 1;\n white-space: nowrap;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.neutral {\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n}\n.neutral .dot {\n background: var(--status-neutral-solid);\n}\n\n.info {\n background: var(--status-info-bg);\n color: var(--status-info-fg);\n}\n.info .dot {\n background: var(--status-info-solid);\n}\n\n.running {\n background: var(--status-running-bg);\n color: var(--status-running-fg);\n}\n.running .dot {\n background: var(--status-running-solid);\n animation: pulse 1.6s ease-in-out infinite;\n}\n\n.success {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n.success .dot {\n background: var(--status-success-solid);\n}\n\n.warning {\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n}\n.warning .dot {\n background: var(--status-warning-solid);\n}\n\n.danger {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n.danger .dot {\n background: var(--status-danger-solid);\n}\n\n.unknown {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-style: italic;\n}\n.unknown .dot {\n background: var(--status-unknown-solid);\n}\n\n.phaseDot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .running .dot {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .running .dot {\n animation: none;\n}\n","/**\n * components/primitives/StatusBadge.tsx — the ONE status-color mapping for\n * the whole app. See DESIGN.md \"Status-color semantics\" for the reasoning;\n * the short version: `running` is amber (motion, unresolved — matches\n * Vercel/GitHub Actions \"in progress\"), `done` is green (resolved,\n * successful). Neither reuses the accent color, so \"this is clickable\"\n * (accent) never visually collides with \"this succeeded\" (green).\n *\n * Every view should route run/swarm/proposal/daemon status strings through\n * `statusToTone()` rather than switching on raw strings itself, so adding a\n * new backend status value only ever needs one edit, here.\n */\nimport type { ReactNode } from 'react';\nimport styles from './StatusBadge.module.css';\n\nexport type Tone = 'neutral' | 'info' | 'running' | 'success' | 'warning' | 'danger' | 'unknown';\n\nconst STATUS_TONE: Record<string, Tone> = {\n // Run / swarm / proposal lifecycle.\n pending: 'neutral',\n queued: 'neutral',\n waiting: 'neutral',\n running: 'running',\n active: 'running',\n in_progress: 'running',\n building: 'running',\n applying: 'running',\n done: 'success',\n success: 'success',\n succeeded: 'success',\n applied: 'success',\n merged: 'success',\n ready: 'success',\n approved: 'success',\n ship: 'success',\n review: 'warning',\n degraded: 'warning',\n paused: 'warning',\n noise: 'neutral',\n failed: 'danger',\n error: 'danger',\n errored: 'danger',\n rejected: 'danger',\n harmful: 'danger',\n cancelled: 'neutral',\n canceled: 'neutral',\n unknown: 'unknown',\n};\n\nexport function statusToTone(status: string | undefined | null): Tone {\n if (!status) return 'unknown';\n return STATUS_TONE[status.toLowerCase()] ?? 'neutral';\n}\n\nexport interface StatusBadgeProps {\n status: string;\n /** Override the derived tone (rare — prefer letting statusToTone decide). */\n tone?: Tone;\n children?: ReactNode;\n}\n\nexport function StatusBadge({ status, tone, children }: StatusBadgeProps): ReactNode {\n const resolved = tone ?? statusToTone(status);\n return (\n <span className={`${styles.badge} ${styles[resolved]}`}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {children ?? status}\n </span>\n );\n}\n\n/** A named DAG/milestone phase — categorical color, unrelated to health. */\nexport function PhaseDot({ index }: { index: number }): ReactNode {\n const n = ((index % 6) + 6) % 6; // wrap safely for any index, including negatives\n return <span className={styles.phaseDot} style={{ background: `var(--phase-${n + 1})` }} aria-hidden=\"true\" />;\n}\n"],"mappings":"kVCiBM,EAAoC,CAExC,QAAS,UACT,OAAQ,UACR,QAAS,UACT,QAAS,UACT,OAAQ,UACR,YAAa,UACb,SAAU,UACV,SAAU,UACV,KAAM,UACN,QAAS,UACT,UAAW,UACX,QAAS,UACT,OAAQ,UACR,MAAO,UACP,SAAU,UACV,KAAM,UACN,OAAQ,UACR,SAAU,UACV,OAAQ,UACR,MAAO,UACP,OAAQ,SACR,MAAO,SACP,QAAS,SACT,SAAU,SACV,QAAS,SACT,UAAW,UACX,SAAU,UACV,QAAS,SACX,EAEA,SAAgB,EAAa,EAAyC,CAEpE,OADK,EACE,EAAY,EAAO,YAAY,IAAM,UADxB,SAEtB,CASA,SAAgB,EAAY,CAAE,SAAQ,OAAM,YAAyC,CACnF,IAAM,EAAW,GAAQ,EAAa,CAAM,EAC5C,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,KAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAChD,GAAY,CACT,GAEV,CAGA,SAAgB,EAAS,CAAE,SAAuC,CAChE,IAAM,GAAM,EAAQ,EAAK,GAAK,EAC9B,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,MAAO,CAAE,WAAY,eAAe,EAAI,EAAE,EAAG,EAAG,cAAY,MAAQ,CAAA,CAC/G"}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-QesfXBsb.js";import{D as r,L as i,S as a,T as ee,_ as o,a as te,c as ne,d as s,f as re,h as c,l as ie,m as ae,n as oe,o as se,r as l,s as u,t as ce,u as le,w as d,x as f}from"./ChartFrame-SygZ7B3x.js";import{c as p,i as m,l as h,m as g,n as ue,p as de,r as fe}from"./colors-BZ3a9wFf.js";import{l as pe,n as _,o as v,t as me}from"./format-DKrNjdwD.js";var y=t(e(),1),b=n(),x=8,S=16,C=2,w=28,T=16,E=4,D=[`Mon`,``,`Wed`,``,`Fri`,``,``],O=[``,`Mon`,``,`Wed`,``,`Fri`,``];function k({title:e,description:t,caveat:n,status:r,days:i,weekStart:a=1,width:ee,formatValue:o=me,unit:s=``,ariaLabel:re}){let ie=(0,y.useRef)(null),ae=le(ie,ee),oe=(0,y.useId)(),d=de((0,y.useId)()),p=(0,y.useMemo)(()=>c(i,a),[i,a]),[m,h]=(0,y.useState)(null),ue=Math.max(0,...i.map(e=>e.value??0)),fe=i.some(e=>e.value!==null),pe=r??(i.length===0?{kind:`empty`}:fe?{kind:`ready`}:{kind:`unknown`}),v=ae-w,k=Math.max(1,Math.floor((v+C)/10)),A=Math.min(p.weeks,k),j=p.weeks-A,M=Math.max(x,Math.min(S,Math.floor((v+C)/Math.max(1,A))-C)),N=j,P=p.cells.filter(e=>e.week>=N),F=w+A*(M+C),I=T+7*(M+C),L=e=>w+(e.week-N)*(M+C),R=e=>T+e.weekday*(M+C),z=s?` ${s}`:``,B=e=>`${_(e.day)}: ${e.value===null?`no data`:`${o(e.value)}${z}`}`,V=[];for(let e of p.months){if(e.week<N)continue;let t=V[V.length-1];t&&e.week-t.week<3||V.push(e)}let H=P.filter(e=>!e.outside),U=m===null?void 0:H[m];function he(e){if(H.length===0)return;let t=m??H.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=H.length-1):r=t+n,r!==null&&(e.preventDefault(),h(Math.max(0,Math.min(H.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=re??`${e}: ${i.length} days, ${o(ge)}${z} in total`+(G&&(G.value??0)>0?`, busiest ${_(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=>_(e.day)},{key:`value`,label:s?s[0].toUpperCase()+s.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:o(e.value)}],ve=(0,b.jsxs)(`div`,{className:u.legend,"aria-hidden":`true`,children:[(0,b.jsx)(`span`,{className:u.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,b.jsx)(`span`,{className:u.swatch,style:{background:g(t)}},t)),(0,b.jsx)(`span`,{className:u.legendItem,children:`More`}),(0,b.jsxs)(`span`,{className:u.legendItem,children:[(0,b.jsx)(`span`,{className:u.swatchHatch}),`no data`]})]});return(0,b.jsx)(ce,{title:e,description:t,caveat:n,status:pe,table:(0,b.jsx)(ne,{caption:e,columns:_e,rows:[...i].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,b.jsxs)(b.Fragment,{children:[ve,j>0?(0,b.jsxs)(`p`,{className:u.note,children:[`Showing the latest `,A,` weeks; `,j,` earlier weeks are in the table.`]}):null]}),children:(0,b.jsxs)(`div`,{ref:ie,className:`${u.plotWrap} ${u.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":oe,onFocus:()=>h(e=>e??(H.length?H.length-1:null)),onBlur:()=>h(null),onKeyDown:he,children:[(0,b.jsxs)(`svg`,{className:u.svg,width:F,height:I,viewBox:`0 0 ${F} ${I}`,role:`img`,"aria-label":K,children:[(0,b.jsx)(`defs`,{children:(0,b.jsx)(te,{id:d})}),V.map(e=>(0,b.jsx)(`text`,{className:u.tick,x:w+(e.week-N)*(M+C),y:11,children:e.label},`${e.week}${e.label}`)),(a===1?D:O).map((e,t)=>e&&M>=10?(0,b.jsx)(`text`,{className:u.tick,x:0,y:T+t*(M+C)+M/2,dy:`0.32em`,children:e},t):null),P.map(e=>{if(e.outside)return null;let t=f(e.value,ue,E),n=U?.day===e.day;return(0,b.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:L(e),y:R(e),width:M,height:M,rx:2,className:t===null?u.unknownMark:void 0,fill:t===null?`url(#${d})`:g(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>h(H.indexOf(e)),onPointerLeave:()=>h(null)},e.day)})]}),(0,b.jsx)(`span`,{id:oe,className:u.srOnly,"aria-live":`polite`,children:U?B(U):``}),U?(0,b.jsx)(l,{left:se(L(U)+M/2,F,60),top:R(U),title:_(U.day),rows:[{key:`v`,label:s||`Value`,value:U.value===null?null:o(U.value)}]}):null]})})}var A={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function j(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var M={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function N(e){return e===`positive`?m:e===`negative`?fe:`var(--text-secondary)`}function P(e,t){return e>0?`+${t(e)}`:t(e)}var F=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),I=28,L=22,R=12,z=480;function B({title:e,description:t,caveat:n,status:i,rows:a,unit:ee=``,gate:o,formatValue:s,unknownText:c=`not enough pairs yet`,width:ie,ariaLabel:se}){let l=s??F,d=(0,y.useRef)(null),f=le(d,ie),[p,h]=(0,y.useState)(null),g=(0,y.useId)(),pe=de((0,y.useId)()),_=ee?` ${ee}`:``,v=a.filter(e=>j(e)!==`unknown`),me=i??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),x=f<z,S=Math.max(84,Math.min(180,Math.round(f*(x?.3:.26)))),C=x?0:118,w=S+8,T=Math.max(w+40,f-C-R),E=v.flatMap(e=>[e.low,e.high]),D=Math.min(0,o?.value??0,...E),O=Math.max(0,o?.value??0,...E),k=ae(D,O===D?D+1:O,{count:x?3:5,integer:re([...E,o?.value??0]),format:s?e=>e===0?`0`:P(e,s):void 0}),B=k.ticks,V=s?k.labels:k.labels.map((e,t)=>B[t]>0?`+${e}`:e),H=r(B[0],B[B.length-1],w,T),U=a.length*I,he=U+L,W=e=>{let t=j(e);return t===`unknown`?`${e.label}: ${c}`:`${e.label}: ${P(e.estimate,l)}${_}, 95% interval ${P(e.low,l)} to ${P(e.high,l)}; ${M[t]}`},ge=v.filter(e=>j(e)===`positive`).length,G=se??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=p??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(),h(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${_}`,numeric:!0,render:e=>e.estimate===null?`—`:P(e.estimate,l)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${P(e.low,l)} to ${P(e.high,l)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>j(e)===`unknown`?c:M[j(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=p===null?void 0:a[p],q=Math.floor(S/7);return(0,b.jsx)(ce,{title:e,description:t,caveat:n,status:me,table:(0,b.jsx)(ne,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,b.jsx)(oe,{min:1,items:[{label:`Helped`,color:m},{label:`Hurt`,color:fe},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>v.length?[{label:c,kind:`hatch`}]:[]]}),children:(0,b.jsxs)(`div`,{ref:d,className:`${u.plotWrap} ${u.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":g,onFocus:()=>h(e=>e??(a.length?0:null)),onBlur:()=>h(null),onKeyDown:K,children:[(0,b.jsxs)(`svg`,{className:u.svg,width:f,height:he,viewBox:`0 0 ${f} ${he}`,role:`img`,"aria-label":G,children:[(0,b.jsx)(`defs`,{children:(0,b.jsx)(te,{id:pe})}),B.map((e,t)=>(0,b.jsxs)(`g`,{children:[(0,b.jsx)(`line`,{className:u.grid,x1:H(e),x2:H(e),y1:0,y2:U}),(0,b.jsx)(`text`,{className:u.tick,x:H(e),y:he-6,textAnchor:`middle`,children:V[t]})]},e)),(0,b.jsx)(`line`,{"data-role":`zero`,x1:H(0),x2:H(0),y1:0,y2:U,stroke:ue,strokeWidth:1.5}),o&&o.value!==0?(0,b.jsx)(`g`,{"data-role":`gate`,children:(0,b.jsx)(`line`,{className:u.reference,x1:H(o.value),x2:H(o.value),y1:0,y2:U})}):null,a.map((e,t)=>{let n=t*I+I/2,r=j(e),i=N(r),a=p===t;return(0,b.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:p!==null&&!a?.55:1,children:[t%2==1?(0,b.jsx)(`rect`,{className:A.band,x:0,y:t*I,width:f,height:I}):null,(0,b.jsx)(`text`,{className:u.label,x:S,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,b.jsxs)(`g`,{"data-role":`unknown`,children:[(0,b.jsx)(`rect`,{className:u.unknownMark,fill:`url(#${pe})`,x:w+.5,y:n-5,width:Math.max(1,T-w-1),height:10,rx:2}),x?null:(0,b.jsx)(`text`,{className:u.tick,x:f-R,y:n,dy:`0.32em`,textAnchor:`end`,children:c})]}):(0,b.jsxs)(`g`,{children:[(0,b.jsx)(`line`,{"data-role":`ci`,x1:H(e.low),x2:H(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,b.jsx)(`line`,{x1:H(e.low),x2:H(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,b.jsx)(`line`,{x1:H(e.high),x2:H(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,b.jsx)(`rect`,{"data-role":`estimate`,className:u.marker,x:H(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),x?null:(0,b.jsxs)(`text`,{className:u.tick,x:f-R,y:n,dy:`0.32em`,textAnchor:`end`,children:[P(e.estimate,l),` [`,P(e.low,l),`, `,P(e.high,l),`]`]})]}),a?(0,b.jsx)(`rect`,{className:A.focusRing,x:1,y:t*I+1,width:f-2,height:26,rx:3}):null]},e.id)})]}),(0,b.jsx)(`span`,{id:g,className:u.srOnly,"aria-live":`polite`,children:ve?W(ve):``})]})})}function V(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 H=18,U=26,he=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:c,steps:f,markers:m=[],now:g,from:ue,baseline:_,unit:me=``,formatValue:x,formatTime:S,height:C=200,width:w,ariaLabel:T}){let E=x??ge,D=e=>a(e)?(S??v)(e):`—`,O=(0,y.useRef)(null),k=le(O,w),A=ie(),[j,M]=(0,y.useState)(null),N=(0,y.useId)(),P=de((0,y.useId)()),F=me?` ${me}`:``,I=g??Date.now(),L=V(f,I),R=m.filter(e=>a(e.at)),z=L.filter(e=>e.value!==null),B=c??(L.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:z.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),K=[...L.map(e=>e.at),...R.map(e=>e.at)].filter(a),_e=Math.max(a(I)?I:0,...K,...L.map(e=>e.until).filter(a)),ve=ue!==void 0&&a(ue)?ue:K.length?Math.min(...K):_e-W,[q,ye]=o(ve,_e,s,`end`),be=z.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(_?.value??0,...be),Se=Math.max(_?.value??0,...be),Ce=ae(xe,Se===xe?xe+1:Se,{count:4,integer:re([...be,_?.value??0]),format:x?e=>e===0?`0`:G(e,x):void 0}),we=Ce.ticks,Te=x?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=i(Te,30,56,A),Y=Math.max(40,k-J-he),Ee=C-H-U,De=r(q,ye,J,J+Y),X=r(we[0],we[we.length-1],H+Ee,H),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=pe(q,ye,S,[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:d(A)}),Ae=[],Q=[],je=null;for(let e of L){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})`:``}, ${D(e.at)} to ${D(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,E)}${F}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,E)} to ${G(e.high,E)}`:``)),Ne=z[z.length-1],Pe=R.filter(e=>e.kind===`rollback`).length,Fe=T??`${e}: ${L.length} step${L.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,E)}${F}`:``)+(Pe?`, ${Pe} rollback${Pe===1?``:`s`}`:``)+`.`;function Ie(e){if(L.length===0)return;let t=j??L.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?L.length-1:null;n!==null&&(e.preventDefault(),M(Math.max(0,Math.min(L.length-1,n))))}let Le=[...L.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:G(e.value,E),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,E)} to ${G(e.high,E)}`})),...R.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=>D(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${F}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=j===null?void 0:L[j];return(0,b.jsx)(ce,{title:e,description:t,caveat:n,status:B,table:(0,b.jsx)(ne,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,b.jsx)(oe,{items:[{label:`Level`,color:p,kind:`line`},{label:`95% interval`,color:h},...Pe?[{label:`▼ rollback`,color:fe}]:[],...L.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,b.jsxs)(`div`,{ref:O,className:`${u.plotWrap} ${u.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":N,onFocus:()=>M(e=>e??(L.length?L.length-1:null)),onBlur:()=>M(null),onKeyDown:Ie,children:[(0,b.jsxs)(`svg`,{className:u.svg,width:k,height:C,viewBox:`0 0 ${k} ${C}`,role:`img`,"aria-label":Fe,children:[(0,b.jsx)(`defs`,{children:(0,b.jsx)(te,{id:P})}),we.map((e,t)=>(0,b.jsxs)(`g`,{children:[(0,b.jsx)(`line`,{className:u.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,b.jsx)(`text`,{className:u.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,b.jsx)(`text`,{"data-axis-label":e.key,className:u.tick,x:e.x,y:C-8,textAnchor:e.anchor,children:e.text},e.key)),_?(0,b.jsxs)(`g`,{"data-role":`baseline`,children:[(0,b.jsx)(`line`,{className:u.reference,x1:J,x2:J+Y,y1:X(_.value),y2:X(_.value)}),(0,b.jsx)(`text`,{className:`${u.tick} ${u.halo}`,x:J+4,y:X(_.value)-5,children:_.label})]}):null,L.map((e,t)=>{let n=Z(e.at),r=Math.max(n+1,Z(e.until));if(e.value===null)return(0,b.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:u.unknownMark,fill:`url(#${P})`,x:n,y:H,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,b.jsx)(`g`,{"data-step":e.id,opacity:j!==null&&j!==t?.6:1,children:i?(0,b.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:h,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,b.jsx)(`path`,{"data-role":`level`,className:u.line,stroke:p,d:e},t)),L.map(e=>e.value===null?null:(0,b.jsx)(`circle`,{className:u.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:p},`p${e.id}`)),R.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,b.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?fe:p,children:(0,b.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${D(e.at)}`})},e.id)})]}),(0,b.jsx)(`span`,{id:N,className:u.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,b.jsx)(l,{left:se((Z($.at)+Z($.until))/2,k),top:$.value===null?H+Ee/2:X($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${G($.value,E)}${F}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,E)} to ${G($.high,E)}`},{key:`t`,label:`From`,value:D($.at)}]}):null]})})}export{B as n,k as r,K as t};
2
+ //# sourceMappingURL=StepBand-DQykLkk_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepBand-Duz1PUes.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-DQykLkk_.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":"wZA8CM,EAAW,EACX,EAAW,GACX,EAAM,EACN,EAAc,GACd,EAAU,GACV,EAAQ,EACR,EAAe,CAAC,MAAO,GAAI,MAAO,GAAI,MAAO,GAAI,EAAE,EACnD,EAAe,CAAC,GAAI,MAAO,GAAI,MAAO,GAAI,MAAO,EAAE,EAEzD,SAAgB,EAAgB,CAC9B,QACA,cACA,SACA,SACA,OACA,YAAY,EACZ,MAAO,GACP,cAAc,GACd,OAAO,GACP,cACuB,CACvB,IAAM,IAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,GAAQ,GAAc,GAAS,EAAU,EACzC,IAAA,EAAS,EAAA,MAAA,CAAM,EACf,EAAU,IAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,GAAA,EAAO,EAAA,QAAA,KAAc,EAAa,EAAM,CAAS,EAAG,CAAC,EAAM,CAAS,CAAC,EACrE,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAEhD,GAAM,KAAK,IAAI,EAAG,GAAG,EAAK,IAAK,GAAM,EAAE,OAAS,CAAC,CAAC,EAClD,GAAW,EAAK,KAAM,GAAM,EAAE,QAAU,IAAI,EAC5C,GAA8B,IAAW,EAAK,SAAW,EAAI,CAAE,KAAM,OAAQ,EAAI,GAAW,CAAE,KAAM,OAAQ,EAAI,CAAE,KAAM,SAAU,GAElI,EAAQ,GAAQ,EAChB,EAAW,KAAK,IAAI,EAAG,KAAK,OAAO,EAAQ,GAAQ,EAAe,CAAC,EACnE,EAAa,KAAK,IAAI,EAAK,MAAO,CAAQ,EAC1C,EAAc,EAAK,MAAQ,EAC3B,EAAO,KAAK,IAAI,EAAU,KAAK,IAAI,EAAU,KAAK,OAAO,EAAQ,GAAO,KAAK,IAAI,EAAG,CAAU,CAAC,EAAI,CAAG,CAAC,EACvG,EAAY,EACZ,EAAU,EAAK,MAAM,OAAQ,GAAM,EAAE,MAAQ,CAAS,EACtD,EAAO,EAAc,GAAc,EAAO,GAC1C,EAAO,EAAU,GAAK,EAAO,GAC7B,EAAO,GAAoB,GAAe,EAAE,KAAO,IAAc,EAAO,GACxE,EAAO,GAAoB,EAAU,EAAE,SAAW,EAAO,GACzD,EAAW,EAAO,IAAI,IAAS,GAC/B,EAAY,GAAoB,GAAG,EAAe,EAAE,GAAG,EAAE,IAAI,EAAE,QAAU,KAAO,UAAY,GAAG,EAAY,EAAE,KAAK,IAAI,MAEtH,EAAiD,CAAC,EACxD,IAAK,IAAM,KAAK,EAAK,OAAQ,CAC3B,GAAI,EAAE,KAAO,EAAW,SACxB,IAAM,EAAO,EAAY,EAAY,OAAS,GAC1C,GAAQ,EAAE,KAAO,EAAK,KAAO,GACjC,EAAY,KAAK,CAAC,CACpB,CAEA,IAAM,EAAS,EAAQ,OAAQ,GAAM,CAAC,EAAE,OAAO,EACzC,EAAY,IAAU,KAAuB,IAAA,GAAhB,EAAO,GAE1C,SAAS,GAAM,EAAwC,CACrD,GAAI,EAAO,SAAW,EAAG,OACzB,IAAM,EAAM,GAAS,EAAO,OAAS,EAC/B,EAAQ,EAAE,MAAQ,YAAc,GAAK,EAAE,MAAQ,aAAe,EAAI,EAAE,MAAQ,UAAY,GAAK,EAAE,MAAQ,YAAc,EAAI,KAC3H,EAAsB,KACtB,IAAU,KACL,EAAE,MAAQ,OAAQ,EAAO,EACzB,EAAE,MAAQ,QAAO,EAAO,EAAO,OAAS,GAF7B,EAAO,EAAM,EAG7B,IAAS,OACb,EAAE,eAAe,EACjB,EAAS,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,OAAS,EAAG,CAAI,CAAC,CAAC,EACzD,CAEA,IAAM,EAAY,EAAK,OAAQ,GAAM,EAAE,QAAU,IAAI,EAC/C,GAAQ,EAAU,QAAQ,EAAG,IAAM,GAAK,EAAE,OAAS,GAAI,CAAC,EACxD,EAAU,EAAU,QAA8B,EAAG,IAAO,CAAC,IAAM,EAAE,OAAS,IAAM,EAAE,OAAS,GAAK,EAAI,EAAI,IAAI,EAChH,EAAU,IAAa,GAAG,EAAM,IAAI,EAAK,OAAO,SAAS,EAAY,EAAK,IAAI,EAAS,YAC1F,IAAY,EAAQ,OAAS,GAAK,EAAI,aAAa,EAAe,EAAQ,GAAG,EAAE,QAAQ,EAAY,EAAQ,KAAM,IAAM,KACvH,EAAK,OAAS,EAAU,OAAS,EAAI,KAAK,EAAK,OAAS,EAAU,OAAO,oBAAsB,IAAM,IAElG,GAAwC,CAC5C,CAAE,IAAK,MAAO,MAAO,MAAO,OAAS,GAAM,EAAe,EAAE,GAAG,CAAE,EACjE,CAAE,IAAK,QAAS,MAAO,EAAO,EAAK,EAAE,CAAE,YAAY,EAAI,EAAK,MAAM,CAAC,EAAI,QAAS,QAAS,GAAM,OAAS,GAAO,EAAE,QAAU,KAAO,IAAM,EAAY,EAAE,KAAK,CAAG,CAChK,EAEM,IACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,OAAQ,cAAY,OAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAY,SAAA,MAAU,CAAA,EAC3C,MAAM,KAAK,CAAE,OAAQ,CAAU,GAAI,EAAG,KACrC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,EAAK,OAAQ,MAAO,CAAE,WAAY,EAAU,CAAC,CAAE,CAAI,EAAjE,CAAiE,CAC7E,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAY,SAAA,MAAU,CAAA,GAC5C,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAtB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAc,CAAA,EAAC,SAEjC,GACH,IAGP,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACS,QACM,cACL,SACR,OAAQ,GACR,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,EAAgB,WAAS,KAAM,CAAC,GAAG,CAAI,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC,EAAG,OAAS,GAAM,EAAE,GAAM,CAAA,EACvI,QACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACA,EAAc,GACb,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAK,KAAnB,SAAA,CAAyB,sBAAoB,EAAW,WAAS,EAAY,kCAAmC,CAC9G,CAAA,EAAA,IACJ,CAAA,CAAA,EAGJ,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,GACL,UAAW,GAAG,EAAK,SAAS,GAAG,EAAK,YACpC,SAAU,EACV,KAAK,QACL,aAAY,GAAG,EAAM,4CACrB,mBAAkB,GAClB,YAAe,EAAU,GAAM,IAAM,EAAO,OAAS,EAAO,OAAS,EAAI,KAAK,EAC9E,WAAc,EAAS,IAAI,EAC3B,UAAW,GATb,SAAA,EAWE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAK,MAAO,EAAM,OAAQ,EAAM,QAAS,OAAO,EAAK,GAAG,IAAQ,KAAK,MAAM,aAAY,EAA5G,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,GAAI,CAAU,CAAA,CACxB,CAAA,EACL,EAAY,IAAK,IAChB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAkC,UAAW,EAAK,KAAM,EAAG,GAAe,EAAE,KAAO,IAAc,EAAO,GAAM,EAAG,GAC9G,SAAA,EAAE,KACC,EAFK,GAAG,EAAE,OAAO,EAAE,OAEnB,CACP,GACC,IAAc,EAAI,EAAe,EAAA,CAAc,KAAK,EAAO,IAC3D,GAAS,GAAQ,IACf,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,EAAK,KAAM,EAAG,EAAG,EAAG,EAAU,GAAK,EAAO,GAAO,EAAO,EAAG,GAAG,SAAU,SAAA,CAAY,EAAlG,CAAkG,EAC3G,IACN,EACC,EAAQ,IAAK,GAAM,CAClB,GAAI,EAAE,QAAS,OAAO,KACtB,IAAM,EAAS,EAAW,EAAE,MAAO,GAAK,CAAK,EACvC,EAAU,GAAW,MAAQ,EAAE,IACrC,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAEE,WAAU,EAAE,IACZ,cAAa,IAAW,KAAO,UAAY,EAC3C,EAAG,EAAI,CAAC,EACR,EAAG,EAAI,CAAC,EACR,MAAO,EACP,OAAQ,EACR,GAAI,EACJ,UAAW,IAAW,KAAO,EAAK,YAAc,IAAA,GAChD,KAAM,IAAW,KAAO,QAAQ,EAAQ,GAAK,EAAU,CAAM,EAC7D,MAAO,EAAU,CAAE,OAAQ,sBAAuB,YAAa,EAAG,gBAAiB,MAAO,EAAI,IAAA,GAC9F,mBAAsB,EAAS,EAAO,QAAQ,CAAC,CAAC,EAChD,mBAAsB,EAAS,IAAI,CACpC,EAbM,EAAE,GAaR,CAEL,CAAC,CACE,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAQ,UAAW,EAAK,OAAQ,YAAU,SAAU,SAAA,EAAY,EAAS,CAAS,EAAI,EAAS,CAAA,EACxG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,GAAiB,EAAI,CAAS,EAAI,EAAO,EAAG,EAAM,EAAE,EAC1D,IAAK,EAAI,CAAS,EAClB,MAAO,EAAe,EAAU,GAAG,EACnC,KAAM,CAAC,CAAE,IAAK,IAAK,MAAO,GAAQ,QAAS,MAAO,EAAU,QAAU,KAAO,KAAO,EAAY,EAAU,KAAK,CAAE,CAAC,CACnH,CAAA,EACC,IACD,GACK,CAAA,CAEhB,6DExJA,SAAgB,EAAc,EAAkE,CAI9F,OAHI,EAAI,WAAa,MAAQ,EAAI,MAAQ,MAAQ,EAAI,OAAS,KAAa,UACvE,EAAI,IAAM,EAAU,WACpB,EAAI,KAAO,EAAU,WAClB,MACT,CAEA,IAAM,EAA+C,CACnD,SAAU,+BACV,SAAU,6BACV,KAAM,0CACN,QAAS,SACX,EAEA,SAAS,EAAa,EAAgC,CAGpD,OAFI,IAAY,WAAmB,EAC/B,IAAY,WAAmB,GAC5B,uBACT,CAEA,SAAS,EAAO,EAAW,EAAoC,CAC7D,OAAO,EAAI,EAAI,IAAI,EAAI,CAAC,IAAM,EAAI,CAAC,CACrC,CAEA,IAAM,EAAsB,GAAuB,KAAK,IAAI,CAAC,GAAK,GAAK,EAAE,QAAQ,CAAC,EAAI,EAAE,QAAQ,CAAC,EAE3F,EAAQ,GACR,EAAS,GACT,EAAQ,GACR,EAAS,IAEf,SAAgB,EAAW,CACzB,QACA,cACA,SACA,SACA,OACA,QAAO,GACP,OACA,YAAa,EACb,cAAc,uBACd,MAAO,GACP,cACkB,CAClB,IAAM,EAAc,GAAmB,EACjC,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,EAAQ,GAAc,EAAS,EAAU,EACzC,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAwB,IAAI,EAClD,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,GAAU,IAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,EAAW,GAAO,IAAI,KAAS,GAE/B,EAAQ,EAAK,OAAQ,GAAM,EAAc,CAAC,IAAM,SAAS,EACzD,GAA8B,IAAW,EAAK,SAAW,EAAI,CAAE,KAAM,QAAS,QAAS,8BAA+B,EAAI,CAAE,KAAM,OAAQ,GAE1I,EAAS,EAAQ,EACjB,EAAS,KAAK,IAAI,GAAI,KAAK,IAAI,IAAK,KAAK,MAAM,GAAS,EAAS,GAAM,IAAK,CAAC,CAAC,EAC9E,EAAS,EAAS,EAAI,IACtB,EAAS,EAAS,EAClB,EAAS,KAAK,IAAI,EAAS,GAAI,EAAQ,EAAS,CAAK,EACrD,EAAS,EAAM,QAAS,GAAM,CAAC,EAAE,IAAM,EAAE,IAAK,CAAC,EAC/C,EAAK,KAAK,IAAI,EAAG,GAAM,OAAS,EAAG,GAAG,CAAM,EAC5C,EAAK,KAAK,IAAI,EAAG,GAAM,OAAS,EAAG,GAAG,CAAM,EAI5C,EAAQ,GAAU,EAAI,IAAO,EAAK,EAAK,EAAI,EAAI,CACnD,MAAO,EAAS,EAAI,EACpB,QAAS,GAAY,CAAC,GAAG,EAAQ,GAAM,OAAS,CAAC,CAAC,EAClD,OAAQ,EAAmB,GAAO,IAAM,EAAI,IAAM,EAAO,EAAG,CAAe,EAAK,IAAA,EAClF,CAAC,EACK,EAAQ,EAAM,MACd,EAAa,EAAkB,EAAM,OAAS,EAAM,OAAO,KAAK,EAAG,IAAO,EAAM,GAAM,EAAI,IAAI,IAAM,CAAE,EACtG,EAAK,EAAY,EAAM,GAAK,EAAM,EAAM,OAAS,GAAK,EAAQ,CAAM,EACpE,EAAQ,EAAK,OAAS,EACtB,GAAO,EAAQ,EAEf,EAAU,GAAyB,CACvC,IAAM,EAAI,EAAc,CAAC,EAEzB,OADI,IAAM,UAAkB,GAAG,EAAE,MAAM,IAAI,IACpC,GAAG,EAAE,MAAM,IAAI,EAAO,EAAE,SAAW,CAAW,IAAI,EAAS,iBAAiB,EAAO,EAAE,IAAM,CAAW,EAAE,MAAM,EAAO,EAAE,KAAO,CAAW,EAAE,IAAI,EAAc,IACtK,EAEM,GAAW,EAAM,OAAQ,GAAM,EAAc,CAAC,IAAM,UAAU,CAAC,CAAC,OAChE,EAAU,IAAa,GAAG,EAAM,IAAI,EAAK,OAAO,aAAa,EAAK,SAAW,EAAI,GAAK,IAAI,IAAI,GAAS,+BAE7G,SAAS,EAAM,EAAwC,CACrD,GAAI,EAAK,SAAW,EAAG,OACvB,IAAM,EAAM,GAAU,EAChB,EAAO,EAAE,MAAQ,YAAc,EAAM,EAAI,EAAE,MAAQ,UAAY,EAAM,EAAI,EAAE,MAAQ,OAAS,EAAI,EAAE,MAAQ,MAAQ,EAAK,OAAS,EAAI,KACtI,IAAS,OACb,EAAE,eAAe,EACjB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAS,EAAG,CAAI,CAAC,CAAC,EACxD,CAEA,IAAM,GAAoC,CACxC,CAAE,IAAK,QAAS,MAAO,aAAc,OAAS,GAAM,EAAE,KAAM,EAC5D,CAAE,IAAK,MAAO,MAAO,WAAW,IAAY,QAAS,GAAM,OAAS,GAAO,EAAE,WAAa,KAAO,IAAM,EAAO,EAAE,SAAU,CAAW,CAAG,EACxI,CACE,IAAK,KACL,MAAO,eACP,QAAS,GACT,OAAS,GAAO,EAAE,MAAQ,MAAQ,EAAE,OAAS,KAAO,IAAM,GAAG,EAAO,EAAE,IAAK,CAAW,EAAE,MAAM,EAAO,EAAE,KAAM,CAAW,GAC1H,EACA,CAAE,IAAK,IAAK,MAAO,QAAS,QAAS,GAAM,OAAS,GAAO,EAAE,IAAM,MAAQ,EAAE,IAAM,IAAA,GAAY,IAAM,OAAO,EAAE,CAAC,CAAG,EAClH,CAAE,IAAK,UAAW,MAAO,UAAW,OAAS,GAAO,EAAc,CAAC,IAAM,UAAY,EAAc,EAAc,EAAc,CAAC,EAAI,EACpI,GAAI,EAAK,KAAM,GAAM,EAAE,MAAM,EAAI,CAAC,CAAE,IAAK,SAAU,MAAO,SAAU,OAAS,GAAiB,EAAE,QAAU,EAAG,CAAC,EAAI,CAAC,CACrH,EAEM,GAAY,IAAW,KAAsB,IAAA,GAAf,EAAK,GACnC,EAAa,KAAK,MAAM,EAAS,CAAC,EAExC,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACS,QACM,cACL,SACR,OAAQ,GACR,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,EAAgB,WAAe,OAAM,OAAS,GAAM,EAAE,EAAK,CAAA,EACtF,QACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,IAAK,EACL,MAAO,CACL,CAAE,MAAO,SAAU,MAAO,CAAoB,EAC9C,CAAE,MAAO,OAAQ,MAAO,EAAoB,EAC5C,CAAE,MAAO,kBAAmB,MAAO,uBAAwB,EAC3D,GAAI,EAAK,OAAS,EAAM,OAAS,CAAC,CAAE,MAAO,EAAa,KAAM,OAAiB,CAAC,EAAI,CAAC,CACvF,CACD,CAAA,EAGH,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,UAAW,GAAG,EAAK,SAAS,GAAG,EAAK,YACpC,SAAU,EACV,KAAK,QACL,aAAY,GAAG,EAAM,2DACrB,mBAAkB,EAClB,YAAe,EAAW,GAAM,IAAM,EAAK,OAAS,EAAI,KAAK,EAC7D,WAAc,EAAU,IAAI,EAC5B,UAAW,EATb,SAAA,EAWE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAY,QAAO,OAAQ,GAAM,QAAS,OAAO,EAAM,GAAG,KAAQ,KAAK,MAAM,aAAY,EAA9G,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,GAAI,EAAU,CAAA,CACxB,CAAA,EACL,EAAM,KAAK,EAAG,KACb,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,GAAI,CAAQ,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,EAAG,EAAG,CAAC,EAAG,EAAG,GAAO,EAAG,WAAW,SAC3D,SAAA,EAAW,EACR,CAAA,CACL,CAAA,EALK,CAKL,CACJ,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,OAAO,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,GAAI,EAAO,OAAQ,GAAqB,YAAa,GAAM,CAAA,EAC9G,GAAQ,EAAK,QAAU,GACtB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,YAAU,OACX,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,UAAW,GAAI,EAAG,EAAK,KAAK,EAAG,GAAI,EAAG,EAAK,KAAK,EAAG,GAAI,EAAG,GAAI,CAAQ,CAAA,CAC3F,CAAA,EACD,KACH,EAAK,KAAK,EAAG,IAAM,CAClB,IAAM,EAAI,EAAI,EAAQ,EAAQ,EACxB,EAAI,EAAc,CAAC,EACnB,EAAQ,EAAa,CAAC,EACtB,EAAW,IAAW,EAC5B,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAc,WAAU,EAAE,GAAI,eAAc,EAAG,QAAS,IAAW,MAAQ,CAAC,EAAW,IAAO,EAA9F,SAAA,CACG,EAAI,GAAM,GAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,EAAG,EAAG,EAAG,EAAI,EAAc,QAAO,OAAQ,CAAQ,CAAA,EAAI,MACnG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,MAAO,EAAG,EAAW,IAAG,GAAG,SAAS,WAAW,MAClE,SAAA,EAAE,MAAM,OAAS,EAAa,GAAG,EAAE,MAAM,MAAM,EAAG,EAAa,CAAC,EAAE,GAAK,EAAE,KACtE,CAAA,EACL,IAAM,WACL,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,YAAU,UAAb,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAW,EAAK,YAChB,KAAM,QAAQ,GAAQ,GACtB,EAAG,EAAS,GACZ,EAAG,EAAI,EACP,MAAO,KAAK,IAAI,EAAG,EAAS,EAAS,CAAC,EACtC,OAAQ,GACR,GAAI,CACL,CAAA,EACC,EAEE,MADF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,EAAG,EAAQ,EAAU,IAAG,GAAG,SAAS,WAAW,MAAO,SAAA,CAAkB,CAAA,CAErG,CAEH,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,KAAK,GAAI,EAAG,EAAE,GAAI,EAAG,GAAI,EAAG,EAAE,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,OAAQ,EAAO,YAAa,EAAG,cAAc,OAAS,CAAA,GAC1H,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAG,EAAE,GAAI,EAAG,GAAI,EAAG,EAAE,GAAI,EAAG,GAAI,EAAI,EAAG,GAAI,EAAI,EAAG,OAAQ,EAAO,YAAa,GAAM,CAAA,GAC9F,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAG,EAAE,IAAK,EAAG,GAAI,EAAG,EAAE,IAAK,EAAG,GAAI,EAAI,EAAG,GAAI,EAAI,EAAG,OAAQ,EAAO,YAAa,GAAM,CAAA,GAChG,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,WACV,UAAW,EAAK,OAChB,EAAG,EAAG,EAAE,QAAS,EAAI,EACrB,EAAG,EAAI,EACP,MAAO,GACP,OAAQ,GACR,GAAI,EACJ,KAAM,CACP,CAAA,EACC,EAIE,MAHF,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,EAAG,EAAQ,EAAU,IAAG,GAAG,SAAS,WAAW,MAA3E,SAAA,CACG,EAAO,EAAE,SAAW,CAAW,EAAE,KAAG,EAAO,EAAE,IAAM,CAAW,EAAE,KAAG,EAAO,EAAE,KAAO,CAAW,EAAE,GAC7F,CACJ,CAAA,CACH,CAAA,CAAA,EAEJ,GAAW,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,EAAG,EAAG,EAAG,EAAI,EAAQ,EAAG,MAAO,EAAQ,EAAG,OAAQ,GAAW,GAAI,CAAI,CAAA,EAAI,IACvH,CA3CK,EAAA,EAAE,EA2CP,CAEP,CAAC,CACE,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAQ,UAAW,EAAK,OAAQ,YAAU,SACjD,SAAA,GAAY,EAAO,EAAS,EAAI,EAC7B,CAAA,CACH,GACK,CAAA,CAEhB,CC5MA,SAAgB,EAAU,EAAiC,EAAyB,CAClF,IAAM,EAAS,CAAC,GAAG,CAAK,CAAC,CAAC,OAAQ,GAAM,OAAO,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,GAAK,EAAE,EAAE,EACzF,OAAO,EAAO,KAAK,EAAG,KAAO,CAAE,GAAG,EAAG,MAAO,KAAK,IAAI,EAAE,GAAI,EAAI,EAAI,EAAO,OAAS,EAAO,EAAI,EAAE,CAAE,GAAK,CAAG,CAAE,EAAE,CAChH,CAEA,IAAM,EAAQ,GACR,EAAQ,GACR,GAAQ,GAER,EAAmB,MACnB,GAAsB,GAAuB,KAAK,IAAI,CAAC,GAAK,GAAK,EAAE,QAAQ,CAAC,EAAI,EAAE,QAAQ,CAAC,EAEjG,SAAS,EAAO,EAAW,EAAoC,CAC7D,OAAO,EAAI,EAAI,IAAI,EAAI,CAAC,IAAM,EAAI,CAAC,CACrC,CAEA,SAAgB,EAAS,CACvB,QACA,cACA,SACA,SACA,QACA,QAAS,EAAc,CAAC,EACxB,IAAK,EACL,KAAM,GACN,WACA,QAAO,GACP,YAAa,EACb,WAAY,EACZ,SAAS,IACT,MAAO,EACP,aACgB,CAChB,IAAM,EAAc,GAAmB,GAGjC,EAAc,GAAwB,EAAgB,CAAE,GAAK,GAAkB,EAAA,CAAiB,CAAE,EAAI,IACtG,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,EAAQ,GAAc,EAAS,CAAU,EACzC,EAAY,GAAa,EACzB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAwB,IAAI,EAClD,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,EAAU,IAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,EAAW,GAAO,IAAI,KAAS,GAC/B,EAAM,GAAW,KAAK,IAAI,EAC1B,EAAQ,EAAU,EAAO,CAAG,EAE5B,EAAU,EAAY,OAAQ,GAAM,EAAgB,EAAE,EAAE,CAAC,EACzD,EAAQ,EAAM,OAAQ,GAAM,EAAE,QAAU,IAAI,EAC5C,EAA8B,IAAW,EAAM,SAAW,EAC5D,CAAE,KAAM,QAAS,QAAS,uDAAwD,EAClF,EAAM,SAAW,EAAI,CAAE,KAAM,UAAW,OAAQ,sCAAuC,EAAI,CAAE,KAAM,OAAQ,GAKzG,EAAS,CAAC,GAAG,EAAM,IAAK,GAAM,EAAE,EAAE,EAAG,GAAG,EAAQ,IAAK,GAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAe,EACxF,GAAQ,KAAK,IAAI,EAAgB,CAAG,EAAI,EAAM,EAAG,GAAG,EAAQ,GAAG,EAAM,IAAK,GAAM,EAAE,KAAK,CAAC,CAAC,OAAO,CAAe,CAAC,EAChH,GAAO,KAAa,IAAA,IAAa,EAAgB,EAAQ,EAAI,GAAW,EAAO,OAAS,KAAK,IAAI,GAAG,CAAM,EAAI,GAAQ,EACtH,CAAC,EAAI,IAAM,EAAW,GAAM,GAAO,EAAkB,KAAK,EAC1D,GAAM,EAAM,QAAS,GAAM,CAAC,EAAE,MAAQ,EAAE,KAAO,EAAE,MAAQ,EAAE,MAAQ,EAAE,KAAM,CAAC,EAC5E,GAAK,KAAK,IAAI,GAAU,OAAS,EAAG,GAAG,EAAG,EAC1C,GAAK,KAAK,IAAI,GAAU,OAAS,EAAG,GAAG,EAAG,EAC1C,GAAQ,GAAU,GAAI,KAAO,GAAK,GAAK,EAAI,GAAI,CACnD,MAAO,EACP,QAAS,GAAY,CAAC,GAAG,GAAK,GAAU,OAAS,CAAC,CAAC,EACnD,OAAQ,EAAmB,GAAO,IAAM,EAAI,IAAM,EAAO,EAAG,CAAe,EAAK,IAAA,EAClF,CAAC,EACK,GAAQ,GAAM,MAEd,GAAa,EAAkB,GAAM,OAAS,GAAM,OAAO,KAAK,EAAG,IAAO,GAAM,GAAM,EAAI,IAAI,IAAM,CAAE,EACtG,EAAO,EAAW,GAAY,GAAI,GAAI,CAAS,EAC/C,EAAQ,KAAK,IAAI,GAAI,EAAQ,EAAO,EAAK,EACzC,GAAQ,EAAS,EAAQ,EACzB,GAAK,EAAY,EAAI,GAAI,EAAM,EAAO,CAAK,EAC3C,EAAK,EAAY,GAAM,GAAK,GAAM,GAAM,OAAS,GAAK,EAAQ,GAAO,CAAK,EAC1E,EAAM,GAAc,KAAK,IAAI,EAAO,EAAO,KAAK,IAAI,EAAM,GAAG,CAAC,CAAC,CAAC,EAIhE,GAAS,GAAgB,EAAI,GAAI,EAAgB,CAAC,EAAI,EAAE,CAAC,EACzD,GAAU,GACd,CACE,CAAE,IAAK,QAAS,EAAG,EAAM,OAAQ,QAAS,SAAU,EAAG,SAAU,GAAO,IAAK,GAAM,EAAE,CAAE,CAAC,CAAE,EAC1F,CAAE,IAAK,MAAO,EAAG,EAAO,EAAO,OAAQ,MAAO,SAAU,EAAG,SAAU,GAAO,IAAK,GAAM,EAAE,EAAE,CAAC,CAAE,CAChG,EACA,CAAE,IAAK,EAAM,IAAK,EAAO,EAAO,OAAQ,EAAY,CAAS,CAAE,CACjE,EAGM,GAAiB,CAAC,EACpB,EAAoB,CAAC,EACrB,GAAuB,KAC3B,IAAK,IAAM,KAAK,EAAO,CACrB,GAAI,EAAE,QAAU,KAAM,CAChB,EAAQ,QAAQ,GAAK,KAAK,EAAQ,KAAK,GAAG,CAAC,EAC/C,EAAU,CAAC,EACX,GAAQ,KACR,QACF,CACA,IAAM,EAAI,EAAG,EAAE,KAAK,EACd,EAAI,EAAG,EAAE,EAAE,EACX,EAAI,EAAG,EAAE,KAAK,EACpB,EAAQ,KAAK,KAAU,KAAO,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAM,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EACrG,EAAQ,KAAK,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAC/C,GAAQ,CACV,CACI,EAAQ,QAAQ,GAAK,KAAK,EAAQ,KAAK,GAAG,CAAC,EAE/C,IAAM,GAAU,GACd,GAAG,EAAE,QAAQ,EAAE,OAAS,KAAK,EAAE,OAAO,GAAK,GAAG,IAAI,EAAW,EAAE,EAAE,EAAE,MAAM,EAAW,EAAE,KAAK,EAAE,KAC5F,EAAE,QAAU,KACT,eACA,GAAG,EAAO,EAAE,MAAO,CAAW,IAAI,KACjC,EAAE,MAAQ,MAAQ,EAAE,MAAQ,IAAA,IAAa,EAAE,OAAS,MAAQ,EAAE,OAAS,IAAA,GACpE,kBAAkB,EAAO,EAAE,IAAK,CAAW,EAAE,MAAM,EAAO,EAAE,KAAM,CAAW,IAC7E,KAEJ,GAAO,EAAM,EAAM,OAAS,GAC5B,GAAY,EAAQ,OAAQ,GAAM,EAAE,OAAS,UAAU,CAAC,CAAC,OACzD,GAAU,GAAa,GAAG,EAAM,IAAI,EAAM,OAAO,OAAO,EAAM,SAAW,EAAI,GAAK,OACrF,GAAO,SAAS,EAAO,GAAK,MAAQ,CAAW,IAAI,IAAa,KAChE,GAAY,KAAK,GAAU,WAAW,KAAc,EAAI,GAAK,MAAQ,IAAM,IAE9E,SAAS,GAAM,EAAwC,CACrD,GAAI,EAAM,SAAW,EAAG,OACxB,IAAM,EAAM,GAAU,EAAM,OAAS,EAC/B,EAAO,EAAE,MAAQ,YAAc,EAAM,EAAI,EAAE,MAAQ,aAAe,EAAM,EAAI,EAAE,MAAQ,OAAS,EAAI,EAAE,MAAQ,MAAQ,EAAM,OAAS,EAAI,KAC1I,IAAS,OACb,EAAE,eAAe,EACjB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAM,OAAS,EAAG,CAAI,CAAC,CAAC,EACzD,CAGA,IAAM,GAAmB,CACvB,GAAG,EAAM,IAAK,IAAO,CACnB,GAAI,KAAK,EAAE,KACX,KAAM,EAAE,GACR,KAAM,GAAG,EAAE,QAAQ,EAAE,OAAS,MAAM,EAAE,SAAW,KACjD,MAAO,EAAE,QAAU,KAAO,IAAM,EAAO,EAAE,MAAO,CAAW,EAC3D,SAAU,EAAE,MAAQ,MAAQ,EAAE,MAAQ,IAAA,IAAa,EAAE,OAAS,MAAQ,EAAE,OAAS,IAAA,GAAY,IAAM,GAAG,EAAO,EAAE,IAAK,CAAW,EAAE,MAAM,EAAO,EAAE,KAAM,CAAW,GACnK,EAAE,EACF,GAAG,EAAQ,IAAK,IAAO,CAAE,GAAI,KAAK,EAAE,KAAM,KAAM,EAAE,GAAI,KAAM,GAAG,EAAE,OAAS,WAAa,gBAAkB,YAAY,IAAI,EAAE,QAAS,MAAO,GAAI,SAAU,EAAG,EAAE,CAChK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,KAAO,EAAE,IAAI,EAC1B,GAA8B,CAClC,CAAE,IAAK,OAAQ,MAAO,OAAQ,OAAS,GAAM,EAAW,EAAE,IAAI,CAAE,EAChE,CAAE,IAAK,OAAQ,MAAO,OAAQ,OAAS,GAAM,EAAE,IAAK,EACpD,CAAE,IAAK,QAAS,MAAO,QAAQ,IAAY,QAAS,GAAM,OAAS,GAAM,EAAE,KAAM,EACjF,CAAE,IAAK,KAAM,MAAO,eAAgB,QAAS,GAAM,OAAS,GAAM,EAAE,QAAS,CAC/E,EAEM,EAAa,IAAW,KAAuB,IAAA,GAAhB,EAAM,GAE3C,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACS,QACM,cACL,SACR,OAAQ,EACR,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,EAAgB,WAAS,KAAM,GAAW,OAAS,GAAM,EAAE,EAAK,CAAA,EAC3F,QACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,CACL,CAAE,MAAO,QAAS,MAAO,EAAkB,KAAM,MAAO,EACxD,CAAE,MAAO,eAAgB,MAAO,CAAsB,EACtD,GAAI,GAAY,CAAC,CAAE,MAAO,aAAc,MAAO,EAAoB,CAAC,EAAI,CAAC,EACzE,GAAI,EAAM,KAAM,GAAM,EAAE,QAAU,IAAI,EAAI,CAAC,CAAE,MAAO,eAAgB,KAAM,OAAiB,CAAC,EAAI,CAAC,CACnG,CACD,CAAA,EAGH,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,UAAW,GAAG,EAAK,SAAS,GAAG,EAAK,YACpC,SAAU,EACV,KAAK,QACL,aAAY,GAAG,EAAM,wDACrB,mBAAkB,EAClB,YAAe,EAAW,GAAM,IAAM,EAAM,OAAS,EAAM,OAAS,EAAI,KAAK,EAC7E,WAAc,EAAU,IAAI,EAC5B,UAAW,GATb,SAAA,EAWE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAY,QAAe,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,KAAK,MAAM,aAAY,GAAlH,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,GAAI,CAAU,CAAA,CACxB,CAAA,EACL,GAAM,KAAK,EAAG,KACb,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,GAAI,EAAM,GAAI,EAAO,EAAO,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,CAAC,CAAI,CAAA,GAC/E,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,EAAG,EAAO,EAAG,EAAG,EAAG,CAAC,EAAG,GAAG,SAAS,WAAW,MAAO,SAAA,GAAW,EAAS,CAAA,CACpG,CAAA,EAHK,CAGL,CACJ,EACA,GAAQ,IAAK,IACZ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAkB,kBAAiB,EAAE,IAAK,UAAW,EAAK,KAAM,EAAG,EAAE,EAAG,EAAG,EAAS,EAAG,WAAY,EAAE,OAAS,SAAA,EAAE,IAAW,EAAhH,EAAE,GAA8G,CAC5H,EACA,GACC,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,YAAU,WAAb,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,UAAW,GAAI,EAAM,GAAI,EAAO,EAAO,GAAI,EAAG,EAAS,KAAK,EAAG,GAAI,EAAG,EAAS,KAAK,CAAI,CAAA,GAC9G,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAK,KAAK,GAAG,EAAK,OAAQ,EAAG,EAAO,EAAG,EAAG,EAAG,EAAS,KAAK,EAAI,EAAI,SAAA,EAAS,KAAY,CAAA,CAC3G,CACD,CAAA,EAAA,KACH,EAAM,KAAK,EAAG,IAAM,CACnB,IAAM,EAAI,EAAG,EAAE,EAAE,EACX,EAAI,KAAK,IAAI,EAAI,EAAG,EAAG,EAAE,KAAK,CAAC,EACrC,GAAI,EAAE,QAAU,KACd,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAiB,YAAW,EAAE,GAAI,eAAa,OAAO,UAAW,EAAK,YAAa,KAAM,QAAQ,EAAQ,GAAI,EAAG,EAAG,EAAG,EAAO,MAAO,EAAI,EAAG,OAAQ,GAAO,QAAS,EAAM,EAA9J,EAAE,EAA4J,EAG7K,IAAM,EAAU,EAAE,MAAQ,MAAQ,EAAE,MAAQ,IAAA,IAAa,EAAE,OAAS,MAAQ,EAAE,OAAS,IAAA,GACvF,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAc,YAAW,EAAE,GAAI,QAAS,IAAW,MAAQ,IAAW,EAAI,GAAM,EAC7E,SAAA,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,OAAO,EAAG,EAAG,EAAG,EAAG,EAAE,IAAK,EAAG,MAAO,EAAI,EAAG,OAAQ,KAAK,IAAI,EAAG,EAAG,EAAE,GAAI,EAAI,EAAG,EAAE,IAAK,CAAC,EAAG,KAAM,EAAuB,QAAS,GAAO,CAAA,EACrJ,IACH,EAJK,EAAE,EAIP,CAEP,CAAC,EACA,GAAK,KAAK,EAAG,KACZ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,YAAU,QAAQ,UAAW,EAAK,KAAM,OAAQ,EAAqB,GAAI,EAA5E,CAA4E,CACxF,EACA,EAAM,IAAK,GACV,EAAE,QAAU,KAAO,MAAO,EAAA,EAAA,IAAA,CAAC,SAAD,CAAyB,UAAW,EAAK,OAAQ,GAAI,EAAG,EAAE,EAAE,EAAG,GAAI,EAAG,EAAE,KAAK,EAAG,EAAG,IAAK,KAAM,CAAmB,EAApG,IAAI,EAAE,IAA8F,CAC7I,EACC,EAAQ,IAAK,GAAM,CAClB,IAAM,EAAI,EAAG,EAAE,EAAE,EAEX,EAAI,EAAE,OAAS,WAAa,IAAI,EAAI,EAAE,MAAa,EAAI,EAAE,MAAa,EAAE,OAAW,IAAI,EAAI,EAAE,OAAS,EAAI,EAAE,OAAS,EAAE,MAC7H,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAiB,cAAa,EAAE,KAAS,IAAG,KAAM,EAAE,OAAS,WAAa,GAAsB,EAC9F,UAAA,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAG,EAAE,OAAS,WAAa,cAAgB,UAAU,IAAI,EAAE,MAAM,KAAK,EAAW,EAAE,EAAE,GAAW,CAAA,CACpG,EAFK,EAAE,EAEP,CAEV,CAAC,CACE,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAQ,UAAW,EAAK,OAAQ,YAAU,SAAU,SAAA,EAAa,GAAO,CAAU,EAAI,EAAS,CAAA,EACxG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,IAAkB,EAAG,EAAW,EAAE,EAAI,EAAG,EAAW,KAAK,GAAK,EAAG,CAAK,EAC5E,IAAK,EAAW,QAAU,KAAO,EAAQ,GAAQ,EAAI,EAAG,EAAW,MAAQ,EAAW,KAAK,EAC3F,MAAO,GAAG,EAAW,QAAQ,EAAW,OAAS,MAAM,EAAW,SAAW,KAC7E,KAAM,CACJ,CAAE,IAAK,IAAK,MAAO,QAAS,MAAO,EAAW,QAAU,KAAO,KAAO,GAAG,EAAO,EAAW,MAAO,CAAW,IAAI,GAAW,EAC5H,CACE,IAAK,KACL,MAAO,eACP,MAAO,EAAW,MAAQ,MAAQ,EAAW,MAAQ,IAAA,IAAa,EAAW,OAAS,MAAQ,EAAW,OAAS,IAAA,GAC9G,KACA,GAAG,EAAO,EAAW,IAAK,CAAW,EAAE,MAAM,EAAO,EAAW,KAAM,CAAW,GACtF,EACA,CAAE,IAAK,IAAK,MAAO,OAAQ,MAAO,EAAW,EAAW,EAAE,CAAE,CAC9D,CACD,CAAA,EACC,IACD,GACK,CAAA,CAEhB"}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-QesfXBsb.js";import{kt as r}from"./VerseConsoleApp-BCY5uSok.js";var i=t(e(),1),a={surface:`_surface_1ck24_6`,strip:`_strip_1ck24_14`,title:`_title_1ck24_29`,stripActions:`_stripActions_1ck24_39`,scroll:`_scroll_1ck24_45`,body:`_body_1ck24_53`,grid:`_grid_1ck24_62`,cell:`_cell_1ck24_70`,card:`_card_1ck24_79`,cardHead:`_cardHead_1ck24_114`,cardHeading:`_cardHeading_1ck24_121`,cardTitle:`_cardTitle_1ck24_130`,cardCaption:`_cardCaption_1ck24_138`,cardActions:`_cardActions_1ck24_144`,note:`_note_1ck24_151`,micro:`_micro_1ck24_172`},o=n(),s=e=>Math.max(1,Math.min(12,Math.round(Number.isFinite(e)?e:12)));function c(e,t){let n=s(t);return e===`compact`?12:e===`medium`?n<=6?6:12:n}function l(e,t){let n=t.map(s),r=n.map(t=>c(e,t));if(e!==`medium`)return r;let i=0,a=0;for(let e=0;e<n.length;e+=1)if(a+n[e]>12&&(i=e,a=0),a+=n[e],a===12){let t=e-i+1;if(t>=2){for(let t=i;t<=e;t+=1)r[t]=6;t%2==1&&(r[e]=12)}i=e+1,a=0}return r}function u(e){return(0,i.isValidElement)(e)&&e.type===p}function d(e,t){let n=i.Children.toArray(e),r=l(t,n.filter(u).map(e=>e.props.span)),a=0;return n.map(e=>u(e)?(0,i.cloneElement)(e,{layoutSpan:r[a++]}):e)}function f({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:d(s,l)})]})})]})}function p({span:e,children:t,className:n,id:i,layoutSpan:s}){let{viewport:l}=r(),u={gridColumn:`span ${s??c(l,e)}`};return(0,o.jsx)(`div`,{id:i,className:`${a.cell} ${n??``}`,style:u,"data-span":e,children:t})}function m({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 h({children:e,tone:t=`muted`}){return(0,o.jsx)(`p`,{className:a.note,"data-tone":t,role:t===`danger`?`alert`:`note`,children:e})}function g({children:e}){return(0,o.jsx)(`span`,{className:a.micro,children:e})}export{f as a,g as i,h as n,p as r,m as t};
2
+ //# sourceMappingURL=Surface-D--LXgQm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Surface-D--LXgQm.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 /* Cells share their row's height (audit 16)… */\n align-items: stretch;\n}\n\n.cell {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n/* …and a plain Card fills it, so a pair (Needs you | Leader) is one height.\n A chart frame keeps its natural height: stretching a chart to a taller\n neighbour draws a half-empty card (the 3.9 harness finding). */\n.cell > .card {\n flex: 1 1 auto;\n}\n\n/* A card that renders nothing (e.g. Cloud on a server without the lane)\n leaves no empty row and no extra grid gap. */\n.cell:empty {\n display: none;\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 flex: 1 1 auto;\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. Cards that\n * share a row are one height (a plain Card fills its cell); a chart frame\n * keeps its natural height, never stretched to a taller neighbour (the\n * 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 keeps each wide ROW whole —\n * a pair that fills 12 columns (5 | 7, 8 | 4) becomes 6 | 6 instead of\n * half + full with a blank half-row between (audit 15), and any other\n * cell folds ≤ 6 to half width and wider to full; compact (375) is one\n * column in DOM order — which is why every surface writes its cards in\n * the order the phone should show them.\n */\nimport { Children, cloneElement, isValidElement, useId, type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\nconst clampSpan = (span: number): number => Math.max(1, Math.min(12, Math.round(Number.isFinite(span) ? span : 12)));\n\n/** The grid span ONE card gets at a viewport class, on its own (no row context). Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = clampSpan(span);\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\n/**\n * The spans a run of cells gets at a viewport class, in DOM order. Pure (tested).\n *\n * At medium the cells are grouped into the rows the wide grid would draw\n * (auto-placement: a cell that does not fit starts the next row). A row that\n * exactly fills 12 columns with two or more cells is treated as a unit: every\n * cell goes to half width, and an odd one out (a 4 | 4 | 4 trio's third)\n * takes the full row — so no row is left with a blank half. A row that does\n * not fill 12 (the surface's own layout left room) folds cell by cell.\n */\nexport function layoutSpans(viewport: ViewportClass, spans: readonly number[]): number[] {\n const wide = spans.map(clampSpan);\n const out = wide.map((s) => spanFor(viewport, s));\n if (viewport !== 'medium') return out;\n let start = 0;\n let sum = 0;\n for (let i = 0; i < wide.length; i += 1) {\n if (sum + wide[i]! > 12) {\n start = i;\n sum = 0;\n }\n sum += wide[i]!;\n if (sum === 12) {\n const count = i - start + 1;\n if (count >= 2) {\n for (let j = start; j <= i; j += 1) out[j] = 6;\n if (count % 2 === 1) out[i] = 12;\n }\n start = i + 1;\n sum = 0;\n }\n }\n return out;\n}\n\ninterface CellProps {\n span: number;\n children: ReactNode;\n className?: string;\n id?: string;\n /** Set by Surface from the whole grid's rows (layoutSpans); a Cell outside a Surface falls back to spanFor. */\n layoutSpan?: number;\n}\n\nfunction isCell(node: ReactNode): node is ReactElement<CellProps> {\n return isValidElement(node) && node.type === Cell;\n}\n\n/**\n * Hands each direct Cell child its span for this viewport, computed across the\n * whole run so rows stay whole. Only direct children (and arrays) are seen —\n * a Cell nested in a fragment keeps its own `spanFor` fallback.\n */\nfunction laidOut(children: ReactNode, viewport: ViewportClass): ReactNode[] {\n const items = Children.toArray(children);\n const spans = layoutSpans(viewport, items.filter(isCell).map((c) => c.props.span));\n let k = 0;\n return items.map((child) => (isCell(child) ? cloneElement(child, { layoutSpan: spans[k++] }) : child));\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}>{laidOut(children, viewport)}</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, layoutSpan }: CellProps) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${layoutSpan ?? 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":"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"}
@@ -0,0 +1 @@
1
+ ._surface_1ck24_6{background:var(--bg-canvas);flex-direction:column;height:100%;min-height:0;display:flex}._strip_1ck24_14{justify-content:space-between;align-items:center;gap:var(--space-3);height:var(--strip-height);padding:0 var(--space-5);padding-left:max(var(--space-5), calc(var(--app-traffic-light-inset,0px) - var(--rail-width,56px)));border-bottom:1px solid var(--border-subtle);background:var(--bg-surface);flex-shrink:0;display:flex}._title_1ck24_29{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display);color:var(--text-primary);margin:0}._stripActions_1ck24_39{align-items:center;gap:var(--space-2);display:flex}._scroll_1ck24_45{scrollbar-gutter:stable;flex:1;min-height:0;overflow:hidden auto}._body_1ck24_53{gap:var(--surface-gap);max-width:1440px;padding:var(--space-5) var(--space-5) var(--space-16);flex-direction:column;margin:0 auto;display:flex}._grid_1ck24_62{grid-template-columns:repeat(var(--surface-columns), minmax(0, 1fr));gap:var(--surface-gap);align-items:stretch;display:grid}._cell_1ck24_70{flex-direction:column;min-width:0;display:flex}._cell_1ck24_70>._card_1ck24_79{flex:auto}._cell_1ck24_70:empty{display:none}._surface_1ck24_6[data-viewport=compact] ._body_1ck24_53{padding:var(--space-4) var(--space-4) var(--space-12)}._surface_1ck24_6[data-viewport=compact] ._strip_1ck24_14{padding:0 var(--space-4)}._card_1ck24_79{gap:var(--space-3);min-width:0;padding:var(--card-pad);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);flex-direction:column;display:flex}._card_1ck24_79[data-tone=attention]{border-color:var(--border-default);box-shadow:inset 0 1px 0 var(--hairline-lift,transparent)}._cardHead_1ck24_114{justify-content:space-between;align-items:flex-start;gap:var(--space-3);display:flex}._cardHeading_1ck24_121{flex-direction:column;flex:auto;gap:2px;min-width:0;display:flex}._cardTitle_1ck24_130{font-size:var(--text-sm-size);line-height:var(--text-sm-line);font-weight:var(--font-weight-semibold);color:var(--text-primary);margin:0}._cardCaption_1ck24_138{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._cardActions_1ck24_144{align-items:center;gap:var(--space-2);flex:none;display:inline-flex}._note_1ck24_151{padding:var(--space-3);border-radius:var(--radius-md);background:var(--bg-hover);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);margin:0}._note_1ck24_151[data-tone=unknown]{background:var(--status-unknown-bg);color:var(--status-unknown-fg)}._note_1ck24_151[data-tone=danger]{background:var(--status-danger-bg);color:var(--status-danger-fg)}._micro_1ck24_172{font-family:var(--font-display);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--text-tertiary)}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-QesfXBsb.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"./ChartFrame-SygZ7B3x.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=n();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=t(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=ee(F,ue),L=d(),[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)(u,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,y.jsx)(`text`,{className:h.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),c=A(e.status),l=T(e),u=!l&&c===`unknown`;return(0,y.jsx)(`rect`,{"data-item":e.id,"data-status":e.status,"data-open":e.end===null?`true`:void 0,"data-style":l?`outline`:u?`hatch`:`fill`,className:`${C.bar} ${e.stale?C.stale:``} ${e.end===null?C.open:``} ${l?C.outline:``} ${u?h.unknownMark:``}`,x:l?o+.5:o,y:l?n+5.5:n+5,width:l?Math.max(D,s-1):s,height:l?13:14,rx:3,fill:l?`none`:u?`url(#${H})`:_(c),stroke:l?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:h.svg,width:I,height:E,viewBox:`0 0 ${I} ${E}`,"aria-hidden":`true`,children:[(0,y.jsx)(`line`,{className:h.axis,x1:G,x2:G+K,y1:21,y2:21}),De.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:h.tick,x:e.x,y:15,textAnchor:e.anchor,children:e.text},e.key))]});return(0,y.jsx)(g,{title:e,description:t,caveat:n,status:_e,table:(0,y.jsx)(c,{caption:e,columns:Te,rows:Se,rowKey:e=>e.id}),footer:(0,y.jsx)(f,{min:1,items:be}),children:(0,y.jsxs)(`div`,{ref:F,className:h.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:h.svg,width:I,height:Z,viewBox:`0 0 ${I} ${Z}`,role:`img`,"aria-label":we,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(s,{id:H})}),Q.map(e=>(0,y.jsx)(`line`,{className:h.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} ${h.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:h.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),z&&$?(0,y.jsx)(m,{left:p(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-BzH6OCee.js.map