@visuallyjs/browser-ui-svelte 1.1.4 → 1.2.1

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 (49) hide show
  1. package/AreaChartComponent.svelte +24 -15
  2. package/BarChartComponent.svelte +24 -12
  3. package/BubbleChartComponent.svelte +23 -11
  4. package/ColorPickerComponent.svelte +2 -2
  5. package/ColumnChartComponent.svelte +23 -11
  6. package/ControlsComponent.svelte +12 -34
  7. package/DecoratorComponent.svelte +15 -23
  8. package/DiagramComponent.svelte +2 -2
  9. package/DiagramPaletteComponent.svelte +24 -31
  10. package/DiagramProvider.svelte +3 -1
  11. package/EdgeTypePickerComponent.svelte +1 -1
  12. package/ExportControlsComponent.svelte +15 -33
  13. package/GaugeChartComponent.svelte +2 -7
  14. package/InspectorComponent.svelte +24 -36
  15. package/LineChartComponent.svelte +23 -13
  16. package/MiniviewComponent.svelte +28 -48
  17. package/OverlayWrapperComponent.svelte +35 -0
  18. package/PaletteComponent.svelte +28 -41
  19. package/PaperComponent.svelte +365 -0
  20. package/PaperProvider.svelte +11 -0
  21. package/PieChartComponent.svelte +23 -8
  22. package/SankeyChartComponent.svelte +35 -14
  23. package/ScatterChartComponent.svelte +23 -11
  24. package/ShapePaletteComponent.svelte +11 -22
  25. package/SurfaceComponent.svelte +100 -5
  26. package/SurfacePopup.svelte +32 -0
  27. package/SurfaceProvider.svelte +3 -1
  28. package/WrapperComponent.svelte +3 -1
  29. package/XYChartComponent.svelte +33 -12
  30. package/charts/definitions.d.ts +119 -0
  31. package/charts/definitions.js +1 -0
  32. package/components.d.ts +4 -0
  33. package/components.js +4 -0
  34. package/definitions.d.ts +111 -259
  35. package/diagram-store.d.ts +0 -5
  36. package/diagram-store.js +0 -15
  37. package/index.d.ts +4 -0
  38. package/index.js +4 -0
  39. package/package.json +1 -1
  40. package/surface-store.d.ts +19 -4
  41. package/surface-store.js +43 -12
  42. package/use-diagram.svelte.d.ts +8 -0
  43. package/use-diagram.svelte.js +18 -0
  44. package/use-surface.svelte.d.ts +7 -0
  45. package/use-surface.svelte.js +18 -0
  46. package/use-visuallyjs-update.svelte.d.ts +19 -0
  47. package/use-visuallyjs-update.svelte.js +37 -0
  48. package/use-zoom.svelte.d.ts +1 -3
  49. package/use-zoom.svelte.js +14 -11
@@ -21,13 +21,21 @@
21
21
  extend, EVENT_GRAPH_CLEARED, EVENT_NODE_UPDATED, EVENT_GROUP_UPDATED,
22
22
  type NodeRemovedParams, EVENT_NODE_REMOVED,
23
23
  type GroupRemovedParams, EVENT_GROUP_REMOVED,
24
- type SurfaceOptions
24
+ type SurfaceOptions,
25
+ OVERLAY_TYPE_CUSTOM,
26
+ type Connection,
27
+ type EdgeUpdatedParams,
28
+ type EdgeRemovedParams,
29
+ EVENT_EDGE_UPDATED,
30
+ EVENT_EDGE_REMOVED,
31
+ ELEMENT_DIV
25
32
  } from "@visuallyjs/browser-ui";
26
33
  import { internal_getSurfaceContext } from "./surface-store";
27
34
 
28
35
  import DefaultNodeComponent from './DefaultNodeComponent.svelte'
29
36
  import DefaultGroupComponent from './DefaultGroupComponent.svelte'
30
37
  import WrapperComponent from "./WrapperComponent.svelte";
38
+ import OverlayWrapperComponent from "./OverlayWrapperComponent.svelte";
31
39
 
32
40
  let container:HTMLElement;
33
41
 
@@ -70,17 +78,78 @@
70
78
  // list of vertices to render
71
79
  let _vertices:Array<ComponentHolder> = []
72
80
 
81
+ type OverlayHolder = {
82
+ component: any,
83
+ props: any,
84
+ edge: any,
85
+ id: string,
86
+ el:BrowserElement
87
+ }
88
+
89
+ let _overlays: Array<OverlayHolder> = []
90
+
73
91
  // state wrapper around the vertex list
74
92
  let vertexState = $state({
75
93
  vertices:_vertices
76
94
  })
77
95
 
96
+ let overlayState = $state({
97
+ overlays: _overlays
98
+ })
99
+
78
100
  // manages updating the vertex state cleanly.
79
101
  function _updateVertexState() {
80
102
  vertexState.vertices.length = 0
81
103
  vertexState.vertices.push(..._vertices.slice())
82
104
  }
83
105
 
106
+ function _updateOverlayState() {
107
+ overlayState.overlays.length = 0
108
+ overlayState.overlays.push(..._overlays.slice())
109
+ }
110
+
111
+ function _initialiseSvelteOverlays() {
112
+ const edgeTypes = viewOptions?.edges || {}
113
+ for (let type in edgeTypes) {
114
+ const edgeDefinition = edgeTypes[type];
115
+ if (edgeDefinition.overlays) {
116
+ edgeDefinition.overlays = edgeDefinition.overlays.map((ov: any) => {
117
+ if (ov.component != null) {
118
+ return {
119
+ type: OVERLAY_TYPE_CUSTOM,
120
+ options: {
121
+ create: (c: Connection<BrowserElement>) => {
122
+ const el = document.createElement(ELEMENT_DIV);
123
+ const overlayProps = {
124
+ data: c.edge.data,
125
+ model: surface.model,
126
+ ui: surface,
127
+ edge: c.edge,
128
+ vertex: c.edge, // Some components might expect vertex
129
+ ...ov.props
130
+ };
131
+
132
+ const holder: OverlayHolder = {
133
+ component: ov.component,
134
+ props: overlayProps,
135
+ edge: c.edge,
136
+ id: uuid(),
137
+ el
138
+ };
139
+
140
+ _overlays.push(holder);
141
+ _updateOverlayState();
142
+ return el;
143
+ }
144
+ }
145
+ };
146
+ }
147
+ return ov;
148
+ });
149
+ }
150
+ }
151
+ }
152
+
84
153
  function render ( id:string, data:ObjectData, model:BrowserUISvelteModel, type:string,
85
154
  surface:Surface, def:any, modelObject:Vertex, eventInfo:any) {
86
155
 
@@ -179,7 +248,7 @@
179
248
  };
180
249
 
181
250
  const params = (renderOptions || {}) as SurfaceOptions;
182
- params.view = viewOptions || {};
251
+ params.view = (viewOptions || {}) as any;
183
252
  params.id = id;
184
253
 
185
254
  if (shapeLibrary != null) {
@@ -188,6 +257,8 @@
188
257
  };
189
258
  }
190
259
 
260
+ _initialiseSvelteOverlays();
261
+
191
262
  surface = renderSurface(model, container, templateRenderer, params);
192
263
 
193
264
  // with continuous anchors it's necessary to do this, for
@@ -238,13 +309,29 @@
238
309
  removeVertex(p.group.id)
239
310
  });
240
311
 
312
+ const updateOverlays = (edgeId: string, eventPayload: EdgeUpdatedParams) => {
313
+ _overlays.forEach(o => {
314
+ if (o.edge.id === edgeId) {
315
+ o.props.data = eventPayload.edge.data;
316
+ }
317
+ });
318
+ _updateOverlayState();
319
+ };
320
+
321
+ const removeOverlays = (edgeId: string) => {
322
+ _overlays = _overlays.filter(o => o.edge.id !== edgeId);
323
+ _updateOverlayState();
324
+ };
325
+
326
+ model.bind<EdgeUpdatedParams>(EVENT_EDGE_UPDATED, (p) => updateOverlays(p.edge.id, p));
327
+ model.bind<EdgeRemovedParams>(EVENT_EDGE_REMOVED, (p) => removeOverlays(p.edge.id));
328
+
241
329
 
242
330
  model.bind(EVENT_GRAPH_CLEARED, () => {
243
331
  _vertices = []
244
332
  _updateVertexState()
245
- // TODO svelte overlays
246
- // _overlays = []
247
- // _updateOverlayState()
333
+ _overlays = []
334
+ _updateOverlayState()
248
335
  })
249
336
 
250
337
  if (url != null) {
@@ -264,7 +351,15 @@
264
351
  def={vertex.def}
265
352
  vertex={vertex.vertex}
266
353
  className={vertex.props.className}/>
354
+ {/each}
267
355
 
356
+ {#each overlayState.overlays as overlay (overlay.id)}
357
+ <OverlayWrapperComponent component={overlay.component}
358
+ data={overlay.props.data}
359
+ ui={surface}
360
+ edge={overlay.edge}
361
+ className="vjs-svelte-overlay"
362
+ el={overlay.el}/>
268
363
  {/each}
269
364
  {@render children?.()}
270
365
  </div>
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import {PopupHandler, type Vertex, CLASS_SURFACE_POPUP} from "@visuallyjs/browser-ui";
3
+ import {useSurface} from "./use-surface.svelte";
4
+ import type {SurfacePopupProps} from "./definitions";
5
+
6
+ let {
7
+ selector,
8
+ anchor,
9
+ popup
10
+ }:SurfacePopupProps = $props()
11
+
12
+ const surface = useSurface()
13
+ let container:HTMLElement
14
+ let initialized = false
15
+
16
+ let current = $state<Vertex|null>(null)
17
+ let display = $derived(current == null ? "none" : "block")
18
+
19
+ $effect(() => {
20
+ if (!initialized && surface.current && container) {
21
+ initialized = true
22
+ new PopupHandler(selector, container, surface.current, (v:Vertex|null) => current = v, anchor)
23
+ }
24
+ })
25
+
26
+ </script>
27
+
28
+ <div bind:this={container} class={CLASS_SURFACE_POPUP} style:display={display} style:position="absolute">
29
+ {#if surface.current != null}
30
+ {@render popup(current, surface.current.model, surface.current)}
31
+ {/if}
32
+ </div>
@@ -2,8 +2,10 @@
2
2
 
3
3
  import { internal_getSurfaceContext } from "./surface-store"
4
4
 
5
+ const { children } = $props()
6
+
5
7
  internal_getSurfaceContext(false)
6
8
 
7
9
  </script>
8
10
 
9
- <slot />
11
+ {@render children?.()}
@@ -16,7 +16,9 @@
16
16
  const _ui = $state.raw(ui) as BrowserUI
17
17
 
18
18
  onMount(async () => {
19
- ui.$vertexRendered(vertex, el, def)
19
+ if (def != null) {
20
+ ui.$vertexRendered(vertex, el, def)
21
+ }
20
22
  })
21
23
 
22
24
 
@@ -2,30 +2,51 @@
2
2
 
3
3
  import { onMount } from "svelte";
4
4
 
5
- import { CategoryValueChart } from "@visuallyjs/browser-ui"
6
- import {type XYChartComponentProps} from "./definitions";
5
+ import {
6
+ CategoryValueChart,
7
+ type CategoryValueChartOptions
8
+ } from "@visuallyjs/browser-ui"
9
+ import {type XYChartComponentProps} from "./charts/definitions";
10
+ import {useVisuallyJsModel} from "./surface-store";
7
11
 
8
12
  let container:HTMLElement;
9
13
 
10
14
  // XYChartOptions
11
- let {options, className = "", data, url }:XYChartComponentProps = $props()
15
+ let {options, className = "", data, url, dataSourceFilter }:XYChartComponentProps = $props()
12
16
 
13
- let chart:CategoryValueChart<any>
17
+ let chart:CategoryValueChart
14
18
 
15
19
  export function getChart() {
16
20
  return chart;
17
21
  }
18
22
 
19
- onMount(async () => {
23
+ function init(opts:CategoryValueChartOptions) {
24
+ chart = new CategoryValueChart(container, opts)
25
+ if (url != null) {
26
+ chart.load({url});
27
+ } else if (data != null) {
28
+ chart.load({data});
29
+ }
30
+ }
20
31
 
21
- chart = new CategoryValueChart(container, options)
32
+ $effect(() => {
33
+ if (chart && dataSourceFilter != null) {
34
+ chart.setDataSourceFilter(dataSourceFilter)
35
+ }
36
+ })
37
+
38
+ onMount(async () => {
39
+ const opts:CategoryValueChartOptions = Object.assign({}, options)
40
+ if (url == null && data == null) {
41
+ useVisuallyJsModel().then(m => {
42
+ opts.dataSource = m
43
+ init(opts)
44
+ })
45
+ } else {
46
+ init(opts)
47
+ }
48
+ })
22
49
 
23
- if (url != null) {
24
- chart.load({url});
25
- } else if (data != null) {
26
- chart.load({data});
27
- }
28
- })
29
50
 
30
51
  </script>
31
52
 
@@ -0,0 +1,119 @@
1
+ import { DOMAttributes } from "svelte/elements";
2
+ import { CategoryValueChartOptions, ObjectData, ChartModelFilter, ColumnChartOptions, BarChartOptions, LineChartOptions, PieChartOptions, ScatterChartOptions, AreaChartOptions, GaugeChartOptions, SankeyOptions, VisuallyJsDefaultJSON } from "@visuallyjs/browser-ui";
3
+ /**
4
+ * @group Props
5
+ */
6
+ export interface BaseXYChartComponentProps<O> extends DOMAttributes<HTMLDivElement> {
7
+ /**
8
+ * Options for the chart
9
+ */
10
+ options: Omit<O, "data" | "url" | "model">;
11
+ /**
12
+ * Optional class name to set on the chart component's container
13
+ */
14
+ className?: string;
15
+ /**
16
+ * Optional data to load after the chart has been mounted.
17
+ */
18
+ data?: Array<ObjectData>;
19
+ /**
20
+ * Optional url from which to load data after the component has been mounted. If you provide this and also data, this will take precedence.
21
+ */
22
+ url?: string;
23
+ /**
24
+ * Optional filter to apply to the data source.
25
+ */
26
+ dataSourceFilter?: ChartModelFilter;
27
+ }
28
+ /**
29
+ * Props for the AreaChartComponent
30
+ * @group Props
31
+ */
32
+ export interface AreaChartComponentProps extends BaseXYChartComponentProps<AreaChartOptions> {
33
+ }
34
+ /**
35
+ * Props for the ColumnChartComponent
36
+ * @group Props
37
+ */
38
+ export interface ColumnChartComponentProps extends BaseXYChartComponentProps<ColumnChartOptions> {
39
+ }
40
+ /**
41
+ * Props for the BarChartComponent
42
+ * @group Props
43
+ */
44
+ export interface BarChartComponentProps extends BaseXYChartComponentProps<BarChartOptions> {
45
+ }
46
+ /**
47
+ * Props for the LineChartComponent
48
+ * @group Props
49
+ */
50
+ export interface LineChartComponentProps extends BaseXYChartComponentProps<LineChartOptions> {
51
+ }
52
+ /**
53
+ * Props for the PieChartComponent
54
+ * @group Props
55
+ */
56
+ export interface PieChartComponentProps extends BaseXYChartComponentProps<PieChartOptions> {
57
+ }
58
+ /**
59
+ * Props for the BarChartComponent
60
+ * @group Props
61
+ */
62
+ export interface ScatterChartComponentProps extends BaseXYChartComponentProps<ScatterChartOptions> {
63
+ }
64
+ /**
65
+ * Props for the XYChartComponent
66
+ * @group Props
67
+ */
68
+ export interface XYChartComponentProps extends BaseXYChartComponentProps<CategoryValueChartOptions> {
69
+ }
70
+ /**
71
+ * @group Props
72
+ */
73
+ export interface GaugeChartComponentProps extends DOMAttributes<HTMLDivElement> {
74
+ /**
75
+ * Options for the chart
76
+ */
77
+ options: Omit<GaugeChartOptions, "data" | "url" | "model">;
78
+ /**
79
+ * Optional class name to set on the chart component's container
80
+ */
81
+ className?: string;
82
+ /**
83
+ * Optional data to load after the chart has been mounted.
84
+ */
85
+ data?: Array<ObjectData>;
86
+ }
87
+ /**
88
+ * @group Props
89
+ */
90
+ export interface SankeyChartComponentProps extends DOMAttributes<HTMLDivElement> {
91
+ /**
92
+ * Options for the chart
93
+ */
94
+ options: Omit<SankeyOptions, "data" | "url" | "model">;
95
+ /**
96
+ * Optional class name to set on the chart component's container
97
+ */
98
+ className?: string;
99
+ /**
100
+ * Optional data to load into the chart (in CSV format)
101
+ */
102
+ csvData?: string;
103
+ /**
104
+ * Optional data to load into the chart (in VisuallyJs default json format)
105
+ */
106
+ jsonData?: VisuallyJsDefaultJSON;
107
+ /**
108
+ * Optional url from which to load data after the component has been mounted. If you provide this and also data, this will take precedence.
109
+ */
110
+ url?: string;
111
+ /**
112
+ * Whether the chart is interactive.
113
+ */
114
+ interactive?: boolean;
115
+ /**
116
+ * Optional property to pivot the sankey chart on.
117
+ */
118
+ pivot?: string;
119
+ }
@@ -0,0 +1 @@
1
+ export {};
package/components.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * list of exported Svelte components.
3
3
  */
4
4
  export { default as SurfaceComponent } from "./SurfaceComponent.svelte";
5
+ export { default as PaperComponent } from "./PaperComponent.svelte";
5
6
  export { default as DiagramComponent } from "./DiagramComponent.svelte";
6
7
  export { default as ControlsComponent } from "./ControlsComponent.svelte";
7
8
  export { default as ExportControlsComponent } from "./ExportControlsComponent.svelte";
@@ -14,6 +15,7 @@ export { default as DiagramPaletteComponent } from "./DiagramPaletteComponent.sv
14
15
  export { default as ShapeComponent } from "./ShapeComponent.svelte";
15
16
  export { default as EdgeTypePickerComponent } from "./EdgeTypePickerComponent.svelte";
16
17
  export { default as ColorPickerComponent } from "./ColorPickerComponent.svelte";
18
+ export { default as SurfacePopup } from "./SurfacePopup.svelte";
17
19
  export { default as ColumnChartComponent } from "./ColumnChartComponent.svelte";
18
20
  export { default as BarChartComponent } from "./BarChartComponent.svelte";
19
21
  export { default as XYChartComponent } from "./XYChartComponent.svelte";
@@ -25,5 +27,7 @@ export { default as BubbleChartComponent } from "./BubbleChartComponent.svelte";
25
27
  export { default as GaugeChartComponent } from "./GaugeChartComponent.svelte";
26
28
  export { default as SankeyChartComponent } from "./SankeyChartComponent.svelte";
27
29
  export { default as WrapperComponent } from "./WrapperComponent.svelte";
30
+ export { default as OverlayWrapperComponent } from "./OverlayWrapperComponent.svelte";
28
31
  export { default as DiagramProvider } from "./DiagramProvider.svelte";
29
32
  export { default as SurfaceProvider } from "./SurfaceProvider.svelte";
33
+ export { default as PaperProvider } from "./PaperProvider.svelte";
package/components.js CHANGED
@@ -2,6 +2,7 @@
2
2
  * list of exported Svelte components.
3
3
  */
4
4
  export { default as SurfaceComponent } from "./SurfaceComponent.svelte";
5
+ export { default as PaperComponent } from "./PaperComponent.svelte";
5
6
  export { default as DiagramComponent } from "./DiagramComponent.svelte";
6
7
  export { default as ControlsComponent } from "./ControlsComponent.svelte";
7
8
  export { default as ExportControlsComponent } from "./ExportControlsComponent.svelte";
@@ -14,6 +15,7 @@ export { default as DiagramPaletteComponent } from "./DiagramPaletteComponent.sv
14
15
  export { default as ShapeComponent } from "./ShapeComponent.svelte";
15
16
  export { default as EdgeTypePickerComponent } from "./EdgeTypePickerComponent.svelte";
16
17
  export { default as ColorPickerComponent } from "./ColorPickerComponent.svelte";
18
+ export { default as SurfacePopup } from "./SurfacePopup.svelte";
17
19
  export { default as ColumnChartComponent } from "./ColumnChartComponent.svelte";
18
20
  export { default as BarChartComponent } from "./BarChartComponent.svelte";
19
21
  export { default as XYChartComponent } from "./XYChartComponent.svelte";
@@ -25,5 +27,7 @@ export { default as BubbleChartComponent } from "./BubbleChartComponent.svelte";
25
27
  export { default as GaugeChartComponent } from "./GaugeChartComponent.svelte";
26
28
  export { default as SankeyChartComponent } from "./SankeyChartComponent.svelte";
27
29
  export { default as WrapperComponent } from "./WrapperComponent.svelte";
30
+ export { default as OverlayWrapperComponent } from "./OverlayWrapperComponent.svelte";
28
31
  export { default as DiagramProvider } from "./DiagramProvider.svelte";
29
32
  export { default as SurfaceProvider } from "./SurfaceProvider.svelte";
33
+ export { default as PaperProvider } from "./PaperProvider.svelte";