@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 +40 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/markers.d.ts +60 -0
- package/dist/markers.d.ts.map +1 -0
- package/dist/markers.js +69 -0
- package/dist/markers.js.map +1 -0
- package/dist/render.d.ts +3 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +115 -16
- package/dist/render.js.map +1 -1
- package/dist/theme.d.ts +25 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +16 -1
- package/dist/theme.js.map +1 -1
- package/package.json +3 -3
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/markers.js
ADDED
|
@@ -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;
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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,
|
|
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
|
|
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
|
|
109
|
-
|
|
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,
|
|
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
|
-
|
|
137
|
-
`stroke
|
|
138
|
-
|
|
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
|
-
|
|
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
|
* ------------------------------------------------------------------ */
|
package/dist/render.js.map
CHANGED
|
@@ -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;
|
package/dist/theme.d.ts.map
CHANGED
|
@@ -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;
|
|
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: {
|
|
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;
|
|
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.
|
|
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.
|
|
43
|
+
"@rankonelabs/livid-core": "^0.2.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@rankonelabs/livid-core": "^0.
|
|
46
|
+
"@rankonelabs/livid-core": "^0.2.0"
|
|
47
47
|
}
|
|
48
48
|
}
|