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,55 @@
1
+ /**
2
+ * Pure LineChart series-feature prep for the SSR / renderChart path.
3
+ *
4
+ * Mirrors the client HOC orchestration of:
5
+ * - `useSeriesFeatures` (forecast / anomaly via `buildForecast`)
6
+ * - gapStrategy (break / interpolate / zero)
7
+ * - directLabel endpoint annotations
8
+ * - segment-aware lineStyle (createSegmentLineStyle)
9
+ *
10
+ * Client uses lazy dynamic import + React state for these; SSR can call
11
+ * the pure statisticalOverlays entry points synchronously.
12
+ */
13
+ import type { Datum } from "./datumTypes";
14
+ import { type AnomalyConfig, type ForecastConfig } from "./statisticalOverlays";
15
+ export interface LineSeriesSsrInput {
16
+ data: unknown;
17
+ xAccessor?: string | ((d: Datum) => unknown);
18
+ yAccessor?: string | ((d: Datum) => unknown);
19
+ lineBy?: string | ((d: Datum) => unknown);
20
+ colorBy?: string | ((d: Datum) => unknown);
21
+ colorScheme?: unknown;
22
+ color?: string;
23
+ forecast?: ForecastConfig;
24
+ anomaly?: AnomalyConfig;
25
+ gapStrategy?: "break" | "interpolate" | "zero";
26
+ directLabel?: boolean | {
27
+ position?: "start" | "end";
28
+ fontSize?: number;
29
+ };
30
+ /** Existing annotations to merge with statistical + direct-label ones. */
31
+ annotations?: Datum[];
32
+ themeCategorical?: string[];
33
+ /** Base lineStyle from buildLineStyle — wrapped with segment styling when forecast is set. */
34
+ baseLineStyle?: (d: Datum, group?: string) => Datum;
35
+ }
36
+ export interface LineSeriesSsrResult {
37
+ data: Datum[];
38
+ xAccessor: string | ((d: Datum) => unknown);
39
+ yAccessor: string | ((d: Datum) => unknown);
40
+ groupAccessor: string | ((d: Datum) => unknown) | undefined;
41
+ colorAccessor: string | ((d: Datum) => unknown) | undefined;
42
+ annotations: Datum[];
43
+ lineStyle?: (d: Datum, group?: string) => Datum;
44
+ yExtent?: [number, number];
45
+ /** Extra right/left margin for direct labels. */
46
+ marginExtra?: {
47
+ left?: number;
48
+ right?: number;
49
+ };
50
+ }
51
+ /**
52
+ * Prepare LineChart props for static SSR: forecast/anomaly data + annotations,
53
+ * gap handling, direct labels, segment lineStyle.
54
+ */
55
+ export declare function prepareLineSeriesForSsr(input: LineSeriesSsrInput): LineSeriesSsrResult;
@@ -43,7 +43,7 @@ export type LinkedBrushProp = string | {
43
43
  yField?: string;
44
44
  };
45
45
  /**
46
- * Chart display mode — controls default chrome, size, and interaction.
46
+ * Chart display mode — controls default decoration, size, and interaction.
47
47
  * User-provided props always override mode defaults.
48
48
  */
49
49
  export type ChartMode = "primary" | "context" | "sparkline" | "mobile";
@@ -98,7 +98,7 @@ export interface ResolvedMobileInteractionConfig {
98
98
  * Base props shared across all chart components
99
99
  */
100
100
  export interface BaseChartProps {
101
- /** Display mode: "primary" (full chrome), "context" (compact), "sparkline" (inline) */
101
+ /** Display mode: "primary" (full decoration), "context" (compact), "sparkline" (inline), or "mobile" (touch-first) */
102
102
  mode?: ChartMode;
103
103
  /** Chart width in pixels. Default: 600 */
104
104
  width?: number;
@@ -5,7 +5,7 @@ export interface ValidationResult {
5
5
  valid: boolean;
6
6
  errors: string[];
7
7
  }
8
- export type PropType = "string" | "number" | "boolean" | "array" | "object" | "function";
8
+ export type PropType = "string" | "number" | "boolean" | "array" | "object" | "function" | "null";
9
9
  export interface PropDef {
10
10
  type: PropType | PropType[];
11
11
  enum?: readonly string[];
@@ -14,6 +14,16 @@ export interface SemanticGradientStop {
14
14
  /** Optional opacity applied to this stop. */
15
15
  opacity?: number;
16
16
  }
17
+ /**
18
+ * Convert value-anchored `semanticGradient` stops (`{ at, color }` on the value
19
+ * scale, 0–100) into the frame's `gradientFill.colorStops` (offset 0 = top).
20
+ * Exported so the server (`renderChart`) config resolves it identically to this
21
+ * HOC — otherwise SSR silently drops `semanticGradient` and paints a flat area.
22
+ */
23
+ export declare function semanticGradientToColorStops(stops: SemanticGradientStop[]): Array<{
24
+ offset: number;
25
+ color: string;
26
+ }>;
17
27
  /**
18
28
  * AreaChart component props
19
29
  */
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import type { StreamScales } from "../../stream/types";
3
+ export interface MinimapBrushOverlayProps {
4
+ width: number;
5
+ height: number;
6
+ margin: {
7
+ top: number;
8
+ right: number;
9
+ bottom: number;
10
+ left: number;
11
+ };
12
+ scales: StreamScales | null;
13
+ brushDirection: "x" | "y";
14
+ extent: [number, number] | null;
15
+ onBrush: (extent: [number, number] | null) => void;
16
+ }
17
+ export declare function MinimapBrushOverlay({ width, height, margin, scales, brushDirection, extent, onBrush, }: MinimapBrushOverlayProps): React.JSX.Element;
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ import type { MinimapBrushOverlayProps } from "./minimapBrushOverlay";
3
+ /** Renders nothing until d3-brush module resolves, then mounts the brush. */
4
+ export declare function MinimapBrushOverlayLazy(props: MinimapBrushOverlayProps): React.JSX.Element | null;
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import type { StreamXYFrameHandle } from "../../stream/types";
3
+ export interface ScatterplotMatrixBrushOverlayProps {
4
+ frameRef: React.RefObject<StreamXYFrameHandle | null>;
5
+ cellSize: number;
6
+ onBrush: (extent: [number, number][] | null) => void;
7
+ }
8
+ export declare function ScatterplotMatrixBrushOverlay({ frameRef, cellSize, onBrush, }: ScatterplotMatrixBrushOverlayProps): React.JSX.Element;
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ import type { ScatterplotMatrixBrushOverlayProps } from "./scatterplotMatrixBrushOverlay";
3
+ export declare function ScatterplotMatrixBrushOverlayLazy(props: ScatterplotMatrixBrushOverlayProps): React.JSX.Element | null;
@@ -0,0 +1,51 @@
1
+ import type { Datum } from "../charts/shared/datumTypes";
2
+ import type { Diagnosis } from "../charts/shared/diagnoseTypes";
3
+ import { type NumericContracts, type NumericFieldRole, type NumericRequirement } from "./numericContracts";
4
+ export interface DataAuditDiagnosis extends Diagnosis {
5
+ readonly domain: "data";
6
+ readonly field?: string;
7
+ readonly role?: NumericFieldRole;
8
+ /** Bounded, zero-based row indices; `count` carries the full total. */
9
+ readonly rows?: ReadonlyArray<number>;
10
+ readonly count?: number;
11
+ }
12
+ export interface CheckedNumericContract {
13
+ readonly role: NumericFieldRole;
14
+ readonly accessor: string;
15
+ readonly dataProp: string;
16
+ readonly requirements: ReadonlyArray<NumericRequirement>;
17
+ readonly allowMissing: boolean;
18
+ readonly missingValue?: number;
19
+ readonly domain: boolean;
20
+ }
21
+ export interface DataAuditResult {
22
+ readonly component: string;
23
+ readonly ok: boolean;
24
+ readonly rowCount: number;
25
+ readonly summary: {
26
+ readonly fieldsChecked: number;
27
+ readonly errors: number;
28
+ readonly warnings: number;
29
+ };
30
+ readonly contracts: ReadonlyArray<CheckedNumericContract>;
31
+ readonly diagnoses: ReadonlyArray<DataAuditDiagnosis>;
32
+ }
33
+ export interface AuditDataOptions {
34
+ /** Override the registered/built-in contract (useful for one-off custom charts). */
35
+ readonly contracts?: NumericContracts;
36
+ /** Disable the conservative, 10×IQR scale-domination warning. */
37
+ readonly checkOutliers?: boolean;
38
+ }
39
+ /**
40
+ * Audit the intrinsic numeric safety of data for a selected chart.
41
+ *
42
+ * This is the input-side companion to `diagnoseConfig` (representation) and
43
+ * `auditAccessibility` (reception). It is pure, deterministic, React-free, and
44
+ * accepts function accessors without serializing or executing arbitrary code
45
+ * outside the caller's own process.
46
+ */
47
+ export declare function auditData(component: string, props: Datum, data?: ReadonlyArray<Datum>, options?: AuditDataOptions): DataAuditResult;
48
+ export { profileNumericFields } from "./numericFieldProfiler";
49
+ export type { NumericFieldProfile, ProfileNumericFieldsOptions } from "./numericFieldProfiler";
50
+ export { formatDataAudit, toDataAuditNotifications } from "./dataAuditPresentation";
51
+ export type { DataAuditChartNotification, DataAuditNotificationOptions } from "./dataAuditPresentation";
@@ -0,0 +1,18 @@
1
+ import type { DataAuditResult } from "./auditData";
2
+ export interface DataAuditChartNotification {
3
+ readonly id: string;
4
+ readonly level: "warning" | "error";
5
+ readonly title: string;
6
+ readonly message: string;
7
+ readonly source: "Semiotic data audit";
8
+ readonly dismissible: true;
9
+ }
10
+ export interface DataAuditNotificationOptions {
11
+ /** Maximum individual findings before a final overflow notice. Default 6. */
12
+ readonly max?: number;
13
+ /** Omit non-blocking warnings. Default false. */
14
+ readonly errorsOnly?: boolean;
15
+ }
16
+ export declare function formatDataAudit(result: DataAuditResult): string;
17
+ /** Map audit findings directly onto ChartContainer's notification contract. */
18
+ export declare function toDataAuditNotifications(result: DataAuditResult, options?: DataAuditNotificationOptions): DataAuditChartNotification[];
@@ -0,0 +1,9 @@
1
+ import type { Datum } from "../charts/shared/datumTypes";
2
+ import type { NumericContracts, NumericFieldContract } from "./numericContracts";
3
+ /** Resolve a contract's outer or line-object nested row source. */
4
+ export declare function rowsForNumericField(field: NumericFieldContract, props: Datum, data: ReadonlyArray<Datum> | undefined): {
5
+ dataProp: string;
6
+ rows: ReadonlyArray<Datum>;
7
+ };
8
+ /** Find explicit empty outer arrays and all-empty declared nested series. */
9
+ export declare function explicitEmptyNumericSources(contracts: NumericContracts, props: Datum, data: ReadonlyArray<Datum> | undefined): string[];
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Serializable numeric input contracts for chart capabilities.
3
+ *
4
+ * The contract table deliberately lives below the AI/capability registry. It is
5
+ * consumed by `diagnoseConfig` and `ChartContainer`, both of which must stay
6
+ * lightweight, while capability descriptors reference the same objects.
7
+ */
8
+ export type NumericFieldRole = "x" | "y" | "value" | "size" | "count" | "opacity" | "time" | "lower" | "upper" | "open" | "close" | "high" | "low" | (string & {});
9
+ export type NumericRequirement = "finite" | "positive" | "non-negative" | "integer" | "unit-interval";
10
+ export interface NumericFieldContract {
11
+ /** Semantic role used in findings and dynamic scale checks. */
12
+ readonly role: NumericFieldRole;
13
+ /** Name of the chart prop that contains a string/function accessor. */
14
+ readonly accessor: string;
15
+ /** Resolve this field only when every named chart prop is present. */
16
+ readonly whenProps?: ReadonlyArray<string>;
17
+ /** Accessor used by the chart when the prop is omitted. */
18
+ readonly defaultAccessor?: string;
19
+ /** Collection prop to inspect. Defaults to `data`. */
20
+ readonly dataProp?: string;
21
+ /** Prop naming a nested row array (for line-object `coordinates`, for example). */
22
+ readonly nestedDataAccessorProp?: string;
23
+ /** Nested row-array field used when that prop is omitted. */
24
+ readonly defaultNestedDataAccessor?: string;
25
+ /** Every numeric binding is finite by default. */
26
+ readonly requirements?: ReadonlyArray<NumericRequirement>;
27
+ /** Temporal coercion supported by the chart: Date only, or Date + date-like strings. */
28
+ readonly temporalValues?: "date" | "date-like";
29
+ /** Permit null/undefined values as intentional gaps. Default false. */
30
+ readonly allowMissing?: boolean;
31
+ /** Finite numeric fallback the renderer applies to missing values. */
32
+ readonly missingValue?: number;
33
+ /** Whether equal values create a zero-span scale domain. */
34
+ readonly domain?: boolean;
35
+ }
36
+ export interface NumericAggregateContract {
37
+ readonly kind: "positive-total" | "normalized-total";
38
+ /** Numeric field role to aggregate. */
39
+ readonly role: NumericFieldRole;
40
+ /** Optional grouping accessor prop (for one normalization total per x/category). */
41
+ readonly groupAccessor?: string;
42
+ readonly defaultGroupAccessor?: string;
43
+ /** Only enforce the aggregate when this boolean prop is true. */
44
+ readonly whenProp?: string;
45
+ }
46
+ export interface NumericContracts {
47
+ readonly fields: ReadonlyArray<NumericFieldContract>;
48
+ readonly aggregates?: ReadonlyArray<NumericAggregateContract>;
49
+ }
50
+ /**
51
+ * Compact built-in table. Shared contract objects are intentionally reused so
52
+ * this adds very little to `semiotic/utils/core` when diagnostics import it.
53
+ */
54
+ export declare const BUILT_IN_NUMERIC_CONTRACTS: Readonly<Record<string, NumericContracts>>;
55
+ /** Internal hook used by the public capability registry for third-party charts. */
56
+ export declare function registerNumericContracts(component: string, contracts: NumericContracts | undefined): void;
57
+ /** Internal hook used when a third-party capability is unregistered. */
58
+ export declare function unregisterNumericContracts(component: string): void;
59
+ export declare function getNumericContracts(component: string): NumericContracts | undefined;
@@ -0,0 +1,23 @@
1
+ import type { Datum } from "../charts/shared/datumTypes";
2
+ export interface NumericFieldProfile {
3
+ readonly field: string;
4
+ readonly observedCount: number;
5
+ readonly finiteCount: number;
6
+ readonly missingCount: number;
7
+ readonly nonFiniteCount: number;
8
+ readonly nonNumericCount: number;
9
+ readonly zeroCount: number;
10
+ readonly negativeCount: number;
11
+ readonly fractionalCount: number;
12
+ readonly min?: number;
13
+ readonly q1?: number;
14
+ readonly median?: number;
15
+ readonly q3?: number;
16
+ readonly max?: number;
17
+ }
18
+ export interface ProfileNumericFieldsOptions {
19
+ /** Include exact quartiles. Disable when another profiler already sorts fields. */
20
+ readonly quantiles?: boolean;
21
+ }
22
+ /** Profile invalid/missing numeric candidates without silently dropping them. */
23
+ export declare function profileNumericFields(data: ReadonlyArray<Datum> | null | undefined, options?: ProfileNumericFieldsOptions): Readonly<Record<string, NumericFieldProfile>>;
@@ -191,6 +191,11 @@ export interface RealtimeFrameHandle {
191
191
  remove(id: string | string[]): Datum[];
192
192
  /** Update data by ID in place. Requires an ID accessor. Returns previous values. */
193
193
  update(id: string | string[], updater: (d: Datum) => Datum): Datum[];
194
+ /**
195
+ * Ordinal-only bounded ingest: replace the buffer while preserving category
196
+ * order and enter/move/exit transitions. XY/network/geo typically omit this.
197
+ */
198
+ replace?(data: Datum[]): void;
194
199
  clear(): void;
195
200
  getData(): Datum[];
196
201
  /** Returns the frame's resolved scales, or null if unavailable.
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Pure grid-operations helpers for multi-series power observatories.
3
+ *
4
+ * These turn balancing-authority hourly rows into the chart-ready series used by
5
+ * StackedAreaChart, DifferenceChart, BigNumber, styleRules factories, and
6
+ * provenanced event annotations. They are domain math — not a React kit — so
7
+ * agents and pages can share the same pipeline.
8
+ *
9
+ * Honesty: {@link reserveMarginPct} is a **readability proxy** from public
10
+ * demand / net-generation (+ optional interchange) series. It is *not* an ISO
11
+ * contingency-reserve product. Label it as such in UI and `describeChart` copy.
12
+ */
13
+ import type { StyleRule } from "../charts/shared/styleRules";
14
+ import type { HatchFill } from "../charts/shared/hatchFill";
15
+ /** Stable fuel keys used across regions when present. */
16
+ export declare const GRID_FUEL_KEYS: readonly ["naturalGas", "coal", "nuclear", "hydro", "wind", "solar", "other"];
17
+ export type GridFuelKey = (typeof GRID_FUEL_KEYS)[number];
18
+ /** Human labels for fuel keys (legend / tooltips). */
19
+ export declare const GRID_FUEL_LABELS: Record<GridFuelKey, string>;
20
+ /**
21
+ * One hour (or finest grain) in one balancing authority.
22
+ * Compatible with the strategy schema in docs/strategy/examples-thegrid.md.
23
+ */
24
+ export type GridHour = {
25
+ t: number;
26
+ ba: string;
27
+ demandMw: number;
28
+ forecastMw?: number;
29
+ netGenMw: number;
30
+ interchangeMw?: number;
31
+ fuels: Partial<Record<GridFuelKey, number>>;
32
+ };
33
+ export type ReserveSnapshot = {
34
+ t: number;
35
+ ba: string;
36
+ /** Rough operational headroom proxy — never claim ISO-grade contingency reserve. */
37
+ reserveMarginPct: number;
38
+ netLoadMw: number;
39
+ demandMw: number;
40
+ netGenMw: number;
41
+ };
42
+ export type ReserveLevels = {
43
+ /** Margin below this % is "tight" / danger. Default 5. */
44
+ tight?: number;
45
+ /** Margin below this % is "watch" / warning. Default 12. */
46
+ watch?: number;
47
+ /** Margin at or above this % is comfortable / success. Default 20. */
48
+ comfortable?: number;
49
+ };
50
+ export type FuelStackRow = {
51
+ t: number;
52
+ fuel: GridFuelKey;
53
+ fuelLabel: string;
54
+ mw: number;
55
+ ba: string;
56
+ };
57
+ export type DemandForecastRow = {
58
+ t: number;
59
+ a: number;
60
+ b: number;
61
+ demandMw: number;
62
+ forecastMw: number;
63
+ errorMw: number;
64
+ ba: string;
65
+ };
66
+ export type OperatingPointSummary = {
67
+ t: number;
68
+ ba: string;
69
+ demandMw: number;
70
+ forecastMw: number | null;
71
+ forecastErrorMw: number | null;
72
+ netGenMw: number;
73
+ reserveMarginPct: number;
74
+ topFuel: GridFuelKey | null;
75
+ topFuelShare: number;
76
+ topFuelMw: number;
77
+ fuelShares: Partial<Record<GridFuelKey, number>>;
78
+ };
79
+ export type GridEventWindow = {
80
+ id: string;
81
+ /** Inclusive start epoch ms. */
82
+ start: number;
83
+ /** Inclusive end epoch ms. */
84
+ end: number;
85
+ label: string;
86
+ /** Optional longer note for callouts. */
87
+ note?: string;
88
+ /** "heat-wave" | "outage" | "demand-spike" | open string. */
89
+ kind?: string;
90
+ /** ISO 8601 duration or ms; default "P7D". */
91
+ ttlHint?: string | number;
92
+ y?: number;
93
+ /** Data y for y-threshold style notes. */
94
+ value?: number;
95
+ };
96
+ /**
97
+ * Stackable long-form fuel series for StackedAreaChart (`areaBy: "fuel"`).
98
+ * Zero / missing fuels are omitted so empty keys do not invent area layers.
99
+ */
100
+ export declare function stackFuelSeries(hours: readonly GridHour[], options?: {
101
+ fuels?: readonly GridFuelKey[];
102
+ includeZero?: boolean;
103
+ }): FuelStackRow[];
104
+ /**
105
+ * DifferenceChart rows: series A = demand, series B = forecast.
106
+ * Hours without a finite forecast are skipped.
107
+ */
108
+ export declare function demandForecastRows(hours: readonly GridHour[]): DemandForecastRow[];
109
+ /**
110
+ * Readability proxy for operational headroom.
111
+ *
112
+ * ```
113
+ * reserveMarginPct = ((supply - demand) / demand) * 100
114
+ * supply = capacityOrNetGen + max(0, -interchange) // imports add supply
115
+ * ```
116
+ *
117
+ * When demand is 0, returns 0. Negative values mean demand exceeds supply.
118
+ *
119
+ * **Not** ISO contingency reserve (spinning + non-spinning + regulation).
120
+ * Document that distinction wherever this number is shown.
121
+ */
122
+ export declare function reserveMarginPct(input: {
123
+ demand: number;
124
+ capacityOrNetGen: number;
125
+ interchange?: number;
126
+ }): number;
127
+ /** Per-hour reserve snapshots derived from {@link GridHour} rows. */
128
+ export declare function reserveSeries(hours: readonly GridHour[]): ReserveSnapshot[];
129
+ /**
130
+ * Declarative `styleRules` for marks whose primary value is reserve margin %.
131
+ * Hatch on the tight band so color is not the only encoding.
132
+ *
133
+ * Works on BarChart / DotPlot (ordinal) and LineChart / Scatterplot when the
134
+ * mark value (or `field: "reserveMarginPct"`) is the margin percent.
135
+ */
136
+ export declare function thresholdBandsForReserve(levels?: ReserveLevels, options?: {
137
+ field?: string;
138
+ /** Override hatch for the tight band. */
139
+ tightHatch?: HatchFill;
140
+ tightFill?: string;
141
+ watchFill?: string;
142
+ comfortableFill?: string;
143
+ }): StyleRule[];
144
+ /**
145
+ * Annotation band descriptors for reserve threshold strips (y-band style).
146
+ * Pair with chart `annotations` — not the same object as styleRules.
147
+ */
148
+ export declare function reserveAnnotationBands(levels?: ReserveLevels): Array<{
149
+ type: "band";
150
+ y0: number;
151
+ y1: number;
152
+ label: string;
153
+ color: string;
154
+ fillOpacity: number;
155
+ emphasis: "secondary";
156
+ }>;
157
+ /** Summarize the operating point at `now` (or the last hour ≤ now). */
158
+ export declare function summarizeOperatingPoint(hours: readonly GridHour[], now?: number): OperatingPointSummary | null;
159
+ /**
160
+ * Convert authored event windows into annotation objects with provenance + lifecycle
161
+ * fields suitable for `applyAnnotationLifecycle`.
162
+ *
163
+ * Returns plain annotation dicts (not React nodes). Callers may pass the array to
164
+ * chart `annotations` after lifecycle treatment.
165
+ */
166
+ export declare function gridEventAnnotations(events: readonly GridEventWindow[], options?: {
167
+ now?: number;
168
+ author?: string;
169
+ source?: string;
170
+ }): Array<Record<string, unknown>>;
171
+ /** Pick the top N tightest-margin hours for a ranked risk strip. */
172
+ export declare function tightestHours(reserves: readonly ReserveSnapshot[], n?: number): ReserveSnapshot[];
173
+ /** Format MW with locale grouping; returns "—" for non-finite. */
174
+ export declare function formatMw(value: number, digits?: number): string;
175
+ /** Format reserve margin percent with sign awareness. */
176
+ export declare function formatReservePct(value: number, digits?: number): string;
@@ -0,0 +1,167 @@
1
+ import type { NetworkCustomLayout } from "../stream/networkCustomLayout";
2
+ import type { Datum } from "../charts/shared/datumTypes";
3
+ import type { HighlightMatch } from "./recipeUtils";
4
+ /**
5
+ * `netEnsembleLayout` — a layout for **ensembles of disconnected (or only
6
+ * trivially connected) DAGs**: a "bag of little graphs" that force-directed
7
+ * layout scatters into meaningless blobs and hierarchical layouts (dagre,
8
+ * flextree) can't place at all because they assume one connected root.
9
+ *
10
+ * The organizing idea comes from the mathematical notion of a **net** (a
11
+ * Moore–Smith net: a function from a *directed set*). A directed set is a
12
+ * partial order in which every pair of elements has a common upper bound —
13
+ * "everything eventually flows together." A DAG hands you a partial order for
14
+ * free via reachability (`u ≤ v` iff `v` is reachable from `u`), and a finite
15
+ * directed set must have a single greatest element. For a weakly-connected DAG
16
+ * that collapses to a one-line, O(V+E) test: **count the sinks.** Exactly one
17
+ * sink ⟹ the component is a net converging to a single limit; two or more sinks
18
+ * ⟹ it fails directedness (some pair has no common descendant). See
19
+ * `/recipes/net-ensemble` for the full explanation.
20
+ *
21
+ * The layout:
22
+ * 1. splits the graph into weakly-connected components,
23
+ * 2. tests each for directedness (the sink count),
24
+ * 3. fingerprints each component with Weisfeiler–Leman color refinement so
25
+ * order-isomorphic components — the recurring *motifs* — group together,
26
+ * 4. lays each component out so flow converges toward its sink(s) at the
27
+ * bottom (the convergence-to-a-limit made spatial), and
28
+ * 5. arranges the ensemble as small multiples grouped into motif bands,
29
+ * turning a hairball-of-blobs into a **census** ("12 chains, 4 diamonds,
30
+ * 3 branching forks, 1 oddball") — the thing force layout can never show.
31
+ *
32
+ * Emits one hit-testable scene node per drawn mark (individual nodes at full
33
+ * detail, one node per component when cells collapse), so it inherits keyboard
34
+ * nav, annotation anchoring, and shared selection for free. Pure / SSR-safe.
35
+ */
36
+ export interface NetEnsembleConfig {
37
+ /** Edge field naming the source node id. @default "source" */
38
+ sourceAccessor?: string;
39
+ /** Edge field naming the target node id. @default "target" */
40
+ targetAccessor?: string;
41
+ /** Node field for the display label. @default "label" */
42
+ labelAccessor?: string;
43
+ /** Node field for a category (used by `colorMode: "category"`). @default "category" */
44
+ categoryAccessor?: string;
45
+ /** Group order-isomorphic components into labelled motif bands. When `false`,
46
+ * every component is placed in one band ordered by size. @default true */
47
+ groupByMotif?: boolean;
48
+ /** Band ordering. @default "frequency" */
49
+ sort?: "frequency" | "size" | "directedness";
50
+ /** What node fill encodes. @default "directedness" */
51
+ colorMode?: "directedness" | "category" | "motif";
52
+ /** Node radius at full detail (px). @default 4 */
53
+ nodeRadius?: number;
54
+ /** Gap between component cells (px). @default 16 */
55
+ cellGap?: number;
56
+ /** Gap between motif bands (px). @default 22 */
57
+ bandGap?: number;
58
+ /** Height reserved for a band's header/label + exemplar (px). @default 34 */
59
+ headerHeight?: number;
60
+ /** Below this cell size (px) a component collapses to a single glyph — the
61
+ * census view for large ensembles. @default 38 */
62
+ minCellForFull?: number;
63
+ /** Largest cell edge (px). @default 120 */
64
+ maxCellSize?: number;
65
+ /** Smallest cell edge (px) before the layout stops shrinking to fit. @default 12 */
66
+ minCellSize?: number;
67
+ /** Weisfeiler–Leman refinement rounds for the motif fingerprint. More rounds
68
+ * distinguish subtler structural differences. @default 3 */
69
+ fingerprintRounds?: number;
70
+ /** Draw the motif descriptor + instance count in each band header. @default true */
71
+ showBandLabels?: boolean;
72
+ /** Draw the representative component once per band (the "template"). @default true */
73
+ showExemplars?: boolean;
74
+ /** Draw the directedness legend. @default true */
75
+ showLegend?: boolean;
76
+ /** Fill for converging (single-sink) components. @default theme info */
77
+ convergeColor?: string;
78
+ /** Fill for branching (multi-sink) components. @default theme warning */
79
+ branchColor?: string;
80
+ /** Edge stroke color. @default theme border */
81
+ edgeColor?: string;
82
+ /** Dim marks that don't match this `{field, value}` highlight. */
83
+ highlight?: HighlightMatch | null;
84
+ }
85
+ export interface NetEnsemblePlacedNode {
86
+ id: string;
87
+ cx: number;
88
+ cy: number;
89
+ r: number;
90
+ datum: Datum;
91
+ category: string;
92
+ }
93
+ export interface NetEnsemblePlacedEdge {
94
+ x1: number;
95
+ y1: number;
96
+ x2: number;
97
+ y2: number;
98
+ }
99
+ /** One weakly-connected component of the ensemble, with its net diagnostics. */
100
+ export interface NetEnsembleComponent {
101
+ /** Node ids belonging to this component. */
102
+ ids: string[];
103
+ nodeCount: number;
104
+ edgeCount: number;
105
+ /** Sinks (out-degree 0) and sources (in-degree 0) within the component. */
106
+ sinkCount: number;
107
+ sourceCount: number;
108
+ /**
109
+ * True iff the component is a **directed set** (a net with a single limit):
110
+ * for a weakly-connected DAG this holds exactly when there is one sink, so
111
+ * every pair of nodes shares a common descendant. Multiple sinks ⟹ some pair
112
+ * has no common upper bound and the component fails directedness.
113
+ */
114
+ directed: boolean;
115
+ /** Weisfeiler–Leman fingerprint — order-isomorphic components share it. */
116
+ motif: string;
117
+ /** Short human descriptor of the shape (e.g. `"chain of 5"`, `"diamond / mesh"`). */
118
+ descriptor: string;
119
+ }
120
+ /** A motif class: one recurring structural shape and how many times it appears. */
121
+ export interface NetEnsembleMotif {
122
+ motif: string;
123
+ descriptor: string;
124
+ count: number;
125
+ directed: boolean;
126
+ }
127
+ export interface NetEnsembleAnalysis {
128
+ /** Every weakly-connected component, with net diagnostics. */
129
+ components: NetEnsembleComponent[];
130
+ /** The distinct motif classes, most frequent first. */
131
+ motifs: NetEnsembleMotif[];
132
+ /** Components that converge to a single sink (are directed nets). */
133
+ directedCount: number;
134
+ /** Components that branch to two or more sinks. */
135
+ branchingCount: number;
136
+ }
137
+ /**
138
+ * Analyze a graph as an **ensemble of nets** — headless, no rendering. Splits
139
+ * the graph into weakly-connected components, tests each for directedness (the
140
+ * sink count), fingerprints them so recurring motifs group together, and
141
+ * returns the motif census. The pure core of {@link netEnsembleLayout}; reach
142
+ * for it when you want the diagnostics (how many chains? how many branch?)
143
+ * without drawing, e.g. to drive a summary readout or a data-quality check.
144
+ */
145
+ export declare function analyzeNetEnsemble(nodes: ReadonlyArray<{
146
+ id: string;
147
+ }>, edges: ReadonlyArray<{
148
+ source: string;
149
+ target: string;
150
+ }>, options?: {
151
+ fingerprintRounds?: number;
152
+ }): NetEnsembleAnalysis;
153
+ export interface BandInfo {
154
+ motif: string;
155
+ descriptor: string;
156
+ count: number;
157
+ directed: boolean;
158
+ x: number;
159
+ y: number;
160
+ width: number;
161
+ height: number;
162
+ exemplar: {
163
+ nodes: NetEnsemblePlacedNode[];
164
+ edges: NetEnsemblePlacedEdge[];
165
+ } | null;
166
+ }
167
+ export declare const netEnsembleLayout: NetworkCustomLayout<NetEnsembleConfig>;