@ashlr/hub 3.9.0 → 3.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/build-identity.json +2 -2
- package/dist/core/resources/claude-account-usage.d.ts +19 -0
- package/dist/core/resources/claude-account-usage.js +22 -1
- package/dist/core/resources/claude-account-usage.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +6 -5
- package/dist/core/verse/accounts.js +9 -8
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/web/public/next/assets/{App-XURmiAAp.js → App-D2P1AJiD.js} +2 -2
- package/dist/core/web/public/next/assets/{App-XURmiAAp.js.map → App-D2P1AJiD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ApprovalsSection-BriUzoZc.js → ApprovalsSection-Dq66NMfx.js} +2 -2
- package/dist/core/web/public/next/assets/{ApprovalsSection-BriUzoZc.js.map → ApprovalsSection-Dq66NMfx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{AutonomySection-C4GBsQVc.js → AutonomySection-DyxpeR5I.js} +2 -2
- package/dist/core/web/public/next/assets/{AutonomySection-C4GBsQVc.js.map → AutonomySection-DyxpeR5I.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ChatSection-hlgPBRco.js → ChatSection-bzwFdbdw.js} +2 -2
- package/dist/core/web/public/next/assets/{ChatSection-hlgPBRco.js.map → ChatSection-bzwFdbdw.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ConfirmDialog-BdQYI-Ng.js → ConfirmDialog-DkR0z5_a.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-BdQYI-Ng.js.map → ConfirmDialog-DkR0z5_a.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BxdIfmFH.js → Dialog-CIjlQZqc.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BxdIfmFH.js.map → Dialog-CIjlQZqc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-DmeRWuc4.js → DiffViewer-BjQZAm5L.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-DmeRWuc4.js.map → DiffViewer-BjQZAm5L.js.map} +1 -1
- package/dist/core/web/public/next/assets/{McpSection-q34T7Tho.js → McpSection-D2FySMy3.js} +2 -2
- package/dist/core/web/public/next/assets/{McpSection-q34T7Tho.js.map → McpSection-D2FySMy3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MutationTokenDialog-CFAkwOEt.js → MutationTokenDialog-QBPrD1UE.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-CFAkwOEt.js.map → MutationTokenDialog-QBPrD1UE.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DHc8GFOY.js → ResourcePoolConsoleApp-Dzq9Ufq_.js} +2 -2
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DHc8GFOY.js.map → ResourcePoolConsoleApp-Dzq9Ufq_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-ZL9F4qUn.js → RouteErrorBoundary-Chd-wt6w.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-ZL9F4qUn.js.map → RouteErrorBoundary-Chd-wt6w.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-DbRjVye3.js → Segmented-DhGh7Y1s.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-DbRjVye3.js.map → Segmented-DhGh7Y1s.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-nJGGGYqv.js → SettingsSection-Bqimu_Mg.js} +2 -2
- package/dist/core/web/public/next/assets/{SettingsSection-nJGGGYqv.js.map → SettingsSection-Bqimu_Mg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-6GJydgo4.js → UniverseConsoleApp-DzAyrE-A.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-6GJydgo4.js.map → UniverseConsoleApp-DzAyrE-A.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DLDtNYL8.js → UniverseView-BGl3DRV7.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseView-DLDtNYL8.js.map → UniverseView-BGl3DRV7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UsageSection-Cf9d9iFH.js → UsageSection-PaaJ1L90.js} +2 -2
- package/dist/core/web/public/next/assets/{UsageSection-Cf9d9iFH.js.map → UsageSection-PaaJ1L90.js.map} +1 -1
- package/dist/core/web/public/next/assets/{VerseConsoleApp-y0uOHixd.js → VerseConsoleApp-DYH7ottg.js} +3 -3
- package/dist/core/web/public/next/assets/{VerseConsoleApp-y0uOHixd.js.map → VerseConsoleApp-DYH7ottg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{charts-CVooqJWN.js → charts-CnMDT08S.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-CVooqJWN.js.map → charts-CnMDT08S.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-Bqv8DVuH.js → context-model-DTvb2uZy.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-Bqv8DVuH.js.map → context-model-DTvb2uZy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{global-eaY9GyX3.js → global-F2K14nNo.js} +2 -2
- package/dist/core/web/public/next/assets/{global-eaY9GyX3.js.map → global-F2K14nNo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-vex8rclC.js → icons-B2fa40k6.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-vex8rclC.js.map → icons-B2fa40k6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-D2Eik-zt.js → index-DO9a5IaB.js} +3 -3
- package/dist/core/web/public/next/assets/{index-D2Eik-zt.js.map → index-DO9a5IaB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{queries-bAYU0VNy.js → queries-BdSsWYSu.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-bAYU0VNy.js.map → queries-BdSsWYSu.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-C7QrP7Yp.js → use-guarded-action-BrlIU0jJ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-C7QrP7Yp.js.map → use-guarded-action-BrlIU0jJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-model-TfDk9cky.js → verse-model-GWqHIjMG.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-model-TfDk9cky.js.map → verse-model-GWqHIjMG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-CHol5RVp.js → workspace-model-4yzB--1h.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-CHol5RVp.js.map → workspace-model-4yzB--1h.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,o as n}from"./index-D2Eik-zt.js";var r={figure:`_figure_1si9v_1`,caption:`_caption_1si9v_12`,title:`_title_1si9v_20`,description:`_description_1si9v_26`,plot:`_plot_1si9v_31`,tableDisclosure:`_tableDisclosure_1si9v_36`,tableBody:`_tableBody_1si9v_61`,caveat:`_caveat_1si9v_65`,empty:`_empty_1si9v_75`},i=t();function a({title:e,description:t,caveat:n,children:a,table:o,empty:s,emptyMessage:c=`No data for this window.`}){return(0,i.jsxs)(`figure`,{className:r.figure,children:[(0,i.jsxs)(`figcaption`,{className:r.caption,children:[(0,i.jsx)(`span`,{className:r.title,children:e}),t?(0,i.jsx)(`span`,{className:r.description,children:t}):null]}),n?(0,i.jsx)(`p`,{className:r.caveat,role:`note`,children:n}):null,s?(0,i.jsx)(`p`,{className:r.empty,children:c}):(0,i.jsx)(`div`,{className:r.plot,children:a}),o?(0,i.jsxs)(`details`,{className:r.tableDisclosure,children:[(0,i.jsx)(`summary`,{children:`View as table`}),(0,i.jsx)(`div`,{className:r.tableBody,children:o})]}):null]})}var o={legend:`_legend_4pgvn_1`,item:`_item_4pgvn_10`,swatch:`_swatch_4pgvn_18`,swatchLine:`_swatchLine_4pgvn_25`};function s({items:e}){return e.length<2?null:(0,i.jsx)(`ul`,{className:o.legend,children:e.map(e=>(0,i.jsxs)(`li`,{className:o.item,children:[(0,i.jsx)(`span`,{className:e.kind===`line`?o.swatchLine:o.swatch,style:{background:e.color},"aria-hidden":`true`}),e.label]},e.label))})}var c=n(e(),1),l=7;function u(e){return`var(--chart-series-${(e%l+l)%l+1})`}var d=`var(--chart-sequential)`,f=`var(--chart-grid)`,p=`var(--chart-axis)`,m={svg:`_svg_djmd1_1`,gridline:`_gridline_djmd1_7`,axis:`_axis_djmd1_12`,axisLabel:`_axisLabel_djmd1_17`,line:`_line_djmd1_23`,area:`_area_djmd1_30`,marker:`_marker_djmd1_35`,endLabel:`_endLabel_djmd1_40`,crosshairLine:`_crosshairLine_djmd1_46`,overlay:`_overlay_djmd1_52`,wrap:`_wrap_djmd1_57`,tooltip:`_tooltip_djmd1_61`,tooltipDate:`_tooltipDate_djmd1_77`,tooltipRow:`_tooltipRow_djmd1_82`,tooltipKey:`_tooltipKey_djmd1_88`,tooltipValue:`_tooltipValue_djmd1_94`,tooltipGap:`_tooltipGap_djmd1_99`},h=640,g=44,_=12,v=12,y=24,b=4,x=6.4,S=4,C=150;function w(e){let t=[],n=[];for(let r of e){if(r.y===null){n.length&&t.push(n),n=[];continue}n.push({x:r.x,y:r.y})}return n.length&&t.push(n),t}function T(e,t,n){if(t<=e)return[e];let r=(t-e)/n;return Array.from({length:n+1},(t,n)=>e+r*n)}function E({series:e,height:t=200,area:n=!1,formatX:r=e=>String(e),formatY:a=e=>String(e),ariaLabel:o}){let l=(0,c.useRef)(null),[d,E]=(0,c.useState)(null),[D,O]=(0,c.useState)(null),k=e.flatMap(e=>e.points.map(e=>e.x)),A=e.flatMap(e=>e.points.map(e=>e.y)).filter(e=>e!==null);if(k.length===0)return(0,i.jsx)(`p`,{children:`No data.`});let j=Math.min(...k),M=Math.max(...k),N=Math.min(0,...A),P=Math.max(1e-4,...A),F=M-j||1,I=P-N||1,L=e.length>=1&&e.length<=4,R=L?Math.max(...e.map(e=>e.label.length))*x:0,z=L&&R<=C,B=_+(z?S+R:0),V=e.length>=2,H=596-B,U=t-v-y,W=e=>g+(e-j)/F*H,G=e=>v+U-(e-N)/I*U,K=T(N,P,b),q=Array.from(new Set(k)).sort((e,t)=>e-t);function J(e){let t=l.current;if(!t)return null;let n=t.getBoundingClientRect(),r=(e-n.left)/n.width*h,i=j+(r-g)/H*F,a=q[0],o=1/0;for(let e of q){let t=Math.abs(e-i);t<o&&(o=t,a=e)}return a}function Y(e){let t=J(e.clientX);if(t===null)return;E(t);let n=l.current;if(n){let e=n.getBoundingClientRect(),r=W(t)/h*e.width;O({left:r,top:0})}}let X=d===null?null:e.map(e=>({series:e,point:e.points.find(e=>e.x===d)??null}));return(0,i.jsxs)(`div`,{className:m.wrap,children:[(0,i.jsxs)(`svg`,{ref:l,className:m.svg,viewBox:`0 0 ${h} ${t}`,role:`img`,"aria-label":o,onPointerMove:Y,onPointerLeave:()=>E(null),children:[K.map((e,t)=>(0,i.jsxs)(`g`,{children:[(0,i.jsx)(`line`,{x1:g,x2:h-B,y1:G(e),y2:G(e),className:m.gridline,stroke:f}),(0,i.jsx)(`text`,{x:38,y:G(e),dy:`0.32em`,textAnchor:`end`,className:m.axisLabel,children:a(e)})]},t)),(0,i.jsx)(`line`,{x1:g,x2:h-B,y1:t-y,y2:t-y,className:m.axis,stroke:p}),q.length>1?[q[0],q[q.length-1]].map((e,n)=>(0,i.jsx)(`text`,{x:W(e),y:t-6,textAnchor:n===0?`start`:`end`,className:m.axisLabel,children:r(e)},n)):null,e.map((t,r)=>{let a=u(r),o=w(t.points);return(0,i.jsxs)(`g`,{children:[n&&e.length===1?o.map((e,t)=>{let n=e.map((e,t)=>`${t===0?`M`:`L`}${W(e.x)},${G(e.y)}`).join(` `)+` L${W(e[e.length-1].x)},${G(N)} L${W(e[0].x)},${G(N)} Z`;return(0,i.jsx)(`path`,{d:n,fill:a,className:m.area},t)}):null,o.map((e,t)=>(0,i.jsx)(`path`,{d:e.map((e,t)=>`${t===0?`M`:`L`}${W(e.x)},${G(e.y)}`).join(` `),stroke:a,className:m.line},t)),z&&o.length?(()=>{let e=o[o.length-1],n=e[e.length-1];return(0,i.jsx)(`text`,{x:W(n.x)+S,y:G(n.y),dy:`0.32em`,className:m.endLabel,fill:a,children:t.label})})():null]},t.id)}),d===null?null:(0,i.jsx)(`line`,{x1:W(d),x2:W(d),y1:v,y2:t-y,className:m.crosshairLine}),d===null?null:e.map((e,t)=>{let n=e.points.find(e=>e.x===d);return!n||n.y===null?null:(0,i.jsx)(`circle`,{cx:W(n.x),cy:G(n.y),r:4,fill:u(t),className:m.marker},e.id)}),(0,i.jsx)(`rect`,{x:g,y:v,width:H,height:U,className:m.overlay,onFocus:()=>E(q[q.length-1]??null)})]}),X&&D?(0,i.jsxs)(`div`,{className:m.tooltip,style:{left:D.left,top:D.top},children:[(0,i.jsx)(`div`,{className:m.tooltipDate,children:r(d)}),X.map(({series:e,point:t},n)=>(0,i.jsxs)(`div`,{className:m.tooltipRow,children:[(0,i.jsx)(`span`,{className:m.tooltipKey,style:{background:u(n)},"aria-hidden":`true`}),t&&t.y!==null?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`span`,{className:m.tooltipValue,children:a(t.y)}),V?(0,i.jsx)(`span`,{children:e.label}):null]}):(0,i.jsxs)(`span`,{className:m.tooltipGap,children:[`no data`,V?` — ${e.label}`:``]})]},e.id))]}):null,V?(0,i.jsx)(s,{items:e.map((e,t)=>({label:e.label,color:u(t),kind:`line`}))}):null]})}var D={svg:`_svg_o4jfa_1`,bar:`_bar_o4jfa_6`,baseline:`_baseline_o4jfa_15`,gridline:`_gridline_o4jfa_20`,axisLabel:`_axisLabel_o4jfa_25`,valueLabel:`_valueLabel_o4jfa_31`,categoryLabel:`_categoryLabel_o4jfa_38`,hitArea:`_hitArea_o4jfa_44`,tooltip:`_tooltip_o4jfa_49`,tooltipValue:`_tooltipValue_o4jfa_63`,tooltipLabel:`_tooltipLabel_o4jfa_68`,wrap:`_wrap_o4jfa_73`},O=24,k=10;function A({data:e,height:t=160,orientation:n=`vertical`,color:r=d,formatValue:a=e=>String(e),ariaLabel:o}){let s=(0,c.useId)(),[l,u]=(0,c.useState)(null),m=e.map(e=>e.value).filter(e=>e!==null),h=Math.max(0,...m,1e-4),g=Math.min(0,...m),_=h-g||1;if(n===`horizontal`){let n=Math.min(O,Math.max(14,Math.floor((t-k)/e.length)-k)),s=e.length*(n+k)+k;return(0,i.jsxs)(`div`,{className:D.wrap,children:[(0,i.jsxs)(`svg`,{className:D.svg,width:588,height:s,viewBox:`0 0 588 ${s}`,role:`img`,"aria-label":o,children:[(0,i.jsx)(`line`,{x1:120,y1:0,x2:120,y2:s,className:D.baseline,stroke:p}),e.map((e,t)=>{let o=k+t*(n+k),s=e.value===null?0:(e.value-g)/_*420;return(0,i.jsxs)(`g`,{children:[(0,i.jsx)(`text`,{x:112,y:o+n/2,dy:`0.32em`,textAnchor:`end`,className:D.categoryLabel,children:e.label.length>22?`${e.label.slice(0,21)}…`:e.label}),e.value===null?(0,i.jsx)(`line`,{x1:124,y1:o+n/2,x2:134,y2:o+n/2,stroke:f,strokeWidth:2,strokeDasharray:`2 2`}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`rect`,{x:120,y:o,width:Math.max(2,s),height:n,rx:4,fill:r,className:D.bar}),(0,i.jsx)(`text`,{x:120+Math.max(2,s)+6,y:o+n/2,dy:`0.32em`,className:D.valueLabel,children:a(e.value)})]}),(0,i.jsx)(`rect`,{className:D.hitArea,x:0,y:o-k/2,width:588,height:n+k,tabIndex:0,role:`img`,"aria-label":`${e.label}: ${e.value===null?`no data`:a(e.value)}`,onPointerEnter:()=>u(t),onPointerLeave:()=>u(e=>e===t?null:e),onFocus:()=>u(t),onBlur:()=>u(e=>e===t?null:e)})]},e.label+t)})]}),l===null?null:(0,i.jsxs)(`div`,{className:D.tooltip,style:{left:128,top:k+l*(n+k)-4},children:[(0,i.jsx)(`span`,{className:D.tooltipValue,children:e[l].value===null?`no data`:a(e[l].value)}),(0,i.jsx)(`span`,{className:D.tooltipLabel,children:e[l].label})]})]})}let v=e.length?Math.max(O,0):O,y=Math.min(O,v),b=t,x=b+20+30,S=e.length*(y+k)+k,C=20+b-(0-g)/_*b;return(0,i.jsxs)(`div`,{className:D.wrap,children:[(0,i.jsxs)(`svg`,{className:D.svg,width:S,height:x,viewBox:`0 0 ${S} ${x}`,role:`img`,"aria-label":o,children:[(0,i.jsx)(`line`,{x1:0,y1:C,x2:S,y2:C,className:D.baseline,stroke:p}),e.map((e,t)=>{let n=k+t*(y+k),o=e.value===null?0:Math.abs(e.value-g)/_*b,s=e.value!==null&&e.value>=0?C-o:C;return(0,i.jsxs)(`g`,{children:[e.value===null?(0,i.jsx)(`line`,{x1:n+y/2-5,y1:C,x2:n+y/2+5,y2:C,stroke:f,strokeWidth:2,strokeDasharray:`2 2`}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`rect`,{x:n,y:s,width:y,height:Math.max(2,o),rx:4,fill:r,className:D.bar}),(0,i.jsx)(`text`,{x:n+y/2,y:s-4,textAnchor:`middle`,className:D.valueLabel,children:a(e.value)})]}),(0,i.jsx)(`text`,{x:n+y/2,y:x-8,textAnchor:`middle`,className:D.axisLabel,children:e.label.length>10?`${e.label.slice(0,9)}…`:e.label}),(0,i.jsx)(`rect`,{className:D.hitArea,x:n-k/2,y:0,width:y+k,height:x,tabIndex:0,role:`img`,"aria-label":`${e.label}: ${e.value===null?`no data`:a(e.value)}`,onPointerEnter:()=>u(t),onPointerLeave:()=>u(e=>e===t?null:e),onFocus:()=>u(t),onBlur:()=>u(e=>e===t?null:e)})]},e.label+t)})]}),l===null?null:(0,i.jsxs)(`div`,{className:D.tooltip,style:{left:k+l*(y+k),top:0},id:`${s}-tooltip`,children:[(0,i.jsx)(`span`,{className:D.tooltipValue,children:e[l].value===null?`no data`:a(e[l].value)}),(0,i.jsx)(`span`,{className:D.tooltipLabel,children:e[l].label})]})]})}var j={sparkline:`_sparkline_gomyo_1`,line:`_line_gomyo_6`,dot:`_dot_gomyo_14`};function M({points:e,width:t=72,height:n=24,ariaLabel:r}){let a=e.filter(e=>e!==null);if(a.length<2)return(0,i.jsx)(`svg`,{width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":r});let o=Math.min(...a,0),s=Math.max(...a,0)-o||1,c=t/Math.max(1,e.length-1),l=e=>n-(e-o)/s*(n-2)-1,u=[],d=[];e.forEach((e,t)=>{if(e===null){d.length&&u.push(d),d=[];return}d.push({x:t*c,y:l(e)})}),d.length&&u.push(d);let f=e.map(e=>e!==null).lastIndexOf(!0),p=f>=0?{x:f*c,y:l(e[f])}:null;return(0,i.jsxs)(`svg`,{width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":r,children:[u.map((e,t)=>(0,i.jsx)(`path`,{className:j.line,d:e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)},t)),p?(0,i.jsx)(`circle`,{className:j.dot,cx:p.x,cy:p.y,r:2}):null]})}function N(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e);return t>=1e6?`${(e/1e6).toFixed(t>=1e7?0:1)}M`:t>=1e4?`${Math.round(e/1e3)}K`:t>=1e3?e.toLocaleString(`en-US`):Number.isInteger(e)?String(e):e.toFixed(1)}function P(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e),n=e<0?`-`:``;return t>=1e6?`${n}$${(t/1e6).toFixed(1)}M`:t>=1e3?`${n}$${(t/1e3).toFixed(1)}K`:`${n}$${t.toFixed(2)}`}function F(e,t=0){return Number.isFinite(e)?`${(e*100).toFixed(t)}%`:`—`}function I(e){if(!Number.isFinite(e))return`—`;let t=N(Math.abs(e));return e>0?`+${t}`:e<0?`-${t}`:t}function L(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return e;let t=new Date(`${e}T00:00:00Z`);return Number.isNaN(t.getTime())||t.toISOString().slice(0,10)!==e?e:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,timeZone:`UTC`})}function R(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}var z={tile:`_tile_rp7c9_1`,label:`_label_rp7c9_11`,row:`_row_rp7c9_18`,value:`_value_rp7c9_25`,trendRow:`_trendRow_rp7c9_31`,delta:`_delta_rp7c9_38`,deltaGood:`_deltaGood_rp7c9_43`,deltaBad:`_deltaBad_rp7c9_47`,deltaNeutral:`_deltaNeutral_rp7c9_51`,caption:`_caption_rp7c9_55`};function B({label:e,value:t,caption:n,delta:r,trend:a,trendLabel:o}){let s=r==null||r.goodWhenPositive===void 0||r.value===0?z.deltaNeutral:r.value>0===r.goodWhenPositive?z.deltaGood:z.deltaBad;return(0,i.jsxs)(`div`,{className:z.tile,children:[(0,i.jsx)(`span`,{className:z.label,children:e}),(0,i.jsx)(`div`,{className:z.row,children:(0,i.jsx)(`span`,{className:z.value,children:t})}),(0,i.jsxs)(`div`,{className:z.trendRow,children:[n?(0,i.jsx)(`span`,{className:z.caption,children:n}):(0,i.jsx)(`span`,{}),a?(0,i.jsx)(M,{points:a,ariaLabel:o??`${e} trend`}):null]}),r?(0,i.jsxs)(`span`,{className:`${z.delta} ${s}`,children:[I(r.value),r.versus?` ${r.versus}`:``]}):null]})}var V={table:`_table_1ggl4_1`,numeric:`_numeric_1ggl4_22`};function H({caption:e,columns:t,rows:n,rowKey:r}){return(0,i.jsxs)(`table`,{className:V.table,children:[(0,i.jsx)(`caption`,{className:`visually-hidden`,children:e}),(0,i.jsx)(`thead`,{children:(0,i.jsx)(`tr`,{children:t.map(e=>(0,i.jsx)(`th`,{scope:`col`,className:e.numeric?V.numeric:void 0,children:e.label},e.key))})}),(0,i.jsx)(`tbody`,{children:n.map((e,n)=>(0,i.jsx)(`tr`,{children:t.map(t=>(0,i.jsx)(`td`,{className:t.numeric?V.numeric:void 0,children:t.render(e)},t.key))},r(e,n)))})]})}export{F as a,A as c,s as d,a as f,L as i,E as l,B as n,R as o,N as r,P as s,H as t,u};
|
|
2
|
-
//# sourceMappingURL=charts-
|
|
1
|
+
import{a as e,n as t,o as n}from"./index-DO9a5IaB.js";var r={figure:`_figure_1si9v_1`,caption:`_caption_1si9v_12`,title:`_title_1si9v_20`,description:`_description_1si9v_26`,plot:`_plot_1si9v_31`,tableDisclosure:`_tableDisclosure_1si9v_36`,tableBody:`_tableBody_1si9v_61`,caveat:`_caveat_1si9v_65`,empty:`_empty_1si9v_75`},i=t();function a({title:e,description:t,caveat:n,children:a,table:o,empty:s,emptyMessage:c=`No data for this window.`}){return(0,i.jsxs)(`figure`,{className:r.figure,children:[(0,i.jsxs)(`figcaption`,{className:r.caption,children:[(0,i.jsx)(`span`,{className:r.title,children:e}),t?(0,i.jsx)(`span`,{className:r.description,children:t}):null]}),n?(0,i.jsx)(`p`,{className:r.caveat,role:`note`,children:n}):null,s?(0,i.jsx)(`p`,{className:r.empty,children:c}):(0,i.jsx)(`div`,{className:r.plot,children:a}),o?(0,i.jsxs)(`details`,{className:r.tableDisclosure,children:[(0,i.jsx)(`summary`,{children:`View as table`}),(0,i.jsx)(`div`,{className:r.tableBody,children:o})]}):null]})}var o={legend:`_legend_4pgvn_1`,item:`_item_4pgvn_10`,swatch:`_swatch_4pgvn_18`,swatchLine:`_swatchLine_4pgvn_25`};function s({items:e}){return e.length<2?null:(0,i.jsx)(`ul`,{className:o.legend,children:e.map(e=>(0,i.jsxs)(`li`,{className:o.item,children:[(0,i.jsx)(`span`,{className:e.kind===`line`?o.swatchLine:o.swatch,style:{background:e.color},"aria-hidden":`true`}),e.label]},e.label))})}var c=n(e(),1),l=7;function u(e){return`var(--chart-series-${(e%l+l)%l+1})`}var d=`var(--chart-sequential)`,f=`var(--chart-grid)`,p=`var(--chart-axis)`,m={svg:`_svg_djmd1_1`,gridline:`_gridline_djmd1_7`,axis:`_axis_djmd1_12`,axisLabel:`_axisLabel_djmd1_17`,line:`_line_djmd1_23`,area:`_area_djmd1_30`,marker:`_marker_djmd1_35`,endLabel:`_endLabel_djmd1_40`,crosshairLine:`_crosshairLine_djmd1_46`,overlay:`_overlay_djmd1_52`,wrap:`_wrap_djmd1_57`,tooltip:`_tooltip_djmd1_61`,tooltipDate:`_tooltipDate_djmd1_77`,tooltipRow:`_tooltipRow_djmd1_82`,tooltipKey:`_tooltipKey_djmd1_88`,tooltipValue:`_tooltipValue_djmd1_94`,tooltipGap:`_tooltipGap_djmd1_99`},h=640,g=44,_=12,v=12,y=24,b=4,x=6.4,S=4,C=150;function w(e){let t=[],n=[];for(let r of e){if(r.y===null){n.length&&t.push(n),n=[];continue}n.push({x:r.x,y:r.y})}return n.length&&t.push(n),t}function T(e,t,n){if(t<=e)return[e];let r=(t-e)/n;return Array.from({length:n+1},(t,n)=>e+r*n)}function E({series:e,height:t=200,area:n=!1,formatX:r=e=>String(e),formatY:a=e=>String(e),ariaLabel:o}){let l=(0,c.useRef)(null),[d,E]=(0,c.useState)(null),[D,O]=(0,c.useState)(null),k=e.flatMap(e=>e.points.map(e=>e.x)),A=e.flatMap(e=>e.points.map(e=>e.y)).filter(e=>e!==null);if(k.length===0)return(0,i.jsx)(`p`,{children:`No data.`});let j=Math.min(...k),M=Math.max(...k),N=Math.min(0,...A),P=Math.max(1e-4,...A),F=M-j||1,I=P-N||1,L=e.length>=1&&e.length<=4,R=L?Math.max(...e.map(e=>e.label.length))*x:0,z=L&&R<=C,B=_+(z?S+R:0),V=e.length>=2,H=596-B,U=t-v-y,W=e=>g+(e-j)/F*H,G=e=>v+U-(e-N)/I*U,K=T(N,P,b),q=Array.from(new Set(k)).sort((e,t)=>e-t);function J(e){let t=l.current;if(!t)return null;let n=t.getBoundingClientRect(),r=(e-n.left)/n.width*h,i=j+(r-g)/H*F,a=q[0],o=1/0;for(let e of q){let t=Math.abs(e-i);t<o&&(o=t,a=e)}return a}function Y(e){let t=J(e.clientX);if(t===null)return;E(t);let n=l.current;if(n){let e=n.getBoundingClientRect(),r=W(t)/h*e.width;O({left:r,top:0})}}let X=d===null?null:e.map(e=>({series:e,point:e.points.find(e=>e.x===d)??null}));return(0,i.jsxs)(`div`,{className:m.wrap,children:[(0,i.jsxs)(`svg`,{ref:l,className:m.svg,viewBox:`0 0 ${h} ${t}`,role:`img`,"aria-label":o,onPointerMove:Y,onPointerLeave:()=>E(null),children:[K.map((e,t)=>(0,i.jsxs)(`g`,{children:[(0,i.jsx)(`line`,{x1:g,x2:h-B,y1:G(e),y2:G(e),className:m.gridline,stroke:f}),(0,i.jsx)(`text`,{x:38,y:G(e),dy:`0.32em`,textAnchor:`end`,className:m.axisLabel,children:a(e)})]},t)),(0,i.jsx)(`line`,{x1:g,x2:h-B,y1:t-y,y2:t-y,className:m.axis,stroke:p}),q.length>1?[q[0],q[q.length-1]].map((e,n)=>(0,i.jsx)(`text`,{x:W(e),y:t-6,textAnchor:n===0?`start`:`end`,className:m.axisLabel,children:r(e)},n)):null,e.map((t,r)=>{let a=u(r),o=w(t.points);return(0,i.jsxs)(`g`,{children:[n&&e.length===1?o.map((e,t)=>{let n=e.map((e,t)=>`${t===0?`M`:`L`}${W(e.x)},${G(e.y)}`).join(` `)+` L${W(e[e.length-1].x)},${G(N)} L${W(e[0].x)},${G(N)} Z`;return(0,i.jsx)(`path`,{d:n,fill:a,className:m.area},t)}):null,o.map((e,t)=>(0,i.jsx)(`path`,{d:e.map((e,t)=>`${t===0?`M`:`L`}${W(e.x)},${G(e.y)}`).join(` `),stroke:a,className:m.line},t)),z&&o.length?(()=>{let e=o[o.length-1],n=e[e.length-1];return(0,i.jsx)(`text`,{x:W(n.x)+S,y:G(n.y),dy:`0.32em`,className:m.endLabel,fill:a,children:t.label})})():null]},t.id)}),d===null?null:(0,i.jsx)(`line`,{x1:W(d),x2:W(d),y1:v,y2:t-y,className:m.crosshairLine}),d===null?null:e.map((e,t)=>{let n=e.points.find(e=>e.x===d);return!n||n.y===null?null:(0,i.jsx)(`circle`,{cx:W(n.x),cy:G(n.y),r:4,fill:u(t),className:m.marker},e.id)}),(0,i.jsx)(`rect`,{x:g,y:v,width:H,height:U,className:m.overlay,onFocus:()=>E(q[q.length-1]??null)})]}),X&&D?(0,i.jsxs)(`div`,{className:m.tooltip,style:{left:D.left,top:D.top},children:[(0,i.jsx)(`div`,{className:m.tooltipDate,children:r(d)}),X.map(({series:e,point:t},n)=>(0,i.jsxs)(`div`,{className:m.tooltipRow,children:[(0,i.jsx)(`span`,{className:m.tooltipKey,style:{background:u(n)},"aria-hidden":`true`}),t&&t.y!==null?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`span`,{className:m.tooltipValue,children:a(t.y)}),V?(0,i.jsx)(`span`,{children:e.label}):null]}):(0,i.jsxs)(`span`,{className:m.tooltipGap,children:[`no data`,V?` — ${e.label}`:``]})]},e.id))]}):null,V?(0,i.jsx)(s,{items:e.map((e,t)=>({label:e.label,color:u(t),kind:`line`}))}):null]})}var D={svg:`_svg_o4jfa_1`,bar:`_bar_o4jfa_6`,baseline:`_baseline_o4jfa_15`,gridline:`_gridline_o4jfa_20`,axisLabel:`_axisLabel_o4jfa_25`,valueLabel:`_valueLabel_o4jfa_31`,categoryLabel:`_categoryLabel_o4jfa_38`,hitArea:`_hitArea_o4jfa_44`,tooltip:`_tooltip_o4jfa_49`,tooltipValue:`_tooltipValue_o4jfa_63`,tooltipLabel:`_tooltipLabel_o4jfa_68`,wrap:`_wrap_o4jfa_73`},O=24,k=10;function A({data:e,height:t=160,orientation:n=`vertical`,color:r=d,formatValue:a=e=>String(e),ariaLabel:o}){let s=(0,c.useId)(),[l,u]=(0,c.useState)(null),m=e.map(e=>e.value).filter(e=>e!==null),h=Math.max(0,...m,1e-4),g=Math.min(0,...m),_=h-g||1;if(n===`horizontal`){let n=Math.min(O,Math.max(14,Math.floor((t-k)/e.length)-k)),s=e.length*(n+k)+k;return(0,i.jsxs)(`div`,{className:D.wrap,children:[(0,i.jsxs)(`svg`,{className:D.svg,width:588,height:s,viewBox:`0 0 588 ${s}`,role:`img`,"aria-label":o,children:[(0,i.jsx)(`line`,{x1:120,y1:0,x2:120,y2:s,className:D.baseline,stroke:p}),e.map((e,t)=>{let o=k+t*(n+k),s=e.value===null?0:(e.value-g)/_*420;return(0,i.jsxs)(`g`,{children:[(0,i.jsx)(`text`,{x:112,y:o+n/2,dy:`0.32em`,textAnchor:`end`,className:D.categoryLabel,children:e.label.length>22?`${e.label.slice(0,21)}…`:e.label}),e.value===null?(0,i.jsx)(`line`,{x1:124,y1:o+n/2,x2:134,y2:o+n/2,stroke:f,strokeWidth:2,strokeDasharray:`2 2`}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`rect`,{x:120,y:o,width:Math.max(2,s),height:n,rx:4,fill:r,className:D.bar}),(0,i.jsx)(`text`,{x:120+Math.max(2,s)+6,y:o+n/2,dy:`0.32em`,className:D.valueLabel,children:a(e.value)})]}),(0,i.jsx)(`rect`,{className:D.hitArea,x:0,y:o-k/2,width:588,height:n+k,tabIndex:0,role:`img`,"aria-label":`${e.label}: ${e.value===null?`no data`:a(e.value)}`,onPointerEnter:()=>u(t),onPointerLeave:()=>u(e=>e===t?null:e),onFocus:()=>u(t),onBlur:()=>u(e=>e===t?null:e)})]},e.label+t)})]}),l===null?null:(0,i.jsxs)(`div`,{className:D.tooltip,style:{left:128,top:k+l*(n+k)-4},children:[(0,i.jsx)(`span`,{className:D.tooltipValue,children:e[l].value===null?`no data`:a(e[l].value)}),(0,i.jsx)(`span`,{className:D.tooltipLabel,children:e[l].label})]})]})}let v=e.length?Math.max(O,0):O,y=Math.min(O,v),b=t,x=b+20+30,S=e.length*(y+k)+k,C=20+b-(0-g)/_*b;return(0,i.jsxs)(`div`,{className:D.wrap,children:[(0,i.jsxs)(`svg`,{className:D.svg,width:S,height:x,viewBox:`0 0 ${S} ${x}`,role:`img`,"aria-label":o,children:[(0,i.jsx)(`line`,{x1:0,y1:C,x2:S,y2:C,className:D.baseline,stroke:p}),e.map((e,t)=>{let n=k+t*(y+k),o=e.value===null?0:Math.abs(e.value-g)/_*b,s=e.value!==null&&e.value>=0?C-o:C;return(0,i.jsxs)(`g`,{children:[e.value===null?(0,i.jsx)(`line`,{x1:n+y/2-5,y1:C,x2:n+y/2+5,y2:C,stroke:f,strokeWidth:2,strokeDasharray:`2 2`}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`rect`,{x:n,y:s,width:y,height:Math.max(2,o),rx:4,fill:r,className:D.bar}),(0,i.jsx)(`text`,{x:n+y/2,y:s-4,textAnchor:`middle`,className:D.valueLabel,children:a(e.value)})]}),(0,i.jsx)(`text`,{x:n+y/2,y:x-8,textAnchor:`middle`,className:D.axisLabel,children:e.label.length>10?`${e.label.slice(0,9)}…`:e.label}),(0,i.jsx)(`rect`,{className:D.hitArea,x:n-k/2,y:0,width:y+k,height:x,tabIndex:0,role:`img`,"aria-label":`${e.label}: ${e.value===null?`no data`:a(e.value)}`,onPointerEnter:()=>u(t),onPointerLeave:()=>u(e=>e===t?null:e),onFocus:()=>u(t),onBlur:()=>u(e=>e===t?null:e)})]},e.label+t)})]}),l===null?null:(0,i.jsxs)(`div`,{className:D.tooltip,style:{left:k+l*(y+k),top:0},id:`${s}-tooltip`,children:[(0,i.jsx)(`span`,{className:D.tooltipValue,children:e[l].value===null?`no data`:a(e[l].value)}),(0,i.jsx)(`span`,{className:D.tooltipLabel,children:e[l].label})]})]})}var j={sparkline:`_sparkline_gomyo_1`,line:`_line_gomyo_6`,dot:`_dot_gomyo_14`};function M({points:e,width:t=72,height:n=24,ariaLabel:r}){let a=e.filter(e=>e!==null);if(a.length<2)return(0,i.jsx)(`svg`,{width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":r});let o=Math.min(...a,0),s=Math.max(...a,0)-o||1,c=t/Math.max(1,e.length-1),l=e=>n-(e-o)/s*(n-2)-1,u=[],d=[];e.forEach((e,t)=>{if(e===null){d.length&&u.push(d),d=[];return}d.push({x:t*c,y:l(e)})}),d.length&&u.push(d);let f=e.map(e=>e!==null).lastIndexOf(!0),p=f>=0?{x:f*c,y:l(e[f])}:null;return(0,i.jsxs)(`svg`,{width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":r,children:[u.map((e,t)=>(0,i.jsx)(`path`,{className:j.line,d:e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)},t)),p?(0,i.jsx)(`circle`,{className:j.dot,cx:p.x,cy:p.y,r:2}):null]})}function N(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e);return t>=1e6?`${(e/1e6).toFixed(t>=1e7?0:1)}M`:t>=1e4?`${Math.round(e/1e3)}K`:t>=1e3?e.toLocaleString(`en-US`):Number.isInteger(e)?String(e):e.toFixed(1)}function P(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e),n=e<0?`-`:``;return t>=1e6?`${n}$${(t/1e6).toFixed(1)}M`:t>=1e3?`${n}$${(t/1e3).toFixed(1)}K`:`${n}$${t.toFixed(2)}`}function F(e,t=0){return Number.isFinite(e)?`${(e*100).toFixed(t)}%`:`—`}function I(e){if(!Number.isFinite(e))return`—`;let t=N(Math.abs(e));return e>0?`+${t}`:e<0?`-${t}`:t}function L(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return e;let t=new Date(`${e}T00:00:00Z`);return Number.isNaN(t.getTime())||t.toISOString().slice(0,10)!==e?e:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,timeZone:`UTC`})}function R(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}var z={tile:`_tile_rp7c9_1`,label:`_label_rp7c9_11`,row:`_row_rp7c9_18`,value:`_value_rp7c9_25`,trendRow:`_trendRow_rp7c9_31`,delta:`_delta_rp7c9_38`,deltaGood:`_deltaGood_rp7c9_43`,deltaBad:`_deltaBad_rp7c9_47`,deltaNeutral:`_deltaNeutral_rp7c9_51`,caption:`_caption_rp7c9_55`};function B({label:e,value:t,caption:n,delta:r,trend:a,trendLabel:o}){let s=r==null||r.goodWhenPositive===void 0||r.value===0?z.deltaNeutral:r.value>0===r.goodWhenPositive?z.deltaGood:z.deltaBad;return(0,i.jsxs)(`div`,{className:z.tile,children:[(0,i.jsx)(`span`,{className:z.label,children:e}),(0,i.jsx)(`div`,{className:z.row,children:(0,i.jsx)(`span`,{className:z.value,children:t})}),(0,i.jsxs)(`div`,{className:z.trendRow,children:[n?(0,i.jsx)(`span`,{className:z.caption,children:n}):(0,i.jsx)(`span`,{}),a?(0,i.jsx)(M,{points:a,ariaLabel:o??`${e} trend`}):null]}),r?(0,i.jsxs)(`span`,{className:`${z.delta} ${s}`,children:[I(r.value),r.versus?` ${r.versus}`:``]}):null]})}var V={table:`_table_1ggl4_1`,numeric:`_numeric_1ggl4_22`};function H({caption:e,columns:t,rows:n,rowKey:r}){return(0,i.jsxs)(`table`,{className:V.table,children:[(0,i.jsx)(`caption`,{className:`visually-hidden`,children:e}),(0,i.jsx)(`thead`,{children:(0,i.jsx)(`tr`,{children:t.map(e=>(0,i.jsx)(`th`,{scope:`col`,className:e.numeric?V.numeric:void 0,children:e.label},e.key))})}),(0,i.jsx)(`tbody`,{children:n.map((e,n)=>(0,i.jsx)(`tr`,{children:t.map(t=>(0,i.jsx)(`td`,{className:t.numeric?V.numeric:void 0,children:t.render(e)},t.key))},r(e,n)))})]})}export{F as a,A as c,s as d,a as f,L as i,E as l,B as n,R as o,N as r,P as s,H as t,u};
|
|
2
|
+
//# sourceMappingURL=charts-CnMDT08S.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts-CVooqJWN.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/ChartContainer.module.css","../../../../../../src/web-ui/components/charts/ChartContainer.tsx","../../../../../../src/web-ui/components/charts/Legend.module.css","../../../../../../src/web-ui/components/charts/Legend.tsx","../../../../../../src/web-ui/components/charts/colors.ts","../../../../../../src/web-ui/components/charts/LineChart.module.css","../../../../../../src/web-ui/components/charts/LineChart.tsx","../../../../../../src/web-ui/components/charts/BarChart.module.css","../../../../../../src/web-ui/components/charts/BarChart.tsx","../../../../../../src/web-ui/components/charts/Sparkline.module.css","../../../../../../src/web-ui/components/charts/Sparkline.tsx","../../../../../../src/web-ui/components/charts/format.ts","../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx","../../../../../../src/web-ui/components/charts/TableView.module.css","../../../../../../src/web-ui/components/charts/TableView.tsx"],"sourcesContent":[".figure {\n margin: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n padding: var(--space-4);\n /* Fixed heights must include the axis-label band — this container instead\n grows with its content so a chart's x-axis labels never get clipped or\n forced into a nested scroll (dataviz anti-patterns). */\n}\n\n.caption {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-3);\n margin-bottom: var(--space-3);\n}\n\n.title {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.description {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.plot {\n width: 100%;\n overflow-x: auto;\n}\n\n.tableDisclosure {\n margin-top: var(--space-3);\n border-top: 1px solid var(--border-subtle);\n padding-top: var(--space-2);\n}\n\n.tableDisclosure > summary {\n cursor: pointer;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n list-style: none;\n}\n\n.tableDisclosure > summary::-webkit-details-marker {\n display: none;\n}\n\n.tableDisclosure > summary::before {\n content: '▸ ';\n}\n\n.tableDisclosure[open] > summary::before {\n content: '▾ ';\n}\n\n.tableBody {\n margin-top: var(--space-2);\n}\n\n.caveat {\n margin: 0 0 var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n}\n\n.empty {\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n padding: var(--space-6) 0;\n text-align: center;\n}\n","/**\n * components/charts/ChartContainer.tsx — the figure every chart mounts\n * inside: title/description, the plot itself, an optional caveat banner\n * (epistemic-honesty-adjacent: for a chart built on data with a known,\n * disclosed limitation — see ProductionView's judge-verdict caveat), an\n * optional table-view twin (the WCAG-clean accessibility equivalent every\n * chart should ship per the dataviz skill), and an empty state that never\n * lies about missing data.\n */\nimport type { ReactNode } from 'react';\nimport './chart-tokens.css';\nimport styles from './ChartContainer.module.css';\n\nexport interface ChartContainerProps {\n title: string;\n description?: string;\n /** A short, honest note about a known limitation of the data behind this\n * chart (e.g. \"counts may include X, not yet separable\"). Never omit a\n * caveat to make a chart look cleaner than the data actually is. */\n caveat?: string;\n /** The chart itself (SVG + legend). */\n children: ReactNode;\n /** The accessibility twin — same data as a real HTML table. Omit only\n * when the chart already IS a table. */\n table?: ReactNode;\n /** When true, renders the empty state instead of `children`. */\n empty?: boolean;\n emptyMessage?: string;\n}\n\nexport function ChartContainer({\n title,\n description,\n caveat,\n children,\n table,\n empty,\n emptyMessage = 'No data for this window.',\n}: ChartContainerProps) {\n return (\n <figure className={styles.figure}>\n <figcaption className={styles.caption}>\n <span className={styles.title}>{title}</span>\n {description ? <span className={styles.description}>{description}</span> : null}\n </figcaption>\n {caveat ? (\n <p className={styles.caveat} role=\"note\">\n {caveat}\n </p>\n ) : null}\n {empty ? (\n <p className={styles.empty}>{emptyMessage}</p>\n ) : (\n <div className={styles.plot}>{children}</div>\n )}\n {table ? (\n <details className={styles.tableDisclosure}>\n <summary>View as table</summary>\n <div className={styles.tableBody}>{table}</div>\n </details>\n ) : null}\n </figure>\n );\n}\n",".legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-4);\n margin: var(--space-2) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--radius-full);\n flex: none;\n}\n\n.swatchLine {\n width: 14px;\n height: 2px;\n border-radius: var(--radius-full);\n flex: none;\n}\n","/**\n * components/charts/Legend.tsx — the dependable identity channel. A legend\n * is always present for two or more series (never rely on color-matching\n * alone); a single series needs no legend box because the chart's own title\n * already names it (see marks-and-anatomy.md \"Labels & legend\").\n */\nimport styles from './Legend.module.css';\n\nexport interface LegendItem {\n label: string;\n color: string;\n /** 'line' for line charts (a short stroke key), 'swatch' for bar/area. */\n kind?: 'line' | 'swatch';\n}\n\nexport function Legend({ items }: { items: LegendItem[] }) {\n if (items.length < 2) return null;\n return (\n <ul className={styles.legend}>\n {items.map((it) => (\n <li key={it.label} className={styles.item}>\n <span\n className={it.kind === 'line' ? styles.swatchLine : styles.swatch}\n style={{ background: it.color }}\n aria-hidden=\"true\"\n />\n {it.label}\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * components/charts/colors.ts — the one place a chart asks for a color.\n * Every function returns a `var(--chart-*)` reference into chart-tokens.css\n * (never a literal hex) so theming is automatic and colors can never drift\n * out of sync between light and dark. See chart-tokens.css's header comment\n * for the palette-selection rationale — an exhaustive permutation search\n * clears the CVD adjacent floor (worst ΔE 13.8 light / 14.5 dark, target\n * 8.0) without changing which hues are used, only their series order.\n */\n\nconst SERIES_SLOTS = 7;\n\n/** Fixed-order categorical color for series index `slot` (0-based). Color\n * follows the entity, never its row number — callers must assign a series\n * its slot once (e.g. by stable sort order) and keep it even if other\n * series are filtered out; never reassign slots to \"fill the gap\" left by\n * a removed series (see dataviz anti-patterns: \"recolor-on-filter\"). */\nexport function seriesColor(slot: number): string {\n const n = ((slot % SERIES_SLOTS) + SERIES_SLOTS) % SERIES_SLOTS;\n return `var(--chart-series-${n + 1})`;\n}\n\n/** The \"Other\"/overflow bucket color — never part of the identity rotation. */\nexport const CHART_NEUTRAL = 'var(--chart-neutral)';\n\n/** Default single hue for magnitude (sequential) and for a single nominal\n * series (one series needs no legend box — every bar takes the same hue). */\nexport const CHART_SEQUENTIAL = 'var(--chart-sequential)';\nexport const CHART_SEQUENTIAL_SOFT = 'var(--chart-sequential-soft)';\n\nexport const CHART_DIVERGING_POS = 'var(--chart-diverging-pos)';\nexport const CHART_DIVERGING_NEG = 'var(--chart-diverging-neg)';\nexport const CHART_DIVERGING_MID = 'var(--chart-diverging-mid)';\n\nexport const CHART_GRID = 'var(--chart-grid)';\nexport const CHART_AXIS = 'var(--chart-axis)';\n",".svg {\n display: block;\n width: 100%;\n height: auto;\n}\n\n.gridline {\n stroke: var(--chart-grid);\n stroke-width: 1;\n}\n\n.axis {\n stroke: var(--chart-axis);\n stroke-width: 1;\n}\n\n.axisLabel {\n font-size: var(--text-xs-size);\n fill: var(--text-tertiary);\n font-family: var(--font-ui);\n}\n\n.line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.area {\n opacity: 0.1;\n stroke: none;\n}\n\n.marker {\n stroke: var(--chart-surface);\n stroke-width: 2;\n}\n\n.endLabel {\n font-size: var(--text-xs-size);\n font-family: var(--font-ui);\n font-weight: var(--font-weight-medium);\n}\n\n.crosshairLine {\n stroke: var(--chart-axis);\n stroke-width: 1;\n pointer-events: none;\n}\n\n.overlay {\n fill: transparent;\n cursor: crosshair;\n}\n\n.wrap {\n position: relative;\n}\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--chart-tooltip-bg);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n box-shadow: var(--shadow-md);\n padding: var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n white-space: nowrap;\n z-index: var(--z-dropdown);\n transform: translate(-50%, -100%);\n margin-top: -10px;\n}\n\n.tooltipDate {\n color: var(--text-tertiary);\n margin-bottom: var(--space-1);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.tooltipKey {\n width: 12px;\n height: 2px;\n flex: none;\n}\n\n.tooltipValue {\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipGap {\n color: var(--text-tertiary);\n font-style: italic;\n}\n","/**\n * components/charts/LineChart.tsx — trend over time. A gap (`null` y) is\n * split into a separate path segment so it renders as a visible break in\n * the line, never as a straight line through a missing value and never as\n * a silent zero. Single series gets an optional soft area fill; two-plus\n * series always render a legend (never color-matching alone).\n */\nimport { useRef, useState } from 'react';\nimport type { Series } from './types.js';\nimport { seriesColor, CHART_GRID, CHART_AXIS } from './colors.js';\nimport { Legend } from './Legend.js';\nimport './chart-tokens.css';\nimport styles from './LineChart.module.css';\n\nconst VBOX_W = 640;\nconst PAD_L = 44;\nconst PAD_R = 12;\nconst PAD_T = 12;\nconst PAD_B = 24;\nconst TICKS_Y = 4;\n/* Direct end-of-line labels need a gutter of their own. They are drawn in USER\n units — the viewBox scales the font along with the geometry, so a reserve\n measured in user units holds at every rendered width — and `--text-xs-size`\n resolves to 12 user units here, where the UI sans averages a shade over 6\n units per character at medium weight. 6.4 rounds that up so the reserve errs\n wide rather than clipping. Without the reserve the label was drawn at\n `VBOX_W - PAD_R + 4` with only PAD_R (12u) of room and the svg's own\n `overflow: hidden` cropped it to its first glyph — \"Estimated spend\"\n rendered as a lone \"E\". */\nconst END_LABEL_CH = 6.4;\nconst END_LABEL_GAP = 4;\n/* Past this the gutter would cost more plot than the label is worth, so the\n label is dropped rather than shrinking the chart around it. Nothing is lost:\n Legend.tsx deliberately renders nothing below two series because the panel\n heading already names a lone series, and two-plus series always have the\n legend regardless. */\nconst END_LABEL_MAX = 150;\n\ninterface Run {\n x: number;\n y: number;\n}\n\nfunction splitRuns(points: Series['points']): Run[][] {\n const runs: Run[][] = [];\n let current: Run[] = [];\n for (const p of points) {\n if (p.y === null) {\n if (current.length) runs.push(current);\n current = [];\n continue;\n }\n current.push({ x: p.x, y: p.y });\n }\n if (current.length) runs.push(current);\n return runs;\n}\n\nfunction niceTicks(min: number, max: number, count: number): number[] {\n if (max <= min) return [min];\n const step = (max - min) / count;\n return Array.from({ length: count + 1 }, (_, i) => min + step * i);\n}\n\nexport function LineChart({\n series,\n height = 200,\n area = false,\n formatX = (x: number) => String(x),\n formatY = (y: number) => String(y),\n ariaLabel,\n}: {\n series: Series[];\n height?: number;\n area?: boolean;\n formatX?: (x: number) => string;\n formatY?: (y: number) => string;\n ariaLabel: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [hoverX, setHoverX] = useState<number | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ left: number; top: number } | null>(null);\n\n const allX = series.flatMap((s) => s.points.map((p) => p.x));\n const knownY = series.flatMap((s) => s.points.map((p) => p.y)).filter((y): y is number => y !== null);\n if (allX.length === 0) {\n return <p>No data.</p>;\n }\n const xMin = Math.min(...allX);\n const xMax = Math.max(...allX);\n const yMin = Math.min(0, ...knownY);\n const yMax = Math.max(0.0001, ...knownY);\n const xRange = xMax - xMin || 1;\n const yRange = yMax - yMin || 1;\n\n /* Decided before the scales, because the reserved gutter is what plotW is\n measured against — and the gridlines and x-axis stop at the same edge. */\n const wantEndLabels = series.length >= 1 && series.length <= 4;\n const endLabelW = wantEndLabels\n ? Math.max(...series.map((s) => s.label.length)) * END_LABEL_CH\n : 0;\n const showEndLabels = wantEndLabels && endLabelW <= END_LABEL_MAX;\n const padR = PAD_R + (showEndLabels ? END_LABEL_GAP + endLabelW : 0);\n const showLegend = series.length >= 2;\n\n const plotW = VBOX_W - PAD_L - padR;\n const plotH = height - PAD_T - PAD_B;\n const xScale = (x: number) => PAD_L + ((x - xMin) / xRange) * plotW;\n const yScale = (y: number) => PAD_T + plotH - ((y - yMin) / yRange) * plotH;\n\n const yTicks = niceTicks(yMin, yMax, TICKS_Y);\n\n // Nearest-x lookup across a reference axis (the union of all distinct x\n // values, since series may not share every point).\n const xAxis = Array.from(new Set(allX)).sort((a, b) => a - b);\n\n function nearestX(clientX: number): number | null {\n const svg = svgRef.current;\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n const svgX = ((clientX - rect.left) / rect.width) * VBOX_W;\n const dataX = xMin + ((svgX - PAD_L) / plotW) * xRange;\n let nearest = xAxis[0];\n let best = Infinity;\n for (const x of xAxis) {\n const d = Math.abs(x - dataX);\n if (d < best) {\n best = d;\n nearest = x;\n }\n }\n return nearest;\n }\n\n function handleMove(e: React.PointerEvent<SVGSVGElement>) {\n const x = nearestX(e.clientX);\n if (x === null) return;\n setHoverX(x);\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n const px = (xScale(x) / VBOX_W) * rect.width;\n setTooltipPos({ left: px, top: 0 });\n }\n }\n\n const hoverPoints =\n hoverX !== null\n ? series.map((s) => ({\n series: s,\n point: s.points.find((p) => p.x === hoverX) ?? null,\n }))\n : null;\n\n return (\n <div className={styles.wrap}>\n <svg\n ref={svgRef}\n className={styles.svg}\n viewBox={`0 0 ${VBOX_W} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverX(null)}\n >\n {yTicks.map((t, i) => (\n <g key={i}>\n <line\n x1={PAD_L}\n x2={VBOX_W - padR}\n y1={yScale(t)}\n y2={yScale(t)}\n className={styles.gridline}\n stroke={CHART_GRID}\n />\n <text x={PAD_L - 6} y={yScale(t)} dy=\"0.32em\" textAnchor=\"end\" className={styles.axisLabel}>\n {formatY(t)}\n </text>\n </g>\n ))}\n <line\n x1={PAD_L}\n x2={VBOX_W - padR}\n y1={height - PAD_B}\n y2={height - PAD_B}\n className={styles.axis}\n stroke={CHART_AXIS}\n />\n {xAxis.length > 1\n ? [xAxis[0], xAxis[xAxis.length - 1]].map((x, i) => (\n <text\n key={i}\n x={xScale(x)}\n y={height - 6}\n textAnchor={i === 0 ? 'start' : 'end'}\n className={styles.axisLabel}\n >\n {formatX(x)}\n </text>\n ))\n : null}\n\n {series.map((s, si) => {\n const color = seriesColor(si);\n const runs = splitRuns(s.points);\n return (\n <g key={s.id}>\n {area && series.length === 1\n ? runs.map((run, ri) => {\n const d =\n run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ') +\n ` L${xScale(run[run.length - 1].x)},${yScale(yMin)} L${xScale(run[0].x)},${yScale(yMin)} Z`;\n return <path key={ri} d={d} fill={color} className={styles.area} />;\n })\n : null}\n {runs.map((run, ri) => (\n <path\n key={ri}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ')}\n stroke={color}\n className={styles.line}\n />\n ))}\n {showEndLabels && runs.length ? (\n (() => {\n const lastRun = runs[runs.length - 1];\n const last = lastRun[lastRun.length - 1];\n return (\n <text\n x={xScale(last.x) + END_LABEL_GAP}\n y={yScale(last.y)}\n dy=\"0.32em\"\n className={styles.endLabel}\n fill={color}\n >\n {s.label}\n </text>\n );\n })()\n ) : null}\n </g>\n );\n })}\n\n {hoverX !== null ? (\n <line\n x1={xScale(hoverX)}\n x2={xScale(hoverX)}\n y1={PAD_T}\n y2={height - PAD_B}\n className={styles.crosshairLine}\n />\n ) : null}\n {hoverX !== null\n ? series.map((s, si) => {\n const p = s.points.find((pt) => pt.x === hoverX);\n if (!p || p.y === null) return null;\n return (\n <circle\n key={s.id}\n cx={xScale(p.x)}\n cy={yScale(p.y)}\n r={4}\n fill={seriesColor(si)}\n className={styles.marker}\n />\n );\n })\n : null}\n\n <rect\n x={PAD_L}\n y={PAD_T}\n width={plotW}\n height={plotH}\n className={styles.overlay}\n onFocus={() => setHoverX(xAxis[xAxis.length - 1] ?? null)}\n />\n </svg>\n {hoverPoints && tooltipPos ? (\n <div className={styles.tooltip} style={{ left: tooltipPos.left, top: tooltipPos.top }}>\n <div className={styles.tooltipDate}>{formatX(hoverX as number)}</div>\n {hoverPoints.map(({ series: s, point }, i) => (\n <div className={styles.tooltipRow} key={s.id}>\n <span className={styles.tooltipKey} style={{ background: seriesColor(i) }} aria-hidden=\"true\" />\n {point && point.y !== null ? (\n <>\n <span className={styles.tooltipValue}>{formatY(point.y)}</span>\n {showLegend ? <span>{s.label}</span> : null}\n </>\n ) : (\n <span className={styles.tooltipGap}>no data{showLegend ? ` — ${s.label}` : ''}</span>\n )}\n </div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <Legend items={series.map((s, i) => ({ label: s.label, color: seriesColor(i), kind: 'line' }))} />\n ) : null}\n </div>\n );\n}\n",".svg {\n display: block;\n overflow: visible;\n}\n\n.bar {\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n\n.bar:hover,\n.bar:focus-visible {\n opacity: 0.82;\n}\n\n.baseline {\n stroke: var(--chart-axis);\n stroke-width: 1;\n}\n\n.gridline {\n stroke: var(--chart-grid);\n stroke-width: 1;\n}\n\n.axisLabel {\n font-size: 10px;\n fill: var(--text-tertiary);\n font-family: var(--font-ui);\n}\n\n.valueLabel {\n font-size: 10px;\n fill: var(--text-secondary);\n font-family: var(--font-ui);\n font-variant-numeric: tabular-nums;\n}\n\n.categoryLabel {\n font-size: 10px;\n fill: var(--text-secondary);\n font-family: var(--font-ui);\n}\n\n.hitArea {\n fill: transparent;\n cursor: pointer;\n}\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--chart-tooltip-bg);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n box-shadow: var(--shadow-md);\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n white-space: nowrap;\n z-index: var(--z-dropdown);\n}\n\n.tooltipValue {\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipLabel {\n color: var(--text-tertiary);\n margin-left: var(--space-1);\n}\n\n.wrap {\n position: relative;\n}\n","/**\n * components/charts/BarChart.tsx — categorical magnitude comparison.\n * Single hue by default (nominal categories never get a value-ramp — see\n * dataviz anti-patterns \"a value-ramp on nominal categories\"). Vertical for\n * a handful of short-named categories, horizontal for many or long-named\n * ones (dataviz choosing-a-form.md). Null values render as an explicit\n * \"no data\" dash, never a silent zero-height bar indistinguishable from a\n * real zero.\n */\nimport { useId, useState } from 'react';\nimport type { CategoricalDatum } from './types.js';\nimport { CHART_SEQUENTIAL, CHART_AXIS, CHART_GRID } from './colors.js';\nimport './chart-tokens.css';\nimport styles from './BarChart.module.css';\n\nconst BAR_MAX = 24;\nconst GAP = 10;\n\nexport function BarChart({\n data,\n height = 160,\n orientation = 'vertical',\n color = CHART_SEQUENTIAL,\n formatValue = (v: number) => String(v),\n ariaLabel,\n}: {\n data: CategoricalDatum[];\n height?: number;\n orientation?: 'vertical' | 'horizontal';\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel: string;\n}) {\n const uid = useId();\n const [hover, setHover] = useState<number | null>(null);\n\n const known = data.map((d) => d.value).filter((v): v is number => v !== null);\n const maxVal = Math.max(0, ...known, 0.0001);\n const minVal = Math.min(0, ...known);\n const range = maxVal - minVal || 1;\n\n if (orientation === 'horizontal') {\n const LABEL_W = 120;\n const PAD_R = 48;\n const rowH = Math.min(BAR_MAX, Math.max(14, Math.floor((height - GAP) / data.length) - GAP));\n const plotW = 420;\n const svgH = data.length * (rowH + GAP) + GAP;\n const svgW = LABEL_W + plotW + PAD_R;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={LABEL_W} y1={0} x2={LABEL_W} y2={svgH} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const y = GAP + i * (rowH + GAP);\n const barW = d.value !== null ? ((d.value - minVal) / range) * plotW : 0;\n return (\n <g key={d.label + i}>\n <text\n x={LABEL_W - 8}\n y={y + rowH / 2}\n dy=\"0.32em\"\n textAnchor=\"end\"\n className={styles.categoryLabel}\n >\n {d.label.length > 22 ? `${d.label.slice(0, 21)}…` : d.label}\n </text>\n {d.value === null ? (\n <line\n x1={LABEL_W + 4}\n y1={y + rowH / 2}\n x2={LABEL_W + 14}\n y2={y + rowH / 2}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={LABEL_W}\n y={y}\n width={Math.max(2, barW)}\n height={rowH}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text\n x={LABEL_W + Math.max(2, barW) + 6}\n y={y + rowH / 2}\n dy=\"0.32em\"\n className={styles.valueLabel}\n >\n {formatValue(d.value)}\n </text>\n </>\n )}\n <rect\n className={styles.hitArea}\n x={0}\n y={y - GAP / 2}\n width={svgW}\n height={rowH + GAP}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: LABEL_W + 8, top: GAP + hover * (rowH + GAP) - 4 }}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n }\n\n // Vertical orientation.\n const barSlot = data.length ? Math.max(BAR_MAX, 0) : BAR_MAX;\n const barW = Math.min(BAR_MAX, barSlot);\n const PAD_T = 20;\n const PAD_B = 30;\n const plotH = height;\n const svgH = plotH + PAD_T + PAD_B;\n const svgW = data.length * (barW + GAP) + GAP;\n const zeroY = PAD_T + plotH - ((0 - minVal) / range) * plotH;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={0} y1={zeroY} x2={svgW} y2={zeroY} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const x = GAP + i * (barW + GAP);\n const barH = d.value !== null ? (Math.abs(d.value - minVal) / range) * plotH : 0;\n const top = d.value !== null && d.value >= 0 ? zeroY - barH : zeroY;\n return (\n <g key={d.label + i}>\n {d.value === null ? (\n <line\n x1={x + barW / 2 - 5}\n y1={zeroY}\n x2={x + barW / 2 + 5}\n y2={zeroY}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={x}\n y={top}\n width={barW}\n height={Math.max(2, barH)}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text x={x + barW / 2} y={top - 4} textAnchor=\"middle\" className={styles.valueLabel}>\n {formatValue(d.value)}\n </text>\n </>\n )}\n <text\n x={x + barW / 2}\n y={svgH - 8}\n textAnchor=\"middle\"\n className={styles.axisLabel}\n >\n {d.label.length > 10 ? `${d.label.slice(0, 9)}…` : d.label}\n </text>\n <rect\n className={styles.hitArea}\n x={x - GAP / 2}\n y={0}\n width={barW + GAP}\n height={svgH}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: GAP + hover * (barW + GAP), top: 0 }}\n id={`${uid}-tooltip`}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n}\n",".sparkline {\n display: block;\n overflow: visible;\n}\n\n.line {\n fill: none;\n stroke: var(--text-tertiary);\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.dot {\n fill: var(--chart-sequential);\n}\n","/**\n * components/charts/Sparkline.tsx — the 12-ish-point inline trend for a\n * stat tile (marks-and-anatomy.md \"Figures\" stat-tile contract). No axes,\n * no legend, no tooltip — it is a glance, not a chart; the real numbers\n * live in the stat tile's value and in the full chart elsewhere on the\n * view. Gaps (`null`) break the line rather than reading as a dip to zero.\n */\nimport './chart-tokens.css';\nimport styles from './Sparkline.module.css';\n\nexport function Sparkline({\n points,\n width = 72,\n height = 24,\n ariaLabel,\n}: {\n points: (number | null)[];\n width?: number;\n height?: number;\n ariaLabel: string;\n}) {\n const known = points.filter((p): p is number => p !== null);\n if (known.length < 2) {\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel} />\n );\n }\n const min = Math.min(...known, 0);\n const max = Math.max(...known, 0);\n const range = max - min || 1;\n const stepX = width / Math.max(1, points.length - 1);\n const yOf = (v: number) => height - ((v - min) / range) * (height - 2) - 1;\n\n // Split into contiguous runs so a null renders as a real gap, not a dip.\n const runs: { x: number; y: number }[][] = [];\n let current: { x: number; y: number }[] = [];\n points.forEach((v, i) => {\n if (v === null) {\n if (current.length) runs.push(current);\n current = [];\n return;\n }\n current.push({ x: i * stepX, y: yOf(v) });\n });\n if (current.length) runs.push(current);\n\n const lastKnownIndex = points.map((v) => v !== null).lastIndexOf(true);\n const lastPoint =\n lastKnownIndex >= 0 ? { x: lastKnownIndex * stepX, y: yOf(points[lastKnownIndex] as number) } : null;\n\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel}>\n {runs.map((run, i) => (\n <path\n key={i}\n className={styles.line}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ')}\n />\n ))}\n {lastPoint ? <circle className={styles.dot} cx={lastPoint.x} cy={lastPoint.y} r={2} /> : null}\n </svg>\n );\n}\n","/**\n * components/charts/format.ts — number formatting shared by every chart and\n * stat tile. Proportional figures everywhere EXCEPT columns that must align\n * vertically (table cells, axis ticks) — see marks-and-anatomy.md \"Proportional\n * figures for big numbers; tabular only in columns.\" Callers apply\n * `font-variant-numeric: tabular-nums` via CSS where that applies; these\n * functions only produce the string.\n */\n\n/** Auto-compact a count: 1,284 / 12.9K / 4.2M. */\nexport function formatCompact(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n if (abs >= 1_000_000) return `${(n / 1_000_000).toFixed(abs >= 10_000_000 ? 0 : 1)}M`;\n if (abs >= 10_000) return `${Math.round(n / 1000)}K`;\n if (abs >= 1_000) return n.toLocaleString('en-US');\n return Number.isInteger(n) ? String(n) : n.toFixed(1);\n}\n\n/** Auto-compact USD: $4.20 / $1.2K / $4.2M. */\nexport function formatUsd(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n const sign = n < 0 ? '-' : '';\n if (abs >= 1_000_000) return `${sign}$${(abs / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n return `${sign}$${abs.toFixed(2)}`;\n}\n\n/** Fraction (0..1) as a percentage. */\nexport function formatPercent(fraction: number, digits = 0): string {\n if (!Number.isFinite(fraction)) return '—';\n return `${(fraction * 100).toFixed(digits)}%`;\n}\n\n/** Signed delta for a stat tile: \"+12\" / \"-3\" / \"0\". */\nexport function formatSignedCompact(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const s = formatCompact(Math.abs(n));\n if (n > 0) return `+${s}`;\n if (n < 0) return `-${s}`;\n return s;\n}\n\n/** YYYY-MM-DD -> short label, e.g. \"Aug 14\". Local-independent (UTC parse). */\nexport function formatDayLabel(day: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return day;\n const d = new Date(`${day}T00:00:00Z`);\n // Date normalizes impossible dates; compare the padded UTC date to reject rollover.\n if (Number.isNaN(d.getTime()) || d.toISOString().slice(0, 10) !== day) return day;\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'UTC' });\n}\n\n/** Epoch ms -> short label for axis ticks. */\nexport function formatTimeLabel(ms: number): string {\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n",".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-4);\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.label {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.value {\n font-size: var(--text-2xl-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.trendRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.delta {\n font-size: var(--text-xs-size);\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 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 */\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 yesterday\". */\n versus?: string;\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: 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}>\n <span className={styles.label}>{label}</span>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n </div>\n <div className={styles.trendRow}>\n {caption ? <span className={styles.caption}>{caption}</span> : <span />}\n {trend ? <Sparkline points={trend} ariaLabel={trendLabel ?? `${label} trend`} /> : null}\n </div>\n {delta ? (\n <span className={`${styles.delta} ${deltaTone}`}>\n {formatSignedCompact(delta.value)}\n {delta.versus ? ` ${delta.versus}` : ''}\n </span>\n ) : null}\n </div>\n );\n}\n",".table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--text-xs-size);\n}\n\n.table th,\n.table td {\n text-align: left;\n padding: var(--space-1) var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.table th {\n color: var(--text-tertiary);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n font-size: var(--text-xs-size);\n}\n\n.numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n","/**\n * components/charts/TableView.tsx — the WCAG-clean accessibility twin every\n * chart should ship (dataviz skill: \"no table view / color-only encoding on\n * a continuous scale\" is an anti-pattern). Every value a chart's tooltip or\n * direct label shows must also be reachable here without hovering anything.\n */\nimport type { ReactNode } from 'react';\nimport styles from './TableView.module.css';\n\nexport interface TableColumn<T> {\n key: string;\n label: string;\n numeric?: boolean;\n render: (row: T) => ReactNode;\n}\n\nexport function TableView<T>({\n caption,\n columns,\n rows,\n rowKey,\n}: {\n caption: string;\n columns: TableColumn<T>[];\n rows: T[];\n rowKey: (row: T, index: number) => string;\n}) {\n return (\n <table className={styles.table}>\n <caption className=\"visually-hidden\">{caption}</caption>\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\" className={c.numeric ? styles.numeric : undefined}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={rowKey(row, i)}>\n {columns.map((c) => (\n <td key={c.key} className={c.numeric ? styles.numeric : undefined}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts-CnMDT08S.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/ChartContainer.module.css","../../../../../../src/web-ui/components/charts/ChartContainer.tsx","../../../../../../src/web-ui/components/charts/Legend.module.css","../../../../../../src/web-ui/components/charts/Legend.tsx","../../../../../../src/web-ui/components/charts/colors.ts","../../../../../../src/web-ui/components/charts/LineChart.module.css","../../../../../../src/web-ui/components/charts/LineChart.tsx","../../../../../../src/web-ui/components/charts/BarChart.module.css","../../../../../../src/web-ui/components/charts/BarChart.tsx","../../../../../../src/web-ui/components/charts/Sparkline.module.css","../../../../../../src/web-ui/components/charts/Sparkline.tsx","../../../../../../src/web-ui/components/charts/format.ts","../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx","../../../../../../src/web-ui/components/charts/TableView.module.css","../../../../../../src/web-ui/components/charts/TableView.tsx"],"sourcesContent":[".figure {\n margin: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n padding: var(--space-4);\n /* Fixed heights must include the axis-label band — this container instead\n grows with its content so a chart's x-axis labels never get clipped or\n forced into a nested scroll (dataviz anti-patterns). */\n}\n\n.caption {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-3);\n margin-bottom: var(--space-3);\n}\n\n.title {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.description {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.plot {\n width: 100%;\n overflow-x: auto;\n}\n\n.tableDisclosure {\n margin-top: var(--space-3);\n border-top: 1px solid var(--border-subtle);\n padding-top: var(--space-2);\n}\n\n.tableDisclosure > summary {\n cursor: pointer;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n list-style: none;\n}\n\n.tableDisclosure > summary::-webkit-details-marker {\n display: none;\n}\n\n.tableDisclosure > summary::before {\n content: '▸ ';\n}\n\n.tableDisclosure[open] > summary::before {\n content: '▾ ';\n}\n\n.tableBody {\n margin-top: var(--space-2);\n}\n\n.caveat {\n margin: 0 0 var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n}\n\n.empty {\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n padding: var(--space-6) 0;\n text-align: center;\n}\n","/**\n * components/charts/ChartContainer.tsx — the figure every chart mounts\n * inside: title/description, the plot itself, an optional caveat banner\n * (epistemic-honesty-adjacent: for a chart built on data with a known,\n * disclosed limitation — see ProductionView's judge-verdict caveat), an\n * optional table-view twin (the WCAG-clean accessibility equivalent every\n * chart should ship per the dataviz skill), and an empty state that never\n * lies about missing data.\n */\nimport type { ReactNode } from 'react';\nimport './chart-tokens.css';\nimport styles from './ChartContainer.module.css';\n\nexport interface ChartContainerProps {\n title: string;\n description?: string;\n /** A short, honest note about a known limitation of the data behind this\n * chart (e.g. \"counts may include X, not yet separable\"). Never omit a\n * caveat to make a chart look cleaner than the data actually is. */\n caveat?: string;\n /** The chart itself (SVG + legend). */\n children: ReactNode;\n /** The accessibility twin — same data as a real HTML table. Omit only\n * when the chart already IS a table. */\n table?: ReactNode;\n /** When true, renders the empty state instead of `children`. */\n empty?: boolean;\n emptyMessage?: string;\n}\n\nexport function ChartContainer({\n title,\n description,\n caveat,\n children,\n table,\n empty,\n emptyMessage = 'No data for this window.',\n}: ChartContainerProps) {\n return (\n <figure className={styles.figure}>\n <figcaption className={styles.caption}>\n <span className={styles.title}>{title}</span>\n {description ? <span className={styles.description}>{description}</span> : null}\n </figcaption>\n {caveat ? (\n <p className={styles.caveat} role=\"note\">\n {caveat}\n </p>\n ) : null}\n {empty ? (\n <p className={styles.empty}>{emptyMessage}</p>\n ) : (\n <div className={styles.plot}>{children}</div>\n )}\n {table ? (\n <details className={styles.tableDisclosure}>\n <summary>View as table</summary>\n <div className={styles.tableBody}>{table}</div>\n </details>\n ) : null}\n </figure>\n );\n}\n",".legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-4);\n margin: var(--space-2) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--radius-full);\n flex: none;\n}\n\n.swatchLine {\n width: 14px;\n height: 2px;\n border-radius: var(--radius-full);\n flex: none;\n}\n","/**\n * components/charts/Legend.tsx — the dependable identity channel. A legend\n * is always present for two or more series (never rely on color-matching\n * alone); a single series needs no legend box because the chart's own title\n * already names it (see marks-and-anatomy.md \"Labels & legend\").\n */\nimport styles from './Legend.module.css';\n\nexport interface LegendItem {\n label: string;\n color: string;\n /** 'line' for line charts (a short stroke key), 'swatch' for bar/area. */\n kind?: 'line' | 'swatch';\n}\n\nexport function Legend({ items }: { items: LegendItem[] }) {\n if (items.length < 2) return null;\n return (\n <ul className={styles.legend}>\n {items.map((it) => (\n <li key={it.label} className={styles.item}>\n <span\n className={it.kind === 'line' ? styles.swatchLine : styles.swatch}\n style={{ background: it.color }}\n aria-hidden=\"true\"\n />\n {it.label}\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * components/charts/colors.ts — the one place a chart asks for a color.\n * Every function returns a `var(--chart-*)` reference into chart-tokens.css\n * (never a literal hex) so theming is automatic and colors can never drift\n * out of sync between light and dark. See chart-tokens.css's header comment\n * for the palette-selection rationale — an exhaustive permutation search\n * clears the CVD adjacent floor (worst ΔE 13.8 light / 14.5 dark, target\n * 8.0) without changing which hues are used, only their series order.\n */\n\nconst SERIES_SLOTS = 7;\n\n/** Fixed-order categorical color for series index `slot` (0-based). Color\n * follows the entity, never its row number — callers must assign a series\n * its slot once (e.g. by stable sort order) and keep it even if other\n * series are filtered out; never reassign slots to \"fill the gap\" left by\n * a removed series (see dataviz anti-patterns: \"recolor-on-filter\"). */\nexport function seriesColor(slot: number): string {\n const n = ((slot % SERIES_SLOTS) + SERIES_SLOTS) % SERIES_SLOTS;\n return `var(--chart-series-${n + 1})`;\n}\n\n/** The \"Other\"/overflow bucket color — never part of the identity rotation. */\nexport const CHART_NEUTRAL = 'var(--chart-neutral)';\n\n/** Default single hue for magnitude (sequential) and for a single nominal\n * series (one series needs no legend box — every bar takes the same hue). */\nexport const CHART_SEQUENTIAL = 'var(--chart-sequential)';\nexport const CHART_SEQUENTIAL_SOFT = 'var(--chart-sequential-soft)';\n\nexport const CHART_DIVERGING_POS = 'var(--chart-diverging-pos)';\nexport const CHART_DIVERGING_NEG = 'var(--chart-diverging-neg)';\nexport const CHART_DIVERGING_MID = 'var(--chart-diverging-mid)';\n\nexport const CHART_GRID = 'var(--chart-grid)';\nexport const CHART_AXIS = 'var(--chart-axis)';\n",".svg {\n display: block;\n width: 100%;\n height: auto;\n}\n\n.gridline {\n stroke: var(--chart-grid);\n stroke-width: 1;\n}\n\n.axis {\n stroke: var(--chart-axis);\n stroke-width: 1;\n}\n\n.axisLabel {\n font-size: var(--text-xs-size);\n fill: var(--text-tertiary);\n font-family: var(--font-ui);\n}\n\n.line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.area {\n opacity: 0.1;\n stroke: none;\n}\n\n.marker {\n stroke: var(--chart-surface);\n stroke-width: 2;\n}\n\n.endLabel {\n font-size: var(--text-xs-size);\n font-family: var(--font-ui);\n font-weight: var(--font-weight-medium);\n}\n\n.crosshairLine {\n stroke: var(--chart-axis);\n stroke-width: 1;\n pointer-events: none;\n}\n\n.overlay {\n fill: transparent;\n cursor: crosshair;\n}\n\n.wrap {\n position: relative;\n}\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--chart-tooltip-bg);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n box-shadow: var(--shadow-md);\n padding: var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n white-space: nowrap;\n z-index: var(--z-dropdown);\n transform: translate(-50%, -100%);\n margin-top: -10px;\n}\n\n.tooltipDate {\n color: var(--text-tertiary);\n margin-bottom: var(--space-1);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.tooltipKey {\n width: 12px;\n height: 2px;\n flex: none;\n}\n\n.tooltipValue {\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipGap {\n color: var(--text-tertiary);\n font-style: italic;\n}\n","/**\n * components/charts/LineChart.tsx — trend over time. A gap (`null` y) is\n * split into a separate path segment so it renders as a visible break in\n * the line, never as a straight line through a missing value and never as\n * a silent zero. Single series gets an optional soft area fill; two-plus\n * series always render a legend (never color-matching alone).\n */\nimport { useRef, useState } from 'react';\nimport type { Series } from './types.js';\nimport { seriesColor, CHART_GRID, CHART_AXIS } from './colors.js';\nimport { Legend } from './Legend.js';\nimport './chart-tokens.css';\nimport styles from './LineChart.module.css';\n\nconst VBOX_W = 640;\nconst PAD_L = 44;\nconst PAD_R = 12;\nconst PAD_T = 12;\nconst PAD_B = 24;\nconst TICKS_Y = 4;\n/* Direct end-of-line labels need a gutter of their own. They are drawn in USER\n units — the viewBox scales the font along with the geometry, so a reserve\n measured in user units holds at every rendered width — and `--text-xs-size`\n resolves to 12 user units here, where the UI sans averages a shade over 6\n units per character at medium weight. 6.4 rounds that up so the reserve errs\n wide rather than clipping. Without the reserve the label was drawn at\n `VBOX_W - PAD_R + 4` with only PAD_R (12u) of room and the svg's own\n `overflow: hidden` cropped it to its first glyph — \"Estimated spend\"\n rendered as a lone \"E\". */\nconst END_LABEL_CH = 6.4;\nconst END_LABEL_GAP = 4;\n/* Past this the gutter would cost more plot than the label is worth, so the\n label is dropped rather than shrinking the chart around it. Nothing is lost:\n Legend.tsx deliberately renders nothing below two series because the panel\n heading already names a lone series, and two-plus series always have the\n legend regardless. */\nconst END_LABEL_MAX = 150;\n\ninterface Run {\n x: number;\n y: number;\n}\n\nfunction splitRuns(points: Series['points']): Run[][] {\n const runs: Run[][] = [];\n let current: Run[] = [];\n for (const p of points) {\n if (p.y === null) {\n if (current.length) runs.push(current);\n current = [];\n continue;\n }\n current.push({ x: p.x, y: p.y });\n }\n if (current.length) runs.push(current);\n return runs;\n}\n\nfunction niceTicks(min: number, max: number, count: number): number[] {\n if (max <= min) return [min];\n const step = (max - min) / count;\n return Array.from({ length: count + 1 }, (_, i) => min + step * i);\n}\n\nexport function LineChart({\n series,\n height = 200,\n area = false,\n formatX = (x: number) => String(x),\n formatY = (y: number) => String(y),\n ariaLabel,\n}: {\n series: Series[];\n height?: number;\n area?: boolean;\n formatX?: (x: number) => string;\n formatY?: (y: number) => string;\n ariaLabel: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [hoverX, setHoverX] = useState<number | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ left: number; top: number } | null>(null);\n\n const allX = series.flatMap((s) => s.points.map((p) => p.x));\n const knownY = series.flatMap((s) => s.points.map((p) => p.y)).filter((y): y is number => y !== null);\n if (allX.length === 0) {\n return <p>No data.</p>;\n }\n const xMin = Math.min(...allX);\n const xMax = Math.max(...allX);\n const yMin = Math.min(0, ...knownY);\n const yMax = Math.max(0.0001, ...knownY);\n const xRange = xMax - xMin || 1;\n const yRange = yMax - yMin || 1;\n\n /* Decided before the scales, because the reserved gutter is what plotW is\n measured against — and the gridlines and x-axis stop at the same edge. */\n const wantEndLabels = series.length >= 1 && series.length <= 4;\n const endLabelW = wantEndLabels\n ? Math.max(...series.map((s) => s.label.length)) * END_LABEL_CH\n : 0;\n const showEndLabels = wantEndLabels && endLabelW <= END_LABEL_MAX;\n const padR = PAD_R + (showEndLabels ? END_LABEL_GAP + endLabelW : 0);\n const showLegend = series.length >= 2;\n\n const plotW = VBOX_W - PAD_L - padR;\n const plotH = height - PAD_T - PAD_B;\n const xScale = (x: number) => PAD_L + ((x - xMin) / xRange) * plotW;\n const yScale = (y: number) => PAD_T + plotH - ((y - yMin) / yRange) * plotH;\n\n const yTicks = niceTicks(yMin, yMax, TICKS_Y);\n\n // Nearest-x lookup across a reference axis (the union of all distinct x\n // values, since series may not share every point).\n const xAxis = Array.from(new Set(allX)).sort((a, b) => a - b);\n\n function nearestX(clientX: number): number | null {\n const svg = svgRef.current;\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n const svgX = ((clientX - rect.left) / rect.width) * VBOX_W;\n const dataX = xMin + ((svgX - PAD_L) / plotW) * xRange;\n let nearest = xAxis[0];\n let best = Infinity;\n for (const x of xAxis) {\n const d = Math.abs(x - dataX);\n if (d < best) {\n best = d;\n nearest = x;\n }\n }\n return nearest;\n }\n\n function handleMove(e: React.PointerEvent<SVGSVGElement>) {\n const x = nearestX(e.clientX);\n if (x === null) return;\n setHoverX(x);\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n const px = (xScale(x) / VBOX_W) * rect.width;\n setTooltipPos({ left: px, top: 0 });\n }\n }\n\n const hoverPoints =\n hoverX !== null\n ? series.map((s) => ({\n series: s,\n point: s.points.find((p) => p.x === hoverX) ?? null,\n }))\n : null;\n\n return (\n <div className={styles.wrap}>\n <svg\n ref={svgRef}\n className={styles.svg}\n viewBox={`0 0 ${VBOX_W} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverX(null)}\n >\n {yTicks.map((t, i) => (\n <g key={i}>\n <line\n x1={PAD_L}\n x2={VBOX_W - padR}\n y1={yScale(t)}\n y2={yScale(t)}\n className={styles.gridline}\n stroke={CHART_GRID}\n />\n <text x={PAD_L - 6} y={yScale(t)} dy=\"0.32em\" textAnchor=\"end\" className={styles.axisLabel}>\n {formatY(t)}\n </text>\n </g>\n ))}\n <line\n x1={PAD_L}\n x2={VBOX_W - padR}\n y1={height - PAD_B}\n y2={height - PAD_B}\n className={styles.axis}\n stroke={CHART_AXIS}\n />\n {xAxis.length > 1\n ? [xAxis[0], xAxis[xAxis.length - 1]].map((x, i) => (\n <text\n key={i}\n x={xScale(x)}\n y={height - 6}\n textAnchor={i === 0 ? 'start' : 'end'}\n className={styles.axisLabel}\n >\n {formatX(x)}\n </text>\n ))\n : null}\n\n {series.map((s, si) => {\n const color = seriesColor(si);\n const runs = splitRuns(s.points);\n return (\n <g key={s.id}>\n {area && series.length === 1\n ? runs.map((run, ri) => {\n const d =\n run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ') +\n ` L${xScale(run[run.length - 1].x)},${yScale(yMin)} L${xScale(run[0].x)},${yScale(yMin)} Z`;\n return <path key={ri} d={d} fill={color} className={styles.area} />;\n })\n : null}\n {runs.map((run, ri) => (\n <path\n key={ri}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ')}\n stroke={color}\n className={styles.line}\n />\n ))}\n {showEndLabels && runs.length ? (\n (() => {\n const lastRun = runs[runs.length - 1];\n const last = lastRun[lastRun.length - 1];\n return (\n <text\n x={xScale(last.x) + END_LABEL_GAP}\n y={yScale(last.y)}\n dy=\"0.32em\"\n className={styles.endLabel}\n fill={color}\n >\n {s.label}\n </text>\n );\n })()\n ) : null}\n </g>\n );\n })}\n\n {hoverX !== null ? (\n <line\n x1={xScale(hoverX)}\n x2={xScale(hoverX)}\n y1={PAD_T}\n y2={height - PAD_B}\n className={styles.crosshairLine}\n />\n ) : null}\n {hoverX !== null\n ? series.map((s, si) => {\n const p = s.points.find((pt) => pt.x === hoverX);\n if (!p || p.y === null) return null;\n return (\n <circle\n key={s.id}\n cx={xScale(p.x)}\n cy={yScale(p.y)}\n r={4}\n fill={seriesColor(si)}\n className={styles.marker}\n />\n );\n })\n : null}\n\n <rect\n x={PAD_L}\n y={PAD_T}\n width={plotW}\n height={plotH}\n className={styles.overlay}\n onFocus={() => setHoverX(xAxis[xAxis.length - 1] ?? null)}\n />\n </svg>\n {hoverPoints && tooltipPos ? (\n <div className={styles.tooltip} style={{ left: tooltipPos.left, top: tooltipPos.top }}>\n <div className={styles.tooltipDate}>{formatX(hoverX as number)}</div>\n {hoverPoints.map(({ series: s, point }, i) => (\n <div className={styles.tooltipRow} key={s.id}>\n <span className={styles.tooltipKey} style={{ background: seriesColor(i) }} aria-hidden=\"true\" />\n {point && point.y !== null ? (\n <>\n <span className={styles.tooltipValue}>{formatY(point.y)}</span>\n {showLegend ? <span>{s.label}</span> : null}\n </>\n ) : (\n <span className={styles.tooltipGap}>no data{showLegend ? ` — ${s.label}` : ''}</span>\n )}\n </div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <Legend items={series.map((s, i) => ({ label: s.label, color: seriesColor(i), kind: 'line' }))} />\n ) : null}\n </div>\n );\n}\n",".svg {\n display: block;\n overflow: visible;\n}\n\n.bar {\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n\n.bar:hover,\n.bar:focus-visible {\n opacity: 0.82;\n}\n\n.baseline {\n stroke: var(--chart-axis);\n stroke-width: 1;\n}\n\n.gridline {\n stroke: var(--chart-grid);\n stroke-width: 1;\n}\n\n.axisLabel {\n font-size: 10px;\n fill: var(--text-tertiary);\n font-family: var(--font-ui);\n}\n\n.valueLabel {\n font-size: 10px;\n fill: var(--text-secondary);\n font-family: var(--font-ui);\n font-variant-numeric: tabular-nums;\n}\n\n.categoryLabel {\n font-size: 10px;\n fill: var(--text-secondary);\n font-family: var(--font-ui);\n}\n\n.hitArea {\n fill: transparent;\n cursor: pointer;\n}\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--chart-tooltip-bg);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n box-shadow: var(--shadow-md);\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n white-space: nowrap;\n z-index: var(--z-dropdown);\n}\n\n.tooltipValue {\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipLabel {\n color: var(--text-tertiary);\n margin-left: var(--space-1);\n}\n\n.wrap {\n position: relative;\n}\n","/**\n * components/charts/BarChart.tsx — categorical magnitude comparison.\n * Single hue by default (nominal categories never get a value-ramp — see\n * dataviz anti-patterns \"a value-ramp on nominal categories\"). Vertical for\n * a handful of short-named categories, horizontal for many or long-named\n * ones (dataviz choosing-a-form.md). Null values render as an explicit\n * \"no data\" dash, never a silent zero-height bar indistinguishable from a\n * real zero.\n */\nimport { useId, useState } from 'react';\nimport type { CategoricalDatum } from './types.js';\nimport { CHART_SEQUENTIAL, CHART_AXIS, CHART_GRID } from './colors.js';\nimport './chart-tokens.css';\nimport styles from './BarChart.module.css';\n\nconst BAR_MAX = 24;\nconst GAP = 10;\n\nexport function BarChart({\n data,\n height = 160,\n orientation = 'vertical',\n color = CHART_SEQUENTIAL,\n formatValue = (v: number) => String(v),\n ariaLabel,\n}: {\n data: CategoricalDatum[];\n height?: number;\n orientation?: 'vertical' | 'horizontal';\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel: string;\n}) {\n const uid = useId();\n const [hover, setHover] = useState<number | null>(null);\n\n const known = data.map((d) => d.value).filter((v): v is number => v !== null);\n const maxVal = Math.max(0, ...known, 0.0001);\n const minVal = Math.min(0, ...known);\n const range = maxVal - minVal || 1;\n\n if (orientation === 'horizontal') {\n const LABEL_W = 120;\n const PAD_R = 48;\n const rowH = Math.min(BAR_MAX, Math.max(14, Math.floor((height - GAP) / data.length) - GAP));\n const plotW = 420;\n const svgH = data.length * (rowH + GAP) + GAP;\n const svgW = LABEL_W + plotW + PAD_R;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={LABEL_W} y1={0} x2={LABEL_W} y2={svgH} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const y = GAP + i * (rowH + GAP);\n const barW = d.value !== null ? ((d.value - minVal) / range) * plotW : 0;\n return (\n <g key={d.label + i}>\n <text\n x={LABEL_W - 8}\n y={y + rowH / 2}\n dy=\"0.32em\"\n textAnchor=\"end\"\n className={styles.categoryLabel}\n >\n {d.label.length > 22 ? `${d.label.slice(0, 21)}…` : d.label}\n </text>\n {d.value === null ? (\n <line\n x1={LABEL_W + 4}\n y1={y + rowH / 2}\n x2={LABEL_W + 14}\n y2={y + rowH / 2}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={LABEL_W}\n y={y}\n width={Math.max(2, barW)}\n height={rowH}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text\n x={LABEL_W + Math.max(2, barW) + 6}\n y={y + rowH / 2}\n dy=\"0.32em\"\n className={styles.valueLabel}\n >\n {formatValue(d.value)}\n </text>\n </>\n )}\n <rect\n className={styles.hitArea}\n x={0}\n y={y - GAP / 2}\n width={svgW}\n height={rowH + GAP}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: LABEL_W + 8, top: GAP + hover * (rowH + GAP) - 4 }}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n }\n\n // Vertical orientation.\n const barSlot = data.length ? Math.max(BAR_MAX, 0) : BAR_MAX;\n const barW = Math.min(BAR_MAX, barSlot);\n const PAD_T = 20;\n const PAD_B = 30;\n const plotH = height;\n const svgH = plotH + PAD_T + PAD_B;\n const svgW = data.length * (barW + GAP) + GAP;\n const zeroY = PAD_T + plotH - ((0 - minVal) / range) * plotH;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={0} y1={zeroY} x2={svgW} y2={zeroY} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const x = GAP + i * (barW + GAP);\n const barH = d.value !== null ? (Math.abs(d.value - minVal) / range) * plotH : 0;\n const top = d.value !== null && d.value >= 0 ? zeroY - barH : zeroY;\n return (\n <g key={d.label + i}>\n {d.value === null ? (\n <line\n x1={x + barW / 2 - 5}\n y1={zeroY}\n x2={x + barW / 2 + 5}\n y2={zeroY}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={x}\n y={top}\n width={barW}\n height={Math.max(2, barH)}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text x={x + barW / 2} y={top - 4} textAnchor=\"middle\" className={styles.valueLabel}>\n {formatValue(d.value)}\n </text>\n </>\n )}\n <text\n x={x + barW / 2}\n y={svgH - 8}\n textAnchor=\"middle\"\n className={styles.axisLabel}\n >\n {d.label.length > 10 ? `${d.label.slice(0, 9)}…` : d.label}\n </text>\n <rect\n className={styles.hitArea}\n x={x - GAP / 2}\n y={0}\n width={barW + GAP}\n height={svgH}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: GAP + hover * (barW + GAP), top: 0 }}\n id={`${uid}-tooltip`}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n}\n",".sparkline {\n display: block;\n overflow: visible;\n}\n\n.line {\n fill: none;\n stroke: var(--text-tertiary);\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.dot {\n fill: var(--chart-sequential);\n}\n","/**\n * components/charts/Sparkline.tsx — the 12-ish-point inline trend for a\n * stat tile (marks-and-anatomy.md \"Figures\" stat-tile contract). No axes,\n * no legend, no tooltip — it is a glance, not a chart; the real numbers\n * live in the stat tile's value and in the full chart elsewhere on the\n * view. Gaps (`null`) break the line rather than reading as a dip to zero.\n */\nimport './chart-tokens.css';\nimport styles from './Sparkline.module.css';\n\nexport function Sparkline({\n points,\n width = 72,\n height = 24,\n ariaLabel,\n}: {\n points: (number | null)[];\n width?: number;\n height?: number;\n ariaLabel: string;\n}) {\n const known = points.filter((p): p is number => p !== null);\n if (known.length < 2) {\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel} />\n );\n }\n const min = Math.min(...known, 0);\n const max = Math.max(...known, 0);\n const range = max - min || 1;\n const stepX = width / Math.max(1, points.length - 1);\n const yOf = (v: number) => height - ((v - min) / range) * (height - 2) - 1;\n\n // Split into contiguous runs so a null renders as a real gap, not a dip.\n const runs: { x: number; y: number }[][] = [];\n let current: { x: number; y: number }[] = [];\n points.forEach((v, i) => {\n if (v === null) {\n if (current.length) runs.push(current);\n current = [];\n return;\n }\n current.push({ x: i * stepX, y: yOf(v) });\n });\n if (current.length) runs.push(current);\n\n const lastKnownIndex = points.map((v) => v !== null).lastIndexOf(true);\n const lastPoint =\n lastKnownIndex >= 0 ? { x: lastKnownIndex * stepX, y: yOf(points[lastKnownIndex] as number) } : null;\n\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel}>\n {runs.map((run, i) => (\n <path\n key={i}\n className={styles.line}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ')}\n />\n ))}\n {lastPoint ? <circle className={styles.dot} cx={lastPoint.x} cy={lastPoint.y} r={2} /> : null}\n </svg>\n );\n}\n","/**\n * components/charts/format.ts — number formatting shared by every chart and\n * stat tile. Proportional figures everywhere EXCEPT columns that must align\n * vertically (table cells, axis ticks) — see marks-and-anatomy.md \"Proportional\n * figures for big numbers; tabular only in columns.\" Callers apply\n * `font-variant-numeric: tabular-nums` via CSS where that applies; these\n * functions only produce the string.\n */\n\n/** Auto-compact a count: 1,284 / 12.9K / 4.2M. */\nexport function formatCompact(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n if (abs >= 1_000_000) return `${(n / 1_000_000).toFixed(abs >= 10_000_000 ? 0 : 1)}M`;\n if (abs >= 10_000) return `${Math.round(n / 1000)}K`;\n if (abs >= 1_000) return n.toLocaleString('en-US');\n return Number.isInteger(n) ? String(n) : n.toFixed(1);\n}\n\n/** Auto-compact USD: $4.20 / $1.2K / $4.2M. */\nexport function formatUsd(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n const sign = n < 0 ? '-' : '';\n if (abs >= 1_000_000) return `${sign}$${(abs / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n return `${sign}$${abs.toFixed(2)}`;\n}\n\n/** Fraction (0..1) as a percentage. */\nexport function formatPercent(fraction: number, digits = 0): string {\n if (!Number.isFinite(fraction)) return '—';\n return `${(fraction * 100).toFixed(digits)}%`;\n}\n\n/** Signed delta for a stat tile: \"+12\" / \"-3\" / \"0\". */\nexport function formatSignedCompact(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const s = formatCompact(Math.abs(n));\n if (n > 0) return `+${s}`;\n if (n < 0) return `-${s}`;\n return s;\n}\n\n/** YYYY-MM-DD -> short label, e.g. \"Aug 14\". Local-independent (UTC parse). */\nexport function formatDayLabel(day: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return day;\n const d = new Date(`${day}T00:00:00Z`);\n // Date normalizes impossible dates; compare the padded UTC date to reject rollover.\n if (Number.isNaN(d.getTime()) || d.toISOString().slice(0, 10) !== day) return day;\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'UTC' });\n}\n\n/** Epoch ms -> short label for axis ticks. */\nexport function formatTimeLabel(ms: number): string {\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n",".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-4);\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.label {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.value {\n font-size: var(--text-2xl-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.trendRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.delta {\n font-size: var(--text-xs-size);\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 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 */\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 yesterday\". */\n versus?: string;\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: 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}>\n <span className={styles.label}>{label}</span>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n </div>\n <div className={styles.trendRow}>\n {caption ? <span className={styles.caption}>{caption}</span> : <span />}\n {trend ? <Sparkline points={trend} ariaLabel={trendLabel ?? `${label} trend`} /> : null}\n </div>\n {delta ? (\n <span className={`${styles.delta} ${deltaTone}`}>\n {formatSignedCompact(delta.value)}\n {delta.versus ? ` ${delta.versus}` : ''}\n </span>\n ) : null}\n </div>\n );\n}\n",".table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--text-xs-size);\n}\n\n.table th,\n.table td {\n text-align: left;\n padding: var(--space-1) var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.table th {\n color: var(--text-tertiary);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n font-size: var(--text-xs-size);\n}\n\n.numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n","/**\n * components/charts/TableView.tsx — the WCAG-clean accessibility twin every\n * chart should ship (dataviz skill: \"no table view / color-only encoding on\n * a continuous scale\" is an anti-pattern). Every value a chart's tooltip or\n * direct label shows must also be reachable here without hovering anything.\n */\nimport type { ReactNode } from 'react';\nimport styles from './TableView.module.css';\n\nexport interface TableColumn<T> {\n key: string;\n label: string;\n numeric?: boolean;\n render: (row: T) => ReactNode;\n}\n\nexport function TableView<T>({\n caption,\n columns,\n rows,\n rowKey,\n}: {\n caption: string;\n columns: TableColumn<T>[];\n rows: T[];\n rowKey: (row: T, index: number) => string;\n}) {\n return (\n <table className={styles.table}>\n <caption className=\"visually-hidden\">{caption}</caption>\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\" className={c.numeric ? styles.numeric : undefined}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={rowKey(row, i)}>\n {columns.map((c) => (\n <td key={c.key} className={c.numeric ? styles.numeric : undefined}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n"],"mappings":"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"}
|
package/dist/core/web/public/next/assets/{context-model-Bqv8DVuH.js → context-model-DTvb2uZy.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{J as e,at as t,et as n,it as r,nt as i,q as a}from"./global-eaY9GyX3.js";import{C as o,i as s,m as c,t as l,x as u}from"./verse-model-TfDk9cky.js";var d={session:null,events:[],lastSeq:0,loaded:!1,loadError:null,stream:`idle`},f=new Map,p=new Set;function m(){for(let e of p)e()}function h(e){return p.add(e),()=>p.delete(e)}function g(e){let t=f.get(e);return t||(t={sessionId:e,...d},f.set(e,t)),t}function _(e,t){let n=g(e);f.set(e,{...n,...t}),m()}var v={sessionId:``,...d};function y(e){return e?g(e):v}function b(e,t,n){let r=k(g(e).events,n);_(e,{session:w(t,r),events:r,lastSeq:r.length?r[r.length-1].seq:0,loaded:!0,loadError:null})}function x(e,t){_(e,{loadError:t,loaded:!0})}function S(e,t){g(e).stream!==t&&_(e,{stream:t})}function C(e,t,n){_(e,{session:w(t,g(e).events,n)})}function w(e,t,n){if(e.status!==`running`)return e;let r=-1,i=n??null;if(!n){for(let e of t)(e.type===`user-message`||e.type===`turn-started`)&&(r=e.seq,i=e.turnId);if(i===null)return e}let a=null,o=null;for(let e of t)e.seq<=r||(e.type===`error`&&e.turnId===i&&(o=e.message),(e.type===`turn-done`||e.type===`cancelled`)&&e.turnId===i&&(a=e));if(!a)return e;let s=a.type===`turn-done`&&!a.ok&&o!==null;return{...e,status:s?`error`:`idle`,lastError:s?o:null,updatedAt:a.at>e.updatedAt?a.at:e.updatedAt}}function ee(e,t){let n=g(e);n.session&&n.session.status!==t&&_(e,{session:{...n.session,status:t}})}function te(e,t){let n=g(e);if(!Number.isFinite(t.seq)||n.events.some(e=>e.seq===t.seq))return!1;let r=k(n.events,[t]),i=n.session;if(i)switch(t.type){case`turn-started`:i={...i,status:`running`,lastError:null,updatedAt:t.at};break;case`usage`:i={...i,usage:ne(i,t.usage),updatedAt:t.at};break;case`context`:i={...i,usage:E(i,t),updatedAt:t.at};break;case`compaction`:i={...i,compactionCount:(i.compactionCount??0)+1,updatedAt:t.at};break;case`turn-done`:i={...i,status:t.ok?`idle`:i.lastError?`error`:`idle`,turnCount:i.turnCount+1,nativeSessionId:t.nativeSessionId??i.nativeSessionId,updatedAt:t.at};break;case`error`:i={...i,status:`error`,lastError:t.message,updatedAt:t.at};break;case`cancelled`:i={...i,status:`idle`,updatedAt:t.at}}return _(e,{events:r,lastSeq:Math.max(n.lastSeq,t.seq),session:i}),!0}function ne(e,t){let n=e.usage,r={...n,inputTokens:n.inputTokens+t.inputTokens,outputTokens:n.outputTokens+t.outputTokens,cacheReadTokens:n.cacheReadTokens+t.cacheReadTokens,cacheCreationTokens:n.cacheCreationTokens+t.cacheCreationTokens,contextTokens:t.contextTokens},i=typeof t.contextWindow==`number`&&t.contextWindow>0?t.contextWindow:null,a=t.contextWindowSource!==void 0||e.engine!==`local`;return i!==null&&a&&(r.contextWindow=i),t.contextWindowSource!==void 0&&(r.contextWindowSource=t.contextWindowSource),t.autoCompactAt!==void 0&&(r.autoCompactAt=t.autoCompactAt),t.contextTokensExact===!1?r.contextTokensExact=!1:t.contextWindowSource!==void 0&&delete r.contextTokensExact,r}var re=new Set([`runtime`,`provider-catalog`,`cli-catalog`,`documented`,`fallback`]);function T(e){return typeof e==`string`&&re.has(e)?e:null}function E(e,t){let n=e.usage,i={...n,contextTokens:Math.max(0,Math.floor(t.contextTokens)),contextTokensExact:t.exact},a=typeof t.contextWindow==`number`&&t.contextWindow>0?t.contextWindow:null,o=T(t.contextWindowSource);return a===null||e.engine===`local`&&o===null?(t.autoCompactAt!==void 0&&t.autoCompactAt!==null&&(i.autoCompactAt=t.autoCompactAt),i):(i.contextWindow=a,i.contextWindowSource=o??`runtime`,t.autoCompactAt===void 0?a!==n.contextWindow&&(i.autoCompactAt=r({engine:e.engine,runtimeWindow:a,budget:n.contextWindow?{contextWindow:n.contextWindow,autoCompactAt:n.autoCompactAt??null}:null})):i.autoCompactAt=t.autoCompactAt,i)}function D(e){let t=null;for(let n of e)(n.type===`usage`||n.type===`turn-done`||n.type===`cancelled`||n.type===`context`&&n.turnId!==null)&&typeof n.at==`string`&&(t===null||n.at>t)&&(t=n.at);return t}function O(e){f.delete(e)&&m()}function k(e,t){if(t.length===0)return e;let n=new Map;for(let t of e)n.set(t.seq,t);for(let e of t)n.has(e.seq)||n.set(e.seq,e);return[...n.values()].sort((e,t)=>e.seq-t.seq)}function A(e,t){let n=Date.parse(e),r=Date.parse(t);return Number.isFinite(n)&&Number.isFinite(r)?Math.max(0,r-n):null}function j(e){let t=[],n=new Map,r=null,i=!1,a=null,o=e=>{r&&=(t.push({kind:`assistant`,key:r.key,turnId:r.turnId,at:r.at,text:r.text,streaming:e}),null)};for(let s of e)switch(s.type){case`user-message`:o(!1),t.push({kind:`user`,key:`u-${s.seq}`,turnId:s.turnId,at:s.at,text:s.text});break;case`turn-started`:i=!0;break;case`text-delta`:r&&r.turnId!==s.turnId&&o(!1),r||={turnId:s.turnId,at:s.at,text:``,key:`d-${s.seq}`},r.text+=s.text;break;case`assistant-message`:r=null,t.push({kind:`assistant`,key:`a-${s.seq}`,turnId:s.turnId,at:s.at,text:s.text,streaming:!1});break;case`thinking`:o(!1),t.push({kind:`thinking`,key:`t-${s.seq}`,turnId:s.turnId,at:s.at,text:s.text});break;case`tool-use`:o(!1),n.set(s.toolUseId,t.length),t.push({kind:`tool`,key:`tu-${s.seq}`,turnId:s.turnId,at:s.at,toolUseId:s.toolUseId,name:s.name,input:s.input,result:null,durationMs:null});break;case`tool-result`:{let e=n.get(s.toolUseId),r=e===void 0?void 0:t[e];r&&r.kind===`tool`?t[e]={...r,result:{output:s.output,isError:s.isError},durationMs:A(r.at,s.at)}:t.push({kind:`tool`,key:`tr-${s.seq}`,turnId:s.turnId,at:s.at,toolUseId:s.toolUseId,name:`tool`,input:null,result:{output:s.output,isError:s.isError},durationMs:null});break}case`usage`:a=s.usage;break;case`compaction`:t.push({kind:`compaction`,key:`k-${s.seq}`,turnId:s.turnId,at:s.at,trigger:s.trigger,preTokens:s.preTokens,postTokens:s.postTokens,durationMs:s.durationMs});break;case`error`:o(!1),t.push({kind:`error`,key:`e-${s.seq}`,turnId:s.turnId,at:s.at,message:s.message});break;case`cancelled`:o(!1),i=!1,t.push({kind:`cancelled`,key:`c-${s.seq}`,turnId:s.turnId,at:s.at});break;case`turn-done`:o(!1),i=!1,t.push({kind:`turn-done`,key:`td-${s.seq}`,turnId:s.turnId,at:s.at,ok:s.ok,durationMs:s.durationMs})}return o(i),{items:t,live:i,usage:a}}function M(e){let t=[],n=[],r=()=>{n.length!==0&&(n.length===1?t.push(n[0]):t.push(N(n)),n=[])};for(let i of e){if((i.kind===`tool`||i.kind===`thinking`)&&(n.length===0||n[0].turnId===i.turnId)){n.push(i);continue}r(),i.kind===`tool`||i.kind===`thinking`?n.push(i):t.push(i)}return r(),t}function N(e){let t=new Map,n=0,r=!1;for(let i of e)i.kind===`tool`&&(t.set(i.name,(t.get(i.name)??0)+1),i.result===null?r=!0:i.result.isError&&(n+=1));let i=[...t.values()].reduce((e,t)=>e+t,0),a=[...t.entries()].map(([e,t])=>t>1?`${e} ×${t}`:e).join(`, `),o=A(e[0].at,e[e.length-1].at);return{kind:`toolGroup`,key:`g-${e[0].key}`,turnId:e[0].turnId,at:e[0].at,items:e,toolCount:i,summary:a,errorCount:n,pending:r,spanMs:o}}function P(e){return e==null||!Number.isFinite(e)?`—`:Math.round(e)<1e3?String(Math.round(e)):Math.round(e/1e3)<1e3?`${Math.round(e/1e3)}k`:`${(e/1e6).toFixed(1).replace(/\.0$/,``)}M`}function F(e,t){return e?c([e],{seatId:e.id,model:t}):null}function I(e,t){return t!==`standard`&&a(e,t)!==null?t:`standard`}function L(e,t){return a(e,I(e,t))}function R(e,t){let n=u(e);if(n!==null)return n;let r=t.unavailableReason;return typeof r==`string`&&r.trim().length>0?r.trim():null}var z={standard:`Standard`,expansive:`Expansive`},B={claude:`Claude Code`,codex:`Codex CLI`,grok:`Grok CLI`,local:`Claude Code`};function ie(e){let t=typeof e.cliVersion==`string`?e.cliVersion.trim():``;return t.length>0?`${B[e.engine]} ${t}`:null}function V(e){return(e.notes??[]).filter(e=>typeof e==`string`&&e.trim().length>0)}function H(e){return e===`fallback`}function U(e,t=`standard`){let n=I(e,t),r=a(e,n);return r?`${`${P(r.contextWindow)} ctx${H(e.windowSource)?` (est.)`:``}`}${r.autoCompactAt===null?``:` · compacts ≈${P(r.autoCompactAt)}`}${n===`expansive`?` (expansive)`:``}`:`window unknown`}function W(e){let t=a(e,`standard`),n=i(e)?a(e,`expansive`):null,r=[];if(!t)r.push(`Context window unknown for this model.`);else{let e=t.autoCompactAt===null?``:`; compacts at about ${P(t.autoCompactAt)}${n?` in Standard`:``}`;r.push(`${P(t.contextWindow)}-token window${e}.`)}return n&&r.push(`Expansive runs to about ${P(n.autoCompactAt??n.contextWindow)} before compacting.`),e.windowSource&&r.push(`Window ${s[e.windowSource]}.`),r.join(` `)}function G(e){return e===`codex`?l:null}function K(e){let t=a(e,`standard`),n=a(e,`expansive`),r=t?t.autoCompactAt??t.contextWindow:null,i=n?n.autoCompactAt??n.contextWindow:null;return r===null||i===null||r<=0?null:`A turn at ${P(i)} re-sends ${(i/r).toFixed(1)}× the tokens of one at ${P(r)}.`}function q(e,t,n){let r=a(t,`standard`),i=a(t,`expansive`),o=r?r.autoCompactAt??r.contextWindow:null,s=i?i.autoCompactAt??i.contextWindow:null;if(n===`standard`||s===null)return o===null?`The CLI compacts at its own default point for this model.`:e===`claude`?`Compacts at about ${P(o)}. Every turn re-sends the whole context, so holding it under this point keeps each turn cheaper and recall sharper.`:`Compacts at about ${P(o)} — the CLI's own default budget for this model.`;let c=K(t),l=G(e);return`Runs to about ${P(s)} before compacting — for tightly coupled, cross-cutting work that needs everything in view at once. Each turn re-sends everything held, so a long expansive chat uses noticeably more of your plan per turn.${c?` ${c}`:``}${l?` ${l}`:``}`}function J(e,t){return a(t,`standard`)?e===`grok`||e===`local`?`One budget: this CLI compacts at its own fixed point, and Verse cannot raise it per chat.`:`One budget: this model has no larger window to expand into.`:`This model’s window is unknown, so Verse cannot offer a larger budget for it.`}var Y={fits:`code fits`,tight:`code fits, tight`,expansive:`code needs expansive`,split:`code too big — split`},ae={fits:`Fits`,tight:`Tight fit`,expansive:`Needs expansive`,split:`Split the work`};function oe(e){return e.roots.some(e=>e.truncated)}function se(e,r,i,o){if(typeof e!=`number`||!Number.isFinite(e)||e<0)return null;let s=t(o);if(I(r,i)===`expansive`&&r){let t=a(r,`expansive`);return n(e,{...r,contextWindow:t.contextWindow,autoCompactAt:t.autoCompactAt,expansive:null},s)}return n(e,r,s)}function ce(e){let t=`${e.floor?`at least `:``}~${P(e.tokens)} tokens of tracked code`,n=I(e.option,e.mode)===`expansive`,r=a(e.option,`standard`),o=a(e.option,`expansive`),s=r?P(r.autoCompactAt??r.contextWindow):null,c=o?P(o.autoCompactAt??o.contextWindow):null,l=n?c:s,u=n?`Expansive budget`:`budget`;switch(e.verdict){case`fits`:return`All ${t} fits well inside this model's ${u}${l?` (compacts ≈${l})`:``}, with room left for the conversation.`;case`tight`:{let r=!n&&c!==null&&i(e.option)?` Expansive (≈${c}) would hold it with room to spare.`:``;return`${X(t)} fits under the ≈${l??`?`} compaction point${n?` of the Expansive budget`:``}, with little room for the conversation — expect it to compact if the agent reads widely.${r}`}case`expansive`:return`${X(t)} is more than the Standard budget (≈${s??`?`}) holds; only Expansive (≈${c??`?`}) takes it all. Switch to Expansive, or narrow the folders to the part you are changing.`;case`split`:return`${X(t)} is more than any single context on this model holds${c?`, even Expansive (≈${c})`:``}. Split the work: fan it out across several chats, each scoped to one folder or subsystem, or narrow this chat to the part you are changing.`}}function le(e){let n=e?` for ${B[e]}`:``;return`Estimated from the size of tracked text files (bytes ÷ 4), plus an estimated ~${P(t(e))} of fixed prompt${n} that every chat starts with. An agent rarely reads everything, so this is a ceiling, not a forecast.`}function X(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function Z(e,t){let n=o(t,e);return{tokens:Math.floor(n.contextTokens),exact:n.exact,window:n.contextWindow,autoCompactAt:n.autoCompactAt,source:n.source,mode:n.mode,hasModes:i(n.option)}}function Q(t){return t.cacheReadTokens<=0&&t.cacheCreationTokens<=0?null:e(t)}function $(e){return e===null||!Number.isFinite(e)?`—`:`${Math.round(e*100)}%`}function ue(e){let t=new Map,n=0,r=null,i=(e,n,r)=>{if(!Number.isFinite(n)||n<0)return;let i=t.get(e)??{exact:null,bound:null};r?i.exact=Math.max(i.exact??0,n):i.bound=Math.max(i.bound??0,n),t.set(e,i)};for(let t of e)switch(t.type){case`usage`:r=t.usage,i(t.turnId,t.usage.contextTokens,t.usage.contextTokensExact!==!1);break;case`context`:t.turnId!==null&&i(t.turnId,t.contextTokens,t.exact);break;case`compaction`:n+=1}let a=0,o=null,s=!0,c=0;for(let e of t.values()){let t=e.exact??e.bound;t!==null&&(e.exact===null&&(s=!1),c+=1,a+=t,o=o===null?t:Math.max(o,t))}return{turns:c,average:c===0?null:Math.round(a/c),peak:o,exact:s,compactions:n,lastTurnCacheHit:r===null?null:Q(r)}}function de(e,n,r,i){if(e.status===`running`||i===null)return null;let a=Date.parse(i);if(!Number.isFinite(a))return null;let o=r-a;return o<36e5||n<t(e.engine)?null:{idleMs:o,tokens:n,local:e.engine===`local`}}function fe(e,t){return e.window!==null&&t.window!==null?e.tokens/e.window>t.tokens/t.window:e.window!==null||t.window===null&&e.tokens>t.tokens}function pe(e,t){let n=new Map;for(let t of e){let e=n.get(t.seatId)??[];e.push(t),n.set(t.seatId,e)}let r=[];for(let[e,i]of n){let n=t.find(t=>t.id===e)??null,a=0,o=0,s=0,c=0,l=0,u=0,d=0,f=null;for(let e of i){a+=e.usage.inputTokens,o+=e.usage.cacheReadTokens,s+=e.usage.cacheCreationTokens,c+=e.usage.outputTokens,l+=e.turnCount,u+=e.compactionCount??0;let n=Z(e,t);if(n.mode===`expansive`&&(d+=1),n.tokens<=0)continue;let r={sessionId:e.id,title:e.title,tokens:n.tokens,window:n.window,exact:n.exact};(f===null||fe(r,f))&&(f=r)}r.push({seatId:e,label:n?.label??e,engine:n?.engine??i[0].engine,retired:n===null,sessions:i.length,turns:l,promptTokens:a+o+s,outputTokens:c,cacheHitRatio:Q({inputTokens:a,cacheReadTokens:o,cacheCreationTokens:s}),compactions:u,expansiveSessions:d,fullest:f})}return r.sort((e,t)=>t.promptTokens-e.promptTokens||e.label.localeCompare(t.label))}export{y as A,F as C,j as D,te as E,C as F,ee as I,S as L,D as M,b as N,O,x as P,h as R,pe as S,ue as T,J as _,L as a,ie as b,ce as c,$ as d,de as f,R as g,se as h,q as i,M as j,P as k,oe as l,W as m,ae as n,G as o,U as p,Y as r,K as s,z as t,le as u,Q as v,Z as w,V as x,I as y};
|
|
2
|
-
//# sourceMappingURL=context-model-
|
|
1
|
+
import{J as e,at as t,et as n,it as r,nt as i,q as a}from"./global-F2K14nNo.js";import{C as o,i as s,m as c,t as l,x as u}from"./verse-model-GWqHIjMG.js";var d={session:null,events:[],lastSeq:0,loaded:!1,loadError:null,stream:`idle`},f=new Map,p=new Set;function m(){for(let e of p)e()}function h(e){return p.add(e),()=>p.delete(e)}function g(e){let t=f.get(e);return t||(t={sessionId:e,...d},f.set(e,t)),t}function _(e,t){let n=g(e);f.set(e,{...n,...t}),m()}var v={sessionId:``,...d};function y(e){return e?g(e):v}function b(e,t,n){let r=k(g(e).events,n);_(e,{session:w(t,r),events:r,lastSeq:r.length?r[r.length-1].seq:0,loaded:!0,loadError:null})}function x(e,t){_(e,{loadError:t,loaded:!0})}function S(e,t){g(e).stream!==t&&_(e,{stream:t})}function C(e,t,n){_(e,{session:w(t,g(e).events,n)})}function w(e,t,n){if(e.status!==`running`)return e;let r=-1,i=n??null;if(!n){for(let e of t)(e.type===`user-message`||e.type===`turn-started`)&&(r=e.seq,i=e.turnId);if(i===null)return e}let a=null,o=null;for(let e of t)e.seq<=r||(e.type===`error`&&e.turnId===i&&(o=e.message),(e.type===`turn-done`||e.type===`cancelled`)&&e.turnId===i&&(a=e));if(!a)return e;let s=a.type===`turn-done`&&!a.ok&&o!==null;return{...e,status:s?`error`:`idle`,lastError:s?o:null,updatedAt:a.at>e.updatedAt?a.at:e.updatedAt}}function ee(e,t){let n=g(e);n.session&&n.session.status!==t&&_(e,{session:{...n.session,status:t}})}function te(e,t){let n=g(e);if(!Number.isFinite(t.seq)||n.events.some(e=>e.seq===t.seq))return!1;let r=k(n.events,[t]),i=n.session;if(i)switch(t.type){case`turn-started`:i={...i,status:`running`,lastError:null,updatedAt:t.at};break;case`usage`:i={...i,usage:ne(i,t.usage),updatedAt:t.at};break;case`context`:i={...i,usage:E(i,t),updatedAt:t.at};break;case`compaction`:i={...i,compactionCount:(i.compactionCount??0)+1,updatedAt:t.at};break;case`turn-done`:i={...i,status:t.ok?`idle`:i.lastError?`error`:`idle`,turnCount:i.turnCount+1,nativeSessionId:t.nativeSessionId??i.nativeSessionId,updatedAt:t.at};break;case`error`:i={...i,status:`error`,lastError:t.message,updatedAt:t.at};break;case`cancelled`:i={...i,status:`idle`,updatedAt:t.at}}return _(e,{events:r,lastSeq:Math.max(n.lastSeq,t.seq),session:i}),!0}function ne(e,t){let n=e.usage,r={...n,inputTokens:n.inputTokens+t.inputTokens,outputTokens:n.outputTokens+t.outputTokens,cacheReadTokens:n.cacheReadTokens+t.cacheReadTokens,cacheCreationTokens:n.cacheCreationTokens+t.cacheCreationTokens,contextTokens:t.contextTokens},i=typeof t.contextWindow==`number`&&t.contextWindow>0?t.contextWindow:null,a=t.contextWindowSource!==void 0||e.engine!==`local`;return i!==null&&a&&(r.contextWindow=i),t.contextWindowSource!==void 0&&(r.contextWindowSource=t.contextWindowSource),t.autoCompactAt!==void 0&&(r.autoCompactAt=t.autoCompactAt),t.contextTokensExact===!1?r.contextTokensExact=!1:t.contextWindowSource!==void 0&&delete r.contextTokensExact,r}var re=new Set([`runtime`,`provider-catalog`,`cli-catalog`,`documented`,`fallback`]);function T(e){return typeof e==`string`&&re.has(e)?e:null}function E(e,t){let n=e.usage,i={...n,contextTokens:Math.max(0,Math.floor(t.contextTokens)),contextTokensExact:t.exact},a=typeof t.contextWindow==`number`&&t.contextWindow>0?t.contextWindow:null,o=T(t.contextWindowSource);return a===null||e.engine===`local`&&o===null?(t.autoCompactAt!==void 0&&t.autoCompactAt!==null&&(i.autoCompactAt=t.autoCompactAt),i):(i.contextWindow=a,i.contextWindowSource=o??`runtime`,t.autoCompactAt===void 0?a!==n.contextWindow&&(i.autoCompactAt=r({engine:e.engine,runtimeWindow:a,budget:n.contextWindow?{contextWindow:n.contextWindow,autoCompactAt:n.autoCompactAt??null}:null})):i.autoCompactAt=t.autoCompactAt,i)}function D(e){let t=null;for(let n of e)(n.type===`usage`||n.type===`turn-done`||n.type===`cancelled`||n.type===`context`&&n.turnId!==null)&&typeof n.at==`string`&&(t===null||n.at>t)&&(t=n.at);return t}function O(e){f.delete(e)&&m()}function k(e,t){if(t.length===0)return e;let n=new Map;for(let t of e)n.set(t.seq,t);for(let e of t)n.has(e.seq)||n.set(e.seq,e);return[...n.values()].sort((e,t)=>e.seq-t.seq)}function A(e,t){let n=Date.parse(e),r=Date.parse(t);return Number.isFinite(n)&&Number.isFinite(r)?Math.max(0,r-n):null}function j(e){let t=[],n=new Map,r=null,i=!1,a=null,o=e=>{r&&=(t.push({kind:`assistant`,key:r.key,turnId:r.turnId,at:r.at,text:r.text,streaming:e}),null)};for(let s of e)switch(s.type){case`user-message`:o(!1),t.push({kind:`user`,key:`u-${s.seq}`,turnId:s.turnId,at:s.at,text:s.text});break;case`turn-started`:i=!0;break;case`text-delta`:r&&r.turnId!==s.turnId&&o(!1),r||={turnId:s.turnId,at:s.at,text:``,key:`d-${s.seq}`},r.text+=s.text;break;case`assistant-message`:r=null,t.push({kind:`assistant`,key:`a-${s.seq}`,turnId:s.turnId,at:s.at,text:s.text,streaming:!1});break;case`thinking`:o(!1),t.push({kind:`thinking`,key:`t-${s.seq}`,turnId:s.turnId,at:s.at,text:s.text});break;case`tool-use`:o(!1),n.set(s.toolUseId,t.length),t.push({kind:`tool`,key:`tu-${s.seq}`,turnId:s.turnId,at:s.at,toolUseId:s.toolUseId,name:s.name,input:s.input,result:null,durationMs:null});break;case`tool-result`:{let e=n.get(s.toolUseId),r=e===void 0?void 0:t[e];r&&r.kind===`tool`?t[e]={...r,result:{output:s.output,isError:s.isError},durationMs:A(r.at,s.at)}:t.push({kind:`tool`,key:`tr-${s.seq}`,turnId:s.turnId,at:s.at,toolUseId:s.toolUseId,name:`tool`,input:null,result:{output:s.output,isError:s.isError},durationMs:null});break}case`usage`:a=s.usage;break;case`compaction`:t.push({kind:`compaction`,key:`k-${s.seq}`,turnId:s.turnId,at:s.at,trigger:s.trigger,preTokens:s.preTokens,postTokens:s.postTokens,durationMs:s.durationMs});break;case`error`:o(!1),t.push({kind:`error`,key:`e-${s.seq}`,turnId:s.turnId,at:s.at,message:s.message});break;case`cancelled`:o(!1),i=!1,t.push({kind:`cancelled`,key:`c-${s.seq}`,turnId:s.turnId,at:s.at});break;case`turn-done`:o(!1),i=!1,t.push({kind:`turn-done`,key:`td-${s.seq}`,turnId:s.turnId,at:s.at,ok:s.ok,durationMs:s.durationMs})}return o(i),{items:t,live:i,usage:a}}function M(e){let t=[],n=[],r=()=>{n.length!==0&&(n.length===1?t.push(n[0]):t.push(N(n)),n=[])};for(let i of e){if((i.kind===`tool`||i.kind===`thinking`)&&(n.length===0||n[0].turnId===i.turnId)){n.push(i);continue}r(),i.kind===`tool`||i.kind===`thinking`?n.push(i):t.push(i)}return r(),t}function N(e){let t=new Map,n=0,r=!1;for(let i of e)i.kind===`tool`&&(t.set(i.name,(t.get(i.name)??0)+1),i.result===null?r=!0:i.result.isError&&(n+=1));let i=[...t.values()].reduce((e,t)=>e+t,0),a=[...t.entries()].map(([e,t])=>t>1?`${e} ×${t}`:e).join(`, `),o=A(e[0].at,e[e.length-1].at);return{kind:`toolGroup`,key:`g-${e[0].key}`,turnId:e[0].turnId,at:e[0].at,items:e,toolCount:i,summary:a,errorCount:n,pending:r,spanMs:o}}function P(e){return e==null||!Number.isFinite(e)?`—`:Math.round(e)<1e3?String(Math.round(e)):Math.round(e/1e3)<1e3?`${Math.round(e/1e3)}k`:`${(e/1e6).toFixed(1).replace(/\.0$/,``)}M`}function F(e,t){return e?c([e],{seatId:e.id,model:t}):null}function I(e,t){return t!==`standard`&&a(e,t)!==null?t:`standard`}function L(e,t){return a(e,I(e,t))}function R(e,t){let n=u(e);if(n!==null)return n;let r=t.unavailableReason;return typeof r==`string`&&r.trim().length>0?r.trim():null}var z={standard:`Standard`,expansive:`Expansive`},B={claude:`Claude Code`,codex:`Codex CLI`,grok:`Grok CLI`,local:`Claude Code`};function ie(e){let t=typeof e.cliVersion==`string`?e.cliVersion.trim():``;return t.length>0?`${B[e.engine]} ${t}`:null}function V(e){return(e.notes??[]).filter(e=>typeof e==`string`&&e.trim().length>0)}function H(e){return e===`fallback`}function U(e,t=`standard`){let n=I(e,t),r=a(e,n);return r?`${`${P(r.contextWindow)} ctx${H(e.windowSource)?` (est.)`:``}`}${r.autoCompactAt===null?``:` · compacts ≈${P(r.autoCompactAt)}`}${n===`expansive`?` (expansive)`:``}`:`window unknown`}function W(e){let t=a(e,`standard`),n=i(e)?a(e,`expansive`):null,r=[];if(!t)r.push(`Context window unknown for this model.`);else{let e=t.autoCompactAt===null?``:`; compacts at about ${P(t.autoCompactAt)}${n?` in Standard`:``}`;r.push(`${P(t.contextWindow)}-token window${e}.`)}return n&&r.push(`Expansive runs to about ${P(n.autoCompactAt??n.contextWindow)} before compacting.`),e.windowSource&&r.push(`Window ${s[e.windowSource]}.`),r.join(` `)}function G(e){return e===`codex`?l:null}function K(e){let t=a(e,`standard`),n=a(e,`expansive`),r=t?t.autoCompactAt??t.contextWindow:null,i=n?n.autoCompactAt??n.contextWindow:null;return r===null||i===null||r<=0?null:`A turn at ${P(i)} re-sends ${(i/r).toFixed(1)}× the tokens of one at ${P(r)}.`}function q(e,t,n){let r=a(t,`standard`),i=a(t,`expansive`),o=r?r.autoCompactAt??r.contextWindow:null,s=i?i.autoCompactAt??i.contextWindow:null;if(n===`standard`||s===null)return o===null?`The CLI compacts at its own default point for this model.`:e===`claude`?`Compacts at about ${P(o)}. Every turn re-sends the whole context, so holding it under this point keeps each turn cheaper and recall sharper.`:`Compacts at about ${P(o)} — the CLI's own default budget for this model.`;let c=K(t),l=G(e);return`Runs to about ${P(s)} before compacting — for tightly coupled, cross-cutting work that needs everything in view at once. Each turn re-sends everything held, so a long expansive chat uses noticeably more of your plan per turn.${c?` ${c}`:``}${l?` ${l}`:``}`}function J(e,t){return a(t,`standard`)?e===`grok`||e===`local`?`One budget: this CLI compacts at its own fixed point, and Verse cannot raise it per chat.`:`One budget: this model has no larger window to expand into.`:`This model’s window is unknown, so Verse cannot offer a larger budget for it.`}var Y={fits:`code fits`,tight:`code fits, tight`,expansive:`code needs expansive`,split:`code too big — split`},ae={fits:`Fits`,tight:`Tight fit`,expansive:`Needs expansive`,split:`Split the work`};function oe(e){return e.roots.some(e=>e.truncated)}function se(e,r,i,o){if(typeof e!=`number`||!Number.isFinite(e)||e<0)return null;let s=t(o);if(I(r,i)===`expansive`&&r){let t=a(r,`expansive`);return n(e,{...r,contextWindow:t.contextWindow,autoCompactAt:t.autoCompactAt,expansive:null},s)}return n(e,r,s)}function ce(e){let t=`${e.floor?`at least `:``}~${P(e.tokens)} tokens of tracked code`,n=I(e.option,e.mode)===`expansive`,r=a(e.option,`standard`),o=a(e.option,`expansive`),s=r?P(r.autoCompactAt??r.contextWindow):null,c=o?P(o.autoCompactAt??o.contextWindow):null,l=n?c:s,u=n?`Expansive budget`:`budget`;switch(e.verdict){case`fits`:return`All ${t} fits well inside this model's ${u}${l?` (compacts ≈${l})`:``}, with room left for the conversation.`;case`tight`:{let r=!n&&c!==null&&i(e.option)?` Expansive (≈${c}) would hold it with room to spare.`:``;return`${X(t)} fits under the ≈${l??`?`} compaction point${n?` of the Expansive budget`:``}, with little room for the conversation — expect it to compact if the agent reads widely.${r}`}case`expansive`:return`${X(t)} is more than the Standard budget (≈${s??`?`}) holds; only Expansive (≈${c??`?`}) takes it all. Switch to Expansive, or narrow the folders to the part you are changing.`;case`split`:return`${X(t)} is more than any single context on this model holds${c?`, even Expansive (≈${c})`:``}. Split the work: fan it out across several chats, each scoped to one folder or subsystem, or narrow this chat to the part you are changing.`}}function le(e){let n=e?` for ${B[e]}`:``;return`Estimated from the size of tracked text files (bytes ÷ 4), plus an estimated ~${P(t(e))} of fixed prompt${n} that every chat starts with. An agent rarely reads everything, so this is a ceiling, not a forecast.`}function X(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function Z(e,t){let n=o(t,e);return{tokens:Math.floor(n.contextTokens),exact:n.exact,window:n.contextWindow,autoCompactAt:n.autoCompactAt,source:n.source,mode:n.mode,hasModes:i(n.option)}}function Q(t){return t.cacheReadTokens<=0&&t.cacheCreationTokens<=0?null:e(t)}function $(e){return e===null||!Number.isFinite(e)?`—`:`${Math.round(e*100)}%`}function ue(e){let t=new Map,n=0,r=null,i=(e,n,r)=>{if(!Number.isFinite(n)||n<0)return;let i=t.get(e)??{exact:null,bound:null};r?i.exact=Math.max(i.exact??0,n):i.bound=Math.max(i.bound??0,n),t.set(e,i)};for(let t of e)switch(t.type){case`usage`:r=t.usage,i(t.turnId,t.usage.contextTokens,t.usage.contextTokensExact!==!1);break;case`context`:t.turnId!==null&&i(t.turnId,t.contextTokens,t.exact);break;case`compaction`:n+=1}let a=0,o=null,s=!0,c=0;for(let e of t.values()){let t=e.exact??e.bound;t!==null&&(e.exact===null&&(s=!1),c+=1,a+=t,o=o===null?t:Math.max(o,t))}return{turns:c,average:c===0?null:Math.round(a/c),peak:o,exact:s,compactions:n,lastTurnCacheHit:r===null?null:Q(r)}}function de(e,n,r,i){if(e.status===`running`||i===null)return null;let a=Date.parse(i);if(!Number.isFinite(a))return null;let o=r-a;return o<36e5||n<t(e.engine)?null:{idleMs:o,tokens:n,local:e.engine===`local`}}function fe(e,t){return e.window!==null&&t.window!==null?e.tokens/e.window>t.tokens/t.window:e.window!==null||t.window===null&&e.tokens>t.tokens}function pe(e,t){let n=new Map;for(let t of e){let e=n.get(t.seatId)??[];e.push(t),n.set(t.seatId,e)}let r=[];for(let[e,i]of n){let n=t.find(t=>t.id===e)??null,a=0,o=0,s=0,c=0,l=0,u=0,d=0,f=null;for(let e of i){a+=e.usage.inputTokens,o+=e.usage.cacheReadTokens,s+=e.usage.cacheCreationTokens,c+=e.usage.outputTokens,l+=e.turnCount,u+=e.compactionCount??0;let n=Z(e,t);if(n.mode===`expansive`&&(d+=1),n.tokens<=0)continue;let r={sessionId:e.id,title:e.title,tokens:n.tokens,window:n.window,exact:n.exact};(f===null||fe(r,f))&&(f=r)}r.push({seatId:e,label:n?.label??e,engine:n?.engine??i[0].engine,retired:n===null,sessions:i.length,turns:l,promptTokens:a+o+s,outputTokens:c,cacheHitRatio:Q({inputTokens:a,cacheReadTokens:o,cacheCreationTokens:s}),compactions:u,expansiveSessions:d,fullest:f})}return r.sort((e,t)=>t.promptTokens-e.promptTokens||e.label.localeCompare(t.label))}export{y as A,F as C,j as D,te as E,C as F,ee as I,S as L,D as M,b as N,O,x as P,h as R,pe as S,ue as T,J as _,L as a,ie as b,ce as c,$ as d,de as f,R as g,se as h,q as i,M as j,P as k,oe as l,W as m,ae as n,G as o,U as p,Y as r,K as s,z as t,le as u,Q as v,Z as w,V as x,I as y};
|
|
2
|
+
//# sourceMappingURL=context-model-DTvb2uZy.js.map
|