@pixerate/editor-svelte 0.42.1 → 0.44.0

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 (40) hide show
  1. package/dist/chart/ChartCanvas.svelte +32 -98
  2. package/dist/chart/ChartCanvas.svelte.d.ts +7 -1
  3. package/dist/chart/ChartCanvas.svelte.d.ts.map +1 -1
  4. package/dist/chart/ChartInspector.svelte +185 -28
  5. package/dist/chart/ChartInspector.svelte.d.ts +1 -1
  6. package/dist/chart/ChartInspector.svelte.d.ts.map +1 -1
  7. package/dist/chart/ChartMarks.svelte +102 -0
  8. package/dist/chart/ChartMarks.svelte.d.ts +11 -0
  9. package/dist/chart/ChartMarks.svelte.d.ts.map +1 -0
  10. package/dist/chart/ChartPresenceLayer.svelte +30 -0
  11. package/dist/chart/ChartPresenceLayer.svelte.d.ts +9 -0
  12. package/dist/chart/ChartPresenceLayer.svelte.d.ts.map +1 -0
  13. package/dist/chart/ChartSceneSvg.svelte +17 -0
  14. package/dist/chart/ChartSceneSvg.svelte.d.ts +11 -0
  15. package/dist/chart/ChartSceneSvg.svelte.d.ts.map +1 -0
  16. package/dist/chart/ChartSparkline.svelte +27 -0
  17. package/dist/chart/ChartSparkline.svelte.d.ts +20 -0
  18. package/dist/chart/ChartSparkline.svelte.d.ts.map +1 -0
  19. package/dist/chart/ChartStreamingView.svelte +92 -0
  20. package/dist/chart/ChartStreamingView.svelte.d.ts +25 -0
  21. package/dist/chart/ChartStreamingView.svelte.d.ts.map +1 -0
  22. package/dist/chart/createChartEditor.svelte.d.ts +25 -1
  23. package/dist/chart/createChartEditor.svelte.d.ts.map +1 -1
  24. package/dist/chart/createChartEditor.svelte.js +25 -1
  25. package/dist/chart/index.d.ts +9 -0
  26. package/dist/chart/index.d.ts.map +1 -1
  27. package/dist/chart/index.js +5 -0
  28. package/dist/chart-node/ChartNodeView.svelte +62 -0
  29. package/dist/chart-node/ChartNodeView.svelte.d.ts +14 -0
  30. package/dist/chart-node/ChartNodeView.svelte.d.ts.map +1 -0
  31. package/dist/chart-node/createChartNodeView.svelte.d.ts +21 -0
  32. package/dist/chart-node/createChartNodeView.svelte.d.ts.map +1 -0
  33. package/dist/chart-node/createChartNodeView.svelte.js +28 -0
  34. package/dist/chart-node/index.d.ts +6 -0
  35. package/dist/chart-node/index.d.ts.map +1 -0
  36. package/dist/chart-node/index.js +2 -0
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -0
  40. package/package.json +2 -2
@@ -0,0 +1,102 @@
1
+ <script lang="ts">
2
+ import { chartTextBaseline, chartTextTransform, type ChartMark } from '@pixerate/editor/chart';
3
+
4
+ interface Props {
5
+ marks: readonly ChartMark[];
6
+ fontFamily: string;
7
+ /** Marks with targets get a pointer cursor and receive events. */
8
+ interactive?: boolean;
9
+ }
10
+
11
+ let { marks, fontFamily, interactive = false }: Props = $props();
12
+
13
+ const pointerEvents = (mark: ChartMark) => (mark.role === 'selection' || mark.role === 'drag-readout' || (!mark.target && mark.role !== 'background') ? 'none' : undefined);
14
+ const cursor = (mark: ChartMark) => (interactive && mark.target && mark.role !== 'background' ? 'pointer' : undefined);
15
+ </script>
16
+
17
+ {#each marks as mark (mark.key)}
18
+ {#if mark.kind === 'rect'}
19
+ <rect
20
+ data-role={mark.role}
21
+ data-chart-key={mark.target ? mark.key : undefined}
22
+ data-selected={mark.selected ? '' : undefined}
23
+ x={mark.x}
24
+ y={mark.y}
25
+ width={mark.width}
26
+ height={mark.height}
27
+ rx={mark.radius}
28
+ opacity={mark.opacity}
29
+ pointer-events={pointerEvents(mark)}
30
+ cursor={cursor(mark)}
31
+ style:fill={mark.fill}
32
+ style:stroke={mark.stroke}
33
+ style:stroke-width={mark.strokeWidth}
34
+ />
35
+ {:else if mark.kind === 'path'}
36
+ <path
37
+ data-role={mark.role}
38
+ data-chart-key={mark.target ? mark.key : undefined}
39
+ data-selected={mark.selected ? '' : undefined}
40
+ d={mark.d}
41
+ stroke-linejoin="round"
42
+ stroke-linecap="round"
43
+ stroke-dasharray={mark.dash}
44
+ opacity={mark.opacity}
45
+ pointer-events={pointerEvents(mark)}
46
+ cursor={cursor(mark)}
47
+ style:fill={mark.fill ?? 'none'}
48
+ style:stroke={mark.stroke}
49
+ style:stroke-width={mark.strokeWidth}
50
+ />
51
+ {:else if mark.kind === 'circle'}
52
+ <circle
53
+ data-role={mark.role}
54
+ data-chart-key={mark.target ? mark.key : undefined}
55
+ data-selected={mark.selected ? '' : undefined}
56
+ cx={mark.cx}
57
+ cy={mark.cy}
58
+ r={mark.r}
59
+ opacity={mark.opacity}
60
+ pointer-events={pointerEvents(mark)}
61
+ cursor={cursor(mark)}
62
+ style:fill={mark.fill}
63
+ style:stroke={mark.stroke}
64
+ style:stroke-width={mark.strokeWidth}
65
+ />
66
+ {:else if mark.kind === 'line'}
67
+ <line
68
+ data-role={mark.role}
69
+ data-chart-key={mark.target ? mark.key : undefined}
70
+ data-selected={mark.selected ? '' : undefined}
71
+ x1={mark.x1}
72
+ y1={mark.y1}
73
+ x2={mark.x2}
74
+ y2={mark.y2}
75
+ stroke-dasharray={mark.dash}
76
+ opacity={mark.opacity}
77
+ pointer-events={pointerEvents(mark)}
78
+ cursor={cursor(mark)}
79
+ style:stroke={mark.stroke}
80
+ style:stroke-width={mark.strokeWidth}
81
+ />
82
+ {:else}
83
+ <text
84
+ data-role={mark.role}
85
+ data-chart-key={mark.target ? mark.key : undefined}
86
+ data-selected={mark.selected ? '' : undefined}
87
+ x={mark.x}
88
+ y={mark.y}
89
+ text-anchor={mark.anchor}
90
+ dominant-baseline={chartTextBaseline(mark.baseline)}
91
+ transform={chartTextTransform(mark)}
92
+ opacity={mark.opacity}
93
+ pointer-events={pointerEvents(mark)}
94
+ cursor={cursor(mark)}
95
+ style:fill={mark.fill}
96
+ style:font-size="{mark.size}px"
97
+ style:font-weight={mark.weight}
98
+ style:font-family={fontFamily}
99
+ style:user-select="none">{mark.text}</text
100
+ >
101
+ {/if}
102
+ {/each}
@@ -0,0 +1,11 @@
1
+ import { type ChartMark } from '@pixerate/editor/chart';
2
+ interface Props {
3
+ marks: readonly ChartMark[];
4
+ fontFamily: string;
5
+ /** Marks with targets get a pointer cursor and receive events. */
6
+ interactive?: boolean;
7
+ }
8
+ declare const ChartMarks: import("svelte").Component<Props, {}, "">;
9
+ type ChartMarks = ReturnType<typeof ChartMarks>;
10
+ export default ChartMarks;
11
+ //# sourceMappingURL=ChartMarks.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartMarks.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/ChartMarks.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG7F,UAAU,KAAK;IACb,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA2BH,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import type { ChartPresence, ChartPresenceState } from '@pixerate/editor/chart';
3
+
4
+ interface Props {
5
+ /** Agent cursors to draw (see `ChartDirector`). */
6
+ presence: ChartPresence;
7
+ }
8
+
9
+ let { presence }: Props = $props();
10
+
11
+ let current: ChartPresenceState = $state.raw({ actors: [] });
12
+ $effect(() => {
13
+ current = presence.getState();
14
+ return presence.subscribe((next) => {
15
+ current = next;
16
+ });
17
+ });
18
+ </script>
19
+
20
+ <g data-chart-presence="" pointer-events="none">
21
+ {#each current.actors as a (a.id)}
22
+ <g transform="translate({a.x} {a.y})" data-actor={a.id}>
23
+ <path d="M0,0 L0,14 L4,10.5 L7,17 L9.5,16 L6.5,9.5 L11.5,9.5 Z" style:fill={a.color} style:stroke="#ffffff" style:stroke-width="1" transform={a.pressed ? 'scale(0.9)' : undefined} />
24
+ <g transform="translate(13 16)">
25
+ <rect x="0" y="0" rx="4" height="18" width={Math.max(28, (a.message ?? a.name).length * 6.4 + 12)} style:fill={a.color} />
26
+ <text x="6" y="9" dominant-baseline="central" style:fill="#ffffff" style:font-size="11px" style:font-weight="600" style:font-family="inherit">{a.message ?? a.name}</text>
27
+ </g>
28
+ </g>
29
+ {/each}
30
+ </g>
@@ -0,0 +1,9 @@
1
+ import type { ChartPresence } from '@pixerate/editor/chart';
2
+ interface Props {
3
+ /** Agent cursors to draw (see `ChartDirector`). */
4
+ presence: ChartPresence;
5
+ }
6
+ declare const ChartPresenceLayer: import("svelte").Component<Props, {}, "">;
7
+ type ChartPresenceLayer = ReturnType<typeof ChartPresenceLayer>;
8
+ export default ChartPresenceLayer;
9
+ //# sourceMappingURL=ChartPresenceLayer.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartPresenceLayer.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/ChartPresenceLayer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,wBAAwB,CAAC;AAG9E,UAAU,KAAK;IACb,mDAAmD;IACnD,QAAQ,EAAE,aAAa,CAAC;CACzB;AA8BH,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { ChartScene } from '@pixerate/editor/chart';
3
+ import ChartMarks from './ChartMarks.svelte';
4
+
5
+ interface Props {
6
+ /** A laid-out scene (`layoutChart`, `layoutSparkline`, `blendChartScenes`). */
7
+ scene: ChartScene;
8
+ label?: string;
9
+ class?: string;
10
+ }
11
+
12
+ let { scene, label, class: className = '' }: Props = $props();
13
+ </script>
14
+
15
+ <svg width={scene.width} height={scene.height} viewBox="0 0 {scene.width} {scene.height}" role="img" aria-label={label} class="block max-w-full {className}">
16
+ <ChartMarks marks={scene.marks} fontFamily={scene.theme.fontFamily} />
17
+ </svg>
@@ -0,0 +1,11 @@
1
+ import type { ChartScene } from '@pixerate/editor/chart';
2
+ interface Props {
3
+ /** A laid-out scene (`layoutChart`, `layoutSparkline`, `blendChartScenes`). */
4
+ scene: ChartScene;
5
+ label?: string;
6
+ class?: string;
7
+ }
8
+ declare const ChartSceneSvg: import("svelte").Component<Props, {}, "">;
9
+ type ChartSceneSvg = ReturnType<typeof ChartSceneSvg>;
10
+ export default ChartSceneSvg;
11
+ //# sourceMappingURL=ChartSceneSvg.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartSceneSvg.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/ChartSceneSvg.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIvD,UAAU,KAAK;IACb,+EAA+E;IAC/E,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { layoutSparkline, type ChartSparklineKind, type ChartValue } from '@pixerate/editor/chart';
3
+ import ChartSceneSvg from './ChartSceneSvg.svelte';
4
+
5
+ interface Props {
6
+ values: readonly ChartValue[];
7
+ kind?: ChartSparklineKind;
8
+ width?: number;
9
+ height?: number;
10
+ color?: string;
11
+ negativeColor?: string;
12
+ markers?: boolean;
13
+ highLow?: boolean;
14
+ min?: number;
15
+ max?: number;
16
+ /** Accessible label (default: first and last value). */
17
+ label?: string;
18
+ class?: string;
19
+ }
20
+
21
+ let { values, kind = 'line', width = 80, height = 20, color, negativeColor, markers, highLow, min, max, label, class: className = '' }: Props = $props();
22
+
23
+ const scene = $derived(layoutSparkline(values, { kind, width, height, color, negativeColor, markers, highLow, min, max }));
24
+ const present = $derived(values.filter((v): v is number => v !== null));
25
+ </script>
26
+
27
+ <ChartSceneSvg {scene} label={label ?? (present.length ? `Trend from ${present[0]} to ${present[present.length - 1]}` : 'No data')} class="inline-block align-middle {className}" />
@@ -0,0 +1,20 @@
1
+ import { type ChartSparklineKind, type ChartValue } from '@pixerate/editor/chart';
2
+ interface Props {
3
+ values: readonly ChartValue[];
4
+ kind?: ChartSparklineKind;
5
+ width?: number;
6
+ height?: number;
7
+ color?: string;
8
+ negativeColor?: string;
9
+ markers?: boolean;
10
+ highLow?: boolean;
11
+ min?: number;
12
+ max?: number;
13
+ /** Accessible label (default: first and last value). */
14
+ label?: string;
15
+ class?: string;
16
+ }
17
+ declare const ChartSparkline: import("svelte").Component<Props, {}, "">;
18
+ type ChartSparkline = ReturnType<typeof ChartSparkline>;
19
+ export default ChartSparkline;
20
+ //# sourceMappingURL=ChartSparkline.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartSparkline.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/ChartSparkline.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIjG,UAAU,KAAK;IACb,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgBH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,92 @@
1
+ <script lang="ts">
2
+ import { onDestroy, untrack } from 'svelte';
3
+ import {
4
+ CSS_VARIABLE_CHART_THEME,
5
+ ChartStream,
6
+ blendChartScenes,
7
+ easeChartTween,
8
+ layoutChart,
9
+ type ChartIssue,
10
+ type ChartScene,
11
+ type ChartStreamFormat,
12
+ type ChartTheme
13
+ } from '@pixerate/editor/chart';
14
+ import type { Snippet } from 'svelte';
15
+ import ChartSceneSvg from './ChartSceneSvg.svelte';
16
+
17
+ interface Props {
18
+ /** Mermaid (xychart-beta, pie, radar-beta) or a JSON chart spec, as far as it has arrived. */
19
+ source: string;
20
+ /** Nothing more will arrive: the final chart is drawn at once and problems are reported. */
21
+ complete?: boolean;
22
+ format?: ChartStreamFormat;
23
+ width?: number;
24
+ height?: number;
25
+ theme?: Partial<ChartTheme>;
26
+ /** How often a new layout is adopted while streaming (ms, default 300). */
27
+ adoptInterval?: number;
28
+ /** Tween length between layouts (ms, default 450; 0 to switch at once). */
29
+ tween?: number;
30
+ /** Shown before anything can be drawn. */
31
+ placeholder?: Snippet;
32
+ /** Called with the parse problems once `complete`. */
33
+ onissues?: (issues: ChartIssue[]) => void;
34
+ class?: string;
35
+ }
36
+
37
+ let { source, complete = false, format = 'auto', width = 640, height = 360, theme, adoptInterval = 300, tween = 450, placeholder, onissues, class: className = '' }: Props = $props();
38
+
39
+ const stream = $derived(new ChartStream(format));
40
+ const fullTheme = $derived({ ...CSS_VARIABLE_CHART_THEME, ...theme });
41
+ let scene: ChartScene | null = $state.raw(null);
42
+ let lastAdopt = 0;
43
+ let frame: number | null = null;
44
+ let pending: ReturnType<typeof setTimeout> | null = null;
45
+
46
+ function adopt(src: string, done: boolean) {
47
+ const read = stream.update(src, done);
48
+ if (done) onissues?.(read.issues);
49
+ if (!read.spec) return;
50
+ const next = layoutChart(read.spec, { width, height, theme: fullTheme, valueDomain: read.valueDomain });
51
+ const from = untrack(() => scene);
52
+ lastAdopt = Date.now();
53
+ if (frame !== null) cancelAnimationFrame(frame);
54
+ if (!from || tween <= 0 || typeof requestAnimationFrame === 'undefined') {
55
+ scene = next;
56
+ return;
57
+ }
58
+ const start = performance.now();
59
+ const step = () => {
60
+ const t = easeChartTween((performance.now() - start) / tween);
61
+ scene = blendChartScenes(from, next, t);
62
+ frame = t < 1 ? requestAnimationFrame(step) : null;
63
+ };
64
+ frame = requestAnimationFrame(step);
65
+ }
66
+
67
+ $effect(() => {
68
+ const src = source;
69
+ const done = complete;
70
+ if (pending) clearTimeout(pending);
71
+ const wait = done ? 0 : Math.max(0, adoptInterval - (Date.now() - lastAdopt));
72
+ if (wait === 0) adopt(src, done);
73
+ else pending = setTimeout(() => adopt(src, done), wait);
74
+ return () => {
75
+ if (pending) clearTimeout(pending);
76
+ };
77
+ });
78
+
79
+ onDestroy(() => {
80
+ if (frame !== null) cancelAnimationFrame(frame);
81
+ });
82
+ </script>
83
+
84
+ <div class={className} data-chart-streaming={complete ? 'complete' : 'streaming'} aria-busy={!complete}>
85
+ {#if scene}
86
+ <ChartSceneSvg {scene} label={complete ? undefined : 'Chart loading'} />
87
+ {:else if placeholder}
88
+ {@render placeholder()}
89
+ {:else}
90
+ <div style:height="{height}px" class="flex items-center justify-center text-xs text-muted-foreground">Drawing chart…</div>
91
+ {/if}
92
+ </div>
@@ -0,0 +1,25 @@
1
+ import { type ChartIssue, type ChartStreamFormat, type ChartTheme } from '@pixerate/editor/chart';
2
+ import type { Snippet } from 'svelte';
3
+ interface Props {
4
+ /** Mermaid (xychart-beta, pie, radar-beta) or a JSON chart spec, as far as it has arrived. */
5
+ source: string;
6
+ /** Nothing more will arrive: the final chart is drawn at once and problems are reported. */
7
+ complete?: boolean;
8
+ format?: ChartStreamFormat;
9
+ width?: number;
10
+ height?: number;
11
+ theme?: Partial<ChartTheme>;
12
+ /** How often a new layout is adopted while streaming (ms, default 300). */
13
+ adoptInterval?: number;
14
+ /** Tween length between layouts (ms, default 450; 0 to switch at once). */
15
+ tween?: number;
16
+ /** Shown before anything can be drawn. */
17
+ placeholder?: Snippet;
18
+ /** Called with the parse problems once `complete`. */
19
+ onissues?: (issues: ChartIssue[]) => void;
20
+ class?: string;
21
+ }
22
+ declare const ChartStreamingView: import("svelte").Component<Props, {}, "">;
23
+ type ChartStreamingView = ReturnType<typeof ChartStreamingView>;
24
+ export default ChartStreamingView;
25
+ //# sourceMappingURL=ChartStreamingView.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartStreamingView.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/ChartStreamingView.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,EAMH,KAAK,UAAU,EAEf,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAClC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,UAAU,KAAK;IACb,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmEH,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
- import { ChartController, type ChartActionResult, type ChartCommandOptions, type ChartControllerOptions, type ChartSelection, type ChartSpecPatch, type ChartState, type ChartType } from "@pixerate/editor/chart";
1
+ import type { ToolRegistry } from "@pixerate/editor/tools";
2
+ import { ChartController, ChartDirector, ChartPresence, type ChartScene, type ChartToolProviderOptions, type ChartActionResult, type ChartCommandOptions, type ChartControllerOptions, type ChartSelection, type ChartSpecPatch, type ChartState, type ChartType } from "@pixerate/editor/chart";
2
3
  export interface SvelteChartEditor {
3
4
  readonly controller: ChartController;
4
5
  /** The controller's state (reactive). */
@@ -35,4 +36,27 @@ export interface ChartCommandTarget {
35
36
  * initialisation). Pass a getter to follow a changing registry.
36
37
  */
37
38
  export declare function useChartCommands(registry: ChartCommandTarget | null | undefined | (() => ChartCommandTarget | null | undefined), controller: ChartController, options?: ChartCommandOptions): void;
39
+ /**
40
+ * Registers the chart's agent tools (`createChartToolProvider`) with a `ToolRegistry` for the
41
+ * lifetime of the calling component. Pass a getter to follow a changing registry.
42
+ */
43
+ export declare function useChartToolProvider(registry: ToolRegistry | null | undefined | (() => ToolRegistry | null | undefined), controller: ChartController, options?: ChartToolProviderOptions): void;
44
+ /**
45
+ * A `ChartPresence` and `ChartDirector` for a chart: pass `presence` and `sceneRef` to
46
+ * `ChartCanvas`, and `director` to `useChartToolProvider` so agent edits are acted out with a
47
+ * cursor.
48
+ */
49
+ export declare function createChartDirector(controller: ChartController, options?: {
50
+ speed?: number;
51
+ size?: {
52
+ width: number;
53
+ height: number;
54
+ };
55
+ }): {
56
+ presence: ChartPresence;
57
+ director: ChartDirector;
58
+ sceneRef: {
59
+ current: ChartScene | null;
60
+ };
61
+ };
38
62
  //# sourceMappingURL=createChartEditor.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createChartEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/createChartEditor.svelte.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAEf,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAAC;IACjD,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAAC;IAC7E,MAAM,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,yCAAyC;IACzC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,mBAAmB,GAAE,eAAe,GAAG,sBAA2B,GAAG,iBAAiB,CAyBvH;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAgBnG;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAAC,EAC/F,UAAU,EAAE,eAAe,EAC3B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAMN"}
1
+ {"version":3,"file":"createChartEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/chart/createChartEditor.svelte.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EAIb,KAAK,UAAU,EACf,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAAC;IACjD,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAAC;IAC7E,MAAM,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,yCAAyC;IACzC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,mBAAmB,GAAE,eAAe,GAAG,sBAA2B,GAAG,iBAAiB,CAyBvH;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAgBnG;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAAC,EAC/F,UAAU,EAAE,eAAe,EAC3B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC,EACnF,UAAU,EAAE,eAAe,EAC3B,OAAO,GAAE,wBAA6B,GACrC,IAAI,CAMN;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAO;;;;iBAC9G,UAAU,GAAG,IAAI;;EAK7C"}
@@ -1,5 +1,5 @@
1
1
  import { untrack } from "svelte";
2
- import { ChartController, createChartCommands, } from "@pixerate/editor/chart";
2
+ import { ChartController, ChartDirector, ChartPresence, createChartCommands, createChartToolProvider, layoutChart, } from "@pixerate/editor/chart";
3
3
  /**
4
4
  * Svelte 5 rune: subscribes to a `ChartController` (or creates one from options) and
5
5
  * exposes its state reactively with bound actions.
@@ -59,3 +59,27 @@ export function useChartCommands(registry, controller, options = {}) {
59
59
  return target.register(createChartCommands(controller, options));
60
60
  });
61
61
  }
62
+ /**
63
+ * Registers the chart's agent tools (`createChartToolProvider`) with a `ToolRegistry` for the
64
+ * lifetime of the calling component. Pass a getter to follow a changing registry.
65
+ */
66
+ export function useChartToolProvider(registry, controller, options = {}) {
67
+ $effect(() => {
68
+ const target = typeof registry === "function" ? registry() : registry;
69
+ if (!target)
70
+ return;
71
+ return target.register(createChartToolProvider(controller, options));
72
+ });
73
+ }
74
+ /**
75
+ * A `ChartPresence` and `ChartDirector` for a chart: pass `presence` and `sceneRef` to
76
+ * `ChartCanvas`, and `director` to `useChartToolProvider` so agent edits are acted out with a
77
+ * cursor.
78
+ */
79
+ export function createChartDirector(controller, options = {}) {
80
+ const sceneRef = { current: null };
81
+ const presence = new ChartPresence();
82
+ const size = options.size ?? { width: 640, height: 400 };
83
+ const director = new ChartDirector(controller, presence, { scene: () => sceneRef.current ?? layoutChart(controller.getSpec(), size), speed: options.speed });
84
+ return { presence, director, sceneRef };
85
+ }
@@ -3,11 +3,18 @@ import type ChartCanvasComponent from "./ChartCanvas.svelte";
3
3
  import type ChartDataGridComponent from "./ChartDataGrid.svelte";
4
4
  import type ChartEditorComponent from "./ChartEditor.svelte";
5
5
  import type ChartInspectorComponent from "./ChartInspector.svelte";
6
+ import type ChartStreamingViewComponent from "./ChartStreamingView.svelte";
7
+ import type ChartSparklineComponent from "./ChartSparkline.svelte";
6
8
  export { default as ChartEditor } from "./ChartEditor.svelte";
7
9
  export { default as ChartCanvas } from "./ChartCanvas.svelte";
8
10
  export { default as ChartDataGrid } from "./ChartDataGrid.svelte";
9
11
  export { default as ChartInspector } from "./ChartInspector.svelte";
10
12
  export { default as ChartCommitInput } from "./ChartCommitInput.svelte";
13
+ export { default as ChartMarks } from "./ChartMarks.svelte";
14
+ export { default as ChartSceneSvg } from "./ChartSceneSvg.svelte";
15
+ export { default as ChartPresenceLayer } from "./ChartPresenceLayer.svelte";
16
+ export { default as ChartStreamingView } from "./ChartStreamingView.svelte";
17
+ export { default as ChartSparkline } from "./ChartSparkline.svelte";
11
18
  export type { ChartInspectorSection } from "./ChartInspector.svelte";
12
19
  export * from "./createChartEditor.svelte.js";
13
20
  export * from "./styles.js";
@@ -15,4 +22,6 @@ export type ChartCanvasProps = ComponentProps<typeof ChartCanvasComponent>;
15
22
  export type ChartDataGridProps = ComponentProps<typeof ChartDataGridComponent>;
16
23
  export type ChartEditorProps = ComponentProps<typeof ChartEditorComponent>;
17
24
  export type ChartInspectorProps = ComponentProps<typeof ChartInspectorComponent>;
25
+ export type ChartStreamingViewProps = ComponentProps<typeof ChartStreamingViewComponent>;
26
+ export type ChartSparklineProps = ComponentProps<typeof ChartSparklineComponent>;
18
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,uBAAuB,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,aAAa,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC/E,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3E,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,uBAAuB,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,2BAA2B,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,uBAAuB,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,aAAa,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC/E,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3E,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACjF,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACzF,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -3,5 +3,10 @@ export { default as ChartCanvas } from "./ChartCanvas.svelte";
3
3
  export { default as ChartDataGrid } from "./ChartDataGrid.svelte";
4
4
  export { default as ChartInspector } from "./ChartInspector.svelte";
5
5
  export { default as ChartCommitInput } from "./ChartCommitInput.svelte";
6
+ export { default as ChartMarks } from "./ChartMarks.svelte";
7
+ export { default as ChartSceneSvg } from "./ChartSceneSvg.svelte";
8
+ export { default as ChartPresenceLayer } from "./ChartPresenceLayer.svelte";
9
+ export { default as ChartStreamingView } from "./ChartStreamingView.svelte";
10
+ export { default as ChartSparkline } from "./ChartSparkline.svelte";
6
11
  export * from "./createChartEditor.svelte.js";
7
12
  export * from "./styles.js";
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ import type { ChartNodeViewState } from '@pixerate/editor';
3
+ import type { ChartTheme } from '@pixerate/editor/chart';
4
+ import ChartCanvas from '../chart/ChartCanvas.svelte';
5
+ import ChartDataGrid from '../chart/ChartDataGrid.svelte';
6
+ import ChartInspector from '../chart/ChartInspector.svelte';
7
+ import { chartButtonClass } from '../chart/styles.js';
8
+
9
+ interface Props {
10
+ /** What the editor's `chart` node passes (see `ChartNodeViewState`). */
11
+ view: ChartNodeViewState;
12
+ /** Chart colours (default: the CSS-variable theme). */
13
+ theme?: Partial<ChartTheme>;
14
+ /** Show the data grid under the chart while editing (default `true`). */
15
+ showDataGrid?: boolean;
16
+ }
17
+
18
+ let { view, theme, showDataGrid = true }: Props = $props();
19
+
20
+ const clickable = $derived(view.editable && !view.editing);
21
+
22
+ function open() {
23
+ if (clickable) view.setEditing(true);
24
+ }
25
+
26
+ function onkeydown(event: KeyboardEvent) {
27
+ if (view.editing && event.key === 'Escape') {
28
+ event.stopPropagation();
29
+ view.setEditing(false);
30
+ }
31
+ }
32
+ </script>
33
+
34
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
35
+ <div
36
+ class="not-prose my-2 rounded-md border bg-background p-1 {view.selected ? 'border-primary ring-1 ring-primary' : 'border-border'}"
37
+ data-chart-node-view=""
38
+ data-editing={view.editing ? '' : undefined}
39
+ {onkeydown}
40
+ >
41
+ {#if view.editing}
42
+ <div class="mb-1 flex items-center justify-between gap-2 px-1" data-chart-node-toolbar="">
43
+ <span class="text-xs text-muted-foreground">Editing chart</span>
44
+ <button type="button" class={chartButtonClass} data-action="done" onclick={() => view.setEditing(false)}>Done</button>
45
+ </div>
46
+ {/if}
47
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
48
+ <div class={clickable ? 'cursor-pointer' : undefined} onclick={open} title={clickable ? 'Click to edit the chart' : undefined} data-chart-node-canvas="">
49
+ <ChartCanvas controller={view.controller} width={view.width ?? 640} height={view.height} responsive={view.width === null} editable={view.editing} {theme} />
50
+ </div>
51
+ {#if view.editing}
52
+ <!-- Wraps by the document's width, not the viewport's: side by side when there is room. -->
53
+ <div class="mt-2 flex flex-wrap items-start gap-2" data-chart-node-panel="">
54
+ {#if showDataGrid}
55
+ <div class="min-w-0 flex-[1_1_20rem] overflow-x-auto">
56
+ <ChartDataGrid controller={view.controller} />
57
+ </div>
58
+ {/if}
59
+ <ChartInspector controller={view.controller} class="max-h-96 min-w-0 flex-[1_1_16rem] overflow-y-auto rounded-md border border-border p-3" />
60
+ </div>
61
+ {/if}
62
+ </div>
@@ -0,0 +1,14 @@
1
+ import type { ChartNodeViewState } from '@pixerate/editor';
2
+ import type { ChartTheme } from '@pixerate/editor/chart';
3
+ interface Props {
4
+ /** What the editor's `chart` node passes (see `ChartNodeViewState`). */
5
+ view: ChartNodeViewState;
6
+ /** Chart colours (default: the CSS-variable theme). */
7
+ theme?: Partial<ChartTheme>;
8
+ /** Show the data grid under the chart while editing (default `true`). */
9
+ showDataGrid?: boolean;
10
+ }
11
+ declare const ChartNodeView: import("svelte").Component<Props, {}, "">;
12
+ type ChartNodeView = ReturnType<typeof ChartNodeView>;
13
+ export default ChartNodeView;
14
+ //# sourceMappingURL=ChartNodeView.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartNodeView.svelte.d.ts","sourceRoot":"","sources":["../../src/chart-node/ChartNodeView.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOvD,UAAU,KAAK;IACb,wEAAwE;IACxE,IAAI,EAAE,kBAAkB,CAAC;IACzB,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAqDH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type Component } from "svelte";
2
+ import type { ChartNodeViewMount, ChartNodeViewState } from "@pixerate/editor";
3
+ import type { ChartTheme } from "@pixerate/editor/chart";
4
+ export interface SvelteChartNodeViewOptions {
5
+ /** Chart colours (default: the CSS-variable theme). */
6
+ theme?: Partial<ChartTheme>;
7
+ /** Show the data grid under the chart while editing (default `true`). */
8
+ showDataGrid?: boolean;
9
+ /** Draw something else for each chart (default `ChartNodeView`; it receives `view`). */
10
+ component?: Component<{
11
+ view: ChartNodeViewState;
12
+ theme?: Partial<ChartTheme>;
13
+ showDataGrid?: boolean;
14
+ }>;
15
+ }
16
+ /**
17
+ * The `nodeView` for the core `chart` node, mounting `ChartNodeView` into each chart:
18
+ * `createRichTextPreset({ chart: { nodeView: createSvelteChartNodeView() } })`.
19
+ */
20
+ export declare function createSvelteChartNodeView(options?: SvelteChartNodeViewOptions): ChartNodeViewMount;
21
+ //# sourceMappingURL=createChartNodeView.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createChartNodeView.svelte.d.ts","sourceRoot":"","sources":["../../src/chart-node/createChartNodeView.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wFAAwF;IACxF,SAAS,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC1G;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,kBAAkB,CAqBtG"}
@@ -0,0 +1,28 @@
1
+ import { mount, unmount } from "svelte";
2
+ import ChartNodeView from "./ChartNodeView.svelte";
3
+ /**
4
+ * The `nodeView` for the core `chart` node, mounting `ChartNodeView` into each chart:
5
+ * `createRichTextPreset({ chart: { nodeView: createSvelteChartNodeView() } })`.
6
+ */
7
+ export function createSvelteChartNodeView(options = {}) {
8
+ const { component = ChartNodeView, theme, showDataGrid } = options;
9
+ return (dom, state) => {
10
+ let current = $state.raw(state);
11
+ const instance = mount(component, {
12
+ target: dom,
13
+ props: {
14
+ get view() {
15
+ return current;
16
+ },
17
+ theme,
18
+ showDataGrid,
19
+ },
20
+ });
21
+ return {
22
+ update: (next) => {
23
+ current = next;
24
+ },
25
+ destroy: () => void unmount(instance),
26
+ };
27
+ };
28
+ }