semiotic 3.8.3 → 3.8.4
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/CLAUDE.md +9 -9
- package/README.md +40 -39
- package/ai/examples.md +1 -1
- package/ai/schema.json +2726 -300
- package/ai/surface-manifest.json +1 -1
- package/ai/system-prompt.md +1 -1
- package/dist/chunk-chunk-2JGJ5GUG.module.min.js +0 -1
- package/dist/chunk-chunk-3ILKBVVQ.module.min.js +1 -0
- package/dist/{chunk-chunk-XQYVEKEJ.module.min.js → chunk-chunk-6TPGFL7M.module.min.js} +1 -1
- package/dist/{chunk-chunk-VVCA3DB7.module.min.js → chunk-chunk-7ALTGHK6.module.min.js} +1 -1
- package/dist/chunk-chunk-7KZJUTKP.module.min.js +2 -0
- package/dist/chunk-chunk-7RYBCTK5.module.min.js +1 -0
- package/dist/chunk-chunk-ACLDBMRH.module.min.js +2 -0
- package/dist/{chunk-chunk-AZJUDQRM.module.min.js → chunk-chunk-AQPQN2HH.module.min.js} +1 -1
- package/dist/chunk-chunk-ASKSE5F5.module.min.js +1 -0
- package/dist/chunk-chunk-AVBI6GDT.module.min.js +1 -0
- package/dist/chunk-chunk-B3DRZPBK.module.min.js +2 -0
- package/dist/chunk-chunk-BFHUYEOS.module.min.js +2 -0
- package/dist/chunk-chunk-C4YA6TDR.module.min.js +1 -0
- package/dist/chunk-chunk-C57LR3YG.module.min.js +1 -0
- package/dist/chunk-chunk-F5V4UIE6.module.min.js +2 -0
- package/dist/chunk-chunk-F7WFPD4O.module.min.js +2 -0
- package/dist/{chunk-chunk-SANERMIZ.module.min.js → chunk-chunk-FBGHXL72.module.min.js} +1 -1
- package/dist/chunk-chunk-FP44FHFO.module.min.js +2 -0
- package/dist/chunk-chunk-HKXUAEPJ.module.min.js +2 -0
- package/dist/chunk-chunk-ICEXPNDC.module.min.js +2 -0
- package/dist/chunk-chunk-IY7RYD4S.module.min.js +1 -0
- package/dist/{chunk-chunk-7FW6EGLP.module.min.js → chunk-chunk-JDXT6ORT.module.min.js} +1 -1
- package/dist/chunk-chunk-JMVEIZXP.module.min.js +1 -0
- package/dist/chunk-chunk-KHCOJMGK.module.min.js +1 -0
- package/dist/{chunk-chunk-OQTLSTGI.module.min.js → chunk-chunk-KQ546MKE.module.min.js} +1 -1
- package/dist/chunk-chunk-LQBSXO7K.module.min.js +2 -0
- package/dist/chunk-chunk-LRIFN2HK.module.min.js +1 -0
- package/dist/chunk-chunk-MFHF4J2Z.module.min.js +1 -0
- package/dist/{chunk-chunk-JNCHKRIR.module.min.js → chunk-chunk-N6VKKF3A.module.min.js} +1 -1
- package/dist/chunk-chunk-NEVE562N.module.min.js +1 -0
- package/dist/chunk-chunk-NKZ75IM5.module.min.js +2 -0
- package/dist/chunk-chunk-PLIDPQNG.module.min.js +2 -0
- package/dist/{chunk-chunk-FYY2ACNJ.module.min.js → chunk-chunk-PRDGLMJT.module.min.js} +1 -1
- package/dist/chunk-chunk-QGZGZI4X.module.min.js +1 -0
- package/dist/chunk-chunk-RP7WTID5.module.min.js +1 -0
- package/dist/chunk-chunk-S7KLNUO6.module.min.js +1 -0
- package/dist/chunk-chunk-SR4ZXOWR.module.min.js +2 -0
- package/dist/chunk-chunk-ZOAQDIJO.module.min.js +1 -0
- package/dist/chunk-minimapBrushOverlay-JU57U7NM.module.min.js +2 -0
- package/dist/chunk-scatterplotMatrixBrushOverlay-SDIZSN66.module.min.js +2 -0
- package/dist/chunk-statisticalOverlays-QGDLRUHX.module.min.js +1 -0
- package/dist/chunk-statisticalOverlays-T77OKLDY.module.min.js +1 -0
- package/dist/components/ChartContainer.d.ts +2 -2
- package/dist/components/ai/chartCapabilityTypes.d.ts +5 -0
- package/dist/components/charts/geo/ChoroplethMap.d.ts +2 -0
- package/dist/components/charts/geo/DistanceCartogram.d.ts +7 -3
- package/dist/components/charts/geo/FlowMap.d.ts +4 -0
- package/dist/components/charts/geo/ProportionalSymbolMap.d.ts +3 -1
- package/dist/components/charts/physics/CollisionSwarmChart.d.ts +6 -1
- package/dist/components/charts/physics/GaltonBoardChart.d.ts +6 -1
- package/dist/components/charts/physics/gauntletChartProps.d.ts +7 -1
- package/dist/components/charts/physics/gauntletChrome.d.ts +2 -1
- package/dist/components/charts/physics/gauntletPhysics.d.ts +19 -4
- package/dist/components/charts/physics/gauntletRuntime.d.ts +3 -0
- package/dist/components/charts/physics/physicsHocUtils.d.ts +12 -0
- package/dist/components/charts/shared/chartMode.d.ts +8 -0
- package/dist/components/charts/shared/chartSpecCore.d.ts +2 -2
- package/dist/components/charts/shared/hatchPattern.d.ts +8 -3
- package/dist/components/charts/shared/lineSeriesSsr.d.ts +55 -0
- package/dist/components/charts/shared/types.d.ts +2 -2
- package/dist/components/charts/shared/validateProps.d.ts +1 -1
- package/dist/components/charts/xy/AreaChart.d.ts +10 -0
- package/dist/components/charts/xy/minimapBrushOverlay.d.ts +17 -0
- package/dist/components/charts/xy/minimapBrushOverlayLazy.d.ts +4 -0
- package/dist/components/charts/xy/scatterplotMatrixBrushOverlay.d.ts +8 -0
- package/dist/components/charts/xy/scatterplotMatrixBrushOverlayLazy.d.ts +3 -0
- package/dist/components/realtime/types.d.ts +5 -0
- package/dist/components/recipes/gridObservatory.d.ts +176 -0
- package/dist/components/recipes/recipeChrome.d.ts +24 -0
- package/dist/components/recipes/sequenceLayout.d.ts +139 -0
- package/dist/components/semiotic-recipes-core.d.ts +6 -2
- package/dist/components/server/staticAnnotations.d.ts +3 -1
- package/dist/components/stream/SceneToSVG.d.ts +6 -6
- package/dist/components/stream/SceneToSVGOrdinal.d.ts +12 -0
- package/dist/components/stream/networkFramePaint.d.ts +2 -0
- package/dist/components/stream/physics/PhysicsPipelineStore.d.ts +18 -2
- package/dist/components/stream/physics/physicsBodyCanvas.d.ts +7 -0
- package/dist/components/stream/physics/physicsPipelineEviction.d.ts +15 -0
- package/dist/components/stream/physics/physicsPipelineObservations.d.ts +1 -1
- package/dist/components/stream/physics/physicsPipelineQuiescence.d.ts +20 -0
- package/dist/components/stream/sceneToSVGShared.d.ts +30 -1
- package/dist/components/stream/types.d.ts +4 -0
- package/dist/components/stream/useHydration.d.ts +7 -1
- package/dist/components/stream/xySceneBuilders/candlestickScene.d.ts +1 -1
- package/dist/forceLayoutWorker.js +1 -1
- package/dist/geo.min.js +1 -1
- package/dist/geo.module.min.js +1 -1
- package/dist/network.min.js +1 -1
- package/dist/network.module.min.js +1 -1
- package/dist/ordinal.min.js +1 -1
- package/dist/ordinal.module.min.js +1 -1
- package/dist/physics.min.js +1 -1
- package/dist/physics.module.min.js +1 -1
- package/dist/physicsWorker.js +1 -1
- package/dist/realtime.min.js +1 -1
- package/dist/realtime.module.min.js +1 -1
- package/dist/rough.min.js +1 -1
- package/dist/rough.module.min.js +1 -1
- package/dist/semiotic-ai-core.min.js +1 -1
- package/dist/semiotic-ai-core.module.min.js +1 -1
- package/dist/semiotic-ai.min.js +1 -1
- package/dist/semiotic-ai.module.min.js +1 -1
- package/dist/semiotic-experimental.min.js +1 -1
- package/dist/semiotic-experimental.module.min.js +1 -1
- package/dist/semiotic-realtime-core.min.js +1 -1
- package/dist/semiotic-realtime-core.module.min.js +1 -1
- package/dist/semiotic-recipes-core.d.ts +6 -2
- package/dist/semiotic-recipes-core.min.js +1 -1
- package/dist/semiotic-recipes-core.module.min.js +1 -1
- package/dist/semiotic-recipes.min.js +1 -1
- package/dist/semiotic-recipes.module.min.js +1 -1
- package/dist/semiotic-server-edge.min.js +1 -1
- package/dist/semiotic-server-edge.module.min.js +1 -1
- package/dist/semiotic-server-node.min.js +1 -1
- package/dist/semiotic-server-node.module.min.js +1 -1
- package/dist/semiotic-utils-core.min.js +1 -1
- package/dist/semiotic-utils-core.module.min.js +1 -1
- package/dist/semiotic-utils.min.js +1 -1
- package/dist/semiotic-utils.module.min.js +1 -1
- package/dist/semiotic-value.module.min.js +1 -1
- package/dist/semiotic.min.js +1 -1
- package/dist/semiotic.module.min.js +1 -1
- package/dist/server.min.js +1 -1
- package/dist/server.module.min.js +1 -1
- package/dist/xy.min.js +1 -1
- package/dist/xy.module.min.js +1 -1
- package/package.json +3 -2
- package/dist/chunk-chunk-255KDHW5.module.min.js +0 -1
- package/dist/chunk-chunk-2CCFBTQC.module.min.js +0 -2
- package/dist/chunk-chunk-2RXP3FS3.module.min.js +0 -1
- package/dist/chunk-chunk-2WVCH4PL.module.min.js +0 -1
- package/dist/chunk-chunk-4TMZXLCR.module.min.js +0 -1
- package/dist/chunk-chunk-5APBQXZA.module.min.js +0 -1
- package/dist/chunk-chunk-6HSGDMTA.module.min.js +0 -2
- package/dist/chunk-chunk-7OEOSCBP.module.min.js +0 -1
- package/dist/chunk-chunk-A63CTACR.module.min.js +0 -2
- package/dist/chunk-chunk-B6V35LMY.module.min.js +0 -2
- package/dist/chunk-chunk-BOSVL645.module.min.js +0 -2
- package/dist/chunk-chunk-CP3EN6KZ.module.min.js +0 -1
- package/dist/chunk-chunk-F25UA5HT.module.min.js +0 -1
- package/dist/chunk-chunk-FRIO6MCV.module.min.js +0 -1
- package/dist/chunk-chunk-GWSWSPXN.module.min.js +0 -1
- package/dist/chunk-chunk-I6C3KR5H.module.min.js +0 -2
- package/dist/chunk-chunk-IP2UE74X.module.min.js +0 -1
- package/dist/chunk-chunk-J3ELI22J.module.min.js +0 -1
- package/dist/chunk-chunk-J5RL6GXU.module.min.js +0 -2
- package/dist/chunk-chunk-L3H6DQCR.module.min.js +0 -2
- package/dist/chunk-chunk-M337NY6L.module.min.js +0 -1
- package/dist/chunk-chunk-M7VYYHCE.module.min.js +0 -2
- package/dist/chunk-chunk-MC35ILYP.module.min.js +0 -2
- package/dist/chunk-chunk-N72SWNBV.module.min.js +0 -1
- package/dist/chunk-chunk-OBQRFTIL.module.min.js +0 -2
- package/dist/chunk-chunk-QRIBHZYW.module.min.js +0 -1
- package/dist/chunk-chunk-SA3D43RA.module.min.js +0 -2
- package/dist/chunk-chunk-UHSZEB74.module.min.js +0 -1
- package/dist/chunk-chunk-Y6AXCRVO.module.min.js +0 -1
- package/dist/chunk-chunk-ZCNBUZPL.module.min.js +0 -2
package/dist/xy.module.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{DEFAULT_HIT_RADIUS as m,hitTargetPoint as n,hitTargetRect as u}from"./chunk-chunk-J3XWETBJ.module.min.js";import{AreaChart as o,BubbleChart as c,CandlestickChart as h,ConnectedScatterplot as i,DifferenceChart as k,Heatmap as r,LineChart as e,MinimapChart as t,MultiAxisLineChart as p,QuadrantChart as s,Scatterplot as d,ScatterplotMatrix as j,StackedAreaChart as l,XYCustomChart as
|
|
2
|
+
import{DEFAULT_HIT_RADIUS as m,hitTargetPoint as n,hitTargetRect as u}from"./chunk-chunk-J3XWETBJ.module.min.js";import{AreaChart as o,BubbleChart as c,CandlestickChart as h,ConnectedScatterplot as i,DifferenceChart as k,Heatmap as r,LineChart as e,MinimapChart as t,MultiAxisLineChart as p,QuadrantChart as s,Scatterplot as d,ScatterplotMatrix as j,StackedAreaChart as l,XYCustomChart as E}from"./chunk-chunk-7KZJUTKP.module.min.js";import"./chunk-chunk-YCQYG6J5.module.min.js";import"./chunk-chunk-JCG72SGW.module.min.js";import"./chunk-chunk-PLIDPQNG.module.min.js";import{StreamXYFrame_default as P}from"./chunk-chunk-B3DRZPBK.module.min.js";import"./chunk-chunk-6TPGFL7M.module.min.js";import"./chunk-chunk-AQPQN2HH.module.min.js";import"./chunk-chunk-F5V4UIE6.module.min.js";import"./chunk-chunk-KQ546MKE.module.min.js";import"./chunk-chunk-F7WFPD4O.module.min.js";import{useCustomLayoutSelection as f}from"./chunk-chunk-5UKL5W76.module.min.js";import{composeStyleRules as F,makeRuleValueResolver as J,makeXYRuleContext as K,matchesThreshold as B,resolveStyleRules as G,ruleMatches as H}from"./chunk-chunk-EMO5NUGE.module.min.js";import{hatchFillId as O,hatchPatternDef as U,isHatchFill as W,resolveResponsiveRules as C,resolveSvgFill as M,responsiveRuleMatches as Q}from"./chunk-chunk-BFHUYEOS.module.min.js";import"./chunk-chunk-JJ2OOIET.module.min.js";import"./chunk-chunk-WCX6U47H.module.min.js";import{glyphExtent as T,glyphPlacement as Y}from"./chunk-chunk-KTWEBFMX.module.min.js";import"./chunk-chunk-ACLDBMRH.module.min.js";import"./chunk-chunk-YHNZCPOZ.module.min.js";export{o as AreaChart,c as BubbleChart,h as CandlestickChart,i as ConnectedScatterplot,m as DEFAULT_HIT_RADIUS,k as DifferenceChart,r as Heatmap,e as LineChart,t as MinimapChart,p as MultiAxisLineChart,s as QuadrantChart,d as Scatterplot,j as ScatterplotMatrix,l as StackedAreaChart,P as StreamXYFrame,E as XYCustomChart,F as composeStyleRules,T as glyphExtent,Y as glyphPlacement,O as hatchFillId,U as hatchPatternDef,n as hitTargetPoint,u as hitTargetRect,W as isHatchFill,J as makeRuleValueResolver,K as makeXYRuleContext,B as matchesThreshold,C as resolveResponsiveRules,G as resolveStyleRules,M as resolveSvgFill,Q as responsiveRuleMatches,H as ruleMatches,f as useCustomLayoutSelection};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semiotic",
|
|
3
|
-
"version": "3.8.
|
|
3
|
+
"version": "3.8.4",
|
|
4
4
|
"mcpName": "io.github.nteract/semiotic",
|
|
5
5
|
"description": "Verified generative visualization for React and agents, with deterministic chart validation, repair, rendering evidence, and MCP.",
|
|
6
6
|
"main": "dist/semiotic.min.js",
|
|
@@ -280,7 +280,8 @@
|
|
|
280
280
|
"typescript:tests": "node scripts/check-test-types.mjs",
|
|
281
281
|
"typescript:tests:raw": "tsc -p tsconfig.tests.json --noEmit --pretty false",
|
|
282
282
|
"typescript:mcp": "tsc -p tsconfig.mcp.json --noEmit",
|
|
283
|
-
"size": "size-limit && node scripts/check-multi-import-size.mjs",
|
|
283
|
+
"size": "size-limit && node scripts/check-entry-graph-size.mjs && node scripts/check-multi-import-size.mjs",
|
|
284
|
+
"check:entry-graph-size": "node scripts/check-entry-graph-size.mjs",
|
|
284
285
|
"check:multi-import-size": "node scripts/check-multi-import-size.mjs",
|
|
285
286
|
"check:pack": "node scripts/smoke-pack.mjs",
|
|
286
287
|
"check:api-surface": "node scripts/check-api-surface.mjs",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useObservationSelector as e}from"./chunk-chunk-2WVCH4PL.module.min.js";function t(e,t){return"touch"===t?Math.max(e,24):e}function n(e){return Array.isArray(e)?e[0]:e}function o(e,t,o,i){return{data:n(e),x:t,y:o,__semioticHoverData:!0,...i}}var i=["name","label","title"],a=["type","kind","category","group","class","status","role","shape"],r=["value","amount","total","count","weight","score"],l=new Set(["x","y","z","x0","x1","y0","y1","r","cx","cy","radius","layer","row","rowindex","col","column","depth","index","order","sankeywidth","coincidentpoints","sourcelinks","targetlinks","parent","children","fx","fy","vx","vy"]);function s(e,t){for(const n of t){const t=e.find(e=>e.lower===n);if(t)return t}}function c(e,t={}){if(!e||"object"!=typeof e)return{entries:[]};const n=t.maxEntries??6,o=!1!==t.skipPositional,c=[];for(const[t,n]of Object.entries(e)){if(t.startsWith("_"))continue;if("data"===t)continue;if(o&&l.has(t.toLowerCase()))continue;if(null==n)continue;const e=typeof n;("string"===e||"number"===e||"boolean"===e||n instanceof Date)&&c.push({key:t,lower:t.toLowerCase(),value:n})}if(0===c.length)return{entries:[]};let u=c.findIndex(e=>i.includes(e.lower));const d=u>=0;0>u&&(u=c.findIndex(e=>"id"===e.lower)),0>u&&(u=c.findIndex(e=>"string"==typeof e.value));const f=0>u?void 0:c[u];let p=c.filter((e,t)=>t!==u);d&&(p=p.filter(e=>"id"!==e.lower));const y=s(p,a),m=s(p,r),b=new Set(a),h=new Set(r),v=[];y&&v.push({key:y.key,value:y.value}),m&&v.push({key:m.key,value:m.value});for(const e of p){if(v.length>=n)break;e!==y&&e!==m&&(b.has(e.lower)||h.has(e.lower)||v.push({key:e.key,value:e.value}))}return{titleKey:f?.key,title:f?.value,entries:v}}import{jsx as u,jsxs as d}from"react/jsx-runtime";var f={background:"var(--semiotic-tooltip-bg, rgba(0, 0, 0, 0.85))",color:"var(--semiotic-tooltip-text, white)",padding:"8px 12px",borderRadius:"var(--semiotic-tooltip-radius, 6px)",fontSize:"var(--semiotic-tooltip-font-size, 14px)",fontFamily:"var(--semiotic-font-family, inherit)",lineHeight:"1.5",boxShadow:"var(--semiotic-tooltip-shadow, 0 2px 8px rgba(0, 0, 0, 0.15))",pointerEvents:"none",maxWidth:"300px",wordWrap:"break-word"};function p(e,t){return"function"==typeof t?t(e):e[t]}function y(e,t){if(t)return t(e);if(null==e)return"";if("number"==typeof e){if(!Number.isFinite(e))return e+"";const t=Number.isInteger(e)?e:parseFloat(e.toPrecision(6));return Math.abs(t)>9999?t.toLocaleString():t+""}return e instanceof Date?e.toLocaleDateString():"object"==typeof e&&null!==e?void 0!==e.id?e.id+"":void 0!==e.name?e.name+"":JSON.stringify(e):e+""}function m(e={}){const{fields:t,title:n,format:o,style:i={},className:a=""}=e;return e=>{if(!e||"object"!=typeof e)return null;let r;const l=[];if(n){const t=p(e,n);r=y(t,o)}if(t&&t.length>0)t.forEach(t=>{let n,i,a;"string"==typeof t?(n=t,i=t,a=o):(n=t.label,i=t.accessor||t.key||"",a=t.format||o);const r=p(e,i);l.push({label:n,value:y(r,a)})});else if(!n){const t=["value","y","name","id","label"];for(const n of t)if(void 0!==e[n]){r=y(e[n],o);break}if(!r){const t=Object.keys(e).filter(e=>!e.startsWith("_"));t.length>0&&(r=y(e[t[0]],o))}}const s={...f,...i};return d("div",{className:("semiotic-tooltip "+a).trim(),style:s,children:[r&&u("div",{style:{fontWeight:l.length>0?"bold":"normal"},children:r}),l.map((e,t)=>d("div",{style:{marginTop:0===t&&r?"4px":0},children:[e.label&&d("span",{children:[e.label,": "]}),e.value]},t))]})}}function b(){return e=>{const t=e.allSeries;if(!t||0===t.length)return u("div",{className:"semiotic-tooltip",style:f,children:u("div",{children:y(e.data?.value??e.data?.y)})});const n=e.xValue??e.data?.time??e.data?.x;return d("div",{className:"semiotic-tooltip",style:f,children:[null!=n&&u("div",{style:{fontWeight:600,marginBottom:4,fontSize:"0.9em",borderBottom:"1px solid var(--semiotic-border, #eee)",paddingBottom:4},children:y(n)}),t.map((e,t)=>d("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"1px 0"},children:[u("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:e.color,flexShrink:0}}),u("span",{style:{flex:1,fontSize:"0.85em"},children:e.group}),u("span",{style:{fontWeight:500,fontSize:"0.85em"},children:y(e.value)})]},t))]})}}function h(e){if(!0!==e){if("function"==typeof e){const t=e;return e=>{let o=n(!0===e?.__semioticHoverData||e&&void 0!==e.data&&"number"==typeof e.x&&"number"==typeof e.y&&e&&("node"===e.type||"edge"===e.type||void 0!==e.nodeOrEdge||void 0!==e.allSeries||void 0!==e.stats||void 0!==e.__chartType)?e.data??{}:e);if(!o)return null;if(("node"===e?.nodeOrEdge&&"number"==typeof o?.x0&&"number"==typeof o?.x1||"edge"===e?.nodeOrEdge&&"number"==typeof o?.sankeyWidth)&&o.data&&"object"==typeof o.data&&(o=o.data),!o)return null;const i=t(o);return null==i?null:u("div",{className:"semiotic-tooltip",style:f,children:i})}}return!1!==e&&void 0!==e&&("object"==typeof e&&null!==e&&("fields"in e||"title"in e)?m(e):m())}}import*as v from"react";function g(t){const n=e(e=>e.pushObservation),o=v.useCallback(e=>{t.onObservation?.(e),n?.(e)},[t,n]);return v.useMemo(()=>({...t,onObservation:o}),[o,t])}function k(e){const t=e.provenance,n=e.id??e.stableId??t?.stableId;return null==n||""===n?void 0:n+""}function x(e,t={}){const n=k(e);return{"data-semiotic-annotation-widget":"",...n?{"data-semiotic-annotation-id":n}:{},onClickCapture(o){const i=function(e){const t=e.nativeEvent;return"touch"===t.pointerType?"touch":0===t.detail?"keyboard":"pointer"}(o);t.onAnnotationActivate?.({annotation:e,annotationId:n,chartId:t.chartId,inputType:i}),n&&t.onObservation&&t.onObservation({type:"annotation-activate",annotationId:n,inputType:i,timestamp:Date.now(),chartType:t.chartType??"unknown",chartId:t.chartId})}}}function w(e){return e instanceof Element&&null!=e.closest("[data-semiotic-annotation-widget]")}function S(e){const t={};if(null==e||"object"!=typeof e)return t;for(const[n,o]of Object.entries(e))n.startsWith("_")||null!=o&&""!==o&&("number"==typeof o?Number.isFinite(o)&&(t[n]=o):"string"==typeof o?t[n]=o:"boolean"==typeof o?t[n]=o+"":o instanceof Date&&(t[n]=o.toISOString().slice(0,10)));return t}function j(e){return e&&"object"==typeof e?e:{}}function I(e){return j(e.accessibility).tableFields??e.accessibleDatum??e.datum}function O(e){const t=[];if(!Array.isArray(e))return t;const n=e.some(e=>e&&("line"===e.type||"area"===e.type));for(const o of e)if(o&&"object"==typeof o&&null!==o.datum)try{switch(o.type){case"point":if(n)break;t.push({label:"Point",values:S(I(o))});break;case"line":case"area":{const e=I(o),n=Array.isArray(e)?e:[],i="line"===o.type?"Line point":"Area point";for(const e of n)t.push({label:i,values:S(e)});break}case"rect":{const e=I(o),n=null!=e&&"object"==typeof e?e:{},i=n.category??o.group??"",a=n.value??n.__aggregateValue??n.total,r=S(n);null==r.category&&""!==i&&(r.category=i+""),null==r.value&&null!=a&&(r.value="number"==typeof a||"string"==typeof a?a:a+""),t.push({label:"Bar",values:r});break}case"heatcell":{const e=S(I(o));null==e.value&&"number"==typeof o.value&&Number.isFinite(o.value)&&(e.value=o.value),t.push({label:"Cell",values:e});break}case"wedge":{const e=I(o),n=S(e);if(null==n.category){const t=j(e),o=t.category??t.label;null!=o&&(n.category=o+"")}t.push({label:"Wedge",values:n});break}case"circle":t.push({label:"Node",values:S(I(o))});break;case"arc":t.push({label:"Arc",values:S(I(o))});break;case"candlestick":t.push({label:"Candlestick",values:S(I(o))});break;case"geoarea":{const e=j(I(o)),n=S(e);if(null==n.name){const t=j(e.properties).name??e.name;null!=t&&(n.name=t+"")}t.push({label:"Region",values:n});break}}}catch{}return t}export{g as useAnnotationActivationOptions,k as annotationStableId,x as annotationActivationProps,w as isAnnotationActivationTarget,O as extractAllRows,t as getPointerHitRadius,o as buildHoverData,c as smartTooltipEntries,f as defaultTooltipStyle,b as MultiPointTooltip,h as normalizeTooltip};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import{MobileStandardControls as e,auditVisualizationControls as t}from"./chunk-chunk-RCF52Z42.module.min.js";import{resolveAccessor as i,resolveRawAccessor as n}from"./chunk-chunk-AZJUDQRM.module.min.js";import{DataSummaryProvider as r,LinkedCharts as o,annotationStableId as a,bandFromAge as s,resolveResponsiveRules as l,useChartObserver as c,useDataSummaryToggle as d,useLinkedChartsActive as u,useObservationSelector as m,useSelection as p}from"./chunk-chunk-6HSGDMTA.module.min.js";import{getMinMax as h}from"./chunk-chunk-JJ2OOIET.module.min.js";import{ChartErrorBoundary as f}from"./chunk-chunk-ZCNBUZPL.module.min.js";async function g(e,t){const{format:i="png",filename:n="chart",scale:r=2,background:o="white"}=t||{},a=e.querySelector("svg");if(!a)throw Error("No SVG element found in the container");const s=a.cloneNode(!0),l=a.getBoundingClientRect();if(s.getAttribute("width")||s.setAttribute("width",l.width+""),s.getAttribute("height")||s.setAttribute("height",l.height+""),s.getAttribute("xmlns")||s.setAttribute("xmlns","http://www.w3.org/2000/svg"),b(a,s),"svg"===i){const e=(new XMLSerializer).serializeToString(s);y(new Blob([e],{type:"image/svg+xml;charset=utf-8"}),n+".svg")}else{const t=l.width*r,i=l.height*r,a=document.createElement("canvas");a.width=t,a.height=i;const c=a.getContext("2d");c.fillStyle=o,c.fillRect(0,0,t,i),c.scale(r,r);const d=e.querySelector("canvas");d&&c.drawImage(d,0,0,l.width,l.height);const u=(new XMLSerializer).serializeToString(s),m=new Blob([u],{type:"image/svg+xml;charset=utf-8"}),p=URL.createObjectURL(m),h=new Image;h.width=l.width,h.height=l.height,await new Promise((e,t)=>{h.onload=()=>{c.drawImage(h,0,0),a.toBlob(i=>{i?(y(i,n+".png"),e()):t(Error("Failed to create PNG blob"))},"image/png"),URL.revokeObjectURL(p)},h.onerror=()=>{URL.revokeObjectURL(p),t(Error("Failed to load SVG image"))},h.src=p})}}function b(e,t){const i=e.children,n=t.children,r=window.getComputedStyle(e),o=["fill","stroke","stroke-width","stroke-dasharray","opacity","fill-opacity","stroke-opacity","font-family","font-size","font-weight","text-anchor","dominant-baseline"];for(const e of o){const i=r.getPropertyValue(e);i&&"none"!==i&&""!==i&&t.style?.setProperty(e,i)}for(let e=0;Math.min(i.length,n.length)>e;e++)b(i[e],n[e])}function y(e,t){const i=URL.createObjectURL(e),n=document.createElement("a");n.href=i,n.download=t,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}function v(e){return x(e),e}function x(e){if(!e||"object"!=typeof e)throw Error("Chart recipe must be an object.");if("string"!=typeof e.id||""===e.id.trim())throw Error("Chart recipe requires a non-empty id.");if("string"!=typeof e.name||""===e.name.trim())throw Error(`Chart recipe "${e.id}" requires a non-empty name.`);if(!Array.isArray(e.dataRoles)||0===e.dataRoles.length)throw Error(`Chart recipe "${e.id}" requires at least one data role.`);if(!Array.isArray(e.intents)||0===e.intents.length)throw Error(`Chart recipe "${e.id}" requires at least one intent.`);for(const t of e.intents)if("string"!=typeof t&&(!t||"string"!=typeof t.id&&"string"!=typeof t.name))throw Error(`Chart recipe "${e.id}" has an intent without an id or name.`);if(!e.designContract?.whyCustom)throw Error(`Chart recipe "${e.id}" requires designContract.whyCustom.`);if(!e.accessibility||"object"!=typeof e.accessibility)throw Error(`Chart recipe "${e.id}" requires accessibility expectations.`);if(void 0!==e.controls){const i=t({controls:e.controls}).findings.filter(e=>"fail"===e.status);if(i.length>0)throw Error(`Chart recipe "${e.id}" has invalid controls: ${i.map(e=>e.message).join(" ")}`)}if("portable"===e.portability){if(!w(e.layout))throw Error(`Portable chart recipe "${e.id}" must reference a registered layout by id.`);const t=e.layoutConfigSchema??e.portabilityConfig?.schema;if(!t)throw Error(`Portable chart recipe "${e.id}" requires a serializable layout config schema.`);if(!k(t))throw Error(`Portable chart recipe "${e.id}" has a layout config schema that is not JSON-safe.`)}}function w(e){return!!e&&"object"==typeof e&&"string"==typeof e.id}function k(e,t=new Set){if(null===e)return!0;const i=typeof e;if("string"===i||"boolean"===i)return!0;if("number"===i)return Number.isFinite(e);if("object"!==i)return!1;if(t.has(e))return!1;t.add(e);const n=Array.isArray(e)?e.every(e=>k(e,t)):Object.entries(e).every(([,e])=>k(e,t));return t.delete(e),n}function $(e){return"string"==typeof e?e:e.id??e.name}function C(e){return"string"==typeof e?3:"number"==typeof e.score&&Number.isFinite(e.score)?Math.max(0,Math.min(5,e.score>1?e.score:5*e.score)):"primary"===e.strength?5:"secondary"===e.strength?3:"supporting"===e.strength?2:3}function S(e){const t=new Set(e.intents.map($));return t.has("geo")?"geo":t.has("hierarchy")?"hierarchy":t.has("flow")?"flow":t.has("relationship")?"network":t.has("distribution")?"distribution":t.has("correlation")?"relationship":t.has("trend")||t.has("composition-over-time")?"time-series":t.has("compare-categories")||t.has("rank")||t.has("part-to-whole")?"categorical":"custom"}function A(e){const t=Object.values(e.audience?.familiarity??{}),i=t.find(e=>"number"==typeof e);if(void 0!==i)return Math.max(1,Math.min(5,Math.round(i)));const n=t.filter(e=>"string"==typeof e);return n.includes("high")?4:n.includes("medium")?3:n.includes("low")?2:e.reception?.memorableForm?3:2}function N(e,t){return"nodes"===t?e.network?.nodes??[]:"edges"===t?e.network?.edges??[]:"areas"===t?e.geo?.features??[]:"points"===t?e.geo?.points??[]:"lines"===t?e.geo?.flows??[]:e.data}function j(e,t,i){return N(e,t.source).some(e=>null!=e&&Object.prototype.hasOwnProperty.call(e,i))}function I(e,t,i){if(t.field&&j(i,t,t.field))return t.field;if("nodes"===t.source||"edges"===t.source){const e="node-id"===t.role?"id":"edge-source"===t.role?"source":"edge-target"===t.role?"target":void 0;if(e&&j(i,t,e))return e}switch(t.semanticType){case"quantitative":return i.primary.y??i.primary.size??i.primary.x;case"temporal":return i.primary.time??i.primary.x;case"nominal":case"ordinal":return i.primary.category??i.primary.series;case"identifier":{const e=N(i,t.source);return["id","key","name"].find(t=>e.some(e=>null!=e&&Object.prototype.hasOwnProperty.call(e,t)))}case"geographic":return i.hasGeo?t.field:void 0;default:return t.field}}function L(e){const t={},i=[];for(const n of e.intents){const e=$(n);e&&(t[e]=C(n),"string"!=typeof n&&n.rationale&&i.push(n.rationale))}i.push(...(e.reception?.strengths??[]).map(e=>"Reception strength: "+e));const n=e.reception?.risks??[],r=e.designContract.misuse??[],o=[...e.designContract.caveats??[],...e.caveats??[]];return{component:e.id,displayName:e.name,candidateKind:"recipe",family:S(e),renderingFamily:e.frameFamily,importPath:"semiotic/ai",rubric:{familiarity:A(e),accuracy:4,precision:n.some(e=>/precis|comparison/i.test(e))?2:3},fits:t=>function(e,t){for(const i of e.dataRoles)if(!1!==i.required&&!I(0,i,t))return`needs data role "${i.role}" (${i.semanticType})`;const i=e.audit?.maxCategories;return"number"==typeof i&&"number"==typeof t.categoryCount&&t.categoryCount>i?`${t.categoryCount} categories exceeds this recipe's declared maximum of ${i}`:null}(e,t),intentScores:t,caveats:()=>[...n,...r,...o],buildProps:t=>function(e,t){const i={};for(const n of e.dataRoles){const e=I(0,n,t);e&&n.accessor&&(i[n.accessor]=e)}const n={recipeId:e.id,layoutConfig:i};e.frameFamily.startsWith("Network")?(n.nodes=t.network?.nodes??t.data,n.edges=t.network?.edges??[]):e.frameFamily.startsWith("Geo")?(n.areas=t.geo?.features??[],n.points=t.geo?.points??t.data,n.lines=t.geo?.flows??[]):n.data=t.data;const r=e.mobile??("number"==typeof e.accessibility.minimumHitTarget?{minimumHitTarget:e.accessibility.minimumHitTarget}:void 0);return r&&(n.mobileSemantics=r),n}(e,t),mobile:e.mobile??("number"==typeof e.accessibility.minimumHitTarget?{minimumHitTarget:e.accessibility.minimumHitTarget}:void 0),recipe:e,positiveRationale:i,whyCustom:{defaultAlternative:e.designContract.defaultAlternative,reason:e.designContract.whyNotDefault??e.designContract.whyCustom,tradeoff:e.designContract.tradeoff??(n.length>0?n[0]:void 0)}}}var P=Symbol.for("semiotic.chartRecipeRegistry");function R(){const e=globalThis;return e[P]||(e[P]={recipes:new Map,capabilities:new Map,layouts:new Map}),e[P]}function M(e){x(e),R().recipes.set(e.id,e),R().capabilities.set(e.id,L(e))}function B(e){R().recipes.delete(e),R().capabilities.delete(e)}function D(e){return R().recipes.get(e)}function T(){return Array.from(R().recipes.values())}function z(){return Array.from(R().capabilities.values())}function F(){return R().capabilities.size>0}function E(e,t){if(!e)throw Error("Recipe layout requires a non-empty id.");if("function"!=typeof t)throw Error(`Recipe layout "${e}" must be a function.`);R().layouts.set(e,t)}function O(e){R().layouts.delete(e)}function H(e){return R().layouts.get(e)}function W(e){return"string"==typeof e?D(e):e&&"object"==typeof e&&"string"==typeof e.id?e:void 0}var V=["BarChart","StackedBarChart","GroupedBarChart","SwarmPlot","BoxPlot","Histogram","ViolinPlot","RidgelinePlot","DotPlot","PieChart","DonutChart","GaugeChart","FunnelChart","SwimlaneChart","LikertChart","LineChart","AreaChart","DifferenceChart","StackedAreaChart","Scatterplot","BubbleChart","Heatmap","QuadrantChart","MultiAxisLineChart","CandlestickChart","ConnectedScatterplot","ScatterplotMatrix","MinimapChart","ForceDirectedGraph","SankeyDiagram","ProcessSankey","ChordDiagram","TreeDiagram","Treemap","CirclePack","OrbitDiagram","ChoroplethMap","ProportionalSymbolMap","FlowMap","DistanceCartogram","RealtimeLineChart","RealtimeHistogram","TemporalHistogram","RealtimeSwarmChart","RealtimeWaterfallChart","RealtimeHeatmap","GaltonBoardChart","EventDropChart","PhysicsPileChart","CollisionSwarmChart","GauntletChart","ProcessFlowChart","PhysicalFlowChart","BigNumber"],U=new Set(V);function G(e){return U.has(e)}function q(e){return"string"==typeof e?e:e.id??e.name}function J(e){return e.layoutConfig&&"object"==typeof e.layoutConfig?e.layoutConfig:{}}function _(e){return Array.isArray(e.data)?e.data:Array.isArray(e.nodes)?e.nodes:Array.isArray(e.points)?e.points:Array.isArray(e.areas)?e.areas:[]}function Z(e,t,i){return i??W(t.recipe)??W(t.recipeId)??D(e)}function Q(e,t,i=[]){const n=e.accessor?t[e.accessor]:void 0;if("string"==typeof n&&n)return n;if(e.field)return e.field;const r=i.find(e=>e&&"object"==typeof e);if(!r)return;const o=Object.entries(r).filter(([e,t])=>!e.startsWith("_")&&null!=t);return"quantitative"===e.semanticType?o.find(([,e])=>"number"==typeof e)?.[0]:"identifier"===e.semanticType?["id","key","name"].find(e=>e in r):o.find(([,e])=>"string"==typeof e)?.[0]}function X(e,t){return e.dataRoles.find(e=>e.role===t)}function K(e,t){return e.dataRoles.find(e=>t.includes(e.semanticType))}function Y(e,t,i,n,r,o={}){const a={...o};if(t)for(const[e,i]of Object.entries(t))a[e]=i;for(const e of i.dataRoles){const i=Q(e,n,r),o=t&&i?t[i]:i;void 0!==o&&(a[e.role]=o)}return e.replace(/\{([^}]+)\}/g,(e,t)=>{const i=a[t];return null==i?`{${t}}`:i+""})}var ee=new Set(["tooltip","onObservation","xFormat","yFormat","valueFormat","svgAnnotationRules","tooltipContent","onHover","tickFormatTime","tickFormatValue","edgeSort","sortGroups","centerContent","frameProps","controls","oFormat","rFormat","oSort","pieceStyle","summaryStyle","nodeStyle","edgeStyle","customHoverBehavior","customClickBehavior","customDoubleClickBehavior","onBrush","onTopologyChange","backgroundGraphics","foregroundGraphics","legend","recipe","layout"]),te=new Set(["data","nodes","edges","points","areas","lines","flows"]);function ie(e,t){return!!te.has(e)&&("areas"!==e||"string"!=typeof t)}var ne="function"==typeof structuredClone?structuredClone:e=>JSON.parse(JSON.stringify(e));function re(e,t,i){const n=D(e)??W(t.recipe)??W(t.recipeId);if(n)return function(e,t,i){const n=function(e,t,i){const n={};for(const[r,o]of Object.entries(e))if(null!=o&&!ee.has(r)&&"recipeId"!==r&&(t||!ie(r,o)))if("function"==typeof o||o?.$$typeof){if(i)throw Error(`Portable recipe prop "${r}" is not JSON-safe.`)}else if(k(o))n[r]=ne(o);else if(i)throw Error(`Portable recipe prop "${r}" is not JSON-safe.`);return n}(t,!1!==i?.includeData,"portable"===e.portability),r=e.intents.map(q).filter(e=>!!e),o={name:e.name,intents:r,...e.audience?.primary?{audience:[e.audience.primary]}:{},frameFamily:e.frameFamily};if("portable"===e.portability){if(!k(n))throw Error(`Portable recipe "${e.id}" contains non-JSON-safe props or layoutConfig.`);return{component:"ChartRecipe",recipeId:e.id,portable:!0,props:n,manifest:o,version:"1",createdAt:(new Date).toISOString(),...i?.selections?{selections:i.selections}:{}}}return{component:"ChartRecipe",recipeId:e.id,portable:!1,reason:"Recipe contains or may depend on non-serializable local layout callbacks.",warnings:["This config is inspectable but cannot be rendered remotely by CLI or MCP."],props:n,manifest:o,version:"1",createdAt:(new Date).toISOString(),...i?.selections?{selections:i.selections}:{}}}(n,t,i);if(!G(e))throw Error(`Unknown component "${e}". Known components: ${V.join(", ")}`);const r=!1!==i?.includeData,o={};for(const[e,i]of Object.entries(t))null!=i&&(ee.has(e)||!r&&ie(e,i)||"function"!=typeof i&&(i?.$$typeof||(o[e]=ne(i))));return{component:e,props:o,version:"1",createdAt:(new Date).toISOString(),...i?.selections?{selections:i.selections}:{}}}function oe(e){if(!e.component||!e.props)throw Error("Invalid chart config: missing component or props");if("ChartRecipe"===e.component||"LocalChartRecipe"===e.component){if(!e.recipeId)throw Error("Invalid chart recipe config: missing recipeId");const t=D(e.recipeId);if(!t)throw Error(`Unknown chart recipe "${e.recipeId}". Register it before deserializing this config.`);if("LocalChartRecipe"!==e.component&&!1!==e.portable&&"portable"!==t.portability)throw Error(`Chart recipe "${e.recipeId}" is registered as local, not portable.`);return{componentName:"ChartRecipe",props:{...ne(e.props),recipeId:e.recipeId}}}if(!G(e.component))throw Error(`Unknown component "${e.component}". This config may require a newer version of semiotic.`);return{componentName:e.component,props:ne(e.props)}}function ae(e){const t=JSON.stringify(e);return"sc="+btoa(unescape(encodeURIComponent(t))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function se(e){const t=new URLSearchParams(e.includes("?")?e.split("?")[1]:e).get("sc");if(!t)throw Error("No chart config found in URL (missing 'sc' parameter)");const i=t.replace(/-/g,"+").replace(/_/g,"/"),n=decodeURIComponent(escape(atob(i)));return JSON.parse(n)}async function le(e,t="json"){const i="jsx"===t?ce(e):JSON.stringify(e,null,2);if("undefined"==typeof navigator||!navigator.clipboard)throw Error("Clipboard API not available. copyConfig requires a browser environment.");await navigator.clipboard.writeText(i)}function ce(e){const{props:t}=e,i=["<"+("LocalChartRecipe"===e.component?"ChartRecipe":e.component)];e.recipeId&&i.push(` recipeId="${e.recipeId}"`);for(const[e,n]of Object.entries(t))if("string"==typeof n)i.push(` ${e}="${n}"`);else if("boolean"==typeof n&&!0===n)i.push(" "+e);else if("boolean"==typeof n&&!1===n)i.push(` ${e}={false}`);else if("number"==typeof n)i.push(` ${e}={${n}}`);else{const t=JSON.stringify(n);i.push(80>t.length?` ${e}={${t}}`:` ${e}={${JSON.stringify(n,null,2)}}`)}return i.push("/>"),i.join("\n")}function de(e){const t={};for(const[i,n]of e){const e=[];for(const[,t]of n.clauses){const i={};for(const[e,n]of Object.entries(t.fields))i[e]="point"===n.type?{type:"point",values:Array.from(n.values)}:{type:"interval",range:n.range};e.push({clientId:t.clientId,type:t.type,fields:i})}t[i]={name:n.name,resolution:n.resolution,clauses:e}}return t}function ue(e){const t=new Map;for(const[i,n]of Object.entries(e)){const e=new Map;for(const t of n.clauses){const i={};for(const[e,n]of Object.entries(t.fields))i[e]="point"===n.type?{type:"point",values:new Set(n.values)}:{type:"interval",range:n.range};e.set(t.clientId,{clientId:t.clientId,type:t.type,fields:i})}t.set(i,{name:n.name,resolution:n.resolution,clauses:e})}return t}function me(e){return"nominal"===e||"ordinal"===e}function pe(e){return"quantitative"===e||"temporal"===e}var he={category10:"category10",category20:"category20",category20b:"category20",category20c:"category20",accent:"accent",dark2:"dark2",paired:"paired",pastel1:"pastel1",pastel2:"pastel2",set1:"set1",set2:"set2",set3:"set3",tableau10:"category10",tableau20:"category20"},fe={linear:"linear","monotone-x":"monotoneX","monotone-y":"monotoneY",monotone:"monotoneX",step:"step","step-after":"stepAfter","step-before":"stepBefore",basis:"basis",cardinal:"cardinal","catmull-rom":"catmullRom"},ge={sum:"sum",mean:"mean",average:"mean",count:"count",min:"min",max:"max",median:"mean"};function be(e){e=function(e){if(!function(e){return e.usermeta?.idid}(e)||!Array.isArray(e.layer))return e;const t=e.layer.filter(e=>!function(e){return"annotation-layer"===e.usermeta?.idid?.role}(e));if(1!==t.length)return e;const{layer:i,...n}=e,{usermeta:r,...o}=t[0];return{...n,...o}}(e);const t=[],{type:i,markProps:n}=function(e){if(!e)return{type:"",markProps:{}};if("string"==typeof e)return{type:e,markProps:{}};const{type:t,...i}=e;return{type:t,markProps:i}}(e.mark),r=e.encoding||{},o=r.x,a=r.y,s=r.color,l=r.size,c=r.theta,d=r.opacity;let u;e.data?.values?u=e.data.values:e.data?.url&&t.push("data.url is not supported — only inline data.values can be translated. Provide data manually."),e.transform&&e.transform.length>0&&t.push("Vega-Lite transforms are not supported. Pre-transform your data before passing to fromVegaLite()."),e.layer&&t.push('Layered specs ("layer") are not supported. Only single-mark specs can be translated.'),(e.hconcat||e.vconcat||e.concat)&&t.push('Concatenated views ("hconcat"/"vconcat"/"concat") are not supported. Translate each sub-spec individually.'),(e.facet||r.facet||r.row||r.column)&&t.push("Faceted views are not supported. Use Semiotic's LinkedCharts or render multiple charts manually."),e.repeat&&t.push('Repeated views ("repeat") are not supported. Translate each field combination individually.'),(e.params||e.selection)&&t.push("Selections/params are not supported. Use Semiotic's LinkedCharts and selection props for interactivity.");const m={};e.width&&(m.width=e.width),e.height&&(m.height=e.height);const p=function(e){if(e)return"string"==typeof e?e:e.text}(e.title);if(p&&(m.title=p),s?.field&&(m.colorBy=s.field,s.scale?.scheme)){const e=he[s.scale.scheme];e&&(m.colorScheme=e)}void 0!==d?.value&&(m.pointOpacity=d.value);const f=o?.aggregate,g=a?.aggregate;if(u&&(f||g)){const e=g?a:o,t=g?o:a,i=ge[e.aggregate];if(i&&t?.field&&e.field)u=function(e,t){const{groupBy:i,value:n,agg:r="sum"}=t,o=new Map;for(const t of e){const e=t[i]+"";o.has(e)||o.set(e,[]),o.get(e).push(Number(t[n]))}const a=[];for(const[e,t]of o){let n;switch(r){case"count":n=t.length;break;case"mean":n=t.reduce((e,t)=>e+t,0)/t.length;break;case"min":n=h(t)[0];break;case"max":n=h(t)[1];break;default:n=t.reduce((e,t)=>e+t,0)}a.push({[i]:e,value:n})}return a}(u,{groupBy:t.field,value:e.field,agg:i});else if(("count"===i||"count"===e.aggregate)&&t?.field&&u){const e=new Map;for(const i of u){const n=i[t.field]+"";e.set(n,(e.get(n)||0)+1)}u=Array.from(e,([e,i])=>({[t.field]:e,value:i}))}}if(o?.bin||a?.bin){const e="Histogram";u&&(m.data=u),o?.bin?(m.valueAccessor=o.field,a?.field&&(m.categoryAccessor=a.field),o.axis?.title&&(m.valueLabel=o.axis.title)):a?.bin&&(m.valueAccessor=a.field,o?.field&&(m.categoryAccessor=o.field),a.axis?.title&&(m.valueLabel=a.axis.title));const i=o?.bin||a?.bin,n="object"==typeof i?i.maxbins:void 0;return n&&(m.bins=n),ve(e,m,t)}let b;switch(i){case"bar":b=function(e,t,i,n,r,o,a){let s;return i?.field&&!1!==e?.stack&&!1!==t?.stack&&null!==e?.stack&&null!==t?.stack?(s="StackedBarChart",n.stackBy=i.field):s="BarChart",me(e?.type)&&pe(t?.type)?(n.categoryAccessor=e.field,n.valueAccessor=a?"value":t.field,e?.axis?.title&&(n.categoryLabel=e.axis.title),t?.axis?.title&&(n.valueLabel=t.axis.title)):pe(e?.type)&&me(t?.type)?(n.categoryAccessor=t.field,n.valueAccessor=o?"value":e.field,n.orientation="horizontal",t?.axis?.title&&(n.categoryLabel=t.axis.title),e?.axis?.title&&(n.valueLabel=e.axis.title)):(e?.field&&(n.categoryAccessor=e.field),t?.field&&(n.valueAccessor=a?"value":t.field),e?.axis?.title&&(n.categoryLabel=e.axis.title),t?.axis?.title&&(n.valueLabel=t.axis.title)),r&&(n.data=r),s}(o,a,s,m,u,f,g);break;case"line":if(b="LineChart",ye(o,a,m,f,g),s?.field&&(m.lineBy=s.field),n.interpolate){const e=fe[n.interpolate];e&&(m.curve=e)}!0===n.point&&(m.showPoints=!0),u&&(m.data=u);break;case"area":if(s?.field?(b="StackedAreaChart",m.areaBy=s.field):b="AreaChart",ye(o,a,m,f,g),n.interpolate){const e=fe[n.interpolate];e&&(m.curve=e)}void 0!==n.opacity&&(m.areaOpacity=n.opacity),u&&(m.data=u);break;case"point":case"circle":case"square":l?.field?(b="BubbleChart",m.sizeBy=l.field,l.scale?.range&&(m.sizeRange=l.scale.range)):b="Scatterplot",ye(o,a,m,f,g),u&&(m.data=u);break;case"rect":b="Heatmap",o?.field&&(m.xAccessor=o.field),a?.field&&(m.yAccessor=a.field),s?.field&&(m.valueAccessor=s.field,delete m.colorBy),o?.axis?.title&&(m.xLabel=o.axis.title),a?.axis?.title&&(m.yLabel=a.axis.title),u&&(m.data=u);break;case"arc":n.innerRadius&&n.innerRadius>0?(b="DonutChart",m.innerRadius=n.innerRadius):b="PieChart",c?.field?m.valueAccessor=c.field:a?.field&&(m.valueAccessor=g?"value":a.field),s?.field&&(m.categoryAccessor=s.field),o?.field&&!c?.field&&(m.categoryAccessor=o.field),u&&(m.data=u);break;case"tick":b="DotPlot",me(o?.type)?(m.categoryAccessor=o.field,a?.field&&(m.valueAccessor=g?"value":a.field),o?.axis?.title&&(m.categoryLabel=o.axis.title),a?.axis?.title&&(m.valueLabel=a.axis.title)):me(a?.type)?(m.categoryAccessor=a.field,o?.field&&(m.valueAccessor=f?"value":o.field),m.orientation="horizontal",a?.axis?.title&&(m.categoryLabel=a.axis.title),o?.axis?.title&&(m.valueLabel=o.axis.title)):(o?.field&&(m.categoryAccessor=o.field),a?.field&&(m.valueAccessor=g?"value":a.field)),u&&(m.data=u);break;default:t.push(`Unsupported mark type "${i}". Defaulting to Scatterplot.`),b="Scatterplot",ye(o,a,m,f,g),u&&(m.data=u)}return ve(b,m,t)}function ye(e,t,i,n,r){e?.field&&(i.xAccessor=n?"value":e.field),t?.field&&(i.yAccessor=r?"value":t.field),e?.axis?.title&&(i.xLabel=e.axis.title),t?.axis?.title&&(i.yLabel=t.axis.title)}function ve(e,t,i){const n={component:e,props:t,version:"1",createdAt:(new Date).toISOString()};if(i.length>0){n.warnings=i;for(const e of i)console.warn("[semiotic/fromVegaLite] "+e)}return n}function xe(e,t){const i={...e};return t.provenance&&(i.provenance=t.provenance),t.lifecycle&&(i.lifecycle=t.lifecycle),i}function we(){return(new Date).toISOString()}function ke(e,t={}){const i=e.provenance;return{...e,provenance:{...i,...t,createdAt:t.createdAt??i?.createdAt??we()}}}function $e(e){if(null==e)return null;if("number"==typeof e)return e;if(e instanceof Date)return e.getTime();const t=Date.parse(e);return Number.isFinite(t)?t:null}function Ce(e){const t=$e(e?.now);if(null!=t)return t;const i=e?.dataExtent;if(i)if(Array.isArray(i)){const e=$e(i[i.length-1]);if(null!=e)return e}else if("max"in i){const e=$e(i.max);if(null!=e)return e}return Date.now()}function Se(e,t,i={}){const n=e?.lifecycle?.freshness,r=$e(e?.provenance?.createdAt),o=function(e){if(null==e)return null;if("number"==typeof e)return e;const t=function(e){const t=/^P(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/.exec(e);return t?1e3*(3600*(24*parseInt(t[1]||"0",10)+parseInt(t[2]||"0",10))+60*parseInt(t[3]||"0",10)+parseInt(t[4]||"0",10)):0}(e);return t>0?t:null}(e?.lifecycle?.ttlHint);return null==r||null==o?n??"fresh":s(t-r,o,i)}function Ae(e,t={}){const i=Ce(t);return e.map(e=>{const n=Se(e,i,t.thresholds);return{...e,lifecycle:{...e.lifecycle,freshness:n}}})}var Ne={fresh:null,aging:.55,stale:.35,expired:.2},je={fresh:null,aging:null,stale:"4 4",expired:"2 4"};function Ie(e,t,i){return e&&i in e?e[i]:t[i]}function Le(e,t={}){const i=Ce(t),n=!0===t.showExpiredAnnotations,r=[];for(const o of e){const e=Se(o,i,t.thresholds);if("expired"===e&&!n)continue;const a=Ie(t.opacity,Ne,e),s=Ie(t.strokeDasharray,je,e),l=t.labelSuffix?.[e],c={...o,lifecycle:{...o.lifecycle,freshness:e}};null!=a&&null==c.opacity&&(c.opacity=a),null!=s&&null==c.strokeDasharray&&(c.strokeDasharray=s),l&&"string"==typeof c.label&&(c.label=c.label+l);const d=o.lifecycle?.anchor;d&&null==c.anchor&&(c.anchor=d),r.push(c)}return r}var Pe={proposed:.7,accepted:null,disputed:.7,retracted:.25},Re={proposed:"3 3",accepted:null,disputed:"2 3",retracted:"2 4"},Me={proposed:" (proposed)",accepted:"",disputed:" (?)",retracted:""};function Be(e,t,i){return e&&i in e?e[i]:t[i]}function De(e,t={}){const i=!0===t.showRetractedAnnotations,n=!0===t.showSupersededAnnotations,r=new Set;for(const t of e){const e=t?.lifecycle?.supersedes;e&&"retracted"!==t?.lifecycle?.status&&r.add(e)}return e.filter(e=>{if("retracted"===e?.lifecycle?.status&&!i)return!1;const t=e?.provenance?.stableId;return!(t&&r.has(t)&&!n)})}function Te(e,t={}){const i=[];for(const n of De(e,t)){const e=n?.lifecycle?.status;if(!e){i.push(n);continue}const r=Be(t.opacity,Pe,e),o=Be(t.strokeDasharray,Re,e),a=t.labelSuffix?.[e]??Me[e],s={...n};null!=r&&(s.opacity=("number"==typeof s.opacity?s.opacity:1)*r),null!=o&&null==s.strokeDasharray&&(s.strokeDasharray=o),a&&"string"==typeof s.label&&(s.label=s.label+a),i.push(s)}return i}function ze(e,t,i={}){const n=_(t),r=J(t),o=i.locale??"en",a="function"==typeof e.description?e.description({data:n,config:r,locale:o}):void 0,s=a?.levels??function(e,t,i,n){const r=K(e,["nominal","ordinal"]),o=K(e,["quantitative"]),a=r?Q(r,i,t):void 0,s=o?Q(o,i,t):void 0,l=r?.role??a??"category",c=o?.role??s??"value",d=e.encodings??[],u=d.length?d.slice(0,3).map(e=>e.meaning.replace(/\.$/,"")).join("; "):`${l} and ${c} are mapped through the recipe's declared visual semantics`,{number:m,percent:p}=function(e){try{return{number:new Intl.NumberFormat(e,{maximumFractionDigits:2}),percent:new Intl.NumberFormat(e,{style:"percent",maximumFractionDigits:1})}}catch{return{number:new Intl.NumberFormat("en",{maximumFractionDigits:2}),percent:new Intl.NumberFormat("en",{style:"percent",maximumFractionDigits:1})}}}(n),h=new Map;if(a&&s)for(const e of t){const t=(e[a]??"Uncategorized")+"",i=Number(e[s]);Number.isFinite(i)&&h.set(t,(h.get(t)??0)+i)}const f=[...h].sort((e,t)=>t[1]-e[1]),g=f.reduce((e,[,t])=>e+t,0),b=f[0],y=f[1],v=g>0?((b?.[1]??0)+(y?.[1]??0))/g:0,x=e.intents.map(e=>({id:q(e),strength:"string"==typeof e?void 0:e.strength})).sort((e,t)=>"primary"===e.strength?-1:"primary"===t.strength?1:0)[0]?.id,w=e.audience?.primary??e.audienceFit?.find(e=>"strong"===e.fit)?.audience;return{l1:`A ${e.name.toLowerCase()} encodes ${l} and ${c}. ${k=u,k?k.charAt(0).toUpperCase()+k.slice(1):k}.`,l2:f.length>0?`${f.length} categories total ${m.format(g)}. ${b[0]} accounts for ${m.format(b[1])}${g>0?` (${p.format(b[1]/g)})`:""}${y?`, followed by ${y[0]} at ${m.format(y[1])}`:""}.`:`${t.length} data ${1===t.length?"item is":"items are"} represented.`,l3:2>f.length?b?b[0]+" is the only represented category.":"No quantitative pattern can be derived from the available data.":.5>v?`The total is distributed across ${f.length} categories without the first two forming a majority.`:`Most of the total is concentrated in ${b[0]} and ${y[0]}, which together account for ${p.format(v)}.`,l4:`The chart is intended for ${x??"explanation"}${w?` with a ${w} audience`:""}: ${e.designContract.whyCustom}`};var k}(e,n,r,o),l=i.levels??["l1","l2","l3","l4"],c={};for(const e of l)s[e]&&(c[e]=s[e]);const d=["l1","l2","l3","l4"].map(e=>c[e]).filter(e=>!!e).join(" "),u=i.includeCaveats?[...e.reception?.risks??[],...e.caveats??[],...(e.designContract.misuse??[]).map(e=>"Misuse: "+e)]:void 0;return{text:d,levels:c,...u?.length?{caveats:u}:{}}}var Fe=new Set(["LineChart","AreaChart","StackedAreaChart","DifferenceChart","Scatterplot","BubbleChart","ConnectedScatterplot","QuadrantChart","MultiAxisLineChart","MinimapChart"]),Ee=new Set(["BarChart","StackedBarChart","GroupedBarChart","DotPlot"]),Oe=new Set(["PieChart","DonutChart","FunnelChart"]),He=new Set(["Histogram","BoxPlot","ViolinPlot","RidgelinePlot","SwarmPlot"]);function We(e,t){return Ee.has(e)||Oe.has(e)||"SwimlaneChart"===e||"GaugeChart"===e?{measure:t.valueAccessor,measureFallback:"value",dimension:t.categoryAccessor??t.stepAccessor,dimensionFallback:"category"}:{measure:t.yAccessor??t.valueAccessor,measureFallback:"y",dimension:t.xAccessor,dimensionFallback:"x"}}function Ve(e){for(const t of["lineBy","areaBy","stackBy","groupBy","colorBy"]){const i=e[t];if("string"==typeof i&&i)return i}}function Ue(e,t){return null==e?"—":e instanceof Date?e.toISOString().slice(0,10):"number"==typeof e?t(e):e+""}var Ge={LineChart:"line chart",AreaChart:"area chart",StackedAreaChart:"stacked area chart",DifferenceChart:"difference chart",Scatterplot:"scatter plot",BubbleChart:"bubble chart",ConnectedScatterplot:"connected scatter plot",QuadrantChart:"quadrant chart",MultiAxisLineChart:"dual-axis line chart",CandlestickChart:"candlestick chart",Heatmap:"heatmap",MinimapChart:"line chart",BarChart:"bar chart",StackedBarChart:"stacked bar chart",GroupedBarChart:"grouped bar chart",DotPlot:"dot plot",Histogram:"histogram",BoxPlot:"box plot",ViolinPlot:"violin plot",RidgelinePlot:"ridgeline plot",SwarmPlot:"swarm plot",PieChart:"pie chart",DonutChart:"donut chart",FunnelChart:"funnel chart",GaugeChart:"gauge",LikertChart:"Likert chart",SwimlaneChart:"swimlane chart",ForceDirectedGraph:"network graph",SankeyDiagram:"Sankey diagram",ProcessSankey:"temporal Sankey diagram",ChordDiagram:"chord diagram",TreeDiagram:"tree diagram",Treemap:"treemap",CirclePack:"circle-packing chart",OrbitDiagram:"orbit diagram",ChoroplethMap:"choropleth map",ProportionalSymbolMap:"proportional-symbol map",FlowMap:"flow map",DistanceCartogram:"distance cartogram",BigNumber:"single value",StreamPhysicsFrame:"physics stream frame",EventDropChart:"event-drop physics chart",GaltonBoardChart:"Galton board chart",PhysicsPileChart:"physics pile chart",CollisionSwarmChart:"collision swarm chart",PhysicalFlowChart:"physical flow chart",ProcessFlowChart:"process flow physics chart",PhysicsCustomChart:"custom physics chart"},qe=new Set(["ForceDirectedGraph","SankeyDiagram","ProcessSankey","ChordDiagram"]),Je=new Set(["StreamPhysicsFrame","EventDropChart","GaltonBoardChart","PhysicsPileChart","CollisionSwarmChart","PhysicalFlowChart","ProcessFlowChart","GauntletChart","PhysicsCustomChart"]);function _e(e){return Ge[e]||e.replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase()+" chart"}function Ze(e){const t="number"==typeof e?e:"string"==typeof e?Number(e):NaN;return Number.isFinite(t)?t:void 0}var Qe=new Set(["Scatterplot","BubbleChart","ConnectedScatterplot","QuadrantChart","ScatterplotMatrix"]),Xe={"outlier-detection":"alerting","change-detection":"alerting",trend:"tracking","composition-over-time":"apportioning","compare-series":"comparing","compare-categories":"comparing",rank:"ranking","part-to-whole":"apportioning",distribution:"characterizing",correlation:"relating",flow:"tracing",hierarchy:"nesting",geo:"locating"},Ke={"time-series":"tracking",categorical:"comparing",distribution:"characterizing",relationship:"relating",flow:"tracing",network:"tracing",hierarchy:"nesting",geo:"locating",realtime:"tracking",value:"presenting",custom:"presenting"},Ye=["trend","compare-series","compare-categories","rank","part-to-whole","distribution","correlation","flow","hierarchy","geo","composition-over-time","change-detection","outlier-detection"],et={alerting:"alerting",tracking:"trend",comparing:"comparison",ranking:"ranking",apportioning:"composition",characterizing:"distribution",relating:"correlation",tracing:"flow",nesting:"hierarchy",locating:"locator",presenting:"single-value"};function tt(e){return Xe[e]}function it(e,t){const i=function(e){if(e){if("fits"in e||"buildProps"in e){const t=e,i={};for(const[e,n]of Object.entries(t.intentScores))"number"==typeof n&&Number.isFinite(n)&&(i[e]=n);return{family:t.family,intentScores:Object.keys(i).length?i:void 0}}return e}}(t);if(i?.act)return i.act;if(i?.intentScores){const e=function(e){let t,i=0;for(const[n,r]of Object.entries(e))if("number"==typeof r&&r>0)if(r>i)t=n,i=r;else if(r===i&&void 0!==t){const e=Ye.indexOf(n),i=Ye.indexOf(t);-1===e||-1!==i&&e>=i||(t=n)}return t}(i.intentScores);if(e&&Xe[e]&&(i.intentScores[e]??0)>=3)return Xe[e]}return i?.family?Ke[i.family]:function(e){return Oe.has(e)||"StackedAreaChart"===e?"apportioning":Qe.has(e)?"relating":Ee.has(e)?"comparing":He.has(e)?"characterizing":Fe.has(e)?"tracking":qe.has(e)?"tracing":"BigNumber"===e?"presenting":void 0}(e)}var nt=new Set(["y-threshold","x-threshold","band","x-band","callout","label"]),rt=new Set(["system","agent","watcher"]),ot=new Set(["ai","agent","system","computed","dbt","great-expectations"]),at=new Set(["rule","statistical-test","llm-inference","computed"]);function st(e){const t=e.annotations;return!!Array.isArray(t)&&t.some(e=>{if(!e||"object"!=typeof e)return!1;const t=e;if("string"!=typeof t.type||!nt.has(t.type))return!1;const i=t.provenance;return!(!i||"object"!=typeof i)&&(rt.has(i.authorKind)||ot.has(i.source)||at.has(i.basis))})}function lt(e="en"){let t,i;try{t=new Intl.NumberFormat(e,{notation:"compact",maximumFractionDigits:1}),i=new Intl.NumberFormat(e,{maximumFractionDigits:2})}catch{t=new Intl.NumberFormat("en",{notation:"compact",maximumFractionDigits:1}),i=new Intl.NumberFormat("en",{maximumFractionDigits:2})}return e=>Number.isFinite(e)?1e4>Math.abs(e)?i.format(e):t.format(e):e+""}var ct={"y-threshold":"a threshold line","x-threshold":"a threshold line",band:"a highlighted band","x-band":"a highlighted band",label:"a label",callout:"a callout","callout-circle":"a callout","callout-rect":"a callout",text:"a text note",bracket:"a bracket",enclose:"an enclosure","rect-enclose":"an enclosure",highlight:"a highlight",widget:"a widget",trend:"a trend line",envelope:"an envelope","anomaly-band":"an anomaly band",forecast:"a forecast","category-highlight":"a category highlight"};function dt(e){const t=ct["string"==typeof e.type?e.type:"annotation"]||"an annotation",i=function(e){const t=e.provenance&&"object"==typeof e.provenance?e.provenance:null,i=t?.authorKind??t?.source??t?.basis;return"watcher"===i?"a watcher-flagged ":"agent"===i||"ai"===i||"llm-inference"===i?"an AI-suggested ":""}(e),n=i?i+t.replace(/^an? /,""):t,r="string"==typeof e.label?e.label:"string"==typeof e.title?e.title:void 0;return r?`${n} labeled "${r}"`:n}function ut(e){const t=Array.isArray(e.annotations)?e.annotations:null;if(!t||0===t.length)return;const i=De(t.filter(e=>!!e&&"object"==typeof e));if(0===i.length)return;const n=i.map(dt),r=n.slice(0,5),o=n.length-r.length,a=function(e){return e.length>1?2===e.length?`${e[0]} and ${e[1]}`:`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`:e[0]??""}(r)+(o>0?`, and ${o} more`:""),s=i.length;return`The author has marked ${1===s?"one feature":s+" features"} on this chart: ${a}.`}function mt(e,t,r={}){const o=void 0!==r.levels,a=new Set(r.levels??["l1","l2","l3"]);o||!r.capability&&!st(t)||a.add("l4");const s=Z(e,t,r.recipe);if(s){const e=["l1","l2","l3","l4"].filter(e=>a.has(e));o||e.includes("l4")||e.push("l4");const i=ze(s,t,{levels:e,locale:r.locale,audience:r.audience,includeCaveats:r.includeCaveats}),n=ut(t);return{...i,text:n?`${n} ${i.text}`.trim():i.text,...n?{annotations:n}:{}}}const l=lt(r.locale??"en"),c=_e(e),d=Array.isArray(t.data)?t.data:null,u=Ve(t),m=Je.has(e)?function(e,t){const i=e.physics&&"object"==typeof e.physics?e.physics:null,n=e.settledProjection&&"object"==typeof e.settledProjection?e.settledProjection:null,r=[e.settledProjectionRows,e.projectionRows,n?.rows,i?.settledProjectionRows,i?.projectionRows,i?.settledProjection&&"object"==typeof i.settledProjection?i.settledProjection.rows:void 0].find(e=>Array.isArray(e));return Array.isArray(r)?r.map((e,i)=>{if(!e||"object"!=typeof e)return null;const n=e,r=Ze(n.count??n.value??n.total??n.bodies??n.events);if(null==r)return null;const o=n.label??n.id??n.name??"container "+(i+1),a=Ze(n.secondary??n.secondaryCount),s=Ze(n.observed??n.observedCount);return{label:Ue(o,t),count:r,...null!=a?{secondary:a}:{},..."string"==typeof n.secondaryLabel&&n.secondaryLabel?{secondaryLabel:n.secondaryLabel}:{},...null!=s?{observed:s}:{}}}).filter(e=>null!=e):null}(t,l):null,{measure:p,measureFallback:h,dimension:f,dimensionFallback:g}=We(e,t),b="string"==typeof p&&p?p:h,y="string"==typeof f&&f?f:g,v={};if(Je.has(e)&&function(e,t,i,n,r,o){const a=function(e){return"EventDropChart"===e?"time window":"GaltonBoardChart"===e?"bin":"CollisionSwarmChart"===e?"group lane":"PhysicalFlowChart"===e?"flow node":"container"}(e),s=function(e){return"EventDropChart"===e?"event":"GaltonBoardChart"===e?"sample":"CollisionSwarmChart"===e?"point":"PhysicalFlowChart"===e?"packet":"body"}(e);if(r.has("l1")&&(n.l1=function(e,t){return"EventDropChart"===e?"An event-drop physics chart that collapses moving events into a settled projection by event-time window.":"GaltonBoardChart"===e?"A Galton board chart that collapses falling samples into a settled histogram projection.":"PhysicsPileChart"===e?"A physics pile chart that collapses moving bodies into a settled bar-style projection by container.":"CollisionSwarmChart"===e?"A collision swarm chart that separates overlapping points while preserving their quantitative axis position.":"PhysicalFlowChart"===e?"A physical flow chart that keeps authored routes visible while packet bodies show throughput and proximity events.":`A ${t} whose accessible reading is the settled projection rather than individual trajectories.`}(e,t)),!r.has("l2")&&!r.has("l3"))return;if(!i||0===i.length)return void(r.has("l2")&&(n.l2="No settled projection is loaded yet."));const l=i.reduce((e,t)=>e+t.count,0),c=i.filter(e=>e.count>0).sort((e,t)=>t.count-e.count),d=c[0]??i.slice().sort((e,t)=>t.count-e.count)[0];if(!d)return;const u=i.reduce((e,t)=>e+(t.secondary??0),0),m=i.find(e=>e.secondaryLabel)?.secondaryLabel??"secondary";if(r.has("l2"))if(0===c.length)n.l2=`The settled projection contains ${o(l)} ${ht(l,s)} across ${i.length} ${ht(i.length,a)}; no ${ht(2,a)} are non-empty yet.`;else{const e=u>0?` ${o(u)} ${ht(u,s)} ${1===u?"is":"are"} marked ${m}.`:"";n.l2=`The settled projection contains ${o(l)} ${ht(l,s)} across ${i.length} ${ht(i.length,a)}; ${c.length} ${ht(c.length,a)} ${1===c.length?"is":"are"} non-empty. The largest ${a} is ${d.label} with ${o(d.count)} ${ht(d.count,s)}.${e}`}if(r.has("l3")&&l>0&&c.length>0){const e=c.find(e=>e!==d),t=function(e,t){if(0>=t)return"0%";const i=e/t*100;return(10>i?Math.round(10*i)/10:Math.round(i))+"%"}(d.count,l);n.l3=e?`The settled projection is most concentrated in ${d.label}, which holds ${o(d.count)} ${ht(d.count,s)} (${t}); ${e.label} follows with ${o(e.count)} ${ht(e.count,s)}.`:`The settled projection is concentrated in ${d.label}, which holds all ${o(d.count)} ${ht(d.count,s)}.`}}(e,c,m,v,a,l),a.has("l1")&&!Je.has(e))if(Fe.has(e)||Ee.has(e))v.l1=`A ${c} of ${b} by ${y}`+(u?`, split by ${u}.`:".");else if(Oe.has(e))v.l1=`A ${c} showing ${b} across ${y} categories.`;else if(He.has(e))v.l1=`A ${c} of the distribution of ${b}`+(u?` by ${u}.`:".");else if(qe.has(e)){const e=Array.isArray(t.nodes)?t.nodes.length:void 0,i=Array.isArray(t.edges)?t.edges.length:void 0,n=[null!=e?`${e} ${ht(e,"node")}`:null,null!=i?`${i} ${ht(i,"edge")}`:null].filter(Boolean);v.l1=`A ${c}${n.length?" with "+n.join(" and "):""}.`}else if("BigNumber"===e){const e="string"==typeof t.label?t.label:b;v.l1=`A single value${e?" for "+e:""}.`}else v.l1=`A ${c}.`;const x=Fe.has(e)||Ee.has(e)||Oe.has(e)||He.has(e);let w=null;if((a.has("l2")||a.has("l3")||a.has("l4"))&&x&&d&&d.length>0&&(w=function(e,t,i,n){let r=0,o=0,a=1/0,s=-1/0,l=null,c=null,d=0,u=0,m=null,p=null,h=NaN,f=NaN;for(const i of e){const e=t(i);Number.isFinite(e)&&(0===r&&(h=e,m=i),f=e,p=i,a>e&&(a=e,l=i,d=r),e>s&&(s=e,c=i,u=r),r++,o+=e)}return 0===r?null:{count:r,min:a,max:s,mean:o/r,minLabel:Ue(null!=l?i(l):null,n),maxLabel:Ue(null!=c?i(c):null,n),first:h,last:f,firstLabel:Ue(null!=m?i(m):null,n),lastLabel:Ue(null!=p?i(p):null,n),minIndex:d,maxIndex:u}}(d,i(p,h),n(f,g),l)),a.has("l2")&&x&&(d&&0!==d.length?w&&(v.l2=Oe.has(e)?`${w.count} segments totaling ${l(function(e){return e.mean*e.count}(w))}. Largest is ${w.maxLabel} at ${l(w.max)}; smallest is ${w.minLabel} at ${l(w.min)}.`:`${b} ranges from ${l(w.min)} (${w.minLabel}) to ${l(w.max)} (${w.maxLabel}), with a mean of ${l(w.mean)} across ${w.count} points.`):v.l2="No data is loaded yet."),a.has("l3")&&w&&!u&&Fe.has(e)?v.l3=function(e,t,i){const{first:n,last:r,min:o,max:a,maxLabel:s,minLabel:l,firstLabel:c,lastLabel:d,minIndex:u,maxIndex:m,count:p}=e,h=a-o,f=r-n;if(0===h)return`${pt(t)} is constant at ${i(n)} across the series.`;if(.04>h/(Math.abs(e.mean)||1))return`${pt(t)} ends roughly where it started (${i(n)} at ${c} to ${i(r)} at ${d}), ranging between ${i(o)} and ${i(a)}.`;const g=m>0&&p-1>m,b=u>0&&p-1>u,y=(a-Math.max(n,r))/h,v=(Math.min(n,r)-o)/h;return g&&y>.15?`Overall ${t} climbs to a peak of ${i(a)} (${s}), then falls to ${i(r)} (${d}).`:b&&v>.15?`Overall ${t} drops to a low of ${i(o)} (${l}), then recovers to ${i(r)} (${d}).`:.05>Math.abs(f)/h?`${pt(t)} ends roughly where it started (${i(n)} at ${c} to ${i(r)} at ${d}), ranging between ${i(o)} and ${i(a)}.`:f>0?m===p-1?`Overall ${t} rises from ${i(n)} (${c}) to a peak of ${i(r)} (${d}).`:`Overall ${t} rises from ${i(n)} (${c}) to ${i(r)} (${d}), after peaking at ${i(a)} (${s}).`:u===p-1?`Overall ${t} falls from ${i(n)} (${c}) to a low of ${i(r)} (${d}).`:`Overall ${t} falls from ${i(n)} (${c}) to ${i(r)} (${d}), after dipping to ${i(o)} (${l}).`}(w,b,l):a.has("l3")&&w&&!u&&Ee.has(e)&&(v.l3=`The highest ${y} is ${w.maxLabel} and the lowest is ${w.minLabel}.`),a.has("l4")){const i=st(t)?"alerting":it(e,r.capability);i&&(v.l4=function(e,t,i,n,r,o,a,s){const l=et[e],c=/^[aeiou]/i.test(l)?"an":"a";let d,u;switch(e){case"locating":d="This is a map",u="read values by location";break;case"presenting":d="This is a single-value display",u=`read ${"string"==typeof i.label&&i.label?i.label:r} as the headline number`;break;case"tracing":d=`This is ${c} ${l} chart`,u="follow the movement between states";break;case"nesting":d=`This is ${c} ${l} chart`,u="read it for nested structure and how children sum into their parents";break;case"relating":d=`This is ${c} ${l} chart`,u=`read it for whether ${o} and ${r} move together`;break;default:d=`This is ${c} ${l} chart`,u=function(e,t,i,n,r,o){if(!t)switch(e){case"alerting":return"watch for points that break from the rest";case"tracking":return"read it for the overall direction of "+i;case"comparing":return`compare ${i} across ${n}`;case"ranking":return"read it top to bottom by "+i;case"apportioning":return`read each ${n}'s share of the whole`;case"characterizing":return"read it for the spread and shape of "+i;default:return"read the highlighted features"}switch(e){case"alerting":return function(e,t,i){if(Ee.has(i)||Oe.has(i))return`${e.maxLabel} stands out at ${t(e.max)} — check it first`;const{first:n,last:r,min:o,max:a,minLabel:s,maxLabel:l,lastLabel:c,minIndex:d,maxIndex:u,count:m}=e,p=a-o;if(p>0){const e=u>0&&m-1>u,i=d>0&&m-1>d,h=(a-Math.max(n,r))/p,f=(Math.min(n,r)-o)/p;if(e&&h>.15)return`the peak of ${t(a)} at ${l} is the point to investigate`;if(i&&f>.15)return`the dip to ${t(o)} at ${s} is the point to investigate`;if(r>=a)return`the climb to ${t(r)} at ${c} warrants a closer look`;if(o>=r)return`the drop to ${t(r)} at ${c} warrants a closer look`}return`the extremes — ${l} (${t(a)}) and ${s} (${t(o)}) — are the points to check`}(t,r,o);case"tracking":return`read it for the trajectory of ${i}, which ${function(e){const t=e.max-e.min,i=e.last-e.first;return 0===t||.05>Math.abs(i)/t?"holds roughly steady":i>0?"rises":"falls"}(t)} from ${r(t.first)} (${t.firstLabel}) to ${r(t.last)} (${t.lastLabel})`;case"comparing":return`compare ${i} across ${n}; ${t.maxLabel} leads at ${r(t.max)}`;case"ranking":return`read it top to bottom by ${i}; ${t.maxLabel} ranks highest at ${r(t.max)}`;case"apportioning":{const e=t.mean*t.count,i=e>0?Math.round(t.max/e*100):null;return`read each ${n}'s share of the ${r(e)} total; ${t.maxLabel} is the largest at ${r(t.max)}${null!=i?` (${i}%)`:""}`}case"characterizing":return`read it for the spread of ${i}, from ${r(t.min)} to ${r(t.max)}`;default:return"read the highlighted features"}}(e,n,r,o,a,t)}return`${d}; ${u}.${function(e,t){if(!t)return"";const i=t.familiarity?.[e];return"number"!=typeof i||i>2?"":` This ${_e(e)} may be unfamiliar${t.name?` to ${t.name.toLowerCase()} readers`:""} — lean on this description.`}(t,s)}`}(i,e,t,u?null:w,b,y,l,r.audience))}const k=["l1","l2","l3","l4"].filter(e=>a.has(e)&&v[e]).map(e=>v[e]).join(" "),$=ut(t);return{text:$?`${$} ${k}`.trim():k,levels:v,...$?{annotations:$}:{}}}function pt(e){return e.length?e[0].toUpperCase()+e.slice(1):e}function ht(e,t){return 1!==e&&"body"===t?"bodies":1===e?t:t+"s"}function ft(e){return((e??"unknown")+"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function gt(e,t,i={}){const n=_(t),r=J(t),o=Math.max(1,i.maxLeaves??200);if("function"==typeof e.navigation)return e.navigation({data:n,config:r,locale:i.locale??"en"});const a=(s=e.navigation)&&"object"==typeof s?e.navigation:void 0;var s;const l=(a?.groupByRole?X(e,a.groupByRole):void 0)??(a?.groupBy?.[0]?X(e,a.groupBy[0])??e.dataRoles.find(e=>e.field===a.groupBy?.[0]):void 0)??K(e,["nominal","ordinal"]),c=l?Q(l,r,n):void 0,d=(a?.idRole?X(e,a.idRole):void 0)??K(e,["identifier"]),u=d?Q(d,r,n):void 0,m={id:"root",role:"chart",label:a?.summaryTemplate?Y(a.summaryTemplate,void 0,e,r,n,{count:n.length}):`${e.name}: ${n.length} ${1===n.length?"item":"items"} represented.`,level:1,children:[]};let p=0;const h=(t,i,o)=>{const s=u?t[u]:void 0,l=a?.itemLabelTemplate?Y(a.itemLabelTemplate,t,e,r,n,{count:n.length}):function(e,t,i,n){const r=K(t,["nominal","ordinal"]),o=t.dataRoles.filter(e=>"quantitative"===e.semanticType),a=r?Q(r,i,n):void 0,s=[];a&&null!=e[a]&&s.push(e[a]+"");for(const t of o){const r=Q(t,i,n);r&&null!=e[r]&&s.push(`${t.role}: ${e[r]+""}`)}return s.length>0?s.join(", "):"Data item"}(t,e,r,n);return{id:"datum-"+ft(s??i),role:"datum",label:l,level:o,datum:t}};if(c){const e=new Map;for(const t of n){const i=(t[c]??"Uncategorized")+"",n=e.get(i);n?n.push(t):e.set(i,[t])}m.children=[...e].map(([e,t],i)=>{const n=t.slice(0,Math.max(0,o-p));p+=n.length;const r=n.map((e,t)=>h(e,1e5*i+t,3));return t.length>n.length&&r.push({id:"more-"+ft(e),role:"datum",label:`…and ${t.length-n.length} more items`,level:3}),{id:"group-"+ft(e),role:"series",label:`${e}: ${t.length} ${1===t.length?"item":"items"}.`,level:2,children:r}})}else{const e=n.slice(0,o);m.children=e.map((e,t)=>h(e,t,2)),n.length>e.length&&m.children.push({id:"more",role:"datum",label:`…and ${n.length-e.length} more items`,level:2})}return m}function bt(e,t,r={}){const o=r.locale??"en",a=Math.max(1,r.maxLeaves??200),s=lt(o),l=Z(e,t,r.recipe);if(l)return gt(l,t,{maxLeaves:a,locale:o});const c={id:"root",role:"chart",label:mt(e,t,{locale:o}).text||"Chart.",level:1,children:[]},d=function(e,t){const i=Array.isArray(e.annotations)?e.annotations:null;if(!i)return null;const n=De(i.filter(e=>!!e&&"object"==typeof e));if(0===n.length)return null;let r=0;const o=n.slice(0,t).map(e=>{const t=e.lifecycle?.status,i=t&&"accepted"!==t?` (${t})`:"";return{id:"annotation-"+r++,role:"annotation",level:3,label:`${n=dt(e),n?n.charAt(0).toUpperCase()+n.slice(1):n}${i}.`,datum:e};var n});n.length>t&&o.push({id:"annotation-"+r++,role:"annotation",level:3,label:`…and ${n.length-t} more annotations.`});const a=n.length;return{id:"annotations",role:"annotation",level:2,label:`Annotations: ${1===a?"one marked feature":a+" marked features"}.`,children:o}}(t,a),u=Array.isArray(t.data)?t.data:null,m=Fe.has(e)||Ee.has(e)||Oe.has(e)||He.has(e);if(!u||0===u.length||!m)return d&&(c.children=[d]),c;const{measure:p,measureFallback:h,dimension:f,dimensionFallback:g}=We(e,t),b=i(p,h),y=n(f,g),v="string"==typeof p&&p?p:h,x="string"==typeof f&&f?f:g,w=Ve(t);let k=0;const $=e=>`${e}-${k++}`,C=(e,t)=>{const i=e.slice(0,a).map(e=>((e,t)=>{const i=b(e),n=Ue(y(e),s);return{id:$("datum"),role:"datum",level:t,label:`${n}: ${Number.isFinite(i)?s(i):"—"}`,value:Number.isFinite(i)?i:void 0,datum:e}})(e,t));return e.length>a&&i.push({id:$("more"),role:"datum",level:t,label:`…and ${e.length-a} more points`}),i},S=[];if(Fe.has(e)||Ee.has(e)){let t=1/0,i=-1/0,n=1/0,r=-1/0;const o=[];let a=!0;for(const e of u){const s=b(e);Number.isFinite(s)&&(t>s&&(t=s),s>i&&(i=s));const l=y(e);o.push(l),"number"==typeof l&&Number.isFinite(l)?(n>l&&(n=l),l>r&&(r=l)):a=!1}const l=new Set,c=[];for(const e of o){const t=e+"";l.has(t)||(l.add(t),c.push(e))}const d=a?`${s(n)} to ${s(r)}`:`${Ue(c[0],s)} to ${Ue(c[c.length-1],s)} (${Ee.has(e)?c.length+" categories":u.length+" points"})`;S.push({id:$("axis"),role:"axis",level:2,label:`${Ee.has(e)?"Category axis":"X axis"}: ${x}, ${d}.`}),t>i||S.push({id:$("axis"),role:"axis",level:2,label:`Value axis: ${v}, ${s(t)} to ${s(i)}.`})}if(w){const i=n(w,w),r=new Map;for(const e of u){const t=(i(e)??"—")+"",n=r.get(t);n?n.push(e):r.set(t,[e])}const a=[];for(const[i,n]of r){const r=mt(e,{...t,data:n},{levels:["l2","l3"],locale:o}).text;a.push({id:$("series"),role:"series",level:2,label:`Series ${i}: ${r}`,children:C(n,3)})}c.children=[...S,...a]}else c.children=[...S,...C(u,2)];return d&&c.children.push(d),c}function yt(e,t){const i=[],n=e=>{if(i.push(e),e.children&&e.children.length>0&&t.has(e.id))for(const t of e.children)n(t)};return n(e),i}function vt(e){let t=1;if(e.children)for(const i of e.children)t+=vt(i);return t}var xt=null,wt=new Set,kt=new Set,$t=1e3;function Ct(e,t,i){const n=e??t;if(!Number.isFinite(n)||0>=n)throw new RangeError(`${i} must be a positive number, got ${n+""}`);return Math.floor(n)}function St(e,t){void 0!==console&&console.warn(`[conversationArc] ${e} failed:`,t)}function At(e,t){try{const i=t();i&&"function"==typeof i.then&&Promise.resolve(i).catch(t=>St(e,t))}catch(t){St(e,t)}}function Nt(e){if(e)return e;try{return globalThis.localStorage??null}catch{return null}}function jt(e,t){if(!e)return[];try{return function(e){if(!e)return[];try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){return St("localStorage load",e),[]}}(e.getItem(t))}catch(e){return St("localStorage read",e),[]}}var It=Object.freeze([]),Lt=It,Pt=!1;function Rt(){return Pt?(Lt=xt?Object.freeze(xt.buffer.slice()):It,Pt=!1,Lt):Lt}function Mt(){Pt=!0}var Bt=new Set;function Dt(){for(const e of Bt)try{e()}catch(e){void 0!==console&&console.warn("[conversationArc] change subscriber threw:",e)}}function Tt(e){return Bt.add(e),()=>{Bt.delete(e)}}function zt(e){if(!e||"object"!=typeof e)throw new TypeError("registerConversationArcSink: sink must be an object");return kt.add(e),()=>{kt.delete(e)}}function Ft(e={}){const t=e.key??"semiotic:conversation-arc",i=Ct(e.maxEvents,$t,"createLocalStorageConversationArcSink: maxEvents");return{record(n){const r=Nt(e.storage),o=jt(r,t);o.push(n),function(e,t,i,n){if(e)try{e.setItem(t,JSON.stringify(i.slice(-n)))}catch(e){St("localStorage write",e)}}(r,t,o,i)},clear(){const i=Nt(e.storage);if(i)try{i.removeItem(t)}catch(e){St("localStorage clear",e)}},load:()=>jt(Nt(e.storage),t)}}function Et(e={}){const t=e.dbName??"semiotic-conversation-arc",i=e.storeName??"events",n=Ct(e.maxEvents,$t,"createIndexedDBConversationArcSink: maxEvents");let r=null;const o=()=>(r??(r=function(e,t,i){const n=function(e){if(e)return e;try{return globalThis.indexedDB??null}catch{return null}}(i);return n?new Promise(i=>{let r;try{r=n.open(e,1)}catch(e){return St("IndexedDB open",e),void i(null)}r.onupgradeneeded=()=>{const e=r.result;e.objectStoreNames.contains(t)||e.createObjectStore(t,{keyPath:"id",autoIncrement:!0})},r.onsuccess=()=>i(r.result),r.onerror=()=>{St("IndexedDB open",r.error),i(null)},r.onblocked=()=>{St("IndexedDB open",Error("upgrade blocked")),i(null)}}):Promise.resolve(null)}(t,i,e.indexedDB)),r);return{async record(e){const t=await o();t&&(await new Promise(n=>{try{const r=t.transaction(i,"readwrite");r.objectStore(i).add({event:e}),r.oncomplete=()=>n(),r.onerror=()=>{St("IndexedDB record",r.error),n()}}catch(e){St("IndexedDB record",e),n()}}),await function(e,t,i){return e?new Promise(n=>{try{const r=e.transaction(t,"readwrite"),o=r.objectStore(t),a=o.getAll();a.onsuccess=()=>{const e=Array.isArray(a.result)?a.result:[],t=e.length-i;if(t>0)for(const i of e.slice(0,t))null!=i.id&&o.delete(i.id)},a.onerror=()=>St("IndexedDB trim",a.error),r.oncomplete=()=>n(),r.onerror=()=>{St("IndexedDB trim",r.error),n()}}catch(e){St("IndexedDB trim",e),n()}}):Promise.resolve()}(t,i,n))},async clear(){const e=await o();e&&await new Promise(t=>{try{const n=e.transaction(i,"readwrite");n.objectStore(i).clear(),n.oncomplete=()=>t(),n.onerror=()=>{St("IndexedDB clear",n.error),t()}}catch(e){St("IndexedDB clear",e),t()}})},load:async()=>function(e,t){return e?new Promise(i=>{try{const n=e.transaction(t,"readonly").objectStore(t).getAll();n.onsuccess=()=>{i((Array.isArray(n.result)?n.result:[]).map(e=>e.event).filter(Boolean))},n.onerror=()=>{St("IndexedDB load",n.error),i([])}}catch(e){St("IndexedDB load",e),i([])}}):Promise.resolve([])}(await o(),i)}}function Ot(e){if(!e.url)throw new TypeError("createWebhookConversationArcSink: url is required");const t=e.method??"POST";return{record(i){const n=e.fetch??globalThis.fetch;if(!n)return;const r=e.mapEvent?e.mapEvent(i):i;return n(e.url,{method:t,headers:{"Content-Type":"application/json",...e.headers},body:JSON.stringify(r)}).then(()=>{})}}}function Ht(e,t={}){const i=Array.isArray(e)?e.slice():[],n=Ct(t.capacity,Math.max(xt?.capacity??$t,i.length,1),"loadConversationArc: capacity"),r=t.sessionId??i[0]?.sessionId??xt?.sessionId??Gt();for(xt?(xt.enabled=t.enabled??!1,xt.sessionId=r,xt.capacity=n):xt={enabled:t.enabled??!1,sessionId:r,capacity:n,buffer:[]},t.append||(xt.buffer=[]),xt.buffer.push(...i);xt.buffer.length>xt.capacity;)xt.buffer.shift();return Mt(),Dt(),Rt()}function Wt(e,t={}){return Ht(e,t)}function Vt(e,t,i){return Qt.record({type:"audience-set",audience:e,previous:t??void 0,...i})}function Ut(e,t){return Qt.record({type:"annotation-status-changed",toStatus:e,annotationId:t?.annotationId,fromStatus:t?.fromStatus,chartId:t?.chartId,arcId:t?.arcId,meta:t?.meta})}function Gt(){return`arc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function qt(){return xt}function Jt(e={}){const t=e.capacity??1e3;if(!Number.isFinite(t)||0>=t)throw new RangeError("enableConversationArc: capacity must be a positive number, got "+t);if(xt){if(xt.enabled=!0,e.sessionId&&(xt.sessionId=e.sessionId),null!=e.capacity){for(xt.capacity=t;xt.buffer.length>xt.capacity;)xt.buffer.shift();Mt()}}else xt={enabled:!0,sessionId:e.sessionId??Gt(),capacity:t,buffer:[]},Mt();return Dt(),Qt}function _t(){xt&&(xt.enabled=!1,Dt())}function Zt(){return Qt}var Qt={get enabled(){return xt?.enabled??!1},get sessionId(){return xt?.sessionId??null},get capacity(){return xt?.capacity??0},record(e){const t=qt();if(!t||!t.enabled)return null;const i={...e,timestamp:e.timestamp??Date.now(),sessionId:e.sessionId??t.sessionId};for(t.buffer.push(i);t.buffer.length>t.capacity;)t.buffer.shift();Mt(),Dt();for(const e of wt)try{e(i)}catch(e){void 0!==console&&console.warn("[conversationArc] subscriber threw:",e)}return function(e){for(const t of kt)t.record&&At("sink record",()=>t.record?.(e))}(i),i},flush(){const e=qt();if(!e)return[];const t=e.buffer.slice();return e.buffer=[],Mt(),Dt(),function(e){for(const t of kt)t.flush&&At("sink flush",()=>t.flush?.(e))}(t),t},getEvents:()=>Rt(),subscribe:e=>(wt.add(e),()=>{wt.delete(e)}),clear(){const e=qt();e&&(e.buffer=[],Mt(),Dt()),function(){for(const e of kt)e.clear&&At("sink clear",()=>e.clear?.())}()},reset(){if(wt.clear(),kt.clear(),Lt=It,Pt=!1,!xt)return Dt(),void Bt.clear();xt.buffer=[],xt.enabled=!1,xt=null,Dt(),Bt.clear()}};import*as Xt from"react";import{jsx as Kt,jsxs as Yt}from"react/jsx-runtime";var ei={position:"absolute",width:1,height:1,overflow:"hidden",clip:"rect(0,0,0,0)",whiteSpace:"nowrap",border:0,padding:0,margin:-1};function ti({tree:e,label:t,visible:i=!1,className:n,onActiveChange:r,activeId:o,chartId:s,onObservation:l,onAnnotationActivate:c}){const[d,u]=Xt.useState(()=>new Set([e.id])),[p,h]=Xt.useState(e.id),f=void 0!==o,g=f?o:p,b=Xt.useRef(null),y=Xt.useRef(new Map),v=m(e=>e.pushObservation),x=Xt.useCallback(e=>{l?.(e),v?.(e)},[l,v]),w=Xt.useMemo(()=>function(e){const t=new Map,i=e=>{for(const n of e.children??[])t.set(n.id,e),i(n)};return i(e),t}(e),[e]),k=Xt.useMemo(()=>yt(e,d),[e,d]);Xt.useEffect(()=>{f||k.some(e=>e.id===p)||h(e.id)},[k,p,e.id,f]),Xt.useEffect(()=>{const e=[];let t=w.get(g);for(;t;)e.push(t.id),t=w.get(t.id);e.length>0&&u(t=>{if(e.every(e=>t.has(e)))return t;const i=new Set(t);for(const t of e)i.add(t);return i})},[g,w]),Xt.useEffect(()=>{b.current?.contains(document.activeElement)&&y.current.get(g)?.focus()},[g]);const $=Xt.useCallback((e,t,i)=>{const n=Zt();n.enabled&&n.record("focus"===t?{type:"nav-node-focused",chartId:s,nodeId:e.id,role:e.role,level:e.level,label:e.label.length>200?e.label.slice(0,200):e.label}:{type:"nav-branch-expanded",chartId:s,nodeId:e.id,role:e.role,level:e.level,expanded:!!i})},[s]),C=Xt.useCallback(e=>{e.id!==g&&(f||h(e.id),r?.(e),$(e,"focus"),e.datum&&x({type:"focus",datum:e.datum,inputType:"navigation-tree",timestamp:Date.now(),chartType:"AccessibleNavTree",chartId:s}))},[r,f,$,g,x,s]),S=Xt.useCallback(e=>{if(e.datum){if("annotation"===e.role){const t=a(e.datum);return c?.({annotation:e.datum,annotationId:t,chartId:s,inputType:"navigation-tree"}),void(t&&x({type:"annotation-activate",annotationId:t,inputType:"navigation-tree",timestamp:Date.now(),chartType:"AccessibleNavTree",chartId:s}))}x({type:"activate",datum:e.datum,inputType:"navigation-tree",timestamp:Date.now(),chartType:"AccessibleNavTree",chartId:s})}},[s,x,c]),A=e=>{u(t=>new Set(t).add(e.id)),$(e,"toggle",!0)},N=e=>{u(t=>{const i=new Set(t);return i.delete(e.id),i}),$(e,"toggle",!1)},j=(e,t,n)=>{const r=!!e.children&&e.children.length>0,o=d.has(e.id);return Yt("li",{role:"treeitem","aria-label":e.label,"aria-level":e.level,"aria-posinset":t,"aria-setsize":n,"aria-expanded":r?o:void 0,"aria-selected":e.id===g,tabIndex:e.id===g?0:-1,ref:t=>{y.current.set(e.id,t)},onClick:t=>{t.stopPropagation(),C(e),r?(o?N:A)(e):S(e)},style:i?{listStyle:"none",padding:"2px 6px",paddingLeft:6+16*(e.level-1),cursor:r?"pointer":"default",fontSize:13,color:"var(--semiotic-text, currentColor)",background:e.id===g?"var(--semiotic-surface, var(--semiotic-grid, var(--semiotic-bg, #f0f4f8)))":"transparent",outline:"none"}:void 0,children:[Yt("span",{className:"semiotic-nav-tree-label semiotic-nav-tree-"+e.role,children:[i&&r?o?"▾ ":"▸ ":"",e.label]}),r&&o&&Kt("ul",{role:"group",style:i?{margin:0,padding:0}:void 0,children:e.children.map((t,i)=>j(t,i+1,e.children.length))})]},e.id)};return Kt("div",{ref:b,className:"semiotic-nav-tree"+(n?" "+n:""),style:i?void 0:ei,onKeyDown:e=>{const t=k.findIndex(e=>e.id===g);if(-1===t)return;const i=k[t],n=!!i.children&&i.children.length>0,r=d.has(i.id);let o=!0;switch(e.key){case"ArrowDown":C(k[Math.min(t+1,k.length-1)]);break;case"ArrowUp":C(k[Math.max(t-1,0)]);break;case"Home":C(k[0]);break;case"End":C(k[k.length-1]);break;case"ArrowRight":n&&!r?A(i):n&&r?C(i.children[0]):o=!1;break;case"ArrowLeft":if(n&&r)N(i);else{const e=w.get(i.id);e?C(e):o=!1}break;case"Enter":case" ":n?(r?N:A)(i):S(i);break;default:o=!1}o&&(e.preventDefault(),e.stopPropagation())},children:Kt("ul",{role:"tree","aria-label":t||"Chart navigation",style:i?{margin:0,padding:0}:void 0,children:j(e,1,1)})})}var ii=new Set(["LineChart","AreaChart","DifferenceChart","StackedAreaChart","Scatterplot","ConnectedScatterplot","BubbleChart","QuadrantChart","MultiAxisLineChart","CandlestickChart","Heatmap","MinimapChart","RealtimeLineChart","RealtimeHeatmap"]),ni=new Set(["BarChart","StackedBarChart","GroupedBarChart","SwarmPlot","BoxPlot","Histogram","ViolinPlot","DotPlot","RidgelinePlot","FunnelChart","LikertChart","SwimlaneChart"]),ri={Scatterplot:["pointRadius","hoverRadius"],BubbleChart:["pointRadius","hoverRadius"],ConnectedScatterplot:["pointRadius","hoverRadius"],QuadrantChart:["pointRadius","hoverRadius"],SwarmPlot:["pointRadius","hoverRadius"],DotPlot:["dotRadius","hoverRadius"]};function oi(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function ai(e){return"string"==typeof e&&e.trim().length>0}function si(e){const t=oi(e.capability)?e.capability:null,i=oi(e.recipe)?e.recipe:null,n=[e.mobileSemantics,e.mobileVisualization,e.mobile,t?.mobile,i?.mobile];for(const e of n)if(oi(e))return e;return null}function li(e){return Array.isArray(e)&&e.length>=2&&"number"==typeof e[0]&&"number"==typeof e[1]&&Number.isFinite(e[0])&&Number.isFinite(e[1])?[e[0],e[1]]:null}function ci(e){return li(e.size)||li(oi(e.frameProps)?e.frameProps.size:void 0)||("number"==typeof e.width&&"number"==typeof e.height?[e.width,e.height]:null)}function di(e,t){e.push({...t,status:"pass"})}function ui(e,t){e.push({...t,status:"warn"})}function mi(e,t){e.push({...t,status:"manual"})}function pi(e,t={},i={}){const n=i.viewportWidth??390,r=i.targetSize??44,o=ci(t),a=l(t,{width:n,height:o?.[1]}),s=[],c=ci(t=a.props),d=si(t),u=function(e,t){return e.includes("CustomChart")||e.includes("Custom")||null!=t.recipeId||null!=t.mobileSemantics}(e,t),m=function(e){const t=si(e);return!0===e.responsive||!0===e.mobile||!0===t?.responsive||!0===t?.supportsResponsiveLayout||Array.isArray(t?.breakpoints)||"number"==typeof t?.minViewportWidth||"responsive"===t?.strategy||"small-multiples"===t?.strategy||"summary-cards"===t?.strategy||null!=e.mobileLayout||null!=e.responsiveRules||"mobile-readable"===e.density}(t),p=!0===i.inChartContainer,h=ai(t.title)||ai(t.summary)||ai(t.description)||!0===d?.summary||ai(d?.summary);if(a.matches.length>0&&di(s,{id:"layout.responsive-rule-applied",category:"layout",impact:"medium",message:`${a.matches.length} responsive rule(s) applied for the ${n}px mobile audit.`}),c){const[t,i]=c;t>n&&!m?ui(s,{id:"layout.fixed-desktop-size",category:"layout",impact:"high",message:`Chart size is ${t}px wide against a ${n}px mobile viewport with no responsive/mobile transform hint.`,fix:"Use responsive sizing, responsiveRules/mobileLayout, or an explicit mobile variant that preserves the task instead of clipping the desktop chart."}):di(s,{id:"layout.fixed-desktop-size",category:"layout",impact:"high",message:"No fixed desktop-width overflow risk is visible from the config."}),"number"==typeof d?.minViewportWidth&&d.minViewportWidth>n&&ui(s,{id:"layout.mobile-min-width",category:"layout",impact:"high",message:`The declared mobile contract supports ${d.minViewportWidth}px minimum, wider than the audited ${n}px viewport.`,fix:"Add a narrower breakpoint, summary-card fallback, or explicit horizontal-scroll affordance with a non-visual equivalent."});const r=t/Math.max(1,i);430>=n&&r>2.4&&"BigNumber"!==e&&ui(s,{id:"layout.wide-aspect-ratio",category:"layout",impact:"medium",message:`Chart aspect ratio is ${r.toFixed(1)}:1, which tends to compress phone charts vertically.`,fix:"Prefer stacked sections, small multiples, cards plus a sparkline, or a taller mobile-specific chart ratio."}),160>i&&"BigNumber"!==e&&ui(s,{id:"layout.too-short-for-reading",category:"layout",impact:"medium",message:`Chart height is ${i}px; most phone charts need enough vertical room for marks plus readable labels.`,fix:"Reserve more vertical space, remove nonessential axes, or switch to a card/sparkline pattern with external labels."})}else mi(s,{id:"layout.unknown-size",category:"layout",impact:"medium",message:"No explicit size is available to audit. This may be responsive, but static mobile overflow cannot be checked.",fix:"Audit rendered widths at 320, 360, 390, and 430px, or pass size/responsiveRules metadata into the config."});const f=function(e){const t=[e.data,e.points,e.lines,e.nodes,e.edges,e.areas,oi(e.frameProps)?e.frameProps.data:void 0];let i=0;for(const e of t)Array.isArray(e)&&(i+=e.length);return i}(t);f>0&&(f>("number"==typeof d?.maxMarks?d.maxMarks:ii.has(e)?1.25*n:ni.has(e)?Math.max(8,Math.floor(n/34)):n)?ui(s,{id:"density.mark-budget",category:"density",impact:ii.has(e)?"medium":"high",message:`${f} data item(s) exceed the rough mobile density budget for ${e} at ${n}px.`,fix:"Aggregate, filter, facet into small multiples, switch to a summary-card plus detail view, or use progressive disclosure."}):di(s,{id:"density.mark-budget",category:"density",impact:"medium",message:f+" data item(s) are within the rough mobile density budget for this component."}));const g=function(e){const t=[e.tickValues,e.xTickValues,e.yTickValues,e.rTickValues,e.oTickValues];let i=0;for(const e of t)Array.isArray(e)&&(i+=e.length);return i>0?i:null}(t),b=!1!==t.showAxes&&!1!==t.axis;if(b&&null!=g){const e=Math.max(3,Math.floor(n/58));g>e&&ui(s,{id:"density.explicit-tick-count",category:"density",impact:"medium",message:`${g} explicit tick(s) exceed a phone-friendly budget of about ${e} at ${n}px.`,fix:"Use adaptive ticks, fewer tickValues, direct labels, or move exact values into a tap-accessible detail panel."})}else b&&(ii.has(e)||ni.has(e))&&mi(s,{id:"density.axis-label-collision",category:"density",impact:"medium",message:"Axes are enabled, but label collision depends on rendered tick text and cannot be checked statically.",fix:"Verify tick labels at phone widths or provide explicit mobile tick density."});!function(e){const t=oi(e.frameProps)?e.frameProps:{};return(!0===e.enableHover||null!=e.tooltipContent||null!=e.tooltip||null!=t.tooltipContent||!0===t.enableHover)&&!function(e){const t=si(e),i=oi(e.mobileInteraction)?e.mobileInteraction:null;return null!=e.controls||null!=e.mobileControls||!0===e.alternativeControls||null!=e.selection||null!=e.onClick||null!=e.onSelect||!0===e.mobileInteraction||!0===i?.tapToSelect||!0===i?.tapToLockTooltip||Array.isArray(t?.interaction?.alternatives)&&t.interaction.alternatives.length>0||"tap"===t?.interaction?.primary||"button"===t?.interaction?.primary||ai(t?.interaction?.hoverFallback)}(e)}(t)?di(s,{id:"interaction.hover-only-detail",category:"interaction",impact:"high",message:"No hover-only detail path is visible from the config."}):ui(s,{id:"interaction.hover-only-detail",category:"interaction",impact:"high",message:"The chart exposes tooltip/hover detail without an obvious tap, selection, or control alternative.",fix:"Enable tap-to-select, a persistent details panel, visible segment buttons, or another non-hover path for the same information."});const y=function(e,t){const i=ri[e];if(!i)return null;let n=i.includes("hoverRadius")?30:null;for(const e of i){const i=t[e];"number"==typeof i&&Number.isFinite(i)&&i>0&&(n=null==n?i:Math.max(n,i))}return null==n?null:2*n}(e,t),v=oi(t.mobileInteraction)?t.mobileInteraction:null,x=y??("number"==typeof v?.targetSize?v.targetSize:!0===t.mobileInteraction?44:"number"==typeof d?.minimumHitTarget?d.minimumHitTarget:"number"==typeof d?.interaction?.targetSize?d.interaction.targetSize:null);null!=x&&(24>x?ui(s,{id:"interaction.target-size-minimum",category:"interaction",impact:"high",message:`Small interactive marks expose an estimated ${x}px pointer target, below WCAG's 24px minimum.`,fix:"Increase mark radius/hoverRadius, add tap snapping to nearest datum, or provide larger external controls."}):r>x?ui(s,{id:"interaction.target-size-comfort",category:"interaction",impact:"medium",message:`Pointer target is about ${x}px, above 24px but below the ${r}px comfortable phone target.`,fix:"Use hoverRadius/tapRadius near 44px while keeping the visible mark small if needed."}):di(s,{id:"interaction.target-size-comfort",category:"interaction",impact:"medium",message:`Pointer target is about ${x}px, meeting the configured ${r}px target.`}));const w=[];null==t.brush&&null==t.onBrush||w.push("brush"),!0===t.zoomable&&w.push("pan/zoom"),"isolate"!==t.legendInteraction&&"highlight"!==t.legendInteraction||w.push("legend filtering"),w.length>0&&!function(e,t){const i=si(e),n=oi(e.mobileInteraction)?e.mobileInteraction:null,r=n?.standardControls;return!!(null!=e.controls||null!=e.mobileControls||!0===e.alternativeControls||Array.isArray(i?.interaction?.alternatives)&&i.interaction.alternatives.length>0)||!0===r||"all"===r||t.every(e=>"brush"===e?Array.isArray(r)?r.includes("brush"):"brush"===r:"pan/zoom"===e?Array.isArray(r)?r.includes("zoom"):"zoom"===r:"legend filtering"===e&&(Array.isArray(r)?r.includes("legend"):"legend"===r))}(t,w)&&ui(s,{id:"interaction.complex-gesture-alternative",category:"interaction",impact:"high",message:`Mobile-hostile complex interaction detected: ${w.join(", ")} without standard control alternatives.`,fix:"Pair gestures with buttons, range inputs, chips, or a details panel that works with touch and keyboard."}),!1===t.showLegend||!1===t.legend||!0!==t.showLegend&&!0!==t.legend&&null==t.colorBy&&null==t.groupBy&&null==t.lineBy&&null==t.areaBy&&null==t.stackBy||!0===t.directLabel||!0===t.showLabels||"direct"===t.labelStrategy||"direct-end"===t.labelStrategy||"direct"===d?.labels?.strategy||"inline"===d?.labels?.strategy||"external"===d?.labels?.strategy||n>430||ui(s,{id:"semantics.legend-over-direct-labels",category:"semantics",impact:"medium",message:"The chart appears to rely on a legend instead of direct labels at phone width.",fix:"Prefer direct end labels, inline labels, or a compact chip selector so readers do not bounce between plot and legend."});const k=Array.isArray(t.annotations)?t.annotations.filter(e=>oi(e)):[];if(k.length>("number"==typeof d?.maxAnnotations?d.maxAnnotations:3)&&430>=n&&ui(s,{id:"annotation.mobile-density",category:"annotation",impact:"medium",message:k.length+" annotation(s) compete for phone plot space.",fix:"Assign annotation priority, collapse secondary notes into a callout list, or provide shorter mobileText."}),k.length>0){const e=k.filter(e=>!ai(e.mobileText)&&!ai(e.shortText)&&!ai(e.label));e.length>0&&mi(s,{id:"annotation.mobile-copy",category:"annotation",impact:"low",message:e.length+" annotation(s) lack explicit short/mobile copy.",fix:"Add mobileText or shortText for notes that need to survive narrow layouts."})}m||"BigNumber"===e||mi(s,{id:"layout.no-responsive-transform",category:"layout",impact:"low",message:"No explicit responsive transformation hint is present.",fix:"Declare responsiveRules/mobileLayout or a density/label strategy so the mobile version is a designed transformation, not an accidental resize."}),u&&(d?(di(s,{id:"semantics.custom-mobile-contract",category:"semantics",impact:"medium",message:"Custom chart/recipe provides a mobileSemantics/mobile contract, so the audit can inspect its authored phone behavior."}),!1===d.custom?.dataBearingSceneNodes?ui(s,{id:"semantics.custom-data-bearing-scene",category:"semantics",impact:"medium",message:"Custom mobile contract says emitted scene nodes are not data-bearing.",fix:"Preserve datum references, semantic roles, or accessible-table fields so intelligence, navigation, and tap details can recover the chart's meaning."}):!0!==d.custom?.dataBearingSceneNodes&&mi(s,{id:"semantics.custom-data-bearing-scene",category:"semantics",impact:"low",message:"Custom chart mobile contract does not state whether scene nodes are data-bearing.",fix:"Set mobile.custom.dataBearingSceneNodes and mobile.custom.navigationGranularity for custom layouts and interoperability adapters."})):mi(s,{id:"semantics.custom-mobile-contract",category:"semantics",impact:"medium",message:"Custom chart layout is opaque to static mobile analysis because no mobileSemantics/mobile contract is present.",fix:"Declare mobileSemantics with strategy, breakpoints, mark budgets, touch target size, interaction alternatives, and custom scene semantics."})),h||p||ui(s,{id:"semantics.no-mobile-summary",category:"semantics",impact:"medium",message:"No title, summary, description, or ChartContainer context is visible from the config.",fix:"Add title/summary text or wrap in ChartContainer so the small-screen reader gets the task before the chart."});const $=s.filter(e=>"warn"===e.status),C={highRisk:$.filter(e=>"high"===e.impact).length,warnings:$.length,manual:s.filter(e=>"manual"===e.status).length,passes:s.filter(e=>"pass"===e.status).length};return{component:e,viewportWidth:n,ok:0===C.highRisk,summary:C,findings:s,reference:"Mobile visualization audit: informed by MobileVisFixer, mobile exploratory interaction research, small-multiple mobile studies, responsive visualization grammars, constraint-based breakpoints, and WCAG 2.2 input modalities."}}var hi={pass:"PASS",warn:"WARN",manual:"MANUAL","not-applicable":"N/A"},fi=["layout","density","interaction","annotation","semantics"];function gi(e){const t=[],i=e.summary,n=e.ok?`no high-risk mobile blockers at ${e.viewportWidth}px`:`${i.highRisk} high-risk mobile issue(s) at ${e.viewportWidth}px`;t.push(`${e.ok?"PASS":"WARN"} ${e.component}: mobile visualization audit`),t.push(` ${n} - ${i.warnings} warning(s) - ${i.manual} manual check(s)`);for(const i of fi){const n=e.findings.filter(e=>e.category===i&&"not-applicable"!==e.status);if(0!==n.length){t.push(""),t.push(" "+i.toUpperCase());for(const e of n)t.push(` ${hi[e.status]} [${e.impact}] ${e.id}: ${e.message}`),!e.fix||"warn"!==e.status&&"manual"!==e.status||t.push(" -> "+e.fix)}}return t.push(""),t.push(" Ref: "+e.reference),t.join("\n")}function bi(){return["Static audit only: rendered label collision, CSS-resolved type size, and actual touch behavior still require viewport testing.","Use multiple widths, usually 320, 360, 390, 430, and 768 CSS pixels.","A mobile pass means no high-risk static warnings, not that the chart is perceptually or ergonomically optimal."]}import*as yi from"react";function vi(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function xi(e){return e&&"object"==typeof e&&"number"==typeof e.targetSize?e.targetSize:void 0}function wi(e){return Array.isArray(e)?e.length>0:!!e}import{Fragment as ki,jsx as $i,jsxs as Ci}from"react/jsx-runtime";var Si={position:"absolute",width:1,height:1,overflow:"hidden",clip:"rect(0,0,0,0)",whiteSpace:"nowrap",border:0,padding:0,margin:-1};function Ai(){const e=d();return e?$i("button",{className:"semiotic-chart-action",onClick:e,title:"Data summary","aria-label":"Toggle data summary",style:Ti,children:Ci("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[$i("rect",{x:"1",y:"1",width:"12",height:"3",rx:"0.5"}),$i("rect",{x:"1",y:"6",width:"8",height:"3",rx:"0.5"}),$i("rect",{x:"1",y:"11",width:"5",height:"2",rx:"0.5"})]})}):null}var Ni={info:"var(--semiotic-info, #2563eb)",success:"var(--semiotic-success, #16a34a)",warning:"var(--semiotic-warning, #d97706)",error:"var(--semiotic-error, var(--semiotic-danger, #dc2626))",neutral:"var(--semiotic-text-secondary, #6b7280)"},ji={error:4,warning:3,info:2,success:1,neutral:0};function Ii({level:e}){const t={width:15,height:15,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0};switch(e){case"error":case"warning":return Ci("svg",{...t,children:[$i("path",{d:"M8 1.8 15 14H1L8 1.8Z"}),$i("path",{d:"M8 6.4v3.4"}),$i("circle",{cx:"8",cy:"11.8",r:"0.5",fill:"currentColor",stroke:"none"})]});case"success":return Ci("svg",{...t,children:[$i("circle",{cx:"8",cy:"8",r:"6.4"}),$i("path",{d:"M5 8.2 7 10.2 11 5.8"})]});case"info":return Ci("svg",{...t,children:[$i("circle",{cx:"8",cy:"8",r:"6.4"}),$i("path",{d:"M8 7.4V11"}),$i("circle",{cx:"8",cy:"5",r:"0.5",fill:"currentColor",stroke:"none"})]});default:return Ci("svg",{...t,children:[$i("path",{d:"M8 2a3.5 3.5 0 0 0-3.5 3.5c0 4-1.5 5-1.5 5h10s-1.5-1-1.5-5A3.5 3.5 0 0 0 8 2Z"}),$i("path",{d:"M6.5 13a1.5 1.5 0 0 0 3 0"})]})}}function Li({notification:e,level:t,onDismiss:i}){const n=Ni[t]??Ni.info,r=!1!==e.dismissible;return Ci("div",{className:"semiotic-chart-notification semiotic-chart-notification--"+t,style:{display:"flex",alignItems:"flex-start",gap:8,padding:"6px 10px",borderRadius:4,borderLeft:"3px solid "+n,background:"var(--semiotic-surface, rgba(127, 127, 127, 0.08))"},children:[Ci("div",{style:{flex:1,minWidth:0},children:[e.source&&$i("div",{className:"semiotic-chart-notification-source",style:{fontSize:9,fontWeight:700,letterSpacing:"0.06em",textTransform:"uppercase",color:"var(--semiotic-text-secondary, #666)"},children:e.source}),e.title&&$i("div",{className:"semiotic-chart-notification-title",style:{fontSize:12,fontWeight:600,color:n},children:e.title}),$i("div",{className:"semiotic-chart-notification-message",style:{fontSize:12,lineHeight:1.45,color:"var(--semiotic-text, #333)"},children:e.message})]}),r&&$i("button",{className:"semiotic-chart-notification-dismiss","aria-label":e.title?"Dismiss notification: "+e.title:"Dismiss notification",title:"Dismiss",onClick:i,style:{...Ti,width:18,height:18,fontSize:13,lineHeight:1,flex:"none"},children:"×"})]})}function Pi({visible:e,onDismiss:t}){const[i,n]=yi.useState(!1),r=yi.useRef(null),o=yi.useRef(null);if(yi.useEffect(()=>{0===e.length&&i&&n(!1)},[e.length,i]),yi.useEffect(()=>{if(!i)return;const e=e=>{r.current&&!r.current.contains(e.target)&&n(!1)},t=e=>{"Escape"===e.key&&(n(!1),o.current?.focus())};return document.addEventListener("mousedown",e),document.addEventListener("keydown",t),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",t)}},[i]),0===e.length)return null;const a=e.reduce((e,t)=>ji[t.level]>ji[e]?t.level:e,e[0].level),s=Ni[a]??Ni.info,l=e.length,c=`${l} chart notification${1===l?"":"s"}, most severe: ${a}`;return Ci("div",{ref:r,className:"semiotic-chart-notifications",style:{position:"relative",display:"inline-flex"},children:[$i("span",{style:Si,role:"status","aria-live":"polite",children:c}),Ci("button",{ref:o,className:"semiotic-chart-action semiotic-chart-notifications-toggle","aria-haspopup":"dialog","aria-expanded":i,"aria-label":`${c}. ${i?"Hide":"Show"} notifications`,title:c,onClick:()=>n(e=>!e),style:{...Ti,color:s,position:"relative"},children:[$i(Ii,{level:a}),$i("span",{className:"semiotic-chart-notifications-badge","aria-hidden":"true",style:{position:"absolute",top:-3,right:-3,minWidth:15,height:15,padding:"0 3px",boxSizing:"border-box",borderRadius:8,background:s,color:"#fff",fontSize:9,fontWeight:700,lineHeight:"15px",textAlign:"center"},children:l>99?"99+":l})]}),i&&$i("div",{className:"semiotic-chart-notifications-popover",role:"dialog","aria-label":"Chart notifications",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:20,width:320,maxWidth:"min(360px, 90vw)",maxHeight:320,overflowY:"auto",display:"flex",flexDirection:"column",gap:6,padding:10,textAlign:"left",background:"var(--semiotic-bg, #fff)",border:"1px solid var(--semiotic-border, #e0e0e0)",borderRadius:6,boxShadow:"0 6px 24px rgba(0, 0, 0, 0.16)"},children:e.map(e=>$i(Li,{notification:e.notification,level:e.level,onDismiss:()=>t(e)},e.key))})]})}var Ri={live:{bg:"#22c55e",color:"#fff"},stale:{bg:"#ef4444",color:"#fff"},paused:{bg:"#eab308",color:"#000"},error:{bg:"#ef4444",color:"#fff"},static:{bg:"#6b7280",color:"#fff"}};function Mi({height:e}){return $i("div",{role:"status","aria-busy":"true","aria-label":"Loading chart",style:{width:"100%",height:e,background:"linear-gradient(90deg, var(--semiotic-border, #e0e0e0) 25%, var(--semiotic-bg, #f5f5f5) 50%, var(--semiotic-border, #e0e0e0) 75%)",backgroundSize:"200% 100%",animation:"semiotic-skeleton-pulse 1.5s ease-in-out infinite",borderRadius:4}})}function Bi({error:e}){return $i("div",{role:"alert",style:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%",height:"100%",minHeight:120,padding:24,boxSizing:"border-box"},children:$i("div",{style:{textAlign:"center",maxWidth:400,fontSize:14,color:"var(--semiotic-text-secondary, #666)",lineHeight:1.5},children:e})})}var Di=yi.forwardRef(function({title:t,subtitle:i,children:n,width:o="100%",height:a=400,actions:s,chartConfig:l,describe:c,navigable:d,controls:u,banner:m,notifications:p,onNotificationDismiss:h,loading:b=!1,error:y,errorBoundary:v=!1,status:x,detailsPanel:w,mobile:k,mobileAudit:$,className:C,style:S},A){const N=yi.useRef(null),j=yi.useRef(null),[I,L]=yi.useState(!1),[P,R]=yi.useState(()=>new Set);yi.useEffect(()=>{R(e=>{if(0===e.size)return e;const t=new Set((p??[]).map((e,t)=>e.id??t+""));let i=!1;const n=new Set;for(const r of e)t.has(r)?n.add(r):i=!0;return i?n:e})},[p]);const M=yi.useMemo(()=>p?p.map((e,t)=>({notification:e,index:t,key:e.id??t+"",level:e.level??"info"})).filter(({key:e})=>!P.has(e)):[],[p,P]),B=yi.useCallback(e=>{R(t=>new Set(t).add(e.key)),h?.(e.notification,e.index)},[h]),D=!1!==s?.export&&void 0!==s?.export,T=!1!==s?.fullscreen&&void 0!==s?.fullscreen,z=!1!==s?.copyConfig&&void 0!==s?.copyConfig&&l,F=!0===s?.dataSummary,E=yi.useMemo(()=>{if(!c||!l?.component||!l?.props)return"";const e="object"==typeof c?c.levels:void 0;try{return mt(l.component,l.props,e?{levels:e}:{}).text}catch{return""}},[c,l]),O="object"==typeof c&&!0===c.visible,H=yi.useMemo(()=>{if(!d||!l?.component||!l?.props)return null;const e="object"==typeof d?d.maxLeaves:void 0;try{return bt(l.component,l.props,e?{maxLeaves:e}:{})}catch{return null}},[d,l]),W="object"==typeof d&&!0===d.visible,V=yi.useMemo(()=>"object"==typeof s?.export?s.export:{},[s?.export]),U="object"==typeof s?.copyConfig?s.copyConfig.format:"json",G=yi.useCallback(async e=>{j.current&&await g(j.current,{...V,...e})},[V]),q=yi.useCallback(()=>{N.current&&(document.fullscreenElement?document.exitFullscreen().catch(()=>{}):N.current.requestFullscreen().catch(()=>{}))},[]),J=yi.useCallback(async e=>{l&&await le({...l,version:l.version??"1",createdAt:l.createdAt??(new Date).toISOString()},e||U||"json")},[l,U]);yi.useEffect(()=>{const e=()=>{L(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[]),yi.useImperativeHandle(A,()=>({export:G,toggleFullscreen:q,copyConfig:J,element:N.current}),[G,q,J]);const _=!0===k?{}:k&&"object"==typeof k?k:null,Z=!!k,Q=_?.breakpoint??480,X=void 0===_?.chartMode?"mobile":_.chartMode,K=_?.semantics,Y=_?.mobileInteraction??(!!Z||void 0),ee=_?.standardControls,te=vi(ee)?ee:null,ie=te?.controls??(vi(ee)?void 0:ee)??function(e){return e&&"object"==typeof e?e.standardControls:void 0}(Y),ne=yi.useMemo(()=>function(e,t){return wi(t)?e&&"object"==typeof e?{...e,standardControls:t}:!1===e||null==e?e:{standardControls:t}:e}(Y,ie),[Y,ie]),re=Z&&wi(ie)?$i(e,{controls:ie,targetSize:te?.targetSize??xi(Y)??44,compact:te?.compact??!0,className:te?.className,style:te?.style,ariaLabel:te?.ariaLabel,brush:te?.brush,zoom:te?.zoom,legend:te?.legend}):null,oe=_?.summary,ae=!0===_?.allowHorizontalScroll,se=!0===_?.hideToolbar,ce=yi.useMemo(()=>{if(!$||!l?.component||!l?.props)return null;const e="object"==typeof $?$:{},t=l.props;try{return pi(l.component,{...t,mobileSemantics:t.mobileSemantics??K,mobileInteraction:t.mobileInteraction??ne},{viewportWidth:e.viewportWidth??390,targetSize:e.targetSize??44,inChartContainer:!0})}catch{return null}},[$,l,K,ne]);yi.useEffect(()=>{if(!ce||ce.ok)return;const e=ce.findings.filter(e=>"pass"!==e.status).slice(0,5);console.warn(`[Semiotic mobile audit] ${l?.component}: ${ce.summary.highRisk} high-risk mobile finding(s), ${ce.summary.warnings} warning(s).`,e)},[ce,l?.component]);const de=ce&&!ce.ok&&"object"==typeof $&&!0===$.visible?Ci("div",{className:"semiotic-chart-mobile-audit",role:"status",style:{padding:"8px 12px",fontSize:12,lineHeight:1.45,color:"var(--semiotic-warning, #6b3f00)",background:"color-mix(in srgb, var(--semiotic-warning, #d97706) 14%, var(--semiotic-bg, #fff))",borderBottom:"1px solid var(--semiotic-border, #e0e0e0)"},children:["Mobile audit: ",ce.summary.highRisk," high-risk finding",1===ce.summary.highRisk?"":"s"," and"," ",ce.summary.warnings," warning",1===ce.summary.warnings?"":"s"," at"," ",("object"==typeof $?$.viewportWidth:void 0)??390,"px."]}):null,ue=M.length>0,me=t||i||u||D||T||z||F||x||ue,pe=yi.useMemo(()=>{if(!Z||!yi.isValidElement(n))return n;if(!function(e){const t=e.type;return"function"==typeof t||"object"==typeof t&&null!==t}(n))return n;const e=n.props,t={};return X&&null==e.mode&&(t.mode=X),K&&null==e.mobileSemantics&&(t.mobileSemantics=K),void 0!==ne&&null==e.mobileInteraction&&(t.mobileInteraction=ne),Object.keys(t).length>0?yi.cloneElement(n,t):n},[n,Z,X,K,ne]),he=b?$i(Mi,{height:a}):y?$i(Bi,{error:y}):v?$i(f,{children:pe}):pe;return fe=Ci(ki,{children:[$i("style",{dangerouslySetInnerHTML:{__html:`@keyframes semiotic-skeleton-pulse {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n@media (max-width: ${Q}px) {\n .semiotic-chart-container[data-semiotic-mobile="true"] .semiotic-chart-header {\n padding: 10px 12px !important;\n gap: 10px !important;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"] .semiotic-chart-title-area {\n flex-basis: 100% !important;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"] .semiotic-chart-toolbar {\n width: 100% !important;\n margin-left: 0 !important;\n justify-content: flex-start !important;\n overflow-x: auto !important;\n -webkit-overflow-scrolling: touch;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"][data-semiotic-mobile-hide-toolbar="true"] .semiotic-chart-toolbar {\n display: none !important;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"] .semiotic-chart-action {\n min-width: 32px !important;\n min-height: 32px !important;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"] .semiotic-chart-mobile-summary {\n display: block !important;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"] .semiotic-chart-mobile-standard-controls {\n display: block !important;\n }\n .semiotic-chart-container[data-semiotic-mobile="true"][data-semiotic-mobile-scroll="true"] .semiotic-chart-body {\n overflow-x: auto !important;\n justify-content: flex-start !important;\n -webkit-overflow-scrolling: touch;\n }\n}`}}),Ci("div",{ref:N,className:"semiotic-chart-container"+(C?" "+C:""),"data-semiotic-mobile":Z?"true":void 0,"data-semiotic-mobile-scroll":ae?"true":void 0,"data-semiotic-mobile-hide-toolbar":se?"true":void 0,style:{width:o,border:"1px solid var(--semiotic-border, #e0e0e0)",borderRadius:"var(--semiotic-border-radius, 8px)",overflow:"hidden",background:"var(--semiotic-bg, #fff)",fontFamily:"var(--semiotic-font-family, sans-serif)",position:"relative",...I?{display:"flex",flexDirection:"column",width:"100%",height:"100%"}:{},...S},children:[me&&Ci("div",{className:"semiotic-chart-header",style:{padding:"12px 16px",display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:8,borderBottom:"1px solid var(--semiotic-border, #e0e0e0)"},children:[Ci("div",{className:"semiotic-chart-title-area",style:{minWidth:0,flex:"1 1 200px"},children:[t&&$i("div",{className:"semiotic-chart-title",style:{fontSize:14,fontWeight:600,color:"var(--semiotic-text, #333)"},children:t}),i&&$i("div",{className:"semiotic-chart-subtitle",style:{fontSize:12,color:"var(--semiotic-text-secondary, #666)",marginTop:t?2:0},children:i})]}),Ci("div",{className:"semiotic-chart-toolbar",style:{display:"flex",alignItems:"center",gap:4,marginLeft:"auto"},children:[u,ue&&$i(Pi,{visible:M,onDismiss:B}),D&&$i("button",{className:"semiotic-chart-action",onClick:()=>G(),title:"Export chart","aria-label":"Export chart",style:Ti,children:Ci("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[$i("path",{d:"M7 2v8M3.5 7L7 10.5 10.5 7"}),$i("path",{d:"M2 12h10"})]})}),F&&$i(Ai,{}),T&&$i("button",{className:"semiotic-chart-action",onClick:q,title:I?"Exit fullscreen":"Fullscreen","aria-label":I?"Exit fullscreen":"Enter fullscreen",style:Ti,children:$i("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:Ci(ki,I?{children:[$i("path",{d:"M9 1v4h4"}),$i("path",{d:"M5 13V9H1"}),$i("path",{d:"M13 5H9V1"}),$i("path",{d:"M1 9h4v4"})]}:{children:[$i("path",{d:"M1 5V1h4"}),$i("path",{d:"M13 9v4H9"}),$i("path",{d:"M9 1h4v4"}),$i("path",{d:"M5 13H1V9"})]})})}),z&&$i("button",{className:"semiotic-chart-action",onClick:()=>J(),title:"Copy config","aria-label":"Copy chart configuration",style:Ti,children:Ci("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[$i("rect",{x:"5",y:"5",width:"8",height:"8",rx:"1"}),$i("path",{d:"M9 5V2a1 1 0 00-1-1H2a1 1 0 00-1 1v6a1 1 0 001 1h3"})]})}),x&&$i("div",{className:"semiotic-chart-status","aria-live":"polite","aria-atomic":"true",style:{padding:"2px 8px",borderRadius:4,fontSize:10,fontWeight:700,letterSpacing:"0.05em",textTransform:"uppercase",background:Ri[x].bg,color:Ri[x].color,lineHeight:"18px"},children:x})]})]}),m&&$i("div",{className:"semiotic-chart-banner",children:m}),de,oe&&$i("div",{className:"semiotic-chart-mobile-summary",style:{display:"none",padding:"8px 12px",fontSize:12,lineHeight:1.45,color:"var(--semiotic-text-secondary, #666)",borderBottom:"1px solid var(--semiotic-border, #e0e0e0)"},children:oe}),re&&$i("div",{className:"semiotic-chart-mobile-standard-controls",style:{display:"none",padding:"10px 12px",borderBottom:"1px solid var(--semiotic-border, #e0e0e0)",background:"var(--semiotic-surface, var(--semiotic-bg, #f6f8fa))"},children:re}),E&&$i("div",{className:"semiotic-chart-description",role:"note",style:O?{padding:"8px 16px",fontSize:12,lineHeight:1.5,color:"var(--semiotic-text-secondary, #666)",borderBottom:"1px solid var(--semiotic-border, #e0e0e0)"}:Si,children:E}),H&&$i("div",{className:"semiotic-chart-nav",style:W?{padding:"8px 8px",borderBottom:"1px solid var(--semiotic-border, #e0e0e0)",maxHeight:240,overflow:"auto"}:void 0,children:$i(ti,{tree:H,label:"string"==typeof t&&t?t+" — navigable structure":"Chart navigable structure",visible:W,chartId:"string"==typeof l?.props?.chartId?l.props.chartId:void 0})}),Ci("div",{className:"semiotic-chart-body",ref:j,style:{position:"relative",overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",...I?{flex:1}:{height:a}},children:[he,w]})]})]}),F?$i(r,{children:fe}):fe;var fe}),Ti={width:24,height:24,display:"flex",alignItems:"center",justifyContent:"center",border:"none",background:"transparent",cursor:"pointer",borderRadius:4,color:"var(--semiotic-text-secondary, #666)",padding:0};import*as zi from"react";import{jsx as Fi,jsxs as Ei}from"react/jsx-runtime";function Oi({children:e,controls:t,mobile:i,breakpoint:n=480,chartMode:r="mobile",mobileInteraction:o=!0,mobileSemantics:a,mobileSummary:s,chips:l=[],activeChip:c,onChipChange:d,detail:u,detailTitle:m="Details",detailMode:p="sheet",initialDetailOpen:h=!1,allowHorizontalScroll:f=!1,hideToolbar:g=!1,chartDefaults:b,...y}){const[v,x]=zi.useState(()=>c??l.find(e=>!e.disabled)?.id),[w,k]=zi.useState(h);zi.useEffect(()=>{void 0===c&&(l.length?l.some(e=>e.id===v&&!e.disabled)||x(l.find(e=>!e.disabled)?.id):x(void 0))},[c,l,v]);const $=c??v,C=zi.useCallback(e=>{e.disabled||(void 0===c&&x(e.id),d?.(e))},[c,d]),S=l.length?Fi("div",{className:"semiotic-mobile-chip-row",role:"list","aria-label":"Mobile chart controls",children:l.map(e=>Ei("button",{type:"button",className:"semiotic-mobile-chip","aria-pressed":e.id===$,disabled:e.disabled,onClick:()=>C(e),title:"string"==typeof e.description?e.description:void 0,children:[Fi("span",{children:e.label}),e.description&&Fi("small",{className:"semiotic-mobile-chip-description",children:e.description})]},e.id))}):null,A=s||S?Ei("div",{className:"semiotic-mobile-summary-card",children:[s&&Fi("div",{className:"semiotic-mobile-summary-copy",children:s}),S]}):i?.summary,N={breakpoint:n,chartMode:r,mobileInteraction:o,semantics:a,allowHorizontalScroll:f,hideToolbar:g,...i,summary:A},j=zi.useMemo(()=>{if(!b||!zi.isValidElement(e))return e;const t=e.props,i={};for(const[e,n]of Object.entries(b))null==t[e]&&(i[e]=n);return Object.keys(i).length>0?zi.cloneElement(e,i):e},[e,b]),I=!!u&&"sheet"===p,L=!!u&&"inline"===p||I&&w,P=I?Fi("button",{type:"button",className:"semiotic-mobile-detail-toggle","aria-expanded":w,onClick:()=>k(e=>!e),children:w?"Hide details":"Show details"}):null,R=t||P?Ei("div",{className:"semiotic-mobile-control-stack",children:[t,P]}):void 0;return Ei("div",{className:"semiotic-mobile-chart-shell",children:[Fi("style",{children:`\n .semiotic-mobile-chart-shell {\n display: grid;\n gap: 10px;\n width: 100%;\n }\n .semiotic-mobile-summary-card {\n display: grid;\n gap: 10px;\n }\n .semiotic-mobile-summary-copy {\n font-size: 13px;\n line-height: 1.45;\n }\n .semiotic-mobile-chip-row {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding-bottom: 2px;\n -webkit-overflow-scrolling: touch;\n }\n .semiotic-mobile-chip {\n display: inline-flex;\n flex: 0 0 auto;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n min-height: 40px;\n min-width: 44px;\n border: 1px solid var(--semiotic-border, #d8d8d8);\n border-radius: 999px;\n padding: 7px 12px;\n background: var(--semiotic-bg, #fff);\n color: var(--semiotic-text, #222);\n font: inherit;\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n }\n .semiotic-mobile-chip[aria-pressed="true"] {\n border-color: var(--semiotic-accent, #1f7a6d);\n background: color-mix(in srgb, var(--semiotic-accent, #1f7a6d) 14%, transparent);\n }\n .semiotic-mobile-chip:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n }\n .semiotic-mobile-chip-description {\n display: block;\n max-width: 160px;\n margin-top: 2px;\n color: var(--semiotic-text-secondary, #666);\n font-size: 10px;\n font-weight: 500;\n line-height: 1.2;\n }\n .semiotic-mobile-control-stack {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n .semiotic-mobile-detail-toggle {\n min-height: 32px;\n border: 1px solid var(--semiotic-border, #d8d8d8);\n border-radius: 999px;\n padding: 5px 10px;\n background: transparent;\n color: var(--semiotic-text, #222);\n font: inherit;\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n }\n .semiotic-mobile-detail-panel {\n border: 1px solid var(--semiotic-border, #d8d8d8);\n border-radius: 16px;\n background: var(--semiotic-bg, #fff);\n color: var(--semiotic-text, #222);\n box-shadow: 0 18px 48px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n }\n .semiotic-mobile-detail-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--semiotic-border, #d8d8d8);\n font-size: 13px;\n font-weight: 800;\n }\n .semiotic-mobile-detail-body {\n padding: 12px;\n font-size: 13px;\n line-height: 1.5;\n }\n @media (max-width: ${n}px) {\n .semiotic-mobile-detail-panel[data-mode="sheet"] {\n position: sticky;\n bottom: 8px;\n z-index: 2;\n max-height: min(55vh, 420px);\n overflow: auto;\n }\n }\n `}),Fi(Di,{...y,controls:R,mobile:N,children:j}),L&&Ei("section",{className:"semiotic-mobile-detail-panel","data-mode":p,"aria-label":"string"==typeof m?m:"Chart details",children:[Ei("div",{className:"semiotic-mobile-detail-header",children:[Fi("span",{children:m}),I&&Fi("button",{type:"button",className:"semiotic-mobile-detail-toggle",onClick:()=>k(!1),children:"Close"})]}),Fi("div",{className:"semiotic-mobile-detail-body",children:u})]})]})}import*as Hi from"react";import{jsx as Wi,jsxs as Vi}from"react/jsx-runtime";function Ui(e,t){if(t)return"function"==typeof t?t(e):e?.[t]}function Gi(e,t){const i="function"==typeof t?t(e):e[t];return Array.isArray(i)?i:[]}function qi(e){return{strategy:"small-multiples",responsive:!0,supportsResponsiveLayout:!0,summary:`${e} vertically stacked small multiple panel${1===e?"":"s"} with shared scale guidance.`,interaction:{primary:"tap",alternatives:["panel summary","linked selection"],hoverFallback:"tap-to-lock",targetSize:44},labels:{strategy:"external",minFontSize:12}}}function Ji(e,t){if(!Hi.isValidElement(e))return e;const i=e.props,n={};for(const[e,r]of Object.entries(t))void 0!==r&&null==i[e]&&(n[e]=r);return Object.keys(n).length>0?Hi.cloneElement(e,n):e}function _i({items:e,children:t,columns:i=3,tabletColumns:n=2,mobileColumns:r=1,mobileBreakpoint:a=480,tabletBreakpoint:s=860,gap:l=12,mode:c="mobile",chartHeight:d=220,sharedExtent:m=!0,valueAccessor:p,dataAccessor:h="data",extentProps:f=["yExtent","valueExtent"],linkedHover:g,selection:b,linkedBy:y,linkProvider:v="auto",selections:x,showLegend:w=!1,legendPosition:k,legendInteraction:$,legendSelectionName:C,legendField:S,mobileInteraction:A=!0,mobileSemantics:N,labelMode:j="panel",chartDefaults:I,className:L,style:P}){const R=u(),M=e||"function"==typeof t?[]:Hi.Children.toArray(t),B=e??M.map((e,t)=>({id:"panel-"+(t+1)})),D=B.length,T=Hi.useMemo(()=>function(e,t,i,n){if(t&&"object"==typeof t)return t;if(!1===t)return{};const r=[],o=[];for(const t of e)if(t.extent&&r.push(t.extent[0],t.extent[1]),n)for(const e of Gi(t,i))o.push(Ui(e,n));const a=function(e){let t=1/0,i=-1/0;for(const n of e){const e=Number(n);Number.isFinite(e)&&(t>e&&(t=e),e>i&&(i=e))}if(Number.isFinite(t)&&Number.isFinite(i))return t===i?[t-1,i+1]:[t,i]}(o.length?o:r);return a?{yExtent:a,valueExtent:a}:{}}(B,m,h,p),[B,m,h,p]),z=Hi.useMemo(()=>{if(!y)return{name:void 0,fields:void 0,linkedHover:g,selection:b};const e=Array.isArray(y)?"small-multiples":y.name||"small-multiples",t=Array.isArray(y)?y:y.fields||[];return{name:e,fields:t,linkedHover:g??{name:e,fields:t},selection:b??{name:e}}},[y,g,b]),F=Hi.useMemo(()=>({linkedHover:z.linkedHover,selection:z.selection}),[z.linkedHover,z.selection]),E=Hi.useMemo(()=>{const e={mode:c,height:d,responsiveWidth:!0,mobileInteraction:A,mobileSemantics:N??qi(D),...F,...I};"legend"!==j&&(e.showLegend=!1),"direct"===j&&(e.directLabel=!0);for(const t of f)t in T&&(e[t]=T[t]);return e},[c,d,A,N,D,F,I,j,f,T]),O=Vi("section",{className:["semiotic-small-multiple-chart",L].filter(Boolean).join(" "),style:P,"data-semiotic-small-multiple":"true",children:[Wi("style",{children:`\n .semiotic-small-multiple-chart {\n --semiotic-small-multiple-columns: ${i};\n --semiotic-small-multiple-gap: ${l}px;\n display: grid;\n grid-template-columns: repeat(var(--semiotic-small-multiple-columns), minmax(0, 1fr));\n gap: var(--semiotic-small-multiple-gap);\n width: 100%;\n }\n .semiotic-small-multiple-panel {\n min-width: 0;\n border: 1px solid var(--semiotic-border, #d8d8d8);\n border-radius: 16px;\n background: var(--semiotic-bg, #fff);\n overflow: hidden;\n }\n .semiotic-small-multiple-heading {\n display: grid;\n gap: 3px;\n padding: 10px 12px 0;\n }\n .semiotic-small-multiple-title {\n margin: 0;\n color: var(--semiotic-text, #222);\n font-size: 13px;\n font-weight: 800;\n line-height: 1.25;\n }\n .semiotic-small-multiple-subtitle,\n .semiotic-small-multiple-summary {\n margin: 0;\n color: var(--semiotic-text-secondary, #666);\n font-size: 11px;\n line-height: 1.35;\n }\n .semiotic-small-multiple-plot {\n min-width: 0;\n padding: 4px 6px 8px;\n overflow: hidden;\n }\n @media (max-width: ${s}px) {\n .semiotic-small-multiple-chart {\n --semiotic-small-multiple-columns: ${n};\n }\n }\n @media (max-width: ${a}px) {\n .semiotic-small-multiple-chart {\n --semiotic-small-multiple-columns: ${r};\n }\n .semiotic-small-multiple-panel {\n border-radius: 14px;\n }\n .semiotic-small-multiple-heading {\n padding: 9px 10px 0;\n }\n }\n `}),B.map((e,i)=>{const n={...E},r="function"==typeof t?t(e,{item:e,index:i,count:D,chartProps:n,sharedExtent:T}):M[i];return Vi("article",{className:"semiotic-small-multiple-panel","aria-label":"string"==typeof e.title?e.title:void 0,children:[(e.title||e.subtitle||e.summary)&&Vi("header",{className:"semiotic-small-multiple-heading",children:[e.title&&Wi("h3",{className:"semiotic-small-multiple-title",children:e.title}),e.subtitle&&Wi("p",{className:"semiotic-small-multiple-subtitle",children:e.subtitle}),e.summary&&Wi("p",{className:"semiotic-small-multiple-summary",children:e.summary})]}),Wi("div",{className:"semiotic-small-multiple-plot",children:Ji(r,n)})]},e.id??i)})]});return!0===v||"auto"===v&&(y||g||b||x||!0===w)&&!R?Wi(o,{selections:x,showLegend:w,legendPosition:k,legendInteraction:$,legendSelectionName:C??z.name??"small-multiples",legendField:S??z.fields?.[0]??"category",children:O}):O}import*as Zi from"react";import{Fragment as Qi,jsx as Xi,jsxs as Ki}from"react/jsx-runtime";function Yi({children:e,columns:t="auto",minCellWidth:i=300,gap:n=16,tabletColumns:r,mobileColumns:o=1,mobileBreakpoint:a=480,tabletBreakpoint:s=860,chartDefaults:l,className:c,style:d}){const u="semiotic-chart-grid-"+Zi.useId().replace(/[^a-zA-Z0-9_-]/g,""),m="number"==typeof t?t:void 0,p="auto"===t?`repeat(auto-fill, minmax(${i}px, 1fr))`:`repeat(${t}, 1fr)`,h=["semiotic-chart-grid",u,c].filter(Boolean).join(" ");return Ki(Qi,{children:[Xi("style",{children:`\n ${r?`\n @media (max-width: ${s}px) {\n .${u} {\n grid-template-columns: repeat(${r}, minmax(0, 1fr)) !important;\n }\n }`:""}\n @media (max-width: ${a}px) {\n .${u} {\n grid-template-columns: repeat(${o}, minmax(0, 1fr)) !important;\n }\n .${u} > [data-semiotic-chart-grid-primary="true"] {\n grid-column: span ${o} !important;\n }\n }\n `}),Xi("div",{className:h,style:{display:"grid",gridTemplateColumns:p,gap:n,width:"100%",...d},children:Zi.Children.map(e,e=>{if(!Zi.isValidElement(e))return e;const t=e.props,i={};if(l)for(const[e,n]of Object.entries(l))null==t[e]&&(i[e]=n);const n=Object.keys(i).length>0?Zi.cloneElement(e,i):e;return"primary"!==e.props.emphasis||void 0!==m&&2>m?n:Xi("div",{"data-semiotic-chart-grid-primary":"true",style:{gridColumn:"span 2",minWidth:0},children:n})})})]})}Yi.displayName="ChartGrid";import*as en from"react";import{Fragment as tn,jsx as nn,jsxs as rn}from"react/jsx-runtime";function on({children:e,context:t,position:i="right",contextSize:n=250,mobilePosition:r="bottom",mobileBreakpoint:o=480,gap:a=12,className:s,style:l}){const c="semiotic-context-layout-"+en.useId().replace(/[^a-zA-Z0-9_-]/g,""),d="left"===i||"right"===i,u="left"===i||"top"===i,m={display:"flex",flexDirection:d?u?"row-reverse":"row":u?"column-reverse":"column",gap:a,width:"100%",...l},p=d?{flex:`0 0 ${n}px`,width:n,minHeight:0}:{flex:`0 0 ${n}px`,height:n,minWidth:0};return rn(tn,{children:[nn("style",{children:`\n @media (max-width: ${o}px) {\n .${c}[data-mobile-position="bottom"] {\n flex-direction: column !important;\n }\n .${c}[data-mobile-position="top"] {\n flex-direction: column-reverse !important;\n }\n .${c}[data-mobile-position="bottom"] > .semiotic-context-panel,\n .${c}[data-mobile-position="top"] > .semiotic-context-panel {\n flex: 0 0 auto !important;\n width: 100% !important;\n height: auto !important;\n }\n }\n `}),rn("div",{className:["semiotic-context-layout",c,s].filter(Boolean).join(" "),"data-mobile-position":r,style:m,children:[nn("div",{className:"semiotic-context-primary",style:{flex:"1 1 0%",minWidth:0,minHeight:0},children:e}),nn("div",{className:"semiotic-context-panel",style:p,children:t})]})]})}on.displayName="ContextLayout";import{useState as an,useEffect as sn,useRef as ln,useCallback as cn}from"react";import{jsx as dn,jsxs as un}from"react/jsx-runtime";function mn({children:e,position:t="right",size:i=300,trigger:n="click",chartId:r,observation:o,dismissOnEmpty:a=!0,showClose:s=!0,onToggle:l,className:d,style:u}){const[m,p]=an(null),[h,f]=an(null),[g,b]=an(!1),[y,v]=an(!1),x=ln(null),w=ln(void 0),k="click"===n?["click","click-end"]:["hover","hover-end"],{latest:$}=c({types:k,chartId:r,limit:1}),C=void 0!==o?o:$,S=cn(()=>{v(!0),b(!1),clearTimeout(w.current),w.current=setTimeout(()=>{v(!1),p(null),f(null)},200)},[]);if(sn(()=>{if(C)if("click"===C.type||"hover"===C.type){const e=C;p(e.datum),f(e),b(e=>(e||(v(!0),clearTimeout(w.current),w.current=setTimeout(()=>v(!1),200)),!0))}else!a||"click-end"!==C.type&&"hover-end"!==C.type||S()},[a,S,C]),sn(()=>{l?.(g)},[g,l]),sn(()=>()=>clearTimeout(w.current),[]),!m&&!y)return null;const A=m&&h?e(m,h):null;if(null===A&&!y)return null;const N=function(e,t,i,n){const r={position:"absolute",background:"var(--semiotic-bg, #fff)",borderColor:"var(--semiotic-border, #e0e0e0)",borderStyle:"solid",borderWidth:0,boxSizing:"border-box",zIndex:10,display:"flex",flexDirection:"column",transition:n?"transform 200ms ease-out, opacity 200ms ease-out":void 0};return"right"===e?{...r,top:0,right:0,width:t,height:"100%",borderLeftWidth:1,padding:"12px 16px",transform:i?"translateX(0)":`translateX(${t}px)`,opacity:i?1:0}:"bottom"===e?{...r,bottom:0,left:0,width:"100%",height:t,borderTopWidth:1,padding:"12px 16px",transform:i?"translateY(0)":`translateY(${t}px)`,opacity:i?1:0}:{...r,top:"50%",left:"50%",transform:i?"translate(-50%, -50%) scale(1)":"translate(-50%, -50%) scale(0.95)",opacity:i?1:0,width:Math.min(t,400),maxHeight:"80%",borderWidth:1,borderRadius:8,padding:"16px 20px",boxShadow:"0 8px 32px rgba(0,0,0,0.12)"}}(t,i,g,y);return un("div",{ref:x,className:`semiotic-details-panel semiotic-details-${t}${d?" "+d:""}`,style:{...N,...u},children:[s&&dn("button",{className:"semiotic-details-close",onClick:S,"aria-label":"Close details",style:pn,children:dn("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",children:dn("path",{d:"M2 2l8 8M10 2l-8 8"})})}),dn("div",{className:"semiotic-details-content",style:{overflow:"auto",flex:1},children:A})]})}var pn={position:"absolute",top:8,right:8,width:20,height:20,display:"flex",alignItems:"center",justifyContent:"center",border:"none",background:"transparent",cursor:"pointer",borderRadius:4,color:"var(--semiotic-text-secondary, #666)",padding:0,zIndex:1};function hn(e){const t=e.designContract?.chartFamily??e.title??"chart",i=e.audience?.primary?" for "+e.audience.primary:"",n=e.designContract?.whyThisForm;return`${t}: ${e.intent.primary}${i}${n?". "+n:""}`}function fn(e,t){const i=e.intents.map(e=>"string"==typeof e?e:e.id??e.name).filter(e=>!!e),n=e.intents.find(e=>"string"!=typeof e&&"primary"===e.strength),r=("object"==typeof n?n.id??n.name:void 0)??i[0]??"explanation";return{ididVersion:"0.1",chartId:t.chartId,title:t.title??e.name,intent:{primary:r,secondary:i.filter(e=>e!==r)},audience:{primary:e.audience?.primary,familiarityAssumptions:Object.fromEntries(Object.entries(e.audience?.familiarity??{}).map(([e,t])=>[e,t+""])),literacyTargets:e.audience?.literacyTargets?.map(e=>({feature:e.concept,rationale:e.rationale}))},reception:e.reception?{channels:e.reception.channels,strengths:e.reception.strengths,risks:e.reception.risks,scaffolds:e.reception.scaffolds,memorableForm:e.reception.memorableForm}:void 0,designContract:{chartFamily:e.frameFamily,whyThisForm:e.designContract.whyThisForm??e.designContract.whyCustom,whyNotDefault:e.designContract.whyNotDefault,risks:e.reception?.risks,misuse:e.designContract.misuse},accessibility:{description:t.description,navigation:"required"===e.accessibility.keyboardNavigation||null!=e.navigation,dataFallback:!0===e.accessibility.fallbackTable||"required"===e.accessibility.accessibleTable||!0===e.accessibility.requiresAccessibleTable,manualChecks:["real screen-reader behavior","keyboard order quality","custom metaphor comprehension","animation distraction"]},provenance:t.dataSources||t.reviewStatus?{dataSources:t.dataSources,reviewStatus:t.reviewStatus,generatedBy:"Semiotic recipe intelligence"}:void 0}}mn.displayName="DetailsPanel";import*as gn from"react";import{jsx as bn,jsxs as yn}from"react/jsx-runtime";function vn({manifest:e,label:t="Intent Mark",className:i,showSummary:n=!0}){const[r,o]=gn.useState(!1),a=gn.useMemo(()=>JSON.stringify(e,null,2),[e]),s=gn.useCallback(async()=>{"undefined"!=typeof navigator&&navigator.clipboard&&(await navigator.clipboard.writeText(a),o(!0),window.setTimeout(()=>o(!1),1200))},[a]);return yn("details",{className:i?"semiotic-intent-mark "+i:"semiotic-intent-mark",style:{border:"1px solid var(--semiotic-border, #c8c8c8)",borderRadius:6,background:"var(--semiotic-surface, #fff)",color:"var(--semiotic-text, #222)",fontFamily:"var(--semiotic-font-family, sans-serif)"},children:[yn("summary",{style:{cursor:"pointer",padding:"7px 10px",fontSize:12,fontWeight:700,letterSpacing:"0.04em",textTransform:"uppercase"},children:[t," · ",e.intent.primary]}),yn("div",{style:{padding:"0 10px 10px"},children:[n&&bn("p",{style:{margin:"4px 0 10px",fontSize:13,lineHeight:1.45},children:hn(e)}),bn("button",{type:"button",onClick:s,style:{border:"1px solid currentColor",borderRadius:4,background:"transparent",color:"inherit",padding:"4px 8px",font:"inherit",fontSize:12,cursor:"pointer"},children:r?"Copied":"Copy manifest"}),bn("pre",{style:{maxHeight:280,overflow:"auto",margin:"10px 0 0",padding:10,background:"var(--semiotic-background, #f5f5f5)",fontSize:11,lineHeight:1.45,whiteSpace:"pre-wrap"},children:a})]})]})}import{useCallback as xn,useEffect as wn,useMemo as kn,useRef as $n,useState as Cn}from"react";var Sn=["hover","click","focus","activate"];function An(e){if("datum"===e.role&&e.datum)return e.datum;for(const t of e.children??[]){const e=An(t);if(e)return e}return null}function Nn(e,t){return e?t.map(t=>e[t]+"").join(""):""}function jn(e,t){if(e.id===t)return e;for(const i of e.children??[]){const e=jn(i,t);if(e)return e}return null}function In(e){const{tree:t,chartId:i,observe:n=Sn}=e,r=e.selectionName??"__semiotic-nav-sync"+(i?":"+i:""),o=kn(()=>{if(e.matchFields)return e.matchFields;const i=An(t);return i?Object.keys(i).filter(e=>{return!e.startsWith("_")&&(null==(t=i[e])||"string"==typeof t||"number"==typeof t||"boolean"==typeof t);var t}):[]},[e.matchFields,t]),a=kn(()=>{const e=new Map,i=t=>{if("datum"===t.role&&t.datum){const i=Nn(t.datum,o);e.has(i)||e.set(i,t.id)}for(const e of t.children??[])i(e)};return i(t),e},[t,o]),{selectPoints:s,clear:l}=p({name:r,fields:o}),d=kn(()=>[...n,"hover-end"],[n]),{latest:u}=c({chartId:i,types:d,limit:1}),[m,h]=Cn(t.id),f=$n(m);f.current=m;const g=$n(t);wn(()=>{const e=g.current;g.current=t;const i=jn(e,f.current),n=jn(t,f.current);"datum"===i?.role&&"datum"===n?.role&&i.datum&&n.datum&&o.length>0&&Nn(i.datum,o)===Nn(n.datum,o)||i&&n&&"datum"!==i.role&&"datum"!==n.role||(h(t.id),l())},[t,l,o]);const b=xn(e=>{if(h(e.id),"datum"===e.role&&e.datum&&o.length>0){const t={};for(const i of o)t[i]=[e.datum[i]];s(t)}else l()},[o,s,l]),y=e.annotations,v=kn(()=>{const e=new Set;if(0===o.length||!y)return e;for(const t of y){const i=a.get(Nn(t,o));i&&e.add(i)}return e},[y,a,o]),x=xn(e=>{const t="number"==typeof e?y?.[e]:e;if(!t||0===o.length)return!1;const i=a.get(Nn(t,o));if(!i)return!1;h(i);const n={};for(const e of o)n[e]=[t[e]];return s(n),!0},[y,a,o,s]),w=$n(null),k=xn(e=>{if(i&&e.chartId!==i)return;if("hover-end"===e.type){if(e===w.current)return;return void(w.current=e)}if(!function(e){return"hover"===e.type||"click"===e.type||"focus"===e.type||"activate"===e.type}(e))return;if(!n.includes(e.type))return;if(e===w.current)return;if(w.current=e,0===o.length)return;const t=function(e){const t=e,i=t.data;if(!i||"object"!=typeof i||Array.isArray(i))return e;const n=e=>e.every(e=>"number"==typeof t[e]),r=n(["x0","x1","y0","y1","width","height","value"]),o=n(["y0","y1","sankeyWidth","value"])&&"source"in t&&"target"in t;return r||o?i:e}(e.datum),r=a.get(Nn(t,o));r&&h(e=>e===r?e:r)},[i,n,a,o]),$=$n(null);return wn(()=>{u&&u!==$.current&&($.current=u,k(u))},[u,k]),{activeId:m,onActiveChange:b,selection:{name:r},onObservation:k,handleObservation:k,annotatedIds:v,focusAnnotation:x}}import{Fragment as Ln,jsx as Pn,jsxs as Rn}from"react/jsx-runtime";function Mn({items:e,title:t="Additional notes",empty:i=null,ordered:n=!0,renderItem:r,className:o,style:a}){if(!e.length)return i?Pn(Ln,{children:i}):null;const s=n?"ol":"ul";return Rn("section",{className:["semiotic-mobile-annotation-callouts",o].filter(Boolean).join(" "),style:a,children:[Pn("style",{children:"\n .semiotic-mobile-annotation-callouts {\n display: grid;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--semiotic-border, #d8d8d8);\n border-radius: 14px;\n background: var(--semiotic-bg, #fff);\n color: var(--semiotic-text, #222);\n }\n .semiotic-mobile-annotation-callouts h3 {\n margin: 0;\n font-size: 13px;\n font-weight: 800;\n line-height: 1.25;\n }\n .semiotic-mobile-annotation-callouts ol,\n .semiotic-mobile-annotation-callouts ul {\n display: grid;\n gap: 8px;\n margin: 0;\n padding-left: 18px;\n }\n .semiotic-mobile-annotation-callouts li {\n font-size: 13px;\n line-height: 1.45;\n }\n .semiotic-mobile-annotation-callouts small {\n display: block;\n margin-top: 2px;\n color: var(--semiotic-text-secondary, #666);\n font-size: 11px;\n line-height: 1.3;\n }\n "}),t&&Pn("h3",{children:t}),Pn(s,{children:e.map((e,t)=>Pn("li",{children:r?r(e,t):Rn(Ln,{children:[Pn("span",{children:e.label}),(e.source||e.emphasis)&&Pn("small",{children:[e.emphasis,e.source].filter(Boolean).join(" - ")})]})},e.id))})]})}export{g as exportChart,v as defineChartRecipe,x as validateChartRecipe,w as isRegisteredRecipeLayout,k as isJsonSafe,I as resolveRecipeRoleField,L as recipeToChartCapability,M as registerChartRecipe,B as unregisterChartRecipe,D as getChartRecipe,T as listChartRecipes,z as getRegisteredRecipeCapabilities,F as hasRegisteredRecipeCapabilities,E as registerRecipeLayout,O as unregisterRecipeLayout,H as getRecipeLayout,W as resolveChartRecipe,q as recipeIntentId,J as recipeConfig,Q as fieldForRole,re as toConfig,oe as fromConfig,ae as toURL,se as fromURL,le as copyConfig,ce as configToJSX,de as serializeSelections,ue as deserializeSelections,be as fromVegaLite,xe as withProvenance,we as currentTimestamp,ke as withCurrentProvenance,Se as annotationFreshnessFor,Ae as computeAnnotationFreshness,Le as applyAnnotationLifecycle,De as filterAnnotationsByStatus,Te as applyAnnotationStatus,ze as describeRecipeChart,tt as communicativeActForIntent,it as resolveCommunicativeAct,mt as describeChart,gt as buildRecipeNavigationTree,bt as buildNavigationTree,yt as flattenVisible,vt as countNodes,Tt as subscribeToConversationArcChange,zt as registerConversationArcSink,Ft as createLocalStorageConversationArcSink,Et as createIndexedDBConversationArcSink,Ot as createWebhookConversationArcSink,Ht as loadConversationArc,Wt as replayConversationArc,Vt as recordAudienceChange,Ut as recordAnnotationStatusChange,Jt as enableConversationArc,_t as disableConversationArc,Zt as getConversationArcStore,ti as AccessibleNavTree,pi as auditMobileVisualization,gi as formatMobileVisualizationAudit,bi as mobileVisualizationCaveats,Di as ChartContainer,Oi as MobileChartContainer,_i as SmallMultipleChart,Yi as ChartGrid,on as ContextLayout,mn as DetailsPanel,hn as summarizeIntentManifest,fn as intentManifestFromRecipe,vn as IntentMark,In as useNavigationSync,Mn as MobileAnnotationCalloutList};
|