@rankonelabs/livid-svg 0.1.2 → 0.3.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.
package/README.md CHANGED
@@ -71,14 +71,42 @@ one line is that line; track leaving a router onto another line already belongs
71
71
  to the new one, which is what makes an interchange read as a change. Edges that
72
72
  cross lines are drawn at `branchWeight`, lighter than the track they leave.
73
73
 
74
+ ## Direction
75
+
76
+ Edges draw no arrowheads unless you ask for them:
77
+
78
+ ```ts
79
+ const svg = renderSvg(laid.value, { theme: { metrics: { edgeArrowhead: 'target' } } })
80
+ ```
81
+
82
+ Off by default, and it is theme config rather than a structural option, because
83
+ every livid edge is *already* directed in the data — core gives an edge a source
84
+ and a target — so whether the drawing says so out loud is a question of look. A
85
+ transit map with a head on every segment reads busier than one without; the
86
+ caller knows which of the two its figure is, and the renderer draws what it is
87
+ told.
88
+
89
+ One `<marker>` is defined per figure and shared by every edge. It fills from
90
+ `context-stroke`, so a head is whatever colour its edge is — including when the
91
+ palette is CSS custom properties (`var(--accent)`) that only resolve at paint
92
+ time, which a per-colour definition could never anticipate. It is sized in
93
+ `strokeWidth` units, so the same head serves a track at `lineWeight` and a
94
+ branch at `branchWeight` in proportion. Tune the proportions with `arrowLength`
95
+ and `arrowWidth`, both in stroke widths rather than px.
96
+
97
+ The head is drawn back from the route's last point, which core puts on the
98
+ target's boundary — so it points *at* the node from outside rather than
99
+ disappearing under it. `renderFigure` reserves the room it needs, so turning
100
+ heads on never clips a figure sized from `width` and `height`.
101
+
74
102
  ## Styling hooks, and where motion lives
75
103
 
76
104
  Every node and edge carries hooks for the page's own stylesheet:
77
105
 
78
106
  | Element | Class | Attributes |
79
107
  | --- | --- | --- |
80
- | node `<g>` | `livid-node` | `data-type`, `data-node`, `data-line` |
81
- | edge `<polyline>` | `livid-edge` | `data-type`, `data-line`, `data-kind` (`track` \| `branch`) |
108
+ | node `<g>` | `livid-node` | `data-type`, `data-node`, `data-line`, `data-state`, `data-tint`, `data-anim` |
109
+ | edge `<polyline>` | `livid-edge` | `data-type`, `data-line`, `data-kind` (`track` \| `branch`), `data-state`, `data-tint`, `data-anim` |
82
110
 
83
111
  Motion is not a renderer option, and that is on purpose. An inline SVG is stylable
84
112
  by the document around it, so hover states, transitions, and flow animation are
@@ -87,6 +115,16 @@ deciding something the page is better placed to decide. What the renderer owes i
87
115
  *identity*: which line, which type, track or branch. That is the one thing CSS
88
116
  cannot recover from geometry.
89
117
 
118
+ Pass a validated frame as the second argument to render a state snapshot:
119
+
120
+ ```ts
121
+ renderSvg(laid.value, frame, { levels: 'root' })
122
+ ```
123
+
124
+ The renderer resolves the declared tint through `theme.palette.states` and
125
+ emits the closed animation token as `data-anim`; the surrounding stylesheet can
126
+ then implement transitions while respecting `prefers-reduced-motion`.
127
+
90
128
  ```css
91
129
  /* Artifact flowing along the critical path, in the consumer's stylesheet. */
92
130
  @media (prefers-reduced-motion: no-preference) {
package/dist/.tsbuildinfo CHANGED
@@ -1 +1 @@
1
- {"root":["../src/geometry.ts","../src/index.ts","../src/render.ts","../src/shapes.ts","../src/theme.ts"],"version":"5.9.3"}
1
+ {"root":["../src/geometry.ts","../src/index.ts","../src/markers.ts","../src/render.ts","../src/shapes.ts","../src/theme.ts"],"version":"5.9.3"}
package/dist/index.d.ts CHANGED
@@ -5,7 +5,8 @@
5
5
  * this package measures nothing and lays out nothing; it draws.
6
6
  */
7
7
  export { type SvgOptions, type SvgFigure, renderSvg, renderFigure, escapeText, escapeAttr } from './render.js';
8
- export { type LabelSide, type Palette, type Typography, type Metrics, type SvgTheme, type SvgThemeOverrides, DEFAULT_PALETTE, DEFAULT_TYPOGRAPHY, DEFAULT_METRICS, DEFAULT_THEME, resolveTheme, lineColour, } from './theme.js';
8
+ export { type EdgeArrowhead, type LabelSide, type Palette, type Typography, type Metrics, type SvgTheme, type SvgThemeOverrides, DEFAULT_PALETTE, DEFAULT_TYPOGRAPHY, DEFAULT_METRICS, DEFAULT_THEME, resolveTheme, lineColour, } from './theme.js';
9
9
  export { type Box, type LabelPlacement, type PlacedLabel, EMPTY_BOX, ZERO_BOX, boxOf, unionOf, boxAround, withExtent, estimateTextWidth, labelPlacementOf, placeLabel, } from './geometry.js';
10
10
  export { type ShapeStyle, shapeMarkup, glyphMarkup } from './shapes.js';
11
+ export { type Arrowhead, arrowDefsMarkup, arrowEndAttr, arrowheadOf, arrowheadReach, } from './markers.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/G,OAAO,EACL,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,GAAG,EACR,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/G,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,GAAG,EACR,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EACL,KAAK,SAAS,EACd,eAAe,EACf,YAAY,EACZ,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -8,4 +8,5 @@ export { renderSvg, renderFigure, escapeText, escapeAttr } from './render.js';
8
8
  export { DEFAULT_PALETTE, DEFAULT_TYPOGRAPHY, DEFAULT_METRICS, DEFAULT_THEME, resolveTheme, lineColour, } from './theme.js';
9
9
  export { EMPTY_BOX, ZERO_BOX, boxOf, unionOf, boxAround, withExtent, estimateTextWidth, labelPlacementOf, placeLabel, } from './geometry.js';
10
10
  export { shapeMarkup, glyphMarkup } from './shapes.js';
11
+ export { arrowDefsMarkup, arrowEndAttr, arrowheadOf, arrowheadReach, } from './markers.js';
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAmC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/G,OAAO,EAOL,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAIL,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAmB,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAmC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/G,OAAO,EAQL,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAIL,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAmB,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAEL,eAAe,EACf,YAAY,EACZ,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The arrowhead: one `<marker>` per figure, shared by every edge that draws
3
+ * direction.
4
+ *
5
+ * One definition rather than one per colour, because the head takes its fill
6
+ * from `context-stroke`. That is not a tidiness choice — a consumer's palette
7
+ * may be CSS custom properties (`var(--accent)`) rather than literals, and a
8
+ * marker cannot be pre-rendered per value it will only learn at paint time.
9
+ * Sizing follows for the same reason: `markerUnits="strokeWidth"` lets the one
10
+ * head serve a track at `lineWeight` and a branch at `branchWeight` without the
11
+ * renderer emitting either.
12
+ */
13
+ import type { Metrics } from './theme.js';
14
+ /**
15
+ * A head this figure is going to draw: its proportions, in stroke widths, plus
16
+ * the DOM id the edges point at. Absent — `null` at the call site — is how "no
17
+ * arrowheads" travels, so nothing downstream re-reads the mode.
18
+ */
19
+ export interface Arrowhead {
20
+ /** DOM id, unique to this figure. See `arrowheadOf`. */
21
+ readonly id: string;
22
+ /** Along the route, in stroke widths. */
23
+ readonly length: number;
24
+ /** Across the route, in stroke widths. */
25
+ readonly width: number;
26
+ }
27
+ /**
28
+ * The head one figure will draw, or `null` when it draws none.
29
+ *
30
+ * `fingerprint` distinguishes this figure from any other inlined into the same
31
+ * HTML document; `render.ts` derives it from what the figure draws. It arrives
32
+ * as a thunk rather than a string because deriving it walks every node, edge,
33
+ * and route point in the figure. Arrowheads are off by default, and that walk
34
+ * buys a default render nothing — so the mode check has to happen before the
35
+ * fingerprint is forced, not after. Keeping the thunk here rather than testing
36
+ * the mode at the call site leaves `'none'` with exactly one reader.
37
+ */
38
+ export declare function arrowheadOf(metrics: Metrics, fingerprint: () => string): Arrowhead | null;
39
+ /**
40
+ * The `<defs>` block, emitted once for the whole document.
41
+ *
42
+ * `refX` puts the tip on the vertex the marker is attached to, so the head sits
43
+ * *outside* the node the route arrives at rather than under it, and `orient`
44
+ * turns it along the segment it ends.
45
+ */
46
+ export declare function arrowDefsMarkup(head: Arrowhead): string;
47
+ /** `marker-end`, for an edge that draws its direction. */
48
+ export declare function arrowEndAttr(head: Arrowhead): string;
49
+ /**
50
+ * How far the head reaches from the vertex it is drawn at, in px.
51
+ *
52
+ * The tip sits on the vertex and the body is drawn back along the incoming
53
+ * segment, so the furthest ink is a back corner — the diagonal of half the
54
+ * head. Reserving that as a *radius* holds whichever way the route arrives,
55
+ * which is what lets the bounding box stay ignorant of the route's direction.
56
+ * It errs wide, like every other estimate here: a head with room to spare reads
57
+ * fine, a clipped one does not.
58
+ */
59
+ export declare function arrowheadReach(head: Arrowhead, strokeWidth: number): number;
60
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../src/markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CASzF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAYvD;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The arrowhead: one `<marker>` per figure, shared by every edge that draws
3
+ * direction.
4
+ *
5
+ * One definition rather than one per colour, because the head takes its fill
6
+ * from `context-stroke`. That is not a tidiness choice — a consumer's palette
7
+ * may be CSS custom properties (`var(--accent)`) rather than literals, and a
8
+ * marker cannot be pre-rendered per value it will only learn at paint time.
9
+ * Sizing follows for the same reason: `markerUnits="strokeWidth"` lets the one
10
+ * head serve a track at `lineWeight` and a branch at `branchWeight` without the
11
+ * renderer emitting either.
12
+ */
13
+ /**
14
+ * The head one figure will draw, or `null` when it draws none.
15
+ *
16
+ * `fingerprint` distinguishes this figure from any other inlined into the same
17
+ * HTML document; `render.ts` derives it from what the figure draws. It arrives
18
+ * as a thunk rather than a string because deriving it walks every node, edge,
19
+ * and route point in the figure. Arrowheads are off by default, and that walk
20
+ * buys a default render nothing — so the mode check has to happen before the
21
+ * fingerprint is forced, not after. Keeping the thunk here rather than testing
22
+ * the mode at the call site leaves `'none'` with exactly one reader.
23
+ */
24
+ export function arrowheadOf(metrics, fingerprint) {
25
+ if (metrics.edgeArrowhead === 'none')
26
+ return null;
27
+ return {
28
+ // Base36 hash characters only, so there is nothing here to escape.
29
+ id: `livid-arrow-${fingerprint()}`,
30
+ length: metrics.arrowLength,
31
+ width: metrics.arrowWidth,
32
+ };
33
+ }
34
+ /**
35
+ * The `<defs>` block, emitted once for the whole document.
36
+ *
37
+ * `refX` puts the tip on the vertex the marker is attached to, so the head sits
38
+ * *outside* the node the route arrives at rather than under it, and `orient`
39
+ * turns it along the segment it ends.
40
+ */
41
+ export function arrowDefsMarkup(head) {
42
+ const { length, width } = head;
43
+ return (`<defs>` +
44
+ `<marker id="${head.id}" markerUnits="strokeWidth" ` +
45
+ `markerWidth="${round(length)}" markerHeight="${round(width)}" ` +
46
+ `refX="${round(length)}" refY="${round(width / 2)}" orient="auto">` +
47
+ `<path d="M0,0 L${round(length)},${round(width / 2)} L0,${round(width)} z" fill="context-stroke"/>` +
48
+ `</marker>` +
49
+ `</defs>`);
50
+ }
51
+ /** `marker-end`, for an edge that draws its direction. */
52
+ export function arrowEndAttr(head) {
53
+ return `marker-end="url(#${head.id})"`;
54
+ }
55
+ /**
56
+ * How far the head reaches from the vertex it is drawn at, in px.
57
+ *
58
+ * The tip sits on the vertex and the body is drawn back along the incoming
59
+ * segment, so the furthest ink is a back corner — the diagonal of half the
60
+ * head. Reserving that as a *radius* holds whichever way the route arrives,
61
+ * which is what lets the bounding box stay ignorant of the route's direction.
62
+ * It errs wide, like every other estimate here: a head with room to spare reads
63
+ * fine, a clipped one does not.
64
+ */
65
+ export function arrowheadReach(head, strokeWidth) {
66
+ return strokeWidth * Math.hypot(head.length, head.width / 2);
67
+ }
68
+ const round = (value) => (Math.round(value * 100) / 100).toString();
69
+ //# sourceMappingURL=markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.js","sourceRoot":"","sources":["../src/markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkBH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,WAAyB;IACrE,IAAI,OAAO,CAAC,aAAa,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAElD,OAAO;QACL,mEAAmE;QACnE,EAAE,EAAE,eAAe,WAAW,EAAE,EAAE;QAClC,MAAM,EAAE,OAAO,CAAC,WAAW;QAC3B,KAAK,EAAE,OAAO,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAe;IAC7C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE/B,OAAO,CACL,QAAQ;QACR,eAAe,IAAI,CAAC,EAAE,8BAA8B;QACpD,gBAAgB,KAAK,CAAC,MAAM,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,IAAI;QAChE,SAAS,KAAK,CAAC,MAAM,CAAC,WAAW,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,kBAAkB;QACnE,kBAAkB,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,6BAA6B;QACnG,WAAW;QACX,SAAS,CACV,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,OAAO,oBAAoB,IAAI,CAAC,EAAE,IAAI,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,WAAmB;IACjE,OAAO,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC"}
package/dist/render.d.ts CHANGED
@@ -18,7 +18,7 @@
18
18
  * track or branch — because that is the one thing CSS cannot recover from
19
19
  * geometry alone.
20
20
  */
21
- import type { AnyRegistry, LaidOutDiagram } from '@rankonelabs/livid-core';
21
+ import type { AnyRegistry, LaidOutDiagram, StateFrame } from '@rankonelabs/livid-core';
22
22
  import { type SvgThemeOverrides } from './theme.js';
23
23
  export interface SvgOptions {
24
24
  readonly theme?: SvgThemeOverrides;
@@ -48,7 +48,9 @@ export interface SvgFigure {
48
48
  readonly height: number;
49
49
  }
50
50
  /** The markup alone, for callers with nothing to size. */
51
+ export declare function renderSvg<R extends AnyRegistry>(diagram: LaidOutDiagram<R>, frame: StateFrame, options?: SvgOptions): string;
51
52
  export declare function renderSvg<R extends AnyRegistry>(diagram: LaidOutDiagram<R>, options?: SvgOptions): string;
53
+ export declare function renderFigure<R extends AnyRegistry>(diagram: LaidOutDiagram<R>, frame: StateFrame, options?: SvgOptions): SvgFigure;
52
54
  export declare function renderFigure<R extends AnyRegistry>(diagram: LaidOutDiagram<R>, options?: SvgOptions): SvgFigure;
53
55
  export declare function escapeText(value: string): string;
54
56
  export declare function escapeAttr(value: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAmC,MAAM,yBAAyB,CAAC;AAI5G,OAAO,EAAiB,KAAK,iBAAiB,EAA4B,MAAM,YAAY,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAE7G;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAChD,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1B,OAAO,GAAE,UAAe,GACvB,SAAS,CAoEX;AAsKD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EAId,UAAU,EAEX,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAAiB,KAAK,iBAAiB,EAA4B,MAAM,YAAY,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;AAC9H,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;AAW3G,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;AACpI,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;AAkXjH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
package/dist/render.js CHANGED
@@ -19,17 +19,27 @@
19
19
  * geometry alone.
20
20
  */
21
21
  import { EMPTY_BOX, boxAround, boxOf, placeLabel, unionOf, withExtent } from './geometry.js';
22
+ import { arrowDefsMarkup, arrowEndAttr, arrowheadOf, arrowheadReach } from './markers.js';
22
23
  import { glyphMarkup, shapeMarkup } from './shapes.js';
23
24
  import { lineColour, resolveTheme } from './theme.js';
24
- /** The markup alone, for callers with nothing to size. */
25
- export function renderSvg(diagram, options = {}) {
26
- return renderFigure(diagram, options).svg;
25
+ export function renderSvg(diagram, frameOrOptions = {}, options = {}) {
26
+ return (isStateFrame(frameOrOptions)
27
+ ? renderFigure(diagram, frameOrOptions, options)
28
+ : renderFigure(diagram, frameOrOptions)).svg;
27
29
  }
28
- export function renderFigure(diagram, options = {}) {
30
+ export function renderFigure(diagram, frameOrOptions = {}, suppliedOptions = {}) {
31
+ const frame = isStateFrame(frameOrOptions) ? frameOrOptions : EMPTY_STATE_FRAME;
32
+ const options = isStateFrame(frameOrOptions)
33
+ ? suppliedOptions
34
+ : isObject(frameOrOptions)
35
+ ? frameOrOptions
36
+ : {};
29
37
  const theme = resolveTheme(options.theme);
30
38
  const { padding, levelGap } = theme.metrics;
31
39
  const levels = levelsOf(diagram, options.caption ?? null, options.levels !== 'root');
32
- const rendered = levels.map((level) => renderLevel(level, theme));
40
+ const title = options.title ?? null;
41
+ const arrowhead = arrowheadOf(theme.metrics, () => fingerprintOf(levels, theme, title));
42
+ const rendered = levels.map((level) => renderLevel(level, frame, theme, arrowhead));
33
43
  const captionHeight = theme.typography.captionSize + theme.metrics.labelGap * 2;
34
44
  const width = Math.max(...rendered.map((level) => level.box.maxX - level.box.minX), 0) + padding * 2;
35
45
  const placed = rendered.map((level, index) => {
@@ -64,7 +74,6 @@ export function renderFigure(diagram, options = {}) {
64
74
  .join('\n');
65
75
  })
66
76
  .join('\n');
67
- const title = options.title ?? null;
68
77
  const svg = [
69
78
  // `role="img"` is only correct alongside an accessible name; on its own it
70
79
  // makes a screen reader announce an unnamed image. Without a title the
@@ -73,6 +82,9 @@ export function renderFigure(diagram, options = {}) {
73
82
  `<svg xmlns="http://www.w3.org/2000/svg" width="${round(width)}" height="${round(height)}" ` +
74
83
  `viewBox="0 0 ${round(width)} ${round(height)}"${title === null ? '' : ` role="img" aria-label="${escapeAttr(title)}"`}>`,
75
84
  title === null ? '' : `<title>${escapeText(title)}</title>`,
85
+ // One definition for the whole document, however many levels and edges are
86
+ // stacked below it, and nothing at all unless the theme asked for heads.
87
+ arrowhead === null ? '' : arrowDefsMarkup(arrowhead),
76
88
  `<rect width="100%" height="100%" fill="${theme.palette.surface}"/>`,
77
89
  body,
78
90
  `</svg>`,
@@ -83,6 +95,13 @@ export function renderFigure(diagram, options = {}) {
83
95
  // these numbers is working with the same values the markup carries.
84
96
  return { svg, width: Number(round(width)), height: Number(round(height)) };
85
97
  }
98
+ const EMPTY_STATE_FRAME = { __brand: 'StateFrame', nodes: {}, edges: {} };
99
+ function isStateFrame(value) {
100
+ return isObject(value) && value.__brand === 'StateFrame';
101
+ }
102
+ function isObject(value) {
103
+ return typeof value === 'object' && value !== null;
104
+ }
86
105
  /** The tree of drill-down levels, flattened depth-first into a stack. */
87
106
  function levelsOf(diagram, caption, deep) {
88
107
  const here = { caption, diagram };
@@ -100,13 +119,19 @@ function heightOf(level, captionHeight) {
100
119
  /* ------------------------------------------------------------------ *
101
120
  * One level
102
121
  * ------------------------------------------------------------------ */
103
- function renderLevel(level, theme) {
122
+ function renderLevel(level, frame, theme, arrowhead) {
104
123
  const { diagram } = level;
105
124
  const colours = new Map(diagram.lines.map((line, index) => [line.id, lineColour(theme.palette, line.color, index)]));
106
125
  const colourOf = (line) => (line === null ? undefined : colours.get(line)) ?? theme.palette.caption;
107
126
  const lineOfNode = new Map(diagram.nodes.map((node) => [node.node.id, node.node.line]));
108
- const edges = diagram.edges.map((edge) => renderEdge(edge, lineOfNode, colourOf, theme));
109
- const nodes = diagram.nodes.map((node) => renderNode(node, diagram, colourOf, theme));
127
+ const edgeVisuals = new Map(diagram.edges.flatMap((edge) => {
128
+ const state = frame.edges[edge.edge.id];
129
+ const visual = state === undefined ? undefined : diagram.registry.edgeTypes[edge.edge.type]?.states?.[state];
130
+ return visual === undefined ? [] : [[edge.edge.id, visual]];
131
+ }));
132
+ const context = { lineOfNode, colourOf, frame, edgeVisuals, theme, arrowhead };
133
+ const edges = diagram.edges.map((edge) => renderEdge(edge, context));
134
+ const nodes = diagram.nodes.map((node) => renderNode(node, diagram, frame, colourOf, theme));
110
135
  // Edges first so tracks pass under stations rather than over them.
111
136
  return {
112
137
  caption: level.caption,
@@ -119,11 +144,14 @@ function renderLevel(level, theme) {
119
144
  * one line is that line; track leaving a router onto another line already
120
145
  * belongs to the new one, which is what makes an interchange read as a change.
121
146
  */
122
- function renderEdge(edge, lineOfNode, colourOf, theme) {
147
+ function renderEdge(edge, context) {
148
+ const { lineOfNode, colourOf, frame, edgeVisuals, theme, arrowhead } = context;
123
149
  const sourceLine = lineOfNode.get(edge.edge.source) ?? null;
124
150
  const targetLine = lineOfNode.get(edge.edge.target) ?? null;
125
151
  const branching = sourceLine !== targetLine;
126
152
  const weight = branching ? theme.metrics.branchWeight : theme.metrics.lineWeight;
153
+ const state = frame.edges[edge.edge.id];
154
+ const visual = edgeVisuals.get(edge.edge.id);
127
155
  // Nothing to draw and nothing to reserve, so the identity box keeps it out
128
156
  // of the union rather than pinning it to the origin.
129
157
  if (edge.route.length < 2)
@@ -133,16 +161,35 @@ function renderEdge(edge, lineOfNode, colourOf, theme) {
133
161
  markup: `<polyline class="livid-edge" data-type="${escapeAttr(edge.edge.type)}" ` +
134
162
  `data-line="${targetLine === null ? '' : escapeAttr(targetLine)}" ` +
135
163
  `data-kind="${branching ? 'branch' : 'track'}" ` +
136
- `points="${points}" fill="none" stroke="${colourOf(targetLine)}" stroke-width="${weight}" ` +
137
- `stroke-linejoin="round" stroke-linecap="round"/>`,
138
- box: boxAround(edge.route, weight / 2),
164
+ stateAttributes(state, visual) +
165
+ `points="${points}" fill="none" stroke="${visual === undefined ? colourOf(targetLine) : theme.palette.states[visual.tint]}" stroke-width="${weight}" ` +
166
+ `stroke-linejoin="round" stroke-linecap="round"` +
167
+ `${arrowhead === null ? '' : ` ${arrowEndAttr(arrowhead)}`}/>`,
168
+ box: unionOf([boxAround(edge.route, weight / 2), headBox(edge.route, weight, arrowhead)]),
139
169
  };
140
170
  }
141
- function renderNode(placed, diagram, colourOf, theme) {
171
+ /**
172
+ * Space the head occupies, which the viewport has to include.
173
+ *
174
+ * Half a stroke width around the route — all an undecorated edge needs — cuts
175
+ * straight through an arrowhead, and a consumer sizing a scroll container from
176
+ * `SvgFigure.width` would show that as a visibly clipped figure rather than as
177
+ * a stray pixel of overflow. So the head's reach is reserved around the vertex
178
+ * it is drawn at, which for `marker-end` is the route's last point.
179
+ */
180
+ function headBox(route, strokeWidth, arrowhead) {
181
+ const tip = route[route.length - 1];
182
+ if (arrowhead === null || tip === undefined)
183
+ return EMPTY_BOX;
184
+ return boxAround([tip], arrowheadReach(arrowhead, strokeWidth));
185
+ }
186
+ function renderNode(placed, diagram, frame, colourOf, theme) {
142
187
  const typeDef = diagram.registry.nodeTypes[placed.node.type];
143
188
  const shape = typeDef?.shape ?? 'rect';
144
189
  const glyph = typeDef?.glyph ?? 'none';
145
190
  const colour = colourOf(placed.node.line);
191
+ const state = frame.nodes[placed.node.id];
192
+ const visual = state === undefined ? undefined : typeDef?.states?.[state];
146
193
  const box = boxOf(placed.position, placed.size);
147
194
  const label = placeLabel(placed.node.label, shape, placed.position, placed.size, theme.typography, theme.metrics);
148
195
  const leader = label.leader === null
@@ -155,10 +202,11 @@ function renderNode(placed, diagram, colourOf, theme) {
155
202
  markup: [
156
203
  `<g class="livid-node" data-type="${escapeAttr(placed.node.type)}" ` +
157
204
  `data-node="${escapeAttr(placed.node.id)}" ` +
158
- `data-line="${placed.node.line === null ? '' : escapeAttr(placed.node.line)}">`,
205
+ `data-line="${placed.node.line === null ? '' : escapeAttr(placed.node.line)}" ` +
206
+ stateAttributes(state, visual) + '>',
159
207
  `<title>${escapeText(description)}</title>`,
160
208
  shapeMarkup(shape, box, {
161
- fill: theme.palette.nodeFill,
209
+ fill: visual === undefined ? theme.palette.nodeFill : theme.palette.states[visual.tint],
162
210
  stroke: colour,
163
211
  strokeWidth: theme.metrics.nodeStroke,
164
212
  }),
@@ -174,6 +222,57 @@ function renderNode(placed, diagram, colourOf, theme) {
174
222
  box: unionOf([box, label.box]),
175
223
  };
176
224
  }
225
+ function stateAttributes(state, visual) {
226
+ if (state === undefined || visual === undefined)
227
+ return '';
228
+ const animation = visual.anim === undefined ? '' : ` data-anim="${escapeAttr(visual.anim)}"`;
229
+ return `data-state="${escapeAttr(state)}" data-tint="${escapeAttr(visual.tint)}"${animation} `;
230
+ }
231
+ /* ------------------------------------------------------------------ *
232
+ * Figure identity
233
+ * ------------------------------------------------------------------ */
234
+ /**
235
+ * A short, stable name for *this* figure, for the one DOM id it needs.
236
+ *
237
+ * Two figures inlined into one HTML document share a DOM, so a fixed marker id
238
+ * would have the second figure's edges resolve against the first figure's
239
+ * definition — and duplicate ids are invalid markup besides. A counter or a
240
+ * random suffix would separate them at the cost of purity: the same diagram
241
+ * would render differently on two builds, which a build-time renderer cannot
242
+ * afford. So the suffix is a hash of what the figure draws. Same input, same id;
243
+ * different figures, different ids.
244
+ *
245
+ * A collision degrades rather than breaks. Every head is filled from
246
+ * `context-stroke` and sized in stroke widths, so two figures that agree on the
247
+ * head's proportions have interchangeable definitions — and those proportions
248
+ * are hashed too, so two that disagree cannot quietly share one.
249
+ */
250
+ function fingerprintOf(levels, theme, title) {
251
+ const head = [
252
+ title ?? '',
253
+ theme.metrics.arrowLength,
254
+ theme.metrics.arrowWidth,
255
+ ];
256
+ const drawn = levels.flatMap((level) => [
257
+ level.caption ?? '',
258
+ ...level.diagram.nodes.map((node) => `${node.node.id}:${node.node.type}:${node.position.x},${node.position.y}:` +
259
+ `${node.size.width}x${node.size.height}`),
260
+ ...level.diagram.edges.map((edge) => `${edge.edge.id}:${edge.route.map((point) => `${point.x},${point.y}`).join(';')}`),
261
+ ]);
262
+ return hash32([...head, ...drawn].join('|'));
263
+ }
264
+ /**
265
+ * FNV-1a, 32 bits, base36. Rolled locally like the rest of the primitives here:
266
+ * it is one expression, it never changes, and it is a fingerprint rather than a
267
+ * cryptographic claim.
268
+ */
269
+ function hash32(value) {
270
+ const OFFSET_BASIS = 0x811c9dc5;
271
+ const PRIME = 0x01000193;
272
+ return [...value]
273
+ .reduce((hash, character) => Math.imul(hash ^ (character.codePointAt(0) ?? 0), PRIME) >>> 0, OFFSET_BASIS)
274
+ .toString(36);
275
+ }
177
276
  /* ------------------------------------------------------------------ *
178
277
  * Markup helpers
179
278
  * ------------------------------------------------------------------ */
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/theme.d.ts CHANGED
@@ -5,8 +5,19 @@
5
5
  * colours, weights, and type, and cannot inject markup. That is what keeps the
6
6
  * SVG in a post and the React canvas in an app the same map.
7
7
  */
8
+ import type { StateTint } from '@rankonelabs/livid-core';
8
9
  /** Where a label sits when its shape cannot hold text. */
9
10
  export type LabelSide = 'below' | 'right';
11
+ /**
12
+ * Which end of an edge draws a head, if any.
13
+ *
14
+ * Every livid edge is already directed in the data — `ValidEdge` has a source
15
+ * and a target — so drawing that direction is a question of look rather than of
16
+ * meaning, which is why it is theme config and not a structural option. The
17
+ * caller decides whether its figures say it out loud; the renderer only draws
18
+ * what it is told.
19
+ */
20
+ export type EdgeArrowhead = 'none' | 'target';
10
21
  export interface Palette {
11
22
  /**
12
23
  * Colour token from `LineSpec.color` to a CSS colour. Tokens are the
@@ -21,6 +32,8 @@ export interface Palette {
21
32
  readonly label: string;
22
33
  readonly caption: string;
23
34
  readonly divider: string;
35
+ /** Closed state tint tokens from core, resolved to renderer colours. */
36
+ readonly states: Readonly<Record<StateTint, string>>;
24
37
  }
25
38
  export interface Typography {
26
39
  readonly fontFamily: string;
@@ -48,6 +61,18 @@ export interface Metrics {
48
61
  /** Vertical space between stacked drill-down levels. */
49
62
  readonly levelGap: number;
50
63
  readonly labelSide: LabelSide;
64
+ /** `none` by default, so an existing figure draws exactly as it did. */
65
+ readonly edgeArrowhead: EdgeArrowhead;
66
+ /**
67
+ * Head length along the route, in stroke widths rather than px.
68
+ *
69
+ * Stroke widths because the head is drawn once and reused by every edge: a
70
+ * branch at `branchWeight` and track at `lineWeight` are the same marker, so
71
+ * a head proportionate to one is proportionate to the other.
72
+ */
73
+ readonly arrowLength: number;
74
+ /** Head width across the route, in stroke widths. */
75
+ readonly arrowWidth: number;
51
76
  }
52
77
  export interface SvgTheme {
53
78
  readonly palette: Palette;
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0DAA0D;AAC1D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,OAQ7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,UAOhC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OAS7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,QAI3B,CAAC;AAEF,wBAAgB,YAAY,CAAC,SAAS,GAAE,iBAAsB,GAAG,QAAQ,CAMxE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjF"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
package/dist/theme.js CHANGED
@@ -17,6 +17,13 @@ export const DEFAULT_PALETTE = {
17
17
  label: '#16181D',
18
18
  caption: '#6B7280',
19
19
  divider: '#D8DCE3',
20
+ states: {
21
+ muted: '#9CA3AF',
22
+ base: '#FFFFFF',
23
+ accent: '#2563EB',
24
+ danger: '#DC2626',
25
+ ghost: '#E5E7EB',
26
+ },
20
27
  };
21
28
  export const DEFAULT_TYPOGRAPHY = {
22
29
  fontFamily: 'ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif',
@@ -35,6 +42,9 @@ export const DEFAULT_METRICS = {
35
42
  padding: 44,
36
43
  levelGap: 96,
37
44
  labelSide: 'below',
45
+ edgeArrowhead: 'none',
46
+ arrowLength: 2.4,
47
+ arrowWidth: 2,
38
48
  };
39
49
  export const DEFAULT_THEME = {
40
50
  palette: DEFAULT_PALETTE,
@@ -43,7 +53,12 @@ export const DEFAULT_THEME = {
43
53
  };
44
54
  export function resolveTheme(overrides = {}) {
45
55
  return {
46
- palette: { ...DEFAULT_PALETTE, ...overrides.palette, lines: { ...DEFAULT_PALETTE.lines, ...overrides.palette?.lines } },
56
+ palette: {
57
+ ...DEFAULT_PALETTE,
58
+ ...overrides.palette,
59
+ lines: { ...DEFAULT_PALETTE.lines, ...overrides.palette?.lines },
60
+ states: { ...DEFAULT_PALETTE.states, ...overrides.palette?.states },
61
+ },
47
62
  typography: { ...DEFAULT_TYPOGRAPHY, ...overrides.typography },
48
63
  metrics: { ...DEFAULT_METRICS, ...overrides.metrics },
49
64
  };
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+DH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IACxE,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,UAAU,EAAE,uEAAuE;IACnF,SAAS,EAAE,EAAE;IACb,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,gDAAgD;IAC/D,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,IAAI;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,OAAO,EAAE,eAAe;IACxB,UAAU,EAAE,kBAAkB;IAC9B,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,YAA+B,EAAE;IAC5D,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACvH,UAAU,EAAE,EAAE,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE;QAC9D,OAAO,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;KACtD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB,EAAE,KAAa,EAAE,KAAa;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,OAAO,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0FH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IACxE,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE;QACN,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;KACjB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,UAAU,EAAE,uEAAuE;IACnF,SAAS,EAAE,EAAE;IACb,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,gDAAgD;IAC/D,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,IAAI;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,OAAO;IAClB,aAAa,EAAE,MAAM;IACrB,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,OAAO,EAAE,eAAe;IACxB,UAAU,EAAE,kBAAkB;IAC9B,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,YAA+B,EAAE;IAC5D,OAAO;QACL,OAAO,EAAE;YACP,GAAG,eAAe;YAClB,GAAG,SAAS,CAAC,OAAO;YACpB,KAAK,EAAE,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE;YAChE,MAAM,EAAE,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;SACpE;QACD,UAAU,EAAE,EAAE,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE;QAC9D,OAAO,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;KACtD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB,EAAE,KAAa,EAAE,KAAa;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,OAAO,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;AACrC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rankonelabs/livid-svg",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "LaidOutDiagram to SVG string. Build-time, zero client JS.",
6
6
  "license": "MIT",
@@ -40,9 +40,9 @@
40
40
  "prepublishOnly": "tsc -b --force"
41
41
  },
42
42
  "peerDependencies": {
43
- "@rankonelabs/livid-core": "^0.1.0"
43
+ "@rankonelabs/livid-core": "^0.2.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@rankonelabs/livid-core": "^0.1.0"
46
+ "@rankonelabs/livid-core": "^0.2.0"
47
47
  }
48
48
  }