semiotic 3.8.3 → 3.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CLAUDE.md +13 -10
  2. package/README.md +52 -45
  3. package/ai/componentMetadata.cjs +1 -1
  4. package/ai/dist/mcp-server.js +4 -2
  5. package/ai/examples.md +168 -1
  6. package/ai/schema.json +3756 -327
  7. package/ai/surface-manifest.json +6 -4
  8. package/ai/system-prompt.md +1 -1
  9. package/dist/chunk-chartContainerDataAudit-74TLKIP6.module.min.js +2 -0
  10. package/dist/chunk-chunk-2JGJ5GUG.module.min.js +0 -1
  11. package/dist/chunk-chunk-4AANPFOX.module.min.js +2 -0
  12. package/dist/{chunk-chunk-JNCHKRIR.module.min.js → chunk-chunk-5I3UZV4Q.module.min.js} +1 -1
  13. package/dist/chunk-chunk-74CCPVXB.module.min.js +1 -0
  14. package/dist/{chunk-chunk-VVCA3DB7.module.min.js → chunk-chunk-7ALTGHK6.module.min.js} +1 -1
  15. package/dist/chunk-chunk-ACLDBMRH.module.min.js +2 -0
  16. package/dist/chunk-chunk-AVBI6GDT.module.min.js +1 -0
  17. package/dist/{chunk-chunk-XQYVEKEJ.module.min.js → chunk-chunk-BANTPINB.module.min.js} +1 -1
  18. package/dist/chunk-chunk-C4YA6TDR.module.min.js +1 -0
  19. package/dist/chunk-chunk-C57LR3YG.module.min.js +1 -0
  20. package/dist/chunk-chunk-CKMD5NV3.module.min.js +2 -0
  21. package/dist/chunk-chunk-CO5KQMGH.module.min.js +1 -0
  22. package/dist/chunk-chunk-CWQ5YIHX.module.min.js +2 -0
  23. package/dist/chunk-chunk-E6TXX6MI.module.min.js +1 -0
  24. package/dist/{chunk-chunk-7FW6EGLP.module.min.js → chunk-chunk-I36PJ4OC.module.min.js} +1 -1
  25. package/dist/chunk-chunk-IY7RYD4S.module.min.js +1 -0
  26. package/dist/chunk-chunk-K3DMEW22.module.min.js +1 -0
  27. package/dist/chunk-chunk-KT2VAZMZ.module.min.js +1 -0
  28. package/dist/{chunk-chunk-AZJUDQRM.module.min.js → chunk-chunk-L6EA5V3G.module.min.js} +1 -1
  29. package/dist/{chunk-chunk-SANERMIZ.module.min.js → chunk-chunk-LJLS6DY7.module.min.js} +1 -1
  30. package/dist/chunk-chunk-LJPCLYSC.module.min.js +2 -0
  31. package/dist/chunk-chunk-LRIFN2HK.module.min.js +1 -0
  32. package/dist/chunk-chunk-N5DDKCCF.module.min.js +1 -0
  33. package/dist/chunk-chunk-NEVE562N.module.min.js +1 -0
  34. package/dist/chunk-chunk-NLO44TOS.module.min.js +2 -0
  35. package/dist/{chunk-chunk-FYY2ACNJ.module.min.js → chunk-chunk-PRDGLMJT.module.min.js} +1 -1
  36. package/dist/chunk-chunk-PZJ2SBLL.module.min.js +2 -0
  37. package/dist/chunk-chunk-QUJ6TTLY.module.min.js +1 -0
  38. package/dist/chunk-chunk-RBIDBUT4.module.min.js +2 -0
  39. package/dist/chunk-chunk-RFLAG356.module.min.js +1 -0
  40. package/dist/chunk-chunk-RPU4IZAV.module.min.js +2 -0
  41. package/dist/chunk-chunk-SKMBCFIL.module.min.js +2 -0
  42. package/dist/chunk-chunk-TAE7W424.module.min.js +2 -0
  43. package/dist/{chunk-chunk-OQTLSTGI.module.min.js → chunk-chunk-TMWIZL3K.module.min.js} +1 -1
  44. package/dist/chunk-chunk-TUBMTZMU.module.min.js +2 -0
  45. package/dist/chunk-chunk-UFFEXJQY.module.min.js +1 -0
  46. package/dist/chunk-chunk-XSCHTS4D.module.min.js +2 -0
  47. package/dist/chunk-chunk-XXWSHGPL.module.min.js +2 -0
  48. package/dist/chunk-chunk-ZOAQDIJO.module.min.js +1 -0
  49. package/dist/chunk-chunk-ZXIXAPRE.module.min.js +2 -0
  50. package/dist/chunk-minimapBrushOverlay-JU57U7NM.module.min.js +2 -0
  51. package/dist/chunk-scatterplotMatrixBrushOverlay-SDIZSN66.module.min.js +2 -0
  52. package/dist/chunk-statisticalOverlays-QGDLRUHX.module.min.js +1 -0
  53. package/dist/chunk-statisticalOverlays-T77OKLDY.module.min.js +1 -0
  54. package/dist/components/ChartContainer.d.ts +12 -2
  55. package/dist/components/ai/chartCapabilities.d.ts +2 -1
  56. package/dist/components/ai/chartCapabilityTypes.d.ts +19 -0
  57. package/dist/components/chartContainerDataAudit.d.ts +10 -0
  58. package/dist/components/charts/geo/ChoroplethMap.d.ts +2 -0
  59. package/dist/components/charts/geo/DistanceCartogram.d.ts +35 -5
  60. package/dist/components/charts/geo/FlowMap.d.ts +4 -0
  61. package/dist/components/charts/geo/ProportionalSymbolMap.d.ts +3 -1
  62. package/dist/components/charts/index.d.ts +1 -0
  63. package/dist/components/charts/network/ForceDirectedGraph.d.ts +36 -1
  64. package/dist/components/charts/physics/CollisionSwarmChart.d.ts +6 -1
  65. package/dist/components/charts/physics/CrucibleChart.capability.d.ts +8 -0
  66. package/dist/components/charts/physics/CrucibleChart.d.ts +63 -0
  67. package/dist/components/charts/physics/GaltonBoardChart.d.ts +6 -1
  68. package/dist/components/charts/physics/crucibleBodyRenderers.d.ts +27 -0
  69. package/dist/components/charts/physics/crucibleChartProps.d.ts +90 -0
  70. package/dist/components/charts/physics/crucibleChrome.d.ts +47 -0
  71. package/dist/components/charts/physics/crucibleController.d.ts +59 -0
  72. package/dist/components/charts/physics/crucibleEffects.d.ts +30 -0
  73. package/dist/components/charts/physics/cruciblePhysics.d.ts +54 -0
  74. package/dist/components/charts/physics/crucibleProgram.d.ts +38 -0
  75. package/dist/components/charts/physics/crucibleTypes.d.ts +415 -0
  76. package/dist/components/charts/physics/gauntletChartProps.d.ts +7 -1
  77. package/dist/components/charts/physics/gauntletChrome.d.ts +2 -1
  78. package/dist/components/charts/physics/gauntletPhysics.d.ts +19 -4
  79. package/dist/components/charts/physics/gauntletRuntime.d.ts +3 -0
  80. package/dist/components/charts/physics/physicsHocUtils.d.ts +12 -0
  81. package/dist/components/charts/shared/chartMode.d.ts +8 -0
  82. package/dist/components/charts/shared/chartSpecCore.d.ts +10 -2
  83. package/dist/components/charts/shared/crucibleWireSchema.d.ts +5 -0
  84. package/dist/components/charts/shared/diagnoseTypes.d.ts +10 -0
  85. package/dist/components/charts/shared/hatchPattern.d.ts +8 -3
  86. package/dist/components/charts/shared/knownChartComponents.d.ts +1 -1
  87. package/dist/components/charts/shared/lineSeriesSsr.d.ts +55 -0
  88. package/dist/components/charts/shared/types.d.ts +2 -2
  89. package/dist/components/charts/shared/validateProps.d.ts +1 -1
  90. package/dist/components/charts/xy/AreaChart.d.ts +10 -0
  91. package/dist/components/charts/xy/minimapBrushOverlay.d.ts +17 -0
  92. package/dist/components/charts/xy/minimapBrushOverlayLazy.d.ts +4 -0
  93. package/dist/components/charts/xy/scatterplotMatrixBrushOverlay.d.ts +8 -0
  94. package/dist/components/charts/xy/scatterplotMatrixBrushOverlayLazy.d.ts +3 -0
  95. package/dist/components/data/auditData.d.ts +51 -0
  96. package/dist/components/data/dataAuditPresentation.d.ts +18 -0
  97. package/dist/components/data/dataAuditSources.d.ts +9 -0
  98. package/dist/components/data/numericContracts.d.ts +59 -0
  99. package/dist/components/data/numericFieldProfiler.d.ts +23 -0
  100. package/dist/components/realtime/types.d.ts +5 -0
  101. package/dist/components/recipes/gridObservatory.d.ts +176 -0
  102. package/dist/components/recipes/netEnsembleLayout.d.ts +167 -0
  103. package/dist/components/recipes/netEnsembleOverlays.d.ts +20 -0
  104. package/dist/components/recipes/recipeChrome.d.ts +24 -0
  105. package/dist/components/recipes/sequenceLayout.d.ts +139 -0
  106. package/dist/components/recipes/wordTrails.d.ts +156 -0
  107. package/dist/components/recipes/wordTrailsProgressiveReveal.d.ts +42 -0
  108. package/dist/components/semiotic-ai-core.d.ts +3 -0
  109. package/dist/components/semiotic-ai-data-audit.d.ts +4 -0
  110. package/dist/components/semiotic-ai.d.ts +7 -5
  111. package/dist/components/semiotic-physics.d.ts +1 -0
  112. package/dist/components/semiotic-recipes-core.d.ts +10 -2
  113. package/dist/components/semiotic-utils-core.d.ts +3 -0
  114. package/dist/components/semiotic.d.ts +1 -1
  115. package/dist/components/server/renderEvidence.d.ts +27 -0
  116. package/dist/components/server/serverChartConfigs.d.ts +1 -0
  117. package/dist/components/server/serverChartConfigsPhysics.d.ts +9 -0
  118. package/dist/components/server/staticAnnotations.d.ts +15 -1
  119. package/dist/components/stream/GeoPipelineStore.d.ts +1 -0
  120. package/dist/components/stream/GeoSVGOverlay.d.ts +7 -0
  121. package/dist/components/stream/SceneToSVG.d.ts +6 -6
  122. package/dist/components/stream/SceneToSVGOrdinal.d.ts +12 -0
  123. package/dist/components/stream/geoCartogram.d.ts +7 -0
  124. package/dist/components/stream/geoTypes.d.ts +17 -2
  125. package/dist/components/stream/networkFrameHandleTypes.d.ts +4 -0
  126. package/dist/components/stream/networkFramePaint.d.ts +2 -0
  127. package/dist/components/stream/physics/PhysicsPipelineStore.d.ts +18 -2
  128. package/dist/components/stream/physics/PhysicsSettledSVG.d.ts +8 -0
  129. package/dist/components/stream/physics/physicsBodyCanvas.d.ts +7 -0
  130. package/dist/components/stream/physics/physicsPipelineEviction.d.ts +15 -0
  131. package/dist/components/stream/physics/physicsPipelineObservations.d.ts +1 -1
  132. package/dist/components/stream/physics/physicsPipelineQuiescence.d.ts +20 -0
  133. package/dist/components/stream/sceneToSVGShared.d.ts +30 -1
  134. package/dist/components/stream/types.d.ts +4 -0
  135. package/dist/components/stream/useHydration.d.ts +7 -1
  136. package/dist/components/stream/xySceneBuilders/candlestickScene.d.ts +1 -1
  137. package/dist/components/useChartContainerDataAudit.d.ts +7 -0
  138. package/dist/forceLayoutWorker.js +1 -1
  139. package/dist/geo.min.js +1 -1
  140. package/dist/geo.module.min.js +1 -1
  141. package/dist/network.min.js +1 -1
  142. package/dist/network.module.min.js +1 -1
  143. package/dist/ordinal.min.js +1 -1
  144. package/dist/ordinal.module.min.js +1 -1
  145. package/dist/physics.min.js +1 -1
  146. package/dist/physics.module.min.js +1 -1
  147. package/dist/physicsWorker.js +1 -1
  148. package/dist/realtime.min.js +1 -1
  149. package/dist/realtime.module.min.js +1 -1
  150. package/dist/rough.min.js +1 -1
  151. package/dist/rough.module.min.js +1 -1
  152. package/dist/semiotic-ai-core.d.ts +3 -0
  153. package/dist/semiotic-ai-core.min.js +1 -1
  154. package/dist/semiotic-ai-core.module.min.js +1 -1
  155. package/dist/semiotic-ai.d.ts +7 -5
  156. package/dist/semiotic-ai.min.js +1 -1
  157. package/dist/semiotic-ai.module.min.js +1 -1
  158. package/dist/semiotic-experimental.min.js +1 -1
  159. package/dist/semiotic-experimental.module.min.js +1 -1
  160. package/dist/semiotic-physics.d.ts +1 -0
  161. package/dist/semiotic-realtime-core.min.js +1 -1
  162. package/dist/semiotic-realtime-core.module.min.js +1 -1
  163. package/dist/semiotic-recipes-core.d.ts +10 -2
  164. package/dist/semiotic-recipes-core.min.js +1 -1
  165. package/dist/semiotic-recipes-core.module.min.js +1 -1
  166. package/dist/semiotic-recipes.min.js +1 -1
  167. package/dist/semiotic-recipes.module.min.js +1 -1
  168. package/dist/semiotic-server-edge.min.js +1 -1
  169. package/dist/semiotic-server-edge.module.min.js +1 -1
  170. package/dist/semiotic-server-node.min.js +1 -1
  171. package/dist/semiotic-server-node.module.min.js +1 -1
  172. package/dist/semiotic-utils-core.d.ts +3 -0
  173. package/dist/semiotic-utils-core.min.js +1 -1
  174. package/dist/semiotic-utils-core.module.min.js +1 -1
  175. package/dist/semiotic-utils.min.js +1 -1
  176. package/dist/semiotic-utils.module.min.js +1 -1
  177. package/dist/semiotic-value.module.min.js +1 -1
  178. package/dist/semiotic.d.ts +1 -1
  179. package/dist/semiotic.min.js +1 -1
  180. package/dist/semiotic.module.min.js +1 -1
  181. package/dist/server.min.js +1 -1
  182. package/dist/server.module.min.js +1 -1
  183. package/dist/xy.min.js +1 -1
  184. package/dist/xy.module.min.js +1 -1
  185. package/package.json +4 -3
  186. package/dist/chunk-chunk-255KDHW5.module.min.js +0 -1
  187. package/dist/chunk-chunk-2CCFBTQC.module.min.js +0 -2
  188. package/dist/chunk-chunk-2RXP3FS3.module.min.js +0 -1
  189. package/dist/chunk-chunk-2WVCH4PL.module.min.js +0 -1
  190. package/dist/chunk-chunk-4TMZXLCR.module.min.js +0 -1
  191. package/dist/chunk-chunk-5APBQXZA.module.min.js +0 -1
  192. package/dist/chunk-chunk-6HSGDMTA.module.min.js +0 -2
  193. package/dist/chunk-chunk-7OEOSCBP.module.min.js +0 -1
  194. package/dist/chunk-chunk-A63CTACR.module.min.js +0 -2
  195. package/dist/chunk-chunk-B6V35LMY.module.min.js +0 -2
  196. package/dist/chunk-chunk-BOSVL645.module.min.js +0 -2
  197. package/dist/chunk-chunk-CP3EN6KZ.module.min.js +0 -1
  198. package/dist/chunk-chunk-F25UA5HT.module.min.js +0 -1
  199. package/dist/chunk-chunk-FRIO6MCV.module.min.js +0 -1
  200. package/dist/chunk-chunk-GWSWSPXN.module.min.js +0 -1
  201. package/dist/chunk-chunk-I6C3KR5H.module.min.js +0 -2
  202. package/dist/chunk-chunk-IP2UE74X.module.min.js +0 -1
  203. package/dist/chunk-chunk-J3ELI22J.module.min.js +0 -1
  204. package/dist/chunk-chunk-J5RL6GXU.module.min.js +0 -2
  205. package/dist/chunk-chunk-L3H6DQCR.module.min.js +0 -2
  206. package/dist/chunk-chunk-M337NY6L.module.min.js +0 -1
  207. package/dist/chunk-chunk-M7VYYHCE.module.min.js +0 -2
  208. package/dist/chunk-chunk-MC35ILYP.module.min.js +0 -2
  209. package/dist/chunk-chunk-N72SWNBV.module.min.js +0 -1
  210. package/dist/chunk-chunk-OBQRFTIL.module.min.js +0 -2
  211. package/dist/chunk-chunk-QRIBHZYW.module.min.js +0 -1
  212. package/dist/chunk-chunk-SA3D43RA.module.min.js +0 -2
  213. package/dist/chunk-chunk-UHSZEB74.module.min.js +0 -1
  214. package/dist/chunk-chunk-Y6AXCRVO.module.min.js +0 -1
  215. package/dist/chunk-chunk-ZCNBUZPL.module.min.js +0 -2
@@ -0,0 +1,20 @@
1
+ import type { ReactNode } from "react";
2
+ import type { BandInfo } from "./netEnsembleLayout";
3
+ export interface NetEnsembleOverlayOptions {
4
+ convergeColor: string;
5
+ branchColor: string;
6
+ edgeColor: string;
7
+ plot: {
8
+ x: number;
9
+ y: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ showBandLabels: boolean;
14
+ showExemplars: boolean;
15
+ showLegend: boolean;
16
+ textColor: string;
17
+ subText: string;
18
+ }
19
+ /** Render presentation-only band labels, exemplars, and the directedness key. */
20
+ export declare function buildNetEnsembleOverlays(bands: BandInfo[], o: NetEnsembleOverlayOptions): ReactNode;
@@ -44,6 +44,30 @@ export declare function boundsOf(points: ReadonlyArray<{
44
44
  width: number;
45
45
  height: number;
46
46
  } | null;
47
+ /** Axis-aligned box with a top-left origin (chip, card, scene rect). */
48
+ export interface HullBox {
49
+ x: number;
50
+ y: number;
51
+ width: number;
52
+ height: number;
53
+ }
54
+ export type HullPadding = number | {
55
+ x?: number;
56
+ y?: number;
57
+ };
58
+ /**
59
+ * Axis-aligned hull of discrete mark boxes, with optional padding. Use this when
60
+ * marks are chips/cards with known extents (not just points): the result fully
61
+ * surrounds the marks so a stroke drawn *after* the marks reads as a true
62
+ * enclosure (fill under, stroke over). Returns null for an empty set.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const hull = hullFromBoxes(chips, { x: 12, y: 10 })
67
+ * // overlays: fill rect (under) then marks then stroke-only rect (over)
68
+ * ```
69
+ */
70
+ export declare function hullFromBoxes(boxes: ReadonlyArray<HullBox>, padding?: HullPadding): HullBox | null;
47
71
  export interface BandLabelProps {
48
72
  text: string;
49
73
  x: number;
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Sequence diagram kit — linear spines, span-arc packing, and shared-edge
3
+ * partition helpers for custom charts that treat a row of marks as a baseline
4
+ * (dependency arcs, co-reference, genomic links, alternate-hypothesis overlays).
5
+ *
6
+ * Pure / SSR-safe. Complements {@link packIntervals} (time tracks) and the
7
+ * edge-router kit (network S-curves): here the domain is an ordered index on a
8
+ * baseline and the mark is a vertical-band arc between two anchors.
9
+ */
10
+ export interface SequenceItem {
11
+ /** Stable identity used as the position map key. */
12
+ id: string;
13
+ }
14
+ export interface SequencePosition {
15
+ id: string;
16
+ x: number;
17
+ y: number;
18
+ /** Zero-based order on the baseline. */
19
+ index: number;
20
+ }
21
+ export interface LayoutSequenceOptions {
22
+ width: number;
23
+ y: number;
24
+ /** @default min(74, max(34, width * 0.08)) */
25
+ paddingLeft?: number;
26
+ /** @default min(74, max(34, width * 0.08)) */
27
+ paddingRight?: number;
28
+ }
29
+ /**
30
+ * Place ordered items evenly along a horizontal baseline. Returns a Map keyed
31
+ * by `id` so callers can look up either end of a span arc in O(1).
32
+ */
33
+ export declare function layoutSequence(items: readonly SequenceItem[], options: LayoutSequenceOptions): Map<string, SequencePosition>;
34
+ export interface ChipStripItem extends SequenceItem {
35
+ /** Optional label used by the default width estimator. */
36
+ label?: string;
37
+ }
38
+ export interface LayoutChipStripOptions extends LayoutSequenceOptions {
39
+ /** Gap between chips when packing by content width. @default 8 */
40
+ gap?: number;
41
+ /**
42
+ * When true (default), distribute free horizontal space evenly between chips
43
+ * so the strip still spans the baseline. When false, pack left-to-right.
44
+ */
45
+ distribute?: boolean;
46
+ /** Override per-chip width. Defaults to {@link estimateLabelWidth} of `label`/`id`. */
47
+ estimateWidth?: (item: ChipStripItem, index: number) => number;
48
+ }
49
+ export interface ChipStripPosition extends SequencePosition {
50
+ /** Chip width in px (for hulls / hit targets). */
51
+ width: number;
52
+ }
53
+ /**
54
+ * Place ordered chips along a baseline, sizing each by estimated label width.
55
+ * Prefer {@link layoutSequence} when marks are equal-spaced points rather than
56
+ * variable-width chips.
57
+ */
58
+ export declare function layoutChipStrip(items: readonly ChipStripItem[], options: LayoutChipStripOptions): Map<string, ChipStripPosition>;
59
+ /**
60
+ * Rough text width for chip / arc labels. Matches the heuristic used by the
61
+ * sentence-structure stage and is good enough for layout before paint.
62
+ */
63
+ export declare function estimateLabelWidth(text: unknown, minimum?: number, charWidth?: number, pad?: number): number;
64
+ export interface SpanInterval {
65
+ /** Stable identity for the packed result. */
66
+ id: string;
67
+ /** Inclusive left index on the sequence baseline. */
68
+ a: number;
69
+ /** Inclusive right index on the sequence baseline. */
70
+ b: number;
71
+ }
72
+ export interface PackedSpanLevel<T extends SpanInterval = SpanInterval> {
73
+ span: T;
74
+ /** Zero-based height level (0 = closest to the baseline). */
75
+ level: number;
76
+ }
77
+ export interface PackSpanLevelsResult<T extends SpanInterval = SpanInterval> {
78
+ packed: PackedSpanLevel<T>[];
79
+ /** Number of distinct levels used (`maxLevel + 1`, at least 1). */
80
+ levelCount: number;
81
+ maxLevel: number;
82
+ }
83
+ /**
84
+ * Greedy span packing: assign each interval to the lowest level whose last
85
+ * right edge is already left of this span's left edge. Short spans are packed
86
+ * first so long arcs stack above them — the classic dependency-arc layout.
87
+ *
88
+ * Indices are treated as inclusive; a span with `a === b` is a zero-width hop.
89
+ */
90
+ export declare function packSpanLevels<T extends SpanInterval>(spans: readonly T[]): PackSpanLevelsResult<T>;
91
+ export interface ScaleArcBandOptions {
92
+ /** Y of the sequence baseline (token line). */
93
+ baselineY: number;
94
+ /** Top of the free vertical band arcs may occupy. */
95
+ ceilingY: number;
96
+ /** From {@link packSpanLevels}. */
97
+ levelCount: number;
98
+ /** Vertical room reserved under each peak for a mid-arc label. @default 18 */
99
+ labelRoom?: number;
100
+ }
101
+ export interface ScaleArcBandResult {
102
+ /** Height of the shortest (level 0) arc above the baseline foot. */
103
+ arcLift: number;
104
+ /** Vertical spacing between successive levels. */
105
+ levelStep: number;
106
+ }
107
+ /**
108
+ * Stretch packed arc levels across the free band between `ceilingY` and the
109
+ * baseline so short plots are not a cramped nest under a blank canvas.
110
+ */
111
+ export declare function scaleArcBand(options: ScaleArcBandOptions): ScaleArcBandResult;
112
+ export interface SpanArcPathOptions {
113
+ /**
114
+ * How far above `baselineY` the arc feet attach (keeps arcs off token chips).
115
+ * @default 26
116
+ */
117
+ footLift?: number;
118
+ }
119
+ /**
120
+ * Quadratic span arc between two x-positions on a baseline. Pure path `d`
121
+ * string for SVG overlays / scene edge emission.
122
+ */
123
+ export declare function spanArcPath(x0: number, x1: number, baselineY: number, peakY: number, options?: SpanArcPathOptions): string;
124
+ /**
125
+ * Peak y for a packed span level given band metrics from {@link scaleArcBand}.
126
+ */
127
+ export declare function spanArcPeakY(baselineY: number, level: number, metrics: ScaleArcBandResult): number;
128
+ export type EdgeKeyFn<T> = (edge: T) => string;
129
+ /**
130
+ * Partition several edge lists into the shared intersection (present in every
131
+ * set under `keyOf`) and the per-set exclusive remainder. Used by compare views
132
+ * that paint common topology once and disputed links per hypothesis.
133
+ *
134
+ * Shared edges are taken from the first set (stable identity for paint keys).
135
+ */
136
+ export declare function partitionSharedEdges<T>(edgeSets: readonly (readonly T[])[], keyOf?: EdgeKeyFn<T>): {
137
+ shared: T[];
138
+ exclusive: T[][];
139
+ };
@@ -0,0 +1,156 @@
1
+ import type { OrdinalCustomLayout } from "../stream/ordinalCustomLayout";
2
+ import type { Datum } from "../charts/shared/datumTypes";
3
+ export { wordTrailsProgressiveReveal, type WordTrailsProgressiveRevealOptions } from "./wordTrailsProgressiveReveal";
4
+ /**
5
+ * Word Trails — a *quantitatively honest* word cloud.
6
+ *
7
+ * Where a classic word cloud (d3-cloud / amueller) packs words into free space
8
+ * with only size encoding frequency and position meaning nothing, Word Trails
9
+ * gives position meaning on both axes:
10
+ *
11
+ * - **columns** (x) are a category — e.g. each speaker in a debate;
12
+ * - **the vertical axis** (y) is an ordered value — e.g. the debate segment
13
+ * where the word peaked, so a word's height reads as *when* it was said;
14
+ * - **font size** encodes frequency/weight.
15
+ *
16
+ * Each column is laid out with greedy, largest-first placement: every word
17
+ * searches outward from its segment anchor for the nearest free spot, so the
18
+ * result is **overlap-free by construction**. A single global font scale
19
+ * (`scaleToFit`) shrinks every word together until it all fits — relative
20
+ * magnitude is preserved, nothing is clipped or dropped.
21
+ *
22
+ * The reading: scan a column top-to-bottom to follow one speaker through time;
23
+ * scan across a row to compare what everyone emphasised at the same moment.
24
+ *
25
+ * Inspired by Elijah Meeks's 2016 "Word Trails" debate visualization. Because
26
+ * placement is *box*-aware (not sprite/pixel), the layout needs no canvas text
27
+ * measurement — it is pure and SSR-clean.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * import { OrdinalCustomChart } from "semiotic/ordinal"
32
+ * import { wordTrailsLayout } from "semiotic/recipes"
33
+ *
34
+ * <OrdinalCustomChart
35
+ * data={terms} // [{ word, weight, speaker, segment }]
36
+ * layout={wordTrailsLayout}
37
+ * layoutConfig={{
38
+ * textAccessor: "word",
39
+ * weightAccessor: "weight",
40
+ * columnAccessor: "speaker",
41
+ * segmentAccessor: "segment",
42
+ * }}
43
+ * width={860}
44
+ * height={520}
45
+ * />
46
+ * ```
47
+ */
48
+ export interface WordTrailsWordInfo {
49
+ /** Rendered word text. */
50
+ word: string;
51
+ /** Column containing this word. */
52
+ column: string;
53
+ /** Quantitative weight used to size this word. */
54
+ weight: number;
55
+ /** Ordered segment/time value anchoring this word vertically. */
56
+ segment: number;
57
+ /** Exact source row supplied to the chart. */
58
+ datum: Datum;
59
+ /** Index of `datum` in the chart's input data. */
60
+ dataIndex: number;
61
+ /** Index of the word's column in the final rendered column order. */
62
+ columnIndex: number;
63
+ /** Column color after `columnColor` / the chart theme has been resolved. */
64
+ resolvedColumnColor: string;
65
+ }
66
+ export interface WordTrailsConfig {
67
+ /** Field (or fn) giving the word text. */
68
+ textAccessor: string | ((d: Datum) => string);
69
+ /** Field (or fn) giving the word weight (→ font size). */
70
+ weightAccessor: string | ((d: Datum) => number);
71
+ /** Field (or fn) giving the column category (→ x band). */
72
+ columnAccessor: string | ((d: Datum) => string);
73
+ /** Field (or fn) giving the ordered segment/time value (→ pinned y). */
74
+ segmentAccessor: string | ((d: Datum) => number);
75
+ /** `[min, max]` of the segment axis. Derived from data when omitted. */
76
+ segmentDomain?: [number, number];
77
+ /** Explicit column order. Data insertion order when omitted. */
78
+ columnOrder?: string[];
79
+ /** Smallest font size, px. @default 11 */
80
+ minFontSize?: number;
81
+ /** Largest font size, px. @default 42 */
82
+ maxFontSize?: number;
83
+ /** Gap between columns, px. @default 18 */
84
+ columnGutter?: number;
85
+ /**
86
+ * Gap kept between word boxes, px — the density knob. `0` packs words as
87
+ * tightly as their glyph boxes allow (crowded, still overlap-free); larger
88
+ * values open the cloud up. @default 2
89
+ */
90
+ collisionPadding?: number;
91
+ /**
92
+ * Per-word fill override. Return a color for a word (e.g. from a
93
+ * distinctiveness / sentiment model) or `undefined` to fall back to the
94
+ * column color. Same word ⇒ same color across columns if you key on the text.
95
+ */
96
+ wordColor?: (info: WordTrailsWordInfo) => string | undefined | null;
97
+ /**
98
+ * Per-word reveal opacity. Return a value in `[0, 1]`; values are clamped,
99
+ * and non-finite values resolve to `0`. Every row still participates in
100
+ * scale-to-fit and collision placement, so changing opacity cannot move the
101
+ * remaining words. A resolved `0` emits neither a glyph nor an interactive
102
+ * hit target. By default a nonzero value multiplies the built-in weight
103
+ * opacity; set `weightOpacity` to `false` when this callback should be the
104
+ * exact rendered opacity.
105
+ * @default () => 1
106
+ */
107
+ wordOpacity?: (info: WordTrailsWordInfo) => number;
108
+ /**
109
+ * Fade lower-weight words from `0.5` to `1` opacity in addition to encoding
110
+ * weight with font size. Disable this when opacity carries an independent
111
+ * variable such as recency; `wordOpacity` then controls rendered opacity
112
+ * exactly. @default true
113
+ */
114
+ weightOpacity?: boolean;
115
+ /** Per-column label color override. Falls back to the categorical palette. */
116
+ columnColor?: (column: string) => string | undefined | null;
117
+ /** Draw the speaker/column labels along the top. @default true */
118
+ showColumnLabels?: boolean;
119
+ /** Draw the segment/time value axis on the left. @default true */
120
+ showSegmentAxis?: boolean;
121
+ /** Approx. number of ticks on the segment axis. @default 6 */
122
+ segmentTickCount?: number;
123
+ /** Formats a segment value for the axis + tooltip. @default String */
124
+ segmentTickFormat?: (v: number) => string;
125
+ /** Title shown above the segment axis (e.g. "Debate segment"). */
126
+ segmentAxisLabel?: string;
127
+ /**
128
+ * Max rotation magnitude, degrees. Each word gets a deterministic angle in
129
+ * `[-rotate, +rotate]`. `0` keeps every word horizontal (most legible).
130
+ * @default 0
131
+ */
132
+ rotate?: number;
133
+ /**
134
+ * Allow the same word to appear more than once in a column. When `false`
135
+ * (default), duplicate `(column, word)` rows are merged to a single entry at
136
+ * the row with the greatest weight (its peak) — the classic word-cloud
137
+ * reading. When `true`, every row is kept, so a word can trail down its
138
+ * column once per segment it appeared in. @default false
139
+ */
140
+ repeatWords?: boolean;
141
+ /**
142
+ * Uniformly shrink every word by one global factor until nothing overlaps.
143
+ * Relative magnitude is preserved (a word twice as frequent stays twice the
144
+ * area) — only the absolute scale drops as words are added. Turn it off to
145
+ * keep exact `minFontSize`/`maxFontSize` sizing and accept overlap.
146
+ * @default true
147
+ */
148
+ scaleToFit?: boolean;
149
+ /**
150
+ * Target fraction of each column's area filled by word boxes before the
151
+ * global scale is reduced. Lower packs looser (more whitespace); higher
152
+ * starts larger and lets the greedy placer crowd words in. @default 0.6
153
+ */
154
+ packingDensity?: number;
155
+ }
156
+ export declare const wordTrailsLayout: OrdinalCustomLayout<WordTrailsConfig>;
@@ -0,0 +1,42 @@
1
+ import type { WordTrailsConfig } from "./wordTrails";
2
+ /** Options for a stable, progressive Word Trails reveal. */
3
+ export interface WordTrailsProgressiveRevealOptions {
4
+ /** Segment that is currently active/reached. Values are clamped to `segmentDomain`. */
5
+ currentSegment: number;
6
+ /** Ordered `[oldest, newest]` segment extent used for the fade. */
7
+ segmentDomain: readonly [number, number];
8
+ /** Opacity of the oldest reached segment. @default 0.25 */
9
+ oldestOpacity?: number;
10
+ /** Opacity of the current segment. @default 1 */
11
+ currentOpacity?: number;
12
+ /** Opacity of unreached segments. `0` hides their glyphs and hit targets. @default 0 */
13
+ futureOpacity?: number;
14
+ /** Also multiply the reveal by Word Trails' built-in weight fade. @default false */
15
+ combineWeightOpacity?: boolean;
16
+ }
17
+ /**
18
+ * Build the two config fields for a stable, progressive segment reveal.
19
+ *
20
+ * Reached rows fade linearly from `oldestOpacity` at the start of the domain
21
+ * to `currentOpacity` at `currentSegment`; future rows use `futureOpacity`.
22
+ * Word Trails still lays out zero-opacity rows, so playback changes visibility
23
+ * without reflow. The returned config disables the independent weight-opacity
24
+ * encoding unless `combineWeightOpacity` is explicitly enabled.
25
+ *
26
+ * This is the Word Trails composition counterpart to the runtime-neutral
27
+ * `opacityFromAge` helper: it keeps the same linear newest-to-oldest reading,
28
+ * then adds future hiding, layout reservation, and exact weight-opacity
29
+ * semantics without making the recipes entry point depend on a motion runtime.
30
+ *
31
+ * @example
32
+ * ```tsx
33
+ * layoutConfig={{
34
+ * ...config,
35
+ * ...wordTrailsProgressiveReveal({
36
+ * currentSegment: iteration,
37
+ * segmentDomain: [0, lastIteration]
38
+ * })
39
+ * }}
40
+ * ```
41
+ */
42
+ export declare function wordTrailsProgressiveReveal(options: WordTrailsProgressiveRevealOptions): Pick<WordTrailsConfig, "wordOpacity" | "weightOpacity">;
@@ -18,6 +18,9 @@ export { toConfig, fromConfig, toURL, fromURL, copyConfig, configToJSX } from ".
18
18
  export type { ChartConfig, ToConfigOptions, CopyFormat } from "./export/chartConfig";
19
19
  export { summarizeData } from "./data/DataSummarizer";
20
20
  export type { DataSummary, FieldSummary, FieldType, SummarizeOptions } from "./data/DataSummarizer";
21
+ export { auditData, formatDataAudit, profileNumericFields, toDataAuditNotifications, } from "./data/auditData";
22
+ export type { AuditDataOptions, CheckedNumericContract, DataAuditChartNotification, DataAuditDiagnosis, DataAuditNotificationOptions, DataAuditResult, NumericFieldProfile, ProfileNumericFieldsOptions, } from "./data/auditData";
23
+ export type { NumericAggregateContract, NumericContracts, NumericFieldContract, NumericFieldRole, NumericRequirement, } from "./data/numericContracts";
21
24
  export { profileData } from "./ai/profileData";
22
25
  export type { ProfileDataOptions } from "./ai/profileData";
23
26
  export { inferIntent } from "./ai/inferIntent";
@@ -0,0 +1,4 @@
1
+ export { auditData, formatDataAudit, profileNumericFields, toDataAuditNotifications, } from "./data/auditData";
2
+ export type { AuditDataOptions, CheckedNumericContract, DataAuditChartNotification, DataAuditDiagnosis, DataAuditNotificationOptions, DataAuditResult, NumericFieldProfile, ProfileNumericFieldsOptions, } from "./data/auditData";
3
+ export type { NumericAggregateContract, NumericContracts, NumericFieldContract, NumericFieldRole, NumericRequirement, } from "./data/numericContracts";
4
+ export type { ChartContainerDataAudit, ChartContainerDataAuditOptions, } from "./chartContainerDataAudit";
@@ -50,6 +50,7 @@ export { CollisionSwarmChart } from "./charts/physics/CollisionSwarmChart";
50
50
  export { PhysicalFlowChart } from "./charts/physics/PhysicalFlowChart";
51
51
  export { ProcessFlowChart } from "./charts/physics/ProcessFlowChart";
52
52
  export { GauntletChart } from "./charts/physics/GauntletChart";
53
+ export { CrucibleChart } from "./charts/physics/CrucibleChart";
53
54
  export { BigNumber } from "./charts/value/BigNumber";
54
55
  export { TooltipProvider } from "./store/TooltipStore";
55
56
  export { MultiLineTooltip } from "./Tooltip/Tooltip";
@@ -59,10 +60,10 @@ export { ChartContainer } from "./ChartContainer";
59
60
  export { MobileChartContainer } from "./MobileChartContainer";
60
61
  export { SmallMultipleChart } from "./SmallMultipleChart";
61
62
  export { MobileStandardControls } from "./MobileStandardControls";
62
- export { clampMobileRange, useMobileRangeControls, zoomMobileRange, } from "./MobileStandardControls";
63
+ export { clampMobileRange, useMobileRangeControls, zoomMobileRange } from "./MobileStandardControls";
63
64
  export type { ChartContainerProps, ChartContainerHandle, ChartContainerMobileOptions, ChartNotification, ChartNotificationLevel } from "./ChartContainer";
64
65
  export type { MobileChartChip, MobileChartContainerProps, MobileChartDetailMode } from "./MobileChartContainer";
65
- export type { MobileStandardBrushControls, MobileStandardControlKind, MobileStandardControlLegendItem, MobileStandardControlRequest, MobileStandardControlsMode, MobileStandardControlsProps, MobileStandardLegendControls, MobileStandardZoomControls, UseMobileRangeControlsOptions, UseMobileRangeControlsResult, } from "./MobileStandardControls";
66
+ export type { MobileStandardBrushControls, MobileStandardControlKind, MobileStandardControlLegendItem, MobileStandardControlRequest, MobileStandardControlsMode, MobileStandardControlsProps, MobileStandardLegendControls, MobileStandardZoomControls, UseMobileRangeControlsOptions, UseMobileRangeControlsResult } from "./MobileStandardControls";
66
67
  export type { SmallMultipleChartProps, SmallMultipleExtent, SmallMultipleItem, SmallMultipleRenderContext, SmallMultipleSharedExtent } from "./SmallMultipleChart";
67
68
  export { ChartGrid } from "./ChartGrid";
68
69
  export type { ChartGridProps } from "./ChartGrid";
@@ -76,8 +77,8 @@ export { validateProps } from "./charts/shared/validateProps";
76
77
  export type { ValidationResult } from "./charts/shared/validateProps";
77
78
  export { diagnoseConfig } from "./charts/shared/diagnoseConfig";
78
79
  export type { Diagnosis, DiagnosisResult } from "./charts/shared/diagnoseConfig";
79
- export { diagnoseTokenEncoding, normalizeTokenEncoding, suggestTokenEncoding, tokenTaskIntentToCapabilityIntents, } from "./recipes/tokenEncoding";
80
- export type { PositionedToken, SuggestTokenEncodingInput, TokenCapabilityIntent, TokenCountStrategy, TokenDiagnostic, TokenDiagnosticCode, TokenDiagnosticsContext, TokenEncoding, TokenEncodingSuggestion, TokenGeneratorInput, TokenGridOptions, TokenLabelPolicy, TokenLayout, TokenSemantics, TokenSet, TokenTaskIntent, TokenType, VisualToken, } from "./recipes/tokenEncoding";
80
+ export { diagnoseTokenEncoding, normalizeTokenEncoding, suggestTokenEncoding, tokenTaskIntentToCapabilityIntents } from "./recipes/tokenEncoding";
81
+ export type { PositionedToken, SuggestTokenEncodingInput, TokenCapabilityIntent, TokenCountStrategy, TokenDiagnostic, TokenDiagnosticCode, TokenDiagnosticsContext, TokenEncoding, TokenEncodingSuggestion, TokenGeneratorInput, TokenGridOptions, TokenLabelPolicy, TokenLayout, TokenSemantics, TokenSet, TokenTaskIntent, TokenType, VisualToken } from "./recipes/tokenEncoding";
81
82
  export { auditAccessibility, formatAccessibilityAudit, accessibilityCaveats } from "./charts/shared/auditAccessibility";
82
83
  export { auditMobileVisualization, formatMobileVisualizationAudit, mobileVisualizationCaveats } from "./charts/shared/auditMobileVisualization";
83
84
  export { responsiveRuleMatches, resolveResponsiveRules } from "./charts/shared/responsiveRules";
@@ -112,6 +113,7 @@ export type { AccessibleNavTreeProps } from "./AccessibleNavTree";
112
113
  export { useNavigationSync } from "./ai/useNavigationSync";
113
114
  export type { UseNavigationSyncOptions, UseNavigationSyncResult } from "./ai/useNavigationSync";
114
115
  export type { DataSummary, FieldSummary, FieldType, NumericFieldSummary, DateFieldSummary, CategoricalFieldSummary, UnknownFieldSummary, SummarizeOptions } from "./data/DataSummarizer";
116
+ export * from "./semiotic-ai-data-audit";
115
117
  export { profileData } from "./ai/profileData";
116
118
  export type { ProfileDataOptions } from "./ai/profileData";
117
119
  export { suggestCharts, suggestChartsGrouped, scoreChart, explainCapabilityFit } from "./ai/suggestCharts";
@@ -154,7 +156,7 @@ export type { RecipeNavigationOptions } from "./ai/recipeNavigation";
154
156
  export { auditObservedScene } from "./ai/observedSceneAudit";
155
157
  export type { AuditObservedSceneInput, DeclaredRecipeSemantics, ObservedAuditFinding, ObservedAuditStatus, ObservedSceneAuditResult } from "./ai/observedSceneAudit";
156
158
  export { auditVisualizationControls } from "./controls/controlAudit";
157
- export type { AuditVisualizationControlsOptions, ControlAuditFinding, ControlAuditResult, ControlAuditStatus, } from "./controls/controlAudit";
159
+ export type { AuditVisualizationControlsOptions, ControlAuditFinding, ControlAuditResult, ControlAuditStatus } from "./controls/controlAudit";
158
160
  export type { VisualizationControlDefinition } from "./controls/controlContract";
159
161
  export { IntentMark } from "./ai/IntentMark";
160
162
  export type { IntentMarkProps } from "./ai/IntentMark";
@@ -25,6 +25,7 @@ export { BuiltInPhysicsEngineAdapter, CollisionSwarmChart, EventDropChart, Gaunt
25
25
  export default StreamPhysicsFrame;
26
26
  export type { CollisionSwarmChartProps } from "./charts/physics/CollisionSwarmChart";
27
27
  export type { EventDropChartProps } from "./charts/physics/EventDropChart";
28
+ export * from "./charts/physics/CrucibleChart";
28
29
  export type { GauntletChartProps, GauntletEffect, GauntletEvent, GauntletEventContext, GauntletEventLogItem, GauntletGate, GauntletLayout, GauntletNegativeReplacementOptions, GauntletPopSpec, GauntletProjectPlacement, GauntletProjectState, GauntletPropertyForceContext, GauntletPropertyDefinition, GauntletPropertyWorkPlan, GauntletPropertyWorkPlanOptions } from "./charts/physics/GauntletChart";
29
30
  export type { PhysicsProcessBodyGroup, PhysicsProcessBoundaryOptions, PhysicsProcessStage } from "./charts/physics/physicsProcessPrimitives";
30
31
  export type { GaltonBoardChartProps, GaltonBoardReferenceLine } from "./charts/physics/GaltonBoardChart";
@@ -25,6 +25,8 @@ export { lineageDagLayout } from "./recipes/lineageDag";
25
25
  export type { LineageDagConfig, LineageLod, LineageStoreSlot } from "./recipes/lineageDag";
26
26
  export { mermaidDagLayout } from "./recipes/mermaidDag";
27
27
  export type { MermaidDagConfig } from "./recipes/mermaidDag";
28
+ export { netEnsembleLayout, analyzeNetEnsemble } from "./recipes/netEnsembleLayout";
29
+ export type { NetEnsembleConfig, NetEnsembleAnalysis, NetEnsembleComponent, NetEnsembleMotif, } from "./recipes/netEnsembleLayout";
28
30
  export { packedClusterMatrix } from "./recipes/packedClusterMatrix";
29
31
  export type { PackedClusterMatrixConfig } from "./recipes/packedClusterMatrix";
30
32
  export { marimekkoLayout } from "./recipes/marimekko";
@@ -39,10 +41,14 @@ export { annotationLayout } from "./recipes/annotationLayout";
39
41
  export type { AnnotationLayoutConfig, AnnotationLayoutOptions, AutoPlaceAnnotations, AutoPlaceAnnotationsConfig, AnnotationCohesion, AnnotationAudience, AnnotationMobileConfig, } from "./recipes/annotationLayout";
40
42
  export { annotationDensity, annotationBudget, DEFAULT_AREA_PER_ANNOTATION } from "./recipes/annotationDensity";
41
43
  export type { AnnotationDensityConfig, AnnotationDensityOptions, AnnotationDensityResult, } from "./recipes/annotationDensity";
44
+ export { GRID_FUEL_KEYS, GRID_FUEL_LABELS, stackFuelSeries, demandForecastRows, reserveMarginPct, reserveSeries, thresholdBandsForReserve, reserveAnnotationBands, summarizeOperatingPoint, gridEventAnnotations, tightestHours, formatMw, formatReservePct, } from "./recipes/gridObservatory";
45
+ export type { GridFuelKey, GridHour, ReserveSnapshot, ReserveLevels, FuelStackRow, DemandForecastRow, OperatingPointSummary, GridEventWindow, } from "./recipes/gridObservatory";
42
46
  export { intervalLanesLayout } from "./recipes/intervalLanes";
43
47
  export type { IntervalLanesConfig } from "./recipes/intervalLanes";
44
48
  export { axisFixedForceLayout, axisFixedForcePositions, rectCollide } from "./recipes/axisFixedForce";
45
49
  export type { AxisFixedForceConfig, AxisFixedForceResult, PositionedNode, CollisionBox, RectCollideOptions, } from "./recipes/axisFixedForce";
50
+ export { wordTrailsLayout, wordTrailsProgressiveReveal } from "./recipes/wordTrails";
51
+ export type { WordTrailsConfig, WordTrailsProgressiveRevealOptions, WordTrailsWordInfo, } from "./recipes/wordTrails";
46
52
  export { hitTargetPoint, hitTargetRect, networkHitTarget, geoHitTarget, geoAreaHitTarget, DEFAULT_HIT_RADIUS, } from "./stream/hitTarget";
47
53
  export type { GeoAreaHitTargetProps, HitTargetPointProps, HitTargetRectProps, NetworkHitTargetCircleProps, NetworkHitTargetRectProps, } from "./stream/hitTarget";
48
54
  export { runs, runLengthEncode } from "./recipes/runs";
@@ -50,6 +56,8 @@ export type { Run, RunOptions } from "./recipes/runs";
50
56
  export { wrapValue, shortestArcDelta, cyclicRangeContains, selectCyclicRange } from "./recipes/cyclical";
51
57
  export { packIntervals, activeCountOverDomain } from "./recipes/intervals";
52
58
  export type { PackedInterval, PackIntervalsResult, PackIntervalsOptions, ActiveCount, ActiveCountOptions, } from "./recipes/intervals";
59
+ export { layoutSequence, layoutChipStrip, estimateLabelWidth, packSpanLevels, scaleArcBand, spanArcPath, spanArcPeakY, partitionSharedEdges, } from "./recipes/sequenceLayout";
60
+ export type { SequenceItem, SequencePosition, LayoutSequenceOptions, ChipStripItem, LayoutChipStripOptions, ChipStripPosition, SpanInterval, PackedSpanLevel, PackSpanLevelsResult, ScaleArcBandOptions, ScaleArcBandResult, SpanArcPathOptions, EdgeKeyFn, } from "./recipes/sequenceLayout";
53
61
  export { polarToXY, xyToAngle, angleScale, radiusScale, ringArcPath, TAU } from "./recipes/radialCoords";
54
62
  export type { Point, PolarOptions, AngleScaleOptions, RingArcOptions } from "./recipes/radialCoords";
55
63
  export { curvedEdgePath, orthogonalEdgePath, boxEdgeAnchors, fanOutBend, cubicPoint, cubicTangent, cubicPath, } from "./recipes/edgeRouter";
@@ -69,8 +77,8 @@ export type { NetworkSymbolName } from "./stream/symbolPath";
69
77
  export { glyphPlacement, glyphExtent, glyphFractionClipRect, DEFAULT_GLYPH_VIEWBOX, DEFAULT_GLYPH_ANCHOR, } from "./stream/glyphDef";
70
78
  export type { GlyphDef, GlyphPart, GlyphPlacement } from "./stream/glyphDef";
71
79
  export { isotypeInk, isotypePaper, isotypeGhost, isotypeServerGlyph, isotypeChipGlyph, isotypeBoltGlyph, isotypeBusGlyph, isotypePersonPath, isotypePersonGlyph, isotypeNetworkGlyphs, } from "./recipes/isotypeGlyphs";
72
- export { roundedEnclosure, boundsOf, bandLabel, markCallout, linearAxis, hatchFill } from "./recipes/recipeChrome";
73
- export type { RoundedEnclosureProps, BandLabelProps, MarkCalloutProps, CalloutConnector, LinearAxisProps, AxisOrient, HatchFillOptions, } from "./recipes/recipeChrome";
80
+ export { roundedEnclosure, boundsOf, hullFromBoxes, bandLabel, markCallout, linearAxis, hatchFill, } from "./recipes/recipeChrome";
81
+ export type { RoundedEnclosureProps, HullBox, HullPadding, BandLabelProps, MarkCalloutProps, CalloutConnector, LinearAxisProps, AxisOrient, HatchFillOptions, } from "./recipes/recipeChrome";
74
82
  export { legendGroupsFrom, legendSwatches } from "./recipes/recipeLegend";
75
83
  export type { LegendGroupsInput, LegendSwatch, LegendSwatchesProps } from "./recipes/recipeLegend";
76
84
  export { buildTooltipEntries, extractTooltipDatum, formatTooltipValue, } from "./recipes/customTooltip";
@@ -20,6 +20,9 @@ export { resolveStyleRules, matchesThreshold, ruleMatches, makeRuleValueResolver
20
20
  export type { StyleRule, StyleRuleStyle, StyleRuleThreshold, StyleRuleContext, StyleRulePredicate, } from "./charts/shared/styleRules";
21
21
  export { validateProps } from "./charts/shared/validateProps";
22
22
  export { diagnoseConfig } from "./charts/shared/diagnoseConfig";
23
+ export { auditData, formatDataAudit, profileNumericFields, toDataAuditNotifications, } from "./data/auditData";
24
+ export type { AuditDataOptions, CheckedNumericContract, DataAuditChartNotification, DataAuditDiagnosis, DataAuditNotificationOptions, DataAuditResult, NumericFieldProfile, ProfileNumericFieldsOptions, } from "./data/auditData";
25
+ export type { NumericAggregateContract, NumericContracts, NumericFieldContract, NumericFieldRole, NumericRequirement, } from "./data/numericContracts";
23
26
  export { auditAccessibility, formatAccessibilityAudit, accessibilityCaveats } from "./charts/shared/auditAccessibility";
24
27
  export { auditMobileVisualization, formatMobileVisualizationAudit, mobileVisualizationCaveats } from "./charts/shared/auditMobileVisualization";
25
28
  export { responsiveRuleMatches, resolveResponsiveRules } from "./charts/shared/responsiveRules";
@@ -72,7 +72,7 @@ export { intentManifestFromRecipe, summarizeIntentManifest } from "./ai/intentMa
72
72
  export type { IntentManifest, IntentManifestFromRecipeOptions } from "./ai/intentManifest";
73
73
  export { useNavigationSync } from "./ai/useNavigationSync";
74
74
  export type { UseNavigationSyncOptions, UseNavigationSyncResult } from "./ai/useNavigationSync";
75
- export type { ChartContainerProps, ChartContainerHandle, ChartContainerMobileOptions, ChartNotification, ChartNotificationLevel, } from "./ChartContainer";
75
+ export type { ChartContainerProps, ChartContainerHandle, ChartContainerDataAudit, ChartContainerDataAuditOptions, ChartContainerMobileOptions, ChartNotification, ChartNotificationLevel, } from "./ChartContainer";
76
76
  export type { MobileChartChip, MobileChartContainerProps, MobileChartDetailMode, } from "./MobileChartContainer";
77
77
  export type { MobileStandardBrushControls, MobileStandardControlKind, MobileStandardControlLegendItem, MobileStandardControlRequest, MobileStandardControlsMode, MobileStandardControlsProps, MobileStandardLegendControls, MobileStandardZoomControls, UseMobileRangeControlsOptions, UseMobileRangeControlsResult, } from "./MobileStandardControls";
78
78
  export type { MobileVisualizationContract } from "./charts/shared/auditMobileVisualization";
@@ -47,6 +47,26 @@ export interface RenderEvidence {
47
47
  ariaLabel: string;
48
48
  /** Stable warning codes (EMPTY_SCENE, NO_SCALES). */
49
49
  warnings: string[];
50
+ /**
51
+ * The resolved margin Semiotic actually used — after auto-reservation for a
52
+ * legend, a title, or any other chrome that grows a side beyond the caller's
53
+ * input. This is ground truth for reconstructing the plot rectangle by
54
+ * hand (e.g. a caller hand-drawing an SSR overlay); it is exactly what the
55
+ * emitted SVG's `data-area` group is translated by.
56
+ */
57
+ margin?: {
58
+ top: number;
59
+ right: number;
60
+ bottom: number;
61
+ left: number;
62
+ };
63
+ /** The plot rectangle after resolving `margin` against the outer `width`/`height`. */
64
+ plot?: {
65
+ x: number;
66
+ y: number;
67
+ width: number;
68
+ height: number;
69
+ };
50
70
  }
51
71
  /**
52
72
  * Internal mutable slot threaded through the frame renderers. Only
@@ -85,6 +105,13 @@ interface BuildEvidenceInput {
85
105
  edgeCount?: number;
86
106
  legendItems?: number;
87
107
  extraWarnings?: string[];
108
+ /** The resolved margin (after auto-reservation) the caller's frame used. */
109
+ margin?: {
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
113
+ left: number;
114
+ };
88
115
  }
89
116
  /** Assemble evidence from a computed scene. Component name is stamped later
90
117
  * by `renderChartWithEvidence`, which knows the HOC-level name. */
@@ -52,6 +52,7 @@ export declare const CHART_CONFIGS: {
52
52
  CollisionSwarmChart: ChartConfig;
53
53
  ProcessFlowChart: ChartConfig;
54
54
  GauntletChart: ChartConfig;
55
+ CrucibleChart: ChartConfig;
55
56
  PhysicalFlowChart: ChartConfig;
56
57
  PhysicsCustomChart: ChartConfig;
57
58
  };
@@ -5,5 +5,14 @@ export declare const physicsPileChart: ChartConfig;
5
5
  export declare const collisionSwarmChart: ChartConfig;
6
6
  export declare const processFlowChart: ChartConfig;
7
7
  export declare const gauntletChart: ChartConfig;
8
+ /**
9
+ * Static CrucibleChart renders the same deterministic ledger used by the
10
+ * client HOC. A replay request settles at the terminal state for SSR (the
11
+ * client also hydrates from that reduced-motion snapshot); snapshot mode is
12
+ * the one deliberate way to request an authored intermediate instant.
13
+ * `paused`, `playbackRate`, and `rerunMS` govern wall-clock replay only and
14
+ * therefore cannot alter this static semantic state.
15
+ */
16
+ export declare const crucibleChart: ChartConfig;
8
17
  export declare const physicalFlowChart: ChartConfig;
9
18
  export declare const physicsCustomChart: ChartConfig;
@@ -7,6 +7,7 @@ import type { Datum, DatumValue } from "../charts/shared/datumTypes";
7
7
  */
8
8
  import * as React from "react";
9
9
  import type { SemioticTheme } from "../store/ThemeStore";
10
+ import type { AnnotationContext } from "../realtime/types";
10
11
  import { type AutoPlaceAnnotations } from "../recipes/annotationLayout";
11
12
  interface AnnotationScales {
12
13
  x?: AnnotationScale;
@@ -27,7 +28,9 @@ interface AnnotationScales {
27
28
  }
28
29
  type AnnotationScale = {
29
30
  bivarianceHack(value: DatumValue): number;
30
- }["bivarianceHack"];
31
+ }["bivarianceHack"] & {
32
+ domain?: () => DatumValue[];
33
+ };
31
34
  interface AnnotationLayout {
32
35
  width: number;
33
36
  height: number;
@@ -44,6 +47,17 @@ export interface StaticAnnotationConfig {
44
47
  yAccessor?: string;
45
48
  /** Ordinal projection — determines whether r maps to x or y */
46
49
  projection?: "vertical" | "horizontal" | "radial";
50
+ /**
51
+ * Custom SVG annotation renderer — same contract as the client
52
+ * `svgAnnotationRules` frame prop. When present, each annotation is
53
+ * offered to this rule first; returning `null`/`undefined` falls through
54
+ * to the built-in static type handlers. Without this, custom middle-
55
+ * marker / bulb overlays (and any other non-built-in annotation type)
56
+ * silently vanished from `renderChart` SVG.
57
+ */
58
+ svgAnnotationRules?: (annotation: Datum, index: number, context: AnnotationContext) => React.ReactNode;
59
+ /** Chart data forwarded into the AnnotationContext for custom rules. */
60
+ annotationData?: Datum[];
47
61
  }
48
62
  /**
49
63
  * Render annotations as static SVG elements.