semiotic 3.7.3 → 3.7.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 (138) hide show
  1. package/CLAUDE.md +13 -7
  2. package/README.md +36 -20
  3. package/ai/schema.json +221 -1
  4. package/ai/system-prompt.md +2 -1
  5. package/dist/components/Annotation.d.ts +4 -0
  6. package/dist/components/DataSummaryContext.d.ts +1 -0
  7. package/dist/components/LinkedCharts.d.ts +2 -2
  8. package/dist/components/ai/chartCapabilityTypes.d.ts +16 -0
  9. package/dist/components/ai/dataPitfallsBridge.d.ts +101 -0
  10. package/dist/components/ai/dataQualityBridge.d.ts +201 -0
  11. package/dist/components/ai/describeChart.d.ts +2 -0
  12. package/dist/components/ai/generativeChart.d.ts +145 -0
  13. package/dist/components/charts/custom/NetworkCustomChart.d.ts +15 -2
  14. package/dist/components/charts/ordinal/SwarmPlot.d.ts +7 -0
  15. package/dist/components/charts/realtime/RealtimeLineChart.d.ts +21 -0
  16. package/dist/components/charts/realtime/aggregate.d.ts +51 -0
  17. package/dist/components/charts/realtime/eventTime.d.ts +26 -0
  18. package/dist/components/charts/shared/colorPalettes.d.ts +2 -0
  19. package/dist/components/charts/shared/colorUtils.d.ts +1 -12
  20. package/dist/components/charts/shared/minMax.d.ts +3 -0
  21. package/dist/components/charts/shared/radialGeometry.d.ts +0 -18
  22. package/dist/components/charts/shared/smartTooltip.d.ts +27 -0
  23. package/dist/components/charts/shared/statisticalOverlays.d.ts +35 -0
  24. package/dist/components/charts/shared/tooltipUtils.d.ts +2 -0
  25. package/dist/components/charts/shared/useChartSetup.d.ts +1 -1
  26. package/dist/components/charts/shared/useCustomChartSetup.d.ts +1 -1
  27. package/dist/components/charts/shared/validateChartData.d.ts +1 -1
  28. package/dist/components/charts/xy/Scatterplot.d.ts +9 -0
  29. package/dist/components/data/fromArrow.d.ts +54 -0
  30. package/dist/components/data/fromMermaid.d.ts +47 -0
  31. package/dist/components/data/fromObservablePlot.d.ts +69 -0
  32. package/dist/components/data/portability/index.d.ts +14 -0
  33. package/dist/components/data/portability/spec.d.ts +129 -0
  34. package/dist/components/data/portability/vegaLite.d.ts +62 -0
  35. package/dist/components/realtime/ReorderBuffer.d.ts +54 -0
  36. package/dist/components/realtime/RunningStats.d.ts +66 -0
  37. package/dist/components/realtime/WindowAccumulator.d.ts +105 -0
  38. package/dist/components/realtime/parseWindowDuration.d.ts +12 -0
  39. package/dist/components/recipes/customTooltip.d.ts +31 -0
  40. package/dist/components/recipes/gofish.d.ts +207 -0
  41. package/dist/components/recipes/gofishBoba.d.ts +23 -0
  42. package/dist/components/recipes/gofishIR.d.ts +169 -0
  43. package/dist/components/recipes/gofishIRExamples.d.ts +89 -0
  44. package/dist/components/recipes/gofishInterpreter.d.ts +52 -0
  45. package/dist/components/recipes/gofishLambdas.d.ts +145 -0
  46. package/dist/components/recipes/lineageDag.d.ts +129 -0
  47. package/dist/components/recipes/mermaidDag.d.ts +44 -0
  48. package/dist/components/recipes/packedClusterMatrix.d.ts +166 -0
  49. package/dist/components/recipes/recipeChrome.d.ts +100 -0
  50. package/dist/components/recipes/recipeLegend.d.ts +57 -0
  51. package/dist/components/recipes/recipeUtils.d.ts +105 -0
  52. package/dist/components/semiotic-ai.d.ts +6 -0
  53. package/dist/components/semiotic-data.d.ts +2 -0
  54. package/dist/components/semiotic-experimental.d.ts +20 -0
  55. package/dist/components/semiotic-network.d.ts +3 -1
  56. package/dist/components/semiotic-ordinal.d.ts +2 -0
  57. package/dist/components/semiotic-realtime.d.ts +9 -1
  58. package/dist/components/semiotic-recipes.d.ts +20 -1
  59. package/dist/components/semiotic-themes.d.ts +2 -0
  60. package/dist/components/semiotic-xy.d.ts +2 -0
  61. package/dist/components/semiotic.d.ts +6 -2
  62. package/dist/components/store/ObservationStore.d.ts +21 -2
  63. package/dist/components/store/SelectionStore.d.ts +1 -1
  64. package/dist/components/store/ThemeStore.d.ts +1 -1
  65. package/dist/components/store/TooltipStore.d.ts +1 -1
  66. package/dist/components/store/createStore.d.ts +1 -1
  67. package/dist/components/store/designTokens.d.ts +15 -0
  68. package/dist/components/store/useSelection.d.ts +22 -0
  69. package/dist/components/stream/NetworkHtmlMarksLayer.d.ts +44 -0
  70. package/dist/components/stream/NetworkPipelineStore.d.ts +32 -0
  71. package/dist/components/stream/NetworkSVGOverlay.d.ts +12 -0
  72. package/dist/components/stream/OrdinalPipelineStore.d.ts +18 -0
  73. package/dist/components/stream/PipelineStore.d.ts +27 -0
  74. package/dist/components/stream/SceneGraph.d.ts +5 -1
  75. package/dist/components/stream/customLayout.d.ts +20 -0
  76. package/dist/components/stream/customLayoutDiagnostics.d.ts +11 -0
  77. package/dist/components/stream/customLayoutSelection.d.ts +52 -0
  78. package/dist/components/stream/networkCustomLayout.d.ts +101 -1
  79. package/dist/components/stream/networkTypes.d.ts +38 -1
  80. package/dist/components/stream/ordinalCustomLayout.d.ts +17 -1
  81. package/dist/components/stream/ordinalSceneBuilders/types.d.ts +2 -0
  82. package/dist/components/stream/ordinalTypes.d.ts +19 -3
  83. package/dist/components/stream/renderers/networkSymbolRenderer.d.ts +2 -0
  84. package/dist/components/stream/renderers/symbolCanvasRenderer.d.ts +2 -0
  85. package/dist/components/stream/stalenessBands.d.ts +28 -0
  86. package/dist/components/stream/symbolPath.d.ts +24 -0
  87. package/dist/components/stream/types.d.ts +72 -3
  88. package/dist/components/stream/useStalenessCheck.d.ts +6 -1
  89. package/dist/components/stream/xySceneBuilders/pointScene.d.ts +2 -2
  90. package/dist/components/stream/xySceneBuilders/types.d.ts +5 -0
  91. package/dist/geo.min.js +1 -1
  92. package/dist/geo.module.min.js +1 -1
  93. package/dist/network.min.js +1 -1
  94. package/dist/network.module.min.js +1 -1
  95. package/dist/ordinal.min.js +1 -1
  96. package/dist/ordinal.module.min.js +1 -1
  97. package/dist/realtime.min.js +1 -1
  98. package/dist/realtime.module.min.js +1 -1
  99. package/dist/semiotic-ai-semiotic-ai-u954ylUn.js +2 -0
  100. package/dist/semiotic-ai-statisticalOverlays-CU7jW05Q.js +1 -0
  101. package/dist/semiotic-ai.d.ts +6 -0
  102. package/dist/semiotic-ai.min.js +1 -1
  103. package/dist/semiotic-ai.module.min.js +1 -1
  104. package/dist/semiotic-data.d.ts +2 -0
  105. package/dist/semiotic-data.min.js +1 -1
  106. package/dist/semiotic-data.module.min.js +1 -1
  107. package/dist/semiotic-experimental.d.ts +20 -0
  108. package/dist/semiotic-experimental.min.js +1 -0
  109. package/dist/semiotic-experimental.module.min.js +1 -0
  110. package/dist/semiotic-network.d.ts +3 -1
  111. package/dist/semiotic-ordinal.d.ts +2 -0
  112. package/dist/semiotic-realtime.d.ts +9 -1
  113. package/dist/semiotic-recipes.d.ts +20 -1
  114. package/dist/semiotic-recipes.min.js +1 -1
  115. package/dist/semiotic-recipes.module.min.js +1 -1
  116. package/dist/semiotic-semiotic-BmrYbi99.js +2 -0
  117. package/dist/semiotic-statisticalOverlays-IjZw8Lsu.js +1 -0
  118. package/dist/semiotic-themes.d.ts +2 -0
  119. package/dist/semiotic-themes.min.js +1 -1
  120. package/dist/semiotic-themes.module.min.js +1 -1
  121. package/dist/semiotic-utils.min.js +1 -1
  122. package/dist/semiotic-utils.module.min.js +1 -1
  123. package/dist/semiotic-value.min.js +1 -1
  124. package/dist/semiotic-value.module.min.js +1 -1
  125. package/dist/semiotic-xy.d.ts +2 -0
  126. package/dist/semiotic.d.ts +6 -2
  127. package/dist/semiotic.min.js +1 -1
  128. package/dist/semiotic.module.min.js +1 -1
  129. package/dist/server.min.js +1 -1
  130. package/dist/server.module.min.js +1 -1
  131. package/dist/xy-semiotic-xy-Dufu3D0-.js +2 -0
  132. package/dist/xy-statisticalOverlays-3Ni9bRph.js +1 -0
  133. package/dist/xy.min.js +1 -1
  134. package/dist/xy.module.min.js +1 -1
  135. package/package.json +11 -3
  136. package/dist/semiotic-ai-statisticalOverlays-C2PPlmXv.js +0 -1
  137. package/dist/semiotic-statisticalOverlays-C3DsOgr_.js +0 -1
  138. package/dist/xy-statisticalOverlays-C2PPlmXv.js +0 -1
@@ -0,0 +1,105 @@
1
+ /** The Kafka Streams window taxonomy. */
2
+ export type WindowType = "tumbling" | "hopping" | "session";
3
+ /** Which statistic the aggregated series carries as its primary value. */
4
+ export type AggregateStat = "mean" | "sum" | "min" | "max" | "count";
5
+ /** Envelope drawn around the aggregated series. */
6
+ export type AggregateBand = "stddev" | "minmax" | "none";
7
+ export interface WindowAccumulatorConfig {
8
+ /** Window kind. Defaults to `"tumbling"`. */
9
+ window?: WindowType;
10
+ /**
11
+ * Window width in **milliseconds** (already parsed from any duration
12
+ * string by the caller). For session windows this is unused; pass
13
+ * `gap` instead.
14
+ */
15
+ size: number;
16
+ /**
17
+ * Advance between consecutive hopping windows, in ms. Only meaningful
18
+ * for `window: "hopping"`; must satisfy `0 < hop ≤ size`. Defaults to
19
+ * `size`, which makes hopping degenerate to tumbling.
20
+ */
21
+ hop?: number;
22
+ /**
23
+ * Inactivity gap in ms that closes a session. Only meaningful for
24
+ * `window: "session"`. Two events within `gap` of each other (in
25
+ * event-time) share a session; an event bridging two sessions merges
26
+ * them.
27
+ */
28
+ gap?: number;
29
+ /**
30
+ * Keep at most this many most-recent windows; older windows are
31
+ * pruned on push. Bounds memory for an unbounded stream. Defaults to
32
+ * unbounded (`Infinity`).
33
+ */
34
+ retain?: number;
35
+ }
36
+ /** A closed or still-filling aggregation window. */
37
+ export interface AggregatedWindow {
38
+ /** Inclusive window start (event-time ms). */
39
+ start: number;
40
+ /** Exclusive window end (event-time ms). */
41
+ end: number;
42
+ /** Number of events in the window. */
43
+ count: number;
44
+ mean: number;
45
+ sum: number;
46
+ min: number;
47
+ max: number;
48
+ /** Population standard deviation. */
49
+ stddev: number;
50
+ /**
51
+ * `true` while the window may still receive events — the trailing,
52
+ * still-filling window(s) up to the latest watermark. Render these
53
+ * distinctly (the partial-bin convention) so a viewer doesn't read a
54
+ * half-filled aggregate as final.
55
+ */
56
+ partial: boolean;
57
+ }
58
+ /**
59
+ * Accumulates event-time windowed statistics. Stateful and mutable —
60
+ * one instance per streaming series. Pure with respect to event order.
61
+ */
62
+ export declare class WindowAccumulator {
63
+ private readonly type;
64
+ private readonly size;
65
+ private readonly hop;
66
+ private readonly gap;
67
+ private readonly retain;
68
+ private windows;
69
+ private sessions;
70
+ private latest;
71
+ constructor(config: WindowAccumulatorConfig);
72
+ /** Incorporate one event. Non-finite time/value are ignored. */
73
+ push(time: number, value: number): void;
74
+ private pushFixed;
75
+ private bump;
76
+ private pushSession;
77
+ private prune;
78
+ /**
79
+ * Snapshot the current windows as aggregated rows, sorted by start.
80
+ * For tumbling/hopping a window is `partial` while the watermark has
81
+ * not yet passed its end; for session windows the most recent session
82
+ * is `partial` while within `gap` of the watermark.
83
+ */
84
+ emit(): AggregatedWindow[];
85
+ private emitFixed;
86
+ private emitSessions;
87
+ private row;
88
+ /** Number of live windows (or sessions). */
89
+ get windowCount(): number;
90
+ /** The watermark — largest event-time seen, or `-Infinity` if empty. */
91
+ get watermark(): number;
92
+ clear(): void;
93
+ }
94
+ /**
95
+ * Pull the primary value for a stat off an aggregated window. `count`
96
+ * reads the event count; the rest read the matching `RunningStats`
97
+ * field.
98
+ */
99
+ export declare function statValue(w: AggregatedWindow, stat: AggregateStat): number;
100
+ /**
101
+ * Compute the [lower, upper] band bounds for an aggregated window.
102
+ * `stddev` draws `value ± k·σ` around the chosen stat; `minmax` draws
103
+ * the observed range. Returns `null` for `none`.
104
+ */
105
+ export declare function bandBounds(w: AggregatedWindow, band: AggregateBand, stat: AggregateStat, sigma?: number): [number, number] | null;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Parse a window duration to milliseconds.
3
+ *
4
+ * - A finite number is returned as-is (already milliseconds).
5
+ * - A string is parsed as one or more `<number><unit>` terms summed
6
+ * together: `"1m"`, `"500ms"`, `"1m30s"`.
7
+ *
8
+ * Returns `null` for unparseable input (empty string, unknown unit,
9
+ * non-positive result, non-finite number) so callers can fall back to
10
+ * a default rather than silently bucketing on a zero-width window.
11
+ */
12
+ export declare function parseWindowDuration(spec: number | string): number | null;
@@ -0,0 +1,31 @@
1
+ export interface CustomTooltipEntry {
2
+ key: string;
3
+ label: string;
4
+ value: unknown;
5
+ formatted: string;
6
+ }
7
+ export interface CustomTooltipEntryOptions {
8
+ /** Maximum number of rows to return. @default 8 */
9
+ maxEntries?: number;
10
+ /** Extra keys to omit in addition to underscore-prefixed internals. */
11
+ excludeKeys?: readonly string[] | Set<string>;
12
+ /** Include underscore-prefixed keys. @default false */
13
+ includeInternal?: boolean;
14
+ /** Include null, undefined, and empty-string values. @default false */
15
+ includeEmpty?: boolean;
16
+ /** Optional display labels by key. */
17
+ labels?: Record<string, string> | ((key: string) => string);
18
+ /** Optional value formatter. */
19
+ valueFormat?: (value: unknown, key: string, datum: Record<string, unknown>) => string;
20
+ }
21
+ /**
22
+ * Extract the user-facing datum from Semiotic hover/observation payloads.
23
+ *
24
+ * Custom charts can surface hover payloads as `hover.datum`,
25
+ * `hover.datum.data`, `hover.data`, or `hover.data.data` depending on the
26
+ * frame family and scene node type. This helper normalizes those shapes and
27
+ * drops internal/function fields so tooltips do not render empty chrome.
28
+ */
29
+ export declare function extractTooltipDatum(payload: unknown): Record<string, unknown> | null;
30
+ export declare function buildTooltipEntries(payload: unknown, options?: CustomTooltipEntryOptions): CustomTooltipEntry[];
31
+ export declare function formatTooltipValue(value: unknown): string;
@@ -0,0 +1,207 @@
1
+ import * as React from "react";
2
+ import type { ReactNode } from "react";
3
+ import type { CustomLayout, LayoutContext } from "../stream/customLayout";
4
+ import type { NetworkCustomLayout } from "../stream/networkCustomLayout";
5
+ import type { Datum } from "../charts/shared/datumTypes";
6
+ import type { Style } from "../stream/types";
7
+ import type { BezierPoint } from "../stream/networkTypes";
8
+ export type GofishGlyphMark = {
9
+ kind: "rect";
10
+ id: string;
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
15
+ style?: Style;
16
+ datum?: Datum;
17
+ group?: string;
18
+ interactive?: boolean;
19
+ rx?: number;
20
+ /** Clip this mark to an SVG path (pixel coords) — e.g. a fill to a silhouette. */
21
+ clipPath?: string;
22
+ } | {
23
+ kind: "image";
24
+ id: string;
25
+ x: number;
26
+ y: number;
27
+ width: number;
28
+ height: number;
29
+ href: string;
30
+ /** @default "none" — stretch to the box; "xMidYMid meet" to letterbox. */
31
+ preserveAspectRatio?: string;
32
+ opacity?: number;
33
+ /** Clip the image to an SVG path (pixel coords). */
34
+ clipPath?: string;
35
+ } | {
36
+ kind: "circle";
37
+ id: string;
38
+ cx: number;
39
+ cy: number;
40
+ r: number;
41
+ style?: Style;
42
+ datum?: Datum;
43
+ group?: string;
44
+ interactive?: boolean;
45
+ } | {
46
+ kind: "area";
47
+ id: string;
48
+ topPath: [number, number][];
49
+ bottomPath: [number, number][];
50
+ style?: Style;
51
+ datum?: Datum[];
52
+ group?: string;
53
+ } | {
54
+ kind: "path";
55
+ id: string;
56
+ d: string;
57
+ style?: Style;
58
+ datum?: Datum;
59
+ group?: string;
60
+ clipPath?: string;
61
+ } | {
62
+ kind: "line";
63
+ id: string;
64
+ x1: number;
65
+ y1: number;
66
+ x2: number;
67
+ y2: number;
68
+ style?: Style;
69
+ } | {
70
+ kind: "text";
71
+ id: string;
72
+ x: number;
73
+ y: number;
74
+ text: ReactNode;
75
+ style?: Style;
76
+ fontSize?: number;
77
+ fontWeight?: number | string;
78
+ textAnchor?: "start" | "middle" | "end";
79
+ dominantBaseline?: React.SVGProps<SVGTextElement>["dominantBaseline"];
80
+ transform?: string;
81
+ };
82
+ export interface GofishGlyphLayer {
83
+ marks: GofishGlyphMark[];
84
+ overlays?: ReactNode;
85
+ }
86
+ export interface HitRectForGlyphOptions {
87
+ id: string;
88
+ x: number;
89
+ y: number;
90
+ width: number;
91
+ height: number;
92
+ datum?: Datum;
93
+ group?: string;
94
+ style?: Style;
95
+ rx?: number;
96
+ }
97
+ export type GofishGlyphSolver<C extends object> = (ctx: LayoutContext<C>) => GofishGlyphLayer;
98
+ export declare function hitRectForGlyph(options: HitRectForGlyphOptions): GofishGlyphMark;
99
+ export declare function overlayGroup(children: ReactNode, className?: string): ReactNode;
100
+ /**
101
+ * Compile a small GoFish-style mark vocabulary to a Semiotic custom layout.
102
+ *
103
+ * Rects, circles, and areas become normal scene nodes when interactive is not
104
+ * false, so Semiotic owns hit testing, transitions, decay, SSR evidence, and
105
+ * tooltips. Rich glyph chrome such as petal paths, labels, bottle silhouettes,
106
+ * and arrows is rendered as pointer-events-none SVG overlay content.
107
+ */
108
+ export declare function createGofishGlyphLayout<C extends object>(solve: GofishGlyphSolver<C>): CustomLayout<C>;
109
+ export interface GofishFlowerConfig {
110
+ lakeAccessor?: string | ((d: Datum) => string);
111
+ speciesAccessor?: string | ((d: Datum) => string);
112
+ countAccessor?: string | ((d: Datum) => number);
113
+ xAccessor?: string | ((d: Datum) => number);
114
+ flowerRadius?: number;
115
+ stemWidth?: number;
116
+ }
117
+ export interface GofishBottleConfig {
118
+ categoryAccessor?: string | ((d: Datum) => string);
119
+ amountAccessor?: string | ((d: Datum) => number);
120
+ bottleWidth?: number;
121
+ bottleHeight?: number;
122
+ }
123
+ export interface GofishPolarRibbonConfig {
124
+ lakeAccessor?: string | ((d: Datum) => string);
125
+ speciesAccessor?: string | ((d: Datum) => string);
126
+ countAccessor?: string | ((d: Datum) => number);
127
+ innerRadius?: number;
128
+ outerRadius?: number;
129
+ }
130
+ export interface GofishTitanicCircleTreemapConfig {
131
+ classAccessor?: string | ((d: Datum) => string | number);
132
+ survivedAccessor?: string | ((d: Datum) => string | number | boolean);
133
+ fareAccessor?: string | ((d: Datum) => number);
134
+ padding?: number;
135
+ }
136
+ export interface PythonTutorPointer {
137
+ pointer: number;
138
+ }
139
+ export interface PythonTutorBinding {
140
+ name: string;
141
+ value: string | PythonTutorPointer;
142
+ }
143
+ export interface PythonTutorTuple {
144
+ values: Array<string | PythonTutorPointer>;
145
+ }
146
+ export interface PythonTutorDiagram {
147
+ stack: PythonTutorBinding[];
148
+ heap: PythonTutorTuple[];
149
+ heapArrangement: Array<Array<number | null>>;
150
+ }
151
+ export interface GofishPythonTutorConfig {
152
+ diagram?: PythonTutorDiagram;
153
+ cellWidth?: number;
154
+ cellHeight?: number;
155
+ heapGap?: number;
156
+ }
157
+ export interface PythonTutorMemoryGraph {
158
+ nodes: Datum[];
159
+ edges: Datum[];
160
+ }
161
+ export declare function buildPythonTutorMemoryGraph(diagram: PythonTutorDiagram): PythonTutorMemoryGraph;
162
+ export declare const gofishFlowerLayout: CustomLayout<GofishFlowerConfig>;
163
+ export declare const gofishBottleFillLayout: CustomLayout<GofishBottleConfig>;
164
+ export declare const gofishPolarRibbonLayout: CustomLayout<GofishPolarRibbonConfig>;
165
+ export declare const gofishTitanicCircleTreemapLayout: CustomLayout<GofishTitanicCircleTreemapConfig>;
166
+ export declare const gofishPythonTutorLayout: CustomLayout<GofishPythonTutorConfig>;
167
+ export declare const gofishPythonTutorNetworkLayout: NetworkCustomLayout<GofishPythonTutorConfig>;
168
+ export declare function pointerCurve(start: [number, number], end: [number, number]): {
169
+ d: string;
170
+ points: [BezierPoint, BezierPoint, BezierPoint, BezierPoint];
171
+ };
172
+ interface TreemapStripRegion<T> {
173
+ id: string;
174
+ rows: T[];
175
+ value: number;
176
+ x: number;
177
+ y: number;
178
+ width: number;
179
+ height: number;
180
+ }
181
+ interface PackedCircle<T> {
182
+ row: T;
183
+ index: number;
184
+ x: number;
185
+ y: number;
186
+ r: number;
187
+ }
188
+ export declare function layoutTreemapStrip<T>(entries: Array<{
189
+ id: string;
190
+ rows: T[];
191
+ value: number;
192
+ heightValue?: number;
193
+ }>, bounds: {
194
+ x: number;
195
+ y: number;
196
+ width: number;
197
+ height: number;
198
+ }, gap: number): Array<TreemapStripRegion<T>>;
199
+ export declare function packCirclesInRect<T>(rows: T[], region: TreemapStripRegion<T>, value: (row: T) => number, gap: number): Array<PackedCircle<T>>;
200
+ export declare function datumFromFields(fields: Record<string, unknown>): Datum;
201
+ export declare function stableGlyphId(value: string): string;
202
+ export declare function polarPoint(cx: number, cy: number, r: number, angle: number): [number, number];
203
+ export declare function petalPath(cx: number, cy: number, innerR: number, outerR: number, start: number, end: number): string;
204
+ export declare function polarBandPath(cx: number, cy: number, innerR: number, outerR: number, start: number, end: number): string;
205
+ export declare function smoothClosedPath(points: [number, number][]): string;
206
+ export declare function bottlePath(x: number, y: number, w: number, h: number): string;
207
+ export {};
@@ -0,0 +1,23 @@
1
+ import type { OrdinalCustomLayout } from "../stream/ordinalCustomLayout";
2
+ import type { Datum } from "../charts/shared/datumTypes";
3
+ export interface GofishBobaConfig {
4
+ /** Category — one cup per distinct value. @default "name" */
5
+ categoryAccessor?: string | ((d: Datum) => string);
6
+ /** Tea volume (cm³). @default field "teaVolume" → 450 */
7
+ teaVolumeAccessor?: string | ((d: Datum) => number);
8
+ /** Tapioca-pearl volume (cm³); pearl count derived from it. @default field "bobaVolume" → 110 */
9
+ bobaVolumeAccessor?: string | ((d: Datum) => number);
10
+ /** Ice volume (cm³); cube count derived from it. @default field "iceVolume" → 135 */
11
+ iceVolumeAccessor?: string | ((d: Datum) => number);
12
+ /** Cup height (cm). @default field "cupHeight" → 15.5 */
13
+ cupHeightAccessor?: string | ((d: Datum) => number);
14
+ /** Cup top radius (cm). @default field "cupTopRadius" → 4.75 */
15
+ cupTopRadiusAccessor?: string | ((d: Datum) => number);
16
+ /** Cup bottom radius (cm). @default field "cupBottomRadius" → 3.75 */
17
+ cupBottomRadiusAccessor?: string | ((d: Datum) => number);
18
+ /** Pearl radius (cm). @default field "bobaRadius" → 0.6 */
19
+ bobaRadiusAccessor?: string | ((d: Datum) => number);
20
+ /** Fraction of each band the cup glyph may occupy. @default 0.82 */
21
+ cupWidthRatio?: number;
22
+ }
23
+ export declare const gofishBobaLayout: OrdinalCustomLayout<GofishBobaConfig>;
@@ -0,0 +1,169 @@
1
+ import type { Datum } from "../charts/shared/datumTypes";
2
+ import type { CustomLayout } from "../stream/customLayout";
3
+ import type { NetworkCustomLayout } from "../stream/networkCustomLayout";
4
+ import type { OrdinalCustomLayout } from "../stream/ordinalCustomLayout";
5
+ import type { GofishLambda } from "./gofishLambdas";
6
+ /**
7
+ * Experimental GoFish Frontend IR → Semiotic custom-layout adapter.
8
+ *
9
+ * This is the GoFish analogue of `fromVegaLite`. Where `fromVegaLite` maps a
10
+ * Vega-Lite spec onto a built-in HOC component + props, `unstable_fromGofishIR` maps a
11
+ * GoFish *Frontend IR* document (the JSON artifact GoFish's `to_ir` /
12
+ * serialization frontend emits — see the `gofish-ir` package) onto Semiotic's
13
+ * custom-layout surface.
14
+ *
15
+ * Unlike a recognizer, this *interprets* the spec: `unstable_fromGofishIR` picks a
16
+ * frame family, then hands the IR to `interpretGofishIR` (see
17
+ * `gofishInterpreter.ts`), which walks `data → operators → mark` and executes
18
+ * `group`/`spread`/`stack`/`scatter`/`treemap`/`layer`, the `polar`/`unit`
19
+ * coordinate transforms, mark channels through scales, and `connect`/`ref`/
20
+ * `arrow` relations. The two sanctioned non-grammar paths — `derive` and
21
+ * `mark-fn` — resolve through the lambda registry. Any spec built from the
22
+ * supported grammar renders; it is not limited to known archetypes.
23
+ *
24
+ * Frame family (hybrid): `arrow`/pointer specs → network; the boba volume
25
+ * signature → ordinal (Semiotic owns the category axis, the interpreter owns
26
+ * the within-cup composition); everything else → XY. The Python Tutor memory
27
+ * diagram is a genuinely bespoke diagram beyond the grammar, so it stays a
28
+ * chart-level escape hatch rendered by `gofishPythonTutorNetworkLayout`.
29
+ *
30
+ * Scope: GoFish Frontend IR v0. This is a PR-preview adapter named
31
+ * `unstable-gofish-ir-adapter`, not a release API commitment. Constructs outside the interpreter's
32
+ * allocation model (`table`, `cut`, `mask`, free-form `.constrain`, …) record
33
+ * a warning and fall back rather than silently mis-rendering.
34
+ */
35
+ export declare const EXPERIMENTAL_GOFISH_ADAPTER_NAME = "unstable-gofish-ir-adapter";
36
+ /** Explicit field-accessor channel form, emitted by `field(name)`. */
37
+ export interface GofishFieldAccessor {
38
+ type: "field";
39
+ name: string;
40
+ measure?: string;
41
+ }
42
+ /** A data-driven channel value, emitted by `datum(v)` / `v(...)`. */
43
+ export interface GofishDatumValue {
44
+ type: "datum";
45
+ datum?: unknown;
46
+ offset?: number;
47
+ [key: string]: unknown;
48
+ }
49
+ /** The right-hand side of a mark or operator channel (`h: …`, `fill: …`). */
50
+ export type GofishChannelValue = string | number | boolean | null | GofishFieldAccessor | GofishDatumValue | {
51
+ __gofish_lambda: string;
52
+ };
53
+ export interface GofishOperatorIR {
54
+ type: string;
55
+ by?: string;
56
+ dir?: "x" | "y";
57
+ x?: GofishChannelValue;
58
+ y?: GofishChannelValue;
59
+ spacing?: number | [number, number];
60
+ [key: string]: unknown;
61
+ }
62
+ export interface GofishMarkIR {
63
+ type: string;
64
+ __combinator?: true;
65
+ children?: GofishMarkIR[];
66
+ source?: GofishMarkIR;
67
+ options?: Record<string, unknown>;
68
+ origin?: {
69
+ name?: string;
70
+ };
71
+ name?: string;
72
+ [key: string]: unknown;
73
+ }
74
+ export interface GofishChartIR {
75
+ type: "chart";
76
+ data?: GofishDataIR | null;
77
+ operators?: GofishOperatorIR[];
78
+ mark: GofishMarkIR;
79
+ options?: Record<string, unknown>;
80
+ connect?: GofishMarkIR;
81
+ name?: string;
82
+ }
83
+ export interface GofishLayerIR {
84
+ type: "layer";
85
+ charts: GofishChartIR[];
86
+ options?: Record<string, unknown>;
87
+ }
88
+ export interface GofishRawMarkIR {
89
+ type: "raw-mark";
90
+ mark: GofishMarkIR;
91
+ options?: Record<string, unknown>;
92
+ }
93
+ export type GofishDataIR = {
94
+ type: "inline";
95
+ rows: Array<Record<string, unknown>>;
96
+ } | {
97
+ type: "select";
98
+ layer: string;
99
+ mode?: "one" | "all";
100
+ } | {
101
+ type: "external";
102
+ id?: string;
103
+ };
104
+ export type GofishRootIR = GofishChartIR | GofishLayerIR | GofishRawMarkIR;
105
+ export interface GofishIRDocument {
106
+ irVersion: number;
107
+ ir: string;
108
+ $schema?: string;
109
+ root: GofishRootIR;
110
+ }
111
+ export type GofishChartFamily = "xy" | "network" | "ordinal";
112
+ export type GofishRecipeName =
113
+ /** XY / ordinal charts are produced by the IR interpreter, not a named recipe. */
114
+ "gofishInterpreter"
115
+ /** The Python Tutor memory diagram is a bespoke network glyph (chart-level escape hatch). */
116
+ | "gofishPythonTutorNetworkLayout";
117
+ /**
118
+ * The translated chart, spreadable into `XYCustomChart` / `NetworkCustomChart`.
119
+ * Mirrors `fromVegaLite`'s `{ component, props, warnings }` for the
120
+ * custom-layout surface.
121
+ */
122
+ export interface GofishChartConfig {
123
+ family: GofishChartFamily;
124
+ /** Which `gofish.tsx` recipe the IR resolved to. */
125
+ recipe: GofishRecipeName;
126
+ /** Layout function to pass as `layout` on `XYCustomChart` — null otherwise. */
127
+ layout: CustomLayout<Record<string, unknown>> | null;
128
+ /** Layout function to pass as `layout` on `NetworkCustomChart` — null otherwise. */
129
+ networkLayout: NetworkCustomLayout<Record<string, unknown>> | null;
130
+ /** Layout function to pass as `layout` on `OrdinalCustomChart` — null otherwise. */
131
+ ordinalLayout: OrdinalCustomLayout<Record<string, unknown>> | null;
132
+ /** Accessor config derived from the IR; pass as `layoutConfig`. */
133
+ layoutConfig: Record<string, unknown>;
134
+ /** Category accessor for ordinal charts (the frame builds the o-scale from it). */
135
+ categoryAccessor?: string;
136
+ /** Value accessor for ordinal charts (the frame builds the r-scale from it). */
137
+ valueAccessor?: string;
138
+ /** Inline data to seed the chart (`data` / `pushMany`). Empty for network. */
139
+ data: Datum[];
140
+ /** Node/edge graph for `NetworkCustomChart` (memory diagram only). */
141
+ graph: {
142
+ nodes: Datum[];
143
+ edges: Datum[];
144
+ } | null;
145
+ irVersion: number;
146
+ warnings?: string[];
147
+ }
148
+ export interface FromGofishIROptions {
149
+ /** Force a frame family instead of inferring it. */
150
+ family?: GofishChartFamily;
151
+ /** Per-call `derive`/`mark-fn` lambda overrides (merged over the registry). */
152
+ lambdas?: Record<string, GofishLambda>;
153
+ }
154
+ /**
155
+ * Translate a GoFish Frontend IR document into a Semiotic custom-layout config
156
+ * by *interpreting* the spec.
157
+ *
158
+ * @example
159
+ * ```tsx
160
+ * import { unstable_fromGofishIR } from "semiotic/experimental"
161
+ * import { XYCustomChart } from "semiotic/xy"
162
+ *
163
+ * const cfg = unstable_fromGofishIR(flowerIR)
164
+ * <XYCustomChart data={cfg.data} layout={cfg.layout} />
165
+ * ```
166
+ */
167
+ export declare function unstable_fromGofishIR(doc: GofishIRDocument, options?: FromGofishIROptions): GofishChartConfig;
168
+ /** @deprecated Internal compatibility alias for the temporary GoFish PR preview. */
169
+ export declare const fromGofishIR: typeof unstable_fromGofishIR;
@@ -0,0 +1,89 @@
1
+ import type { GofishIRDocument } from "./gofishIR";
2
+ /** The Python Tutor heap/stack snapshot, inlined as a single IR data row. */
3
+ export declare const pythonTutorDiagramRow: {
4
+ kind: string;
5
+ stack: ({
6
+ name: string;
7
+ value: {
8
+ pointer: number;
9
+ };
10
+ } | {
11
+ name: string;
12
+ value: string;
13
+ })[];
14
+ heap: {
15
+ values: (string | {
16
+ pointer: number;
17
+ })[];
18
+ }[];
19
+ heapArrangement: (number | null)[][];
20
+ };
21
+ /**
22
+ * Deterministic Titanic passenger sample (no RNG), mirroring the docs page so
23
+ * the IR document is self-contained. Kept modest per class so the inline rows
24
+ * stay reasonable to ship and display.
25
+ */
26
+ export declare function buildTitanicSampleRows(): Array<Record<string, unknown>>;
27
+ /**
28
+ * A meadow: one green stem per lake (a `scatter` placing each lake's bar at its
29
+ * x), topped by a polar fan of species petals. Single-chart form so the
30
+ * interpreter renders it directly: `scatter(by:lake)` → per lake a `layer` of
31
+ * a stem `rect` (height = summed catch) and a `polar` `stack` of `petal`s
32
+ * around the angle axis.
33
+ */
34
+ export declare const flowerIR: GofishIRDocument;
35
+ /**
36
+ * A row of pictorial bottles, one per category, each filled to its `amount`
37
+ * percentage. Grammar-first with one `derive`: `bottleGeometry` emits the
38
+ * per-bottle normalized geometry under `_b`; the marks render it with the
39
+ * reusable `image` + clip primitives — an `image` of the bottle silhouette, a
40
+ * green fill `rect` clipped to that silhouette, a fill line, a percentage
41
+ * label, a category label, and a transparent hit rect carrying the datum.
42
+ */
43
+ export declare const bottleIR: GofishIRDocument;
44
+ /**
45
+ * Stacked species bars laid out radially per lake (polar coord), with one
46
+ * cross-lake ribbon per species connecting the matching segments.
47
+ */
48
+ export declare const polarRibbonIR: GofishIRDocument;
49
+ /**
50
+ * A bar chart that's treemap-filled and circle-filled: a `spread` lays one
51
+ * equal-width bar per passenger class whose HEIGHT encodes the class's total
52
+ * fare (`sizeBy`), and that bar rectangle becomes a squarified `treemap` of its
53
+ * passengers — every fare-sized cell rendered as an inscribed circle coloured
54
+ * by survival.
55
+ */
56
+ export declare const titanicCircleTreemapIR: GofishIRDocument;
57
+ /**
58
+ * A Python Tutor runtime memory diagram: a global frame of variable bindings
59
+ * whose pointers arrow into a heap of linked tuples. Encoded as a `layer` of a
60
+ * `spread` (frame + heap) plus `arrow` connectors over `ref`s; the snapshot
61
+ * itself travels as a single inline data row consumed by the network recipe.
62
+ */
63
+ export declare const pythonMemoryIR: GofishIRDocument;
64
+ /**
65
+ * A boba-shop menu: four bubble-tea drinks spread along the category axis, each
66
+ * fully data-driven. Per drink, the tea + tapioca + ice volumes (plus the
67
+ * cup-size parameters) add up to a total volume that determines the drink
68
+ * height; the pearls stack at the bottom and the ice floats at the surface — so
69
+ * "Extra Boba" grows a taller pearl bed, "Light Ice" reads as mostly tea, and
70
+ * "Mega" is a bigger cup of everything.
71
+ *
72
+ * Grammar-first, per the "follow the spec as far as it can" rule: the cup, tea,
73
+ * straw, and lid are real `polygon`/`line` marks and the pearls/ice are real
74
+ * `circle`/`rect` marks. The one genuinely non-grammar step — the
75
+ * frustum-volume → drink-height solve and tapioca/ice packing — lives in a
76
+ * single `derive` lambda (`bobaGeometry`) that emits each cup's geometry the
77
+ * marks read (`_g.*`) plus a shared `_g.box` aspect for the `uniform` unit fit,
78
+ * so the cups sit on one shelf with aligned straws. Derived from Krist
79
+ * Wongsuphasawat's "Boba Science" notebook. Routed to the ordinal frame.
80
+ */
81
+ export declare const bobaIR: GofishIRDocument;
82
+ export interface GofishIRExample {
83
+ key: "flower" | "bottle" | "polar" | "titanic" | "python" | "boba";
84
+ label: string;
85
+ doc: GofishIRDocument;
86
+ source: string;
87
+ }
88
+ /** All five examples, in gallery order. */
89
+ export declare const gofishIRExamples: readonly GofishIRExample[];