@cnvx/nodal 0.1.2 → 0.1.4

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.
@@ -14,6 +14,7 @@
14
14
  browser,
15
15
  dev,
16
16
  } from "./diagram-lib.js";
17
+ import type { HTMLAttributes } from "svelte/elements";
17
18
 
18
19
  export interface DiagramNodeDef {
19
20
  id: string;
@@ -60,6 +61,8 @@
60
61
  nodes: SvelteMap<string, DiagramNodeDef>;
61
62
  edges: SvelteMap<string, DiagramEdgeDef>;
62
63
  children: Snippet;
64
+ scaleToFit?: boolean;
65
+ figureAttributes: HTMLAttributes<HTMLElement>;
63
66
  };
64
67
 
65
68
  // const getNodeOrigin = (node: DiagramNode) => node.origin ?? vector2(0.0, 0.5);
@@ -73,7 +76,8 @@
73
76
  </script>
74
77
 
75
78
  <script lang="ts">
76
- let { nodes, edges, children }: DiagramProps = $props();
79
+ let { nodes, edges, children, scaleToFit, figureAttributes }: DiagramProps =
80
+ $props();
77
81
  export function generateCurvePath(
78
82
  x1: number,
79
83
  y1: number,
@@ -94,7 +98,7 @@
94
98
  return normaliseAngle(raw);
95
99
  }
96
100
 
97
- // CRUCIAL TO INVEST THE Y DIRECTION SINCE IT GOES FROM
101
+ // CRUCIAL TO INVERT THE Y DIRECTION SINCE IT GOES FROM
98
102
  // NEGATIVE TO POSITIVE!!!!!!!!!!!!!
99
103
  const leaveAngle = Math.atan2(y1 - y2, x2 - x1);
100
104
  const arriveAngle = leaveAngle + Math.PI;
@@ -255,7 +259,20 @@
255
259
  // }
256
260
  // });
257
261
 
262
+ let diagramContainer: HTMLElement | null = null;
263
+ let scale = $state(1);
258
264
  onMount(() => {
265
+ if (scaleToFit) {
266
+ console.log(diagramContainer?.parentElement);
267
+ const scaleY = diagramContainer?.parentElement?.clientHeight
268
+ ? diagramContainer.parentElement?.clientHeight / height
269
+ : 1;
270
+ const scaleX = diagramContainer?.parentElement?.clientWidth
271
+ ? diagramContainer?.parentElement?.clientWidth / width
272
+ : 1;
273
+
274
+ scale = Math.min(scaleX, scaleY);
275
+ }
259
276
  dimensions = calculateDimensions(nodes);
260
277
  });
261
278
  </script>
@@ -275,11 +292,13 @@
275
292
  {/snippet}
276
293
 
277
294
  <figure
295
+ bind:this={diagramContainer}
278
296
  aria-label="Diagram"
279
297
  aria-hidden={!dev}
280
298
  inert={!dev}
299
+ {...figureAttributes}
281
300
  role="img"
282
- style="position:relative;width:{width}px;height:{height}px;overflow:show;user-select:none;"
301
+ style="position:relative;width:{width}px;height:{height}px;overflow:visible;user-select:none;transform:scale({scale});transform-origin:center center;"
283
302
  >
284
303
  <!-- <svg class="absolute top-0 right-0 bottom-0 left-0 z-0 h-full w-full overflow-visible"> -->
285
304
  <!-- {#each edges.values() as edge, i}
@@ -1,6 +1,7 @@
1
1
  import { type Snippet } from "svelte";
2
2
  import { SvelteMap } from "svelte/reactivity";
3
3
  import { type Vector2 } from "./diagram-lib.js";
4
+ import type { HTMLAttributes } from "svelte/elements";
4
5
  export interface DiagramNodeDef {
5
6
  id: string;
6
7
  x: number;
@@ -35,6 +36,8 @@ export type DiagramProps = {
35
36
  nodes: SvelteMap<string, DiagramNodeDef>;
36
37
  edges: SvelteMap<string, DiagramEdgeDef>;
37
38
  children: Snippet;
39
+ scaleToFit?: boolean;
40
+ figureAttributes: HTMLAttributes<HTMLElement>;
38
41
  };
39
42
  declare const Diagram: import("svelte").Component<DiagramProps, {
40
43
  generateCurvePath: (x1: number, y1: number, x2: number, y2: number, edge: DiagramEdgeDef) => string;
@@ -18,12 +18,16 @@
18
18
  let {
19
19
  children,
20
20
  eagerLoad = false,
21
+ scaleToFit = false,
21
22
  rootMargin = "100px", // start a bit before it enters the viewport
23
+ figureAttributes = { inert: true, "aria-hidden": true },
22
24
  ...rest
23
25
  }: {
24
26
  children: Snippet;
25
27
  eagerLoad?: boolean;
28
+ scaleToFit?: boolean;
26
29
  rootMargin?: string;
30
+ figureAttributes: HTMLAttributes<HTMLElement>;
27
31
  } & HTMLAttributes<HTMLDivElement> = $props();
28
32
 
29
33
  const nodes = new SvelteMap<string, DiagramNodeDef>();
@@ -85,11 +89,11 @@
85
89
 
86
90
  {#if shouldRender}
87
91
  <!-- first pass: register all the nodes and edges -->
88
- <PrerenderDiagram {nodes} {edges} {children} />
92
+ <PrerenderDiagram {nodes} {edges} {children} {figureAttributes} />
89
93
 
90
94
  <!-- second pass: render with computed positions -->
91
95
  <div {...rest}>
92
- <Diagram {nodes} {edges}>
96
+ <Diagram {nodes} {edges} {scaleToFit} {figureAttributes}>
93
97
  {@render children()}
94
98
  </Diagram>
95
99
  </div>
@@ -3,7 +3,9 @@ import type { HTMLAttributes } from "svelte/elements";
3
3
  type $$ComponentProps = {
4
4
  children: Snippet;
5
5
  eagerLoad?: boolean;
6
+ scaleToFit?: boolean;
6
7
  rootMargin?: string;
8
+ figureAttributes: HTMLAttributes<HTMLElement>;
7
9
  } & HTMLAttributes<HTMLDivElement>;
8
10
  declare const DiagramController: import("svelte").Component<$$ComponentProps, {}, "">;
9
11
  type DiagramController = ReturnType<typeof DiagramController>;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@cnvx/nodal",
3
3
  "private": false,
4
4
  "license": "MIT",
5
- "version": "0.1.2",
5
+ "version": "0.1.4",
6
6
  "scripts": {
7
7
  "dev": "vite dev",
8
8
  "dev-lib": "svelte-package -w",