@nowline/renderer 0.0.0-dev.20261019202820.g9ba7e7e → 0.0.0-dev.20261020011950.gce8a91f
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/dist/svg/edges.d.ts +3 -0
- package/dist/svg/edges.d.ts.map +1 -0
- package/dist/svg/edges.js +144 -0
- package/dist/svg/edges.js.map +1 -0
- package/dist/svg/footnotes.d.ts +4 -0
- package/dist/svg/footnotes.d.ts.map +1 -0
- package/dist/svg/footnotes.js +81 -0
- package/dist/svg/footnotes.js.map +1 -0
- package/dist/svg/header.d.ts +6 -0
- package/dist/svg/header.d.ts.map +1 -0
- package/dist/svg/header.js +215 -0
- package/dist/svg/header.js.map +1 -0
- package/dist/svg/include-region.d.ts +4 -0
- package/dist/svg/include-region.d.ts.map +1 -0
- package/dist/svg/include-region.js +157 -0
- package/dist/svg/include-region.js.map +1 -0
- package/dist/svg/item.d.ts +36 -0
- package/dist/svg/item.d.ts.map +1 -0
- package/dist/svg/item.js +544 -0
- package/dist/svg/item.js.map +1 -0
- package/dist/svg/markers.d.ts +7 -0
- package/dist/svg/markers.d.ts.map +1 -0
- package/dist/svg/markers.js +135 -0
- package/dist/svg/markers.js.map +1 -0
- package/dist/svg/nowline.d.ts +4 -0
- package/dist/svg/nowline.d.ts.map +1 -0
- package/dist/svg/nowline.js +133 -0
- package/dist/svg/nowline.js.map +1 -0
- package/dist/svg/primitives.d.ts +7 -0
- package/dist/svg/primitives.d.ts.map +1 -0
- package/dist/svg/primitives.js +70 -0
- package/dist/svg/primitives.js.map +1 -0
- package/dist/svg/render.d.ts +6 -7
- package/dist/svg/render.d.ts.map +1 -1
- package/dist/svg/render.js +25 -2437
- package/dist/svg/render.js.map +1 -1
- package/dist/svg/swimlanes.d.ts +5 -0
- package/dist/svg/swimlanes.d.ts.map +1 -0
- package/dist/svg/swimlanes.js +228 -0
- package/dist/svg/swimlanes.js.map +1 -0
- package/dist/svg/timeline.d.ts +24 -0
- package/dist/svg/timeline.d.ts.map +1 -0
- package/dist/svg/timeline.js +284 -0
- package/dist/svg/timeline.js.map +1 -0
- package/dist/svg/waves.d.ts +64 -0
- package/dist/svg/waves.d.ts.map +1 -0
- package/dist/svg/waves.js +438 -0
- package/dist/svg/waves.js.map +1 -0
- package/package.json +3 -3
- package/src/svg/edges.ts +154 -0
- package/src/svg/footnotes.ts +115 -0
- package/src/svg/header.ts +285 -0
- package/src/svg/include-region.ts +201 -0
- package/src/svg/item.ts +668 -0
- package/src/svg/markers.ts +160 -0
- package/src/svg/nowline.ts +152 -0
- package/src/svg/primitives.ts +86 -0
- package/src/svg/render.ts +47 -3000
- package/src/svg/swimlanes.ts +317 -0
- package/src/svg/timeline.ts +343 -0
- package/src/svg/waves.ts +562 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../../src/svg/edges.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAS,wBAAwB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAY9E,wBAAgB,UAAU,CAAC,CAAC,EAAE,wBAAwB,EAAE,OAAO,EAAE,KAAK,GAAG,MAAM,CA6C9E"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// The dependency-edge layer: the arrows that join one item to another, their
|
|
2
|
+
// solid and dotted slack legs, and the rounded orthogonal paths they follow.
|
|
3
|
+
import { ARROW_HEAD_LENGTH_PX, ARROW_HEAD_WIDTH_PX, EDGE_CORNER_RADIUS } from '@nowline/layout';
|
|
4
|
+
import { num, tag } from './xml.js';
|
|
5
|
+
/** Dash pattern of a dependency's slack leg: the dotted look of milestone slack lines. */
|
|
6
|
+
const SLACK_DASH = '3 3';
|
|
7
|
+
// A dependency arrow (specs/true-width-layout.md §3.4). It paints behind
|
|
8
|
+
// the bars (see `renderRoadmap`), so a leg that crosses a bar passes behind
|
|
9
|
+
// it. Vertical legs are solid; the horizontal leg is dotted when the target
|
|
10
|
+
// waits. The head is drawn, not a marker, so it can shrink to a narrow
|
|
11
|
+
// target and become a dot (§8 O6).
|
|
12
|
+
export function renderEdge(e, palette) {
|
|
13
|
+
const points = e.waypoints;
|
|
14
|
+
if (points.length < 2)
|
|
15
|
+
return '';
|
|
16
|
+
const color = palette.dependency.edgeStroke;
|
|
17
|
+
const tip = points[points.length - 1];
|
|
18
|
+
const prev = points[points.length - 2];
|
|
19
|
+
const len = Math.hypot(tip.x - prev.x, tip.y - prev.y);
|
|
20
|
+
if (len === 0)
|
|
21
|
+
return '';
|
|
22
|
+
const ux = (tip.x - prev.x) / len;
|
|
23
|
+
const uy = (tip.y - prev.y) / len;
|
|
24
|
+
const half = e.headWidth / 2;
|
|
25
|
+
// The leg stops where the head starts, so a dotted leg never shows
|
|
26
|
+
// through it.
|
|
27
|
+
const headLength = e.head === 'dot' ? half : (e.headWidth * ARROW_HEAD_LENGTH_PX) / ARROW_HEAD_WIDTH_PX;
|
|
28
|
+
// A last leg no longer than the head is all head.
|
|
29
|
+
const leg = len > headLength
|
|
30
|
+
? [...points.slice(0, -1), { x: tip.x - ux * headLength, y: tip.y - uy * headLength }]
|
|
31
|
+
: points.slice(0, -1);
|
|
32
|
+
const parts = [legPaths(leg, e.slack, color)];
|
|
33
|
+
const headFill = palette.arrowhead.neutral;
|
|
34
|
+
if (e.head === 'dot') {
|
|
35
|
+
parts.push(tag('circle', {
|
|
36
|
+
cx: num(tip.x - ux * half),
|
|
37
|
+
cy: num(tip.y - uy * half),
|
|
38
|
+
r: num(half),
|
|
39
|
+
fill: headFill,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const bx = tip.x - ux * headLength;
|
|
44
|
+
const by = tip.y - uy * headLength;
|
|
45
|
+
parts.push(tag('path', {
|
|
46
|
+
d: `M${num(bx - uy * half)} ${num(by + ux * half)} ` +
|
|
47
|
+
`L${num(tip.x)} ${num(tip.y)} ` +
|
|
48
|
+
`L${num(bx + uy * half)} ${num(by - ux * half)} z`,
|
|
49
|
+
fill: headFill,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
return tag('g', { 'data-layer': 'dependency' }, parts.join(''));
|
|
53
|
+
}
|
|
54
|
+
// An arrow's legs: one rounded path, or for a slack arrow its solid
|
|
55
|
+
// vertical legs and its dotted horizontal ones. Empty when the head is all
|
|
56
|
+
// there is (a leg no longer than the head).
|
|
57
|
+
function legPaths(leg, slack, color) {
|
|
58
|
+
if (leg.length < 2)
|
|
59
|
+
return '';
|
|
60
|
+
const stroke = { fill: 'none', stroke: color, 'stroke-width': 1.1, 'stroke-linejoin': 'round' };
|
|
61
|
+
if (!slack)
|
|
62
|
+
return tag('path', { d: roundedOrthogonalPath(leg, EDGE_CORNER_RADIUS), ...stroke });
|
|
63
|
+
const { solid, dotted } = splitSlackPath(leg, EDGE_CORNER_RADIUS);
|
|
64
|
+
return ((solid ? tag('path', { d: solid, ...stroke }) : '') +
|
|
65
|
+
(dotted
|
|
66
|
+
? tag('path', {
|
|
67
|
+
d: dotted,
|
|
68
|
+
...stroke,
|
|
69
|
+
'stroke-dasharray': SLACK_DASH,
|
|
70
|
+
'stroke-linecap': 'round',
|
|
71
|
+
})
|
|
72
|
+
: ''));
|
|
73
|
+
}
|
|
74
|
+
// A slack arrow's path in two parts: its vertical legs with the rounded
|
|
75
|
+
// corners (solid) and its horizontal legs (dotted), so the dash pattern
|
|
76
|
+
// marks the wait alone.
|
|
77
|
+
function splitSlackPath(points, radius) {
|
|
78
|
+
const n = points.length;
|
|
79
|
+
const before = [];
|
|
80
|
+
const after = [];
|
|
81
|
+
const solid = [];
|
|
82
|
+
for (let i = 1; i < n - 1; i++) {
|
|
83
|
+
const prev = points[i - 1];
|
|
84
|
+
const cur = points[i];
|
|
85
|
+
const next = points[i + 1];
|
|
86
|
+
const inLen = Math.hypot(cur.x - prev.x, cur.y - prev.y);
|
|
87
|
+
const outLen = Math.hypot(next.x - cur.x, next.y - cur.y);
|
|
88
|
+
const r = Math.min(radius, inLen / 2, outLen / 2);
|
|
89
|
+
const dIn = { x: Math.sign(cur.x - prev.x), y: Math.sign(cur.y - prev.y) };
|
|
90
|
+
const dOut = { x: Math.sign(next.x - cur.x), y: Math.sign(next.y - cur.y) };
|
|
91
|
+
before[i] = { x: cur.x - dIn.x * r, y: cur.y - dIn.y * r };
|
|
92
|
+
after[i] = { x: cur.x + dOut.x * r, y: cur.y + dOut.y * r };
|
|
93
|
+
if (r > 0) {
|
|
94
|
+
solid.push(`M${num(before[i].x)} ${num(before[i].y)} ` +
|
|
95
|
+
`Q${num(cur.x)} ${num(cur.y)} ${num(after[i].x)} ${num(after[i].y)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const dotted = [];
|
|
99
|
+
for (let i = 0; i < n - 1; i++) {
|
|
100
|
+
const a = i === 0 ? points[0] : after[i];
|
|
101
|
+
const b = i === n - 2 ? points[n - 1] : before[i + 1];
|
|
102
|
+
const piece = `M${num(a.x)} ${num(a.y)} L${num(b.x)} ${num(b.y)}`;
|
|
103
|
+
if (Math.abs(points[i + 1].y - points[i].y) < 1e-9)
|
|
104
|
+
dotted.push(piece);
|
|
105
|
+
else
|
|
106
|
+
solid.push(piece);
|
|
107
|
+
}
|
|
108
|
+
return { solid: solid.join(' '), dotted: dotted.join(' ') };
|
|
109
|
+
}
|
|
110
|
+
// Build an SVG path for a sequence of orthogonal waypoints, inserting a
|
|
111
|
+
// quarter-arc at every interior bend. Falls back to straight segments when
|
|
112
|
+
// adjacent points aren't axis-aligned (defensive — the layout always emits
|
|
113
|
+
// orthogonal segments).
|
|
114
|
+
function roundedOrthogonalPath(points, radius) {
|
|
115
|
+
if (points.length < 2)
|
|
116
|
+
return '';
|
|
117
|
+
const parts = [`M${num(points[0].x)} ${num(points[0].y)}`];
|
|
118
|
+
for (let i = 1; i < points.length; i++) {
|
|
119
|
+
const prev = points[i - 1];
|
|
120
|
+
const cur = points[i];
|
|
121
|
+
if (i === points.length - 1) {
|
|
122
|
+
parts.push(`L${num(cur.x)} ${num(cur.y)}`);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const next = points[i + 1];
|
|
126
|
+
const dxIn = Math.sign(cur.x - prev.x);
|
|
127
|
+
const dyIn = Math.sign(cur.y - prev.y);
|
|
128
|
+
const dxOut = Math.sign(next.x - cur.x);
|
|
129
|
+
const dyOut = Math.sign(next.y - cur.y);
|
|
130
|
+
const inLen = Math.hypot(cur.x - prev.x, cur.y - prev.y);
|
|
131
|
+
const outLen = Math.hypot(next.x - cur.x, next.y - cur.y);
|
|
132
|
+
const r = Math.min(radius, inLen / 2, outLen / 2);
|
|
133
|
+
if (r <= 0 || (dxIn !== 0 && dxOut !== 0) || (dyIn !== 0 && dyOut !== 0)) {
|
|
134
|
+
parts.push(`L${num(cur.x)} ${num(cur.y)}`);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const beforeBend = { x: cur.x - dxIn * r, y: cur.y - dyIn * r };
|
|
138
|
+
const afterBend = { x: cur.x + dxOut * r, y: cur.y + dyOut * r };
|
|
139
|
+
parts.push(`L${num(beforeBend.x)} ${num(beforeBend.y)}`);
|
|
140
|
+
parts.push(`Q${num(cur.x)} ${num(cur.y)} ${num(afterBend.x)} ${num(afterBend.y)}`);
|
|
141
|
+
}
|
|
142
|
+
return parts.join(' ');
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edges.js","sourceRoot":"","sources":["../../src/svg/edges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PositionedFootnoteArea, Theme } from '@nowline/layout';
|
|
2
|
+
import type { FontFamilies } from './render.js';
|
|
3
|
+
export declare function renderFootnotes(f: PositionedFootnoteArea, idPrefix: string, palette: Theme, fonts: FontFamilies): string;
|
|
4
|
+
//# sourceMappingURL=footnotes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footnotes.d.ts","sourceRoot":"","sources":["../../src/svg/footnotes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAgB,eAAe,CAC3B,CAAC,EAAE,sBAAsB,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,YAAY,GACpB,MAAM,CAoGR"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// The footnotes layer: the panel at the bottom of the chart that lists each
|
|
2
|
+
// footnote's number, title and description, drawn only when the roadmap has
|
|
3
|
+
// footnotes.
|
|
4
|
+
import { FOOTNOTE_HEADER_BASELINE_OFFSET_PX, FOOTNOTE_PANEL_PADDING_PX } from '@nowline/layout';
|
|
5
|
+
import { num, tag, textTag } from './xml.js';
|
|
6
|
+
export function renderFootnotes(f, idPrefix, palette, fonts) {
|
|
7
|
+
if (f.entries.length === 0)
|
|
8
|
+
return '';
|
|
9
|
+
const panelFill = palette.footnotePanel.fill;
|
|
10
|
+
const borderColor = palette.footnotePanel.border;
|
|
11
|
+
const headerColor = palette.footnotePanel.header;
|
|
12
|
+
const titleColor = palette.footnotePanel.title;
|
|
13
|
+
const descColor = palette.footnotePanel.description;
|
|
14
|
+
const numberColor = palette.footnotePanel.number;
|
|
15
|
+
const parts = [];
|
|
16
|
+
parts.push(tag('rect', {
|
|
17
|
+
x: num(f.box.x),
|
|
18
|
+
y: num(f.box.y),
|
|
19
|
+
width: num(f.box.width),
|
|
20
|
+
height: num(f.box.height),
|
|
21
|
+
rx: 6,
|
|
22
|
+
ry: 6,
|
|
23
|
+
fill: panelFill,
|
|
24
|
+
stroke: borderColor,
|
|
25
|
+
'stroke-width': 1,
|
|
26
|
+
filter: `url(#${idPrefix}-shadow-subtle)`,
|
|
27
|
+
}));
|
|
28
|
+
parts.push(textTag({
|
|
29
|
+
x: num(f.box.x + FOOTNOTE_PANEL_PADDING_PX),
|
|
30
|
+
y: num(f.box.y + FOOTNOTE_HEADER_BASELINE_OFFSET_PX),
|
|
31
|
+
'font-family': fonts.sans,
|
|
32
|
+
'font-size': 12,
|
|
33
|
+
'font-weight': 700,
|
|
34
|
+
fill: headerColor,
|
|
35
|
+
}, 'Footnotes'));
|
|
36
|
+
// Layout places every row: the entry's number on its first row, the
|
|
37
|
+
// title and description lines (wrapped ones included) at their own
|
|
38
|
+
// baselines, and a region's heading row above its first entry.
|
|
39
|
+
const numberX = f.box.x + FOOTNOTE_PANEL_PADDING_PX;
|
|
40
|
+
for (const e of f.entries) {
|
|
41
|
+
if (e.region !== undefined && e.regionHeadingY !== undefined) {
|
|
42
|
+
parts.push(textTag({
|
|
43
|
+
x: num(numberX),
|
|
44
|
+
y: num(e.regionHeadingY),
|
|
45
|
+
'font-family': fonts.sans,
|
|
46
|
+
'font-size': 10,
|
|
47
|
+
'font-weight': 700,
|
|
48
|
+
fill: headerColor,
|
|
49
|
+
}, e.region));
|
|
50
|
+
}
|
|
51
|
+
parts.push(textTag({
|
|
52
|
+
x: num(numberX),
|
|
53
|
+
y: num(e.y),
|
|
54
|
+
'font-family': fonts.sans,
|
|
55
|
+
'font-size': 10,
|
|
56
|
+
'font-weight': 700,
|
|
57
|
+
fill: numberColor,
|
|
58
|
+
}, String(e.number)));
|
|
59
|
+
for (const line of e.titleLines) {
|
|
60
|
+
parts.push(textTag({
|
|
61
|
+
x: num(line.x),
|
|
62
|
+
y: num(line.y),
|
|
63
|
+
'font-family': fonts.sans,
|
|
64
|
+
'font-size': 11,
|
|
65
|
+
'font-weight': 600,
|
|
66
|
+
fill: titleColor,
|
|
67
|
+
}, line.text));
|
|
68
|
+
}
|
|
69
|
+
for (const line of e.descriptionLines ?? []) {
|
|
70
|
+
parts.push(textTag({
|
|
71
|
+
x: num(line.x),
|
|
72
|
+
y: num(line.y),
|
|
73
|
+
'font-family': fonts.sans,
|
|
74
|
+
'font-size': 11,
|
|
75
|
+
fill: descColor,
|
|
76
|
+
}, line.text));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return tag('g', { 'data-layer': 'footnotes' }, parts.join(''));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=footnotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footnotes.js","sourceRoot":"","sources":["../../src/svg/footnotes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PositionedHeader, PositionedLogo, PositionedRoadmap, Theme } from '@nowline/layout';
|
|
2
|
+
import type { AssetResolver, FontFamilies, RenderOptions } from './render.js';
|
|
3
|
+
export declare function renderHeader(h: PositionedHeader, idPrefix: string, palette: Theme, fonts: FontFamilies): string;
|
|
4
|
+
export declare function renderAttributionMark(model: PositionedRoadmap, fonts: FontFamilies): string;
|
|
5
|
+
export declare function embedLogo(logo: PositionedLogo, resolver: AssetResolver | undefined, idPrefix: string, options: RenderOptions): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/svg/header.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmBlG,OAAO,KAAK,EAAc,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI1F,wBAAgB,YAAY,CACxB,CAAC,EAAE,gBAAgB,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,YAAY,GACpB,MAAM,CA6ER;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAkE3F;AAMD,wBAAsB,SAAS,CAC3B,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,CAAC,CA2EjB"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// The header layers: the title card, the "Powered by nowline" attribution mark,
|
|
2
|
+
// and the embedded logo that sits in the card, plus the base64 helper the logo
|
|
3
|
+
// path uses.
|
|
4
|
+
import { ATTRIBUTION_BAR_LOGICAL_WIDTH, ATTRIBUTION_BAR_LOGICAL_X, ATTRIBUTION_INE_LOGICAL_X, ATTRIBUTION_LINK, ATTRIBUTION_NOW_LOGICAL_X, ATTRIBUTION_PREFIX_FONT_SIZE, ATTRIBUTION_SCALE, ATTRIBUTION_TEXT, ATTRIBUTION_WORDMARK_FONT_SIZE, HEADER_AUTHOR_FONT_SIZE_PX, HEADER_AUTHOR_LINE_HEIGHT_PX, HEADER_CARD_PADDING_TOP, HEADER_CARD_PADDING_X, HEADER_TITLE_FONT_SIZE_PX, HEADER_TITLE_LINE_HEIGHT_PX, HEADER_TITLE_TO_AUTHOR_GAP_PX, } from '@nowline/layout';
|
|
5
|
+
import { sanitizeSvg, svgIntrinsicSize } from './sanitize.js';
|
|
6
|
+
import { num, tag, textTag } from './xml.js';
|
|
7
|
+
export function renderHeader(h, idPrefix, palette, fonts) {
|
|
8
|
+
// The layout has already sized the card to its (wrapped) text content
|
|
9
|
+
// and stashed the bounds in `h.cardBox`, with `h.titleLines` /
|
|
10
|
+
// `h.authorLines` ready to render line-by-line. See sizeBesideHeader
|
|
11
|
+
// in @nowline/layout.
|
|
12
|
+
const cardX = h.box.x + h.cardBox.x;
|
|
13
|
+
const cardY = h.box.y + h.cardBox.y;
|
|
14
|
+
const cardWidth = h.cardBox.width;
|
|
15
|
+
const cardHeight = h.cardBox.height;
|
|
16
|
+
const cardFill = h.style.bg === 'none' ? palette.surface.headerBox : h.style.bg;
|
|
17
|
+
const borderColor = palette.header.cardBorder;
|
|
18
|
+
const card = tag('rect', {
|
|
19
|
+
x: num(cardX),
|
|
20
|
+
y: num(cardY),
|
|
21
|
+
width: num(cardWidth),
|
|
22
|
+
height: num(cardHeight),
|
|
23
|
+
rx: 6,
|
|
24
|
+
ry: 6,
|
|
25
|
+
fill: cardFill,
|
|
26
|
+
stroke: borderColor,
|
|
27
|
+
'stroke-width': 1,
|
|
28
|
+
filter: `url(#${idPrefix}-shadow-subtle)`,
|
|
29
|
+
});
|
|
30
|
+
// Title and author baselines come from `@nowline/layout`'s
|
|
31
|
+
// `header-card-geometry` module so the renderer paints with the
|
|
32
|
+
// exact metrics `sizeBesideHeader` sized the card to.
|
|
33
|
+
// A logo in the card shifts the text right of it (and down, to center
|
|
34
|
+
// it, when the logo made the card taller); see `h.textInset`.
|
|
35
|
+
const textX = cardX + HEADER_CARD_PADDING_X + (h.textInset?.x ?? 0);
|
|
36
|
+
const textTopY = cardY + (h.textInset?.y ?? 0);
|
|
37
|
+
const titleParts = [];
|
|
38
|
+
h.titleLines.forEach((line, i) => {
|
|
39
|
+
titleParts.push(textTag({
|
|
40
|
+
x: num(textX),
|
|
41
|
+
y: num(textTopY + HEADER_CARD_PADDING_TOP + i * HEADER_TITLE_LINE_HEIGHT_PX),
|
|
42
|
+
'font-family': fonts[h.style.font],
|
|
43
|
+
'font-size': HEADER_TITLE_FONT_SIZE_PX,
|
|
44
|
+
'font-weight': 600,
|
|
45
|
+
fill: h.style.text,
|
|
46
|
+
}, line));
|
|
47
|
+
});
|
|
48
|
+
const titleText = titleParts.join('');
|
|
49
|
+
const lastTitleY = textTopY +
|
|
50
|
+
HEADER_CARD_PADDING_TOP +
|
|
51
|
+
Math.max(0, h.titleLines.length - 1) * HEADER_TITLE_LINE_HEIGHT_PX;
|
|
52
|
+
const authorColor = palette.header.author;
|
|
53
|
+
const authorParts = [];
|
|
54
|
+
h.authorLines.forEach((line, j) => {
|
|
55
|
+
authorParts.push(textTag({
|
|
56
|
+
x: num(textX),
|
|
57
|
+
y: num(lastTitleY +
|
|
58
|
+
HEADER_TITLE_TO_AUTHOR_GAP_PX +
|
|
59
|
+
j * HEADER_AUTHOR_LINE_HEIGHT_PX),
|
|
60
|
+
'font-family': fonts[h.style.font],
|
|
61
|
+
'font-size': HEADER_AUTHOR_FONT_SIZE_PX,
|
|
62
|
+
fill: authorColor,
|
|
63
|
+
}, line));
|
|
64
|
+
});
|
|
65
|
+
const authorText = authorParts.join('');
|
|
66
|
+
return tag('g', { 'data-layer': 'header', 'data-id': `${idPrefix}-header` }, card + titleText + authorText);
|
|
67
|
+
}
|
|
68
|
+
// Paint the "Powered by nowline" attribution mark inside the
|
|
69
|
+
// layout-supplied `attributionBox`. The whole mark — prefix text,
|
|
70
|
+
// "now", red "l" bar, and "ine" — sits inside one <a href> so the
|
|
71
|
+
// entire string is clickable. Glyph anatomy (positions, widths, scale)
|
|
72
|
+
// lives in `themes/shared.ts` (`ATTRIBUTION_*`); the layout reserves a
|
|
73
|
+
// box of exactly that size at canvas-bottom-right.
|
|
74
|
+
export function renderAttributionMark(model, fonts) {
|
|
75
|
+
const muted = model.palette.attribution.mark;
|
|
76
|
+
const accent = model.palette.attribution.link;
|
|
77
|
+
if (model.swimlanes.length === 0)
|
|
78
|
+
return '';
|
|
79
|
+
const tx = model.header.attributionBox.x;
|
|
80
|
+
const ty = model.header.attributionBox.y;
|
|
81
|
+
// Both texts share the wordmark's baseline (y = wordmark font size)
|
|
82
|
+
// so the smaller "Powered by" sits visually above the wordmark's
|
|
83
|
+
// baseline without bumping the bar's bottom up.
|
|
84
|
+
const baselineY = ATTRIBUTION_WORDMARK_FONT_SIZE;
|
|
85
|
+
const inner = textTag({
|
|
86
|
+
x: '0',
|
|
87
|
+
y: baselineY,
|
|
88
|
+
'font-family': fonts.sans,
|
|
89
|
+
'font-size': ATTRIBUTION_PREFIX_FONT_SIZE,
|
|
90
|
+
'font-weight': 400,
|
|
91
|
+
fill: muted,
|
|
92
|
+
}, ATTRIBUTION_TEXT) +
|
|
93
|
+
textTag({
|
|
94
|
+
x: ATTRIBUTION_NOW_LOGICAL_X,
|
|
95
|
+
y: baselineY,
|
|
96
|
+
'font-family': fonts.sans,
|
|
97
|
+
'font-size': ATTRIBUTION_WORDMARK_FONT_SIZE,
|
|
98
|
+
'font-weight': 700,
|
|
99
|
+
fill: muted,
|
|
100
|
+
}, 'now') +
|
|
101
|
+
tag('rect', {
|
|
102
|
+
x: ATTRIBUTION_BAR_LOGICAL_X,
|
|
103
|
+
y: 12,
|
|
104
|
+
width: ATTRIBUTION_BAR_LOGICAL_WIDTH,
|
|
105
|
+
height: ATTRIBUTION_WORDMARK_FONT_SIZE,
|
|
106
|
+
fill: accent,
|
|
107
|
+
}) +
|
|
108
|
+
textTag({
|
|
109
|
+
x: ATTRIBUTION_INE_LOGICAL_X,
|
|
110
|
+
y: baselineY,
|
|
111
|
+
'font-family': fonts.sans,
|
|
112
|
+
'font-size': ATTRIBUTION_WORDMARK_FONT_SIZE,
|
|
113
|
+
'font-weight': 400,
|
|
114
|
+
fill: muted,
|
|
115
|
+
}, 'ine');
|
|
116
|
+
const group = tag('g', { transform: `translate(${num(tx)} ${num(ty)}) scale(${num(ATTRIBUTION_SCALE)})` }, inner);
|
|
117
|
+
return tag('a', {
|
|
118
|
+
href: ATTRIBUTION_LINK,
|
|
119
|
+
target: '_blank',
|
|
120
|
+
rel: 'noopener',
|
|
121
|
+
'aria-label': 'Powered by nowline',
|
|
122
|
+
}, tag('g', { 'data-layer': 'attribution' }, group));
|
|
123
|
+
}
|
|
124
|
+
// Draws the logo into its layout box. Layout sized the box to the asset's
|
|
125
|
+
// aspect ratio, so scaling the asset to the box fills it exactly whether
|
|
126
|
+
// the source is larger or smaller; `meet` (fit) only matters if the two
|
|
127
|
+
// disagree, and then it letterboxes rather than cropping or distorting.
|
|
128
|
+
export async function embedLogo(logo, resolver, idPrefix, options) {
|
|
129
|
+
const logoRef = logo.assetRef ?? '';
|
|
130
|
+
const { x, y, width, height } = logo.box;
|
|
131
|
+
let asset;
|
|
132
|
+
try {
|
|
133
|
+
if (options.logo && options.logo.ref === logoRef) {
|
|
134
|
+
asset = options.logo.asset;
|
|
135
|
+
}
|
|
136
|
+
else if (resolver) {
|
|
137
|
+
asset = await resolver(logoRef);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return '';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
const msg = `logo file not found: ${logoRef} (${err instanceof Error ? err.message : String(err)})`;
|
|
145
|
+
if (options.strict)
|
|
146
|
+
throw err;
|
|
147
|
+
options.warn?.(msg);
|
|
148
|
+
return '';
|
|
149
|
+
}
|
|
150
|
+
const mime = (asset.mime ?? '').toLowerCase();
|
|
151
|
+
if (mime === 'image/svg+xml') {
|
|
152
|
+
const raw = new TextDecoder().decode(asset.bytes);
|
|
153
|
+
const intrinsic = logo.intrinsic ?? svgIntrinsicSize(raw) ?? { width, height };
|
|
154
|
+
// The root loses its own size so it fills this viewport; the
|
|
155
|
+
// viewport's viewBox then scales the asset's units to the box.
|
|
156
|
+
// One warning per logo listing what the sanitizer removed, not one
|
|
157
|
+
// per attribute; editor metadata it removes silently.
|
|
158
|
+
const removed = new Set();
|
|
159
|
+
const cleaned = sanitizeSvg(raw, {
|
|
160
|
+
idPrefix: `${idPrefix}-logo`,
|
|
161
|
+
onWarn: (msg) => removed.add(msg.replace(/^sanitizer: dropping /, '')),
|
|
162
|
+
stripRootSize: true,
|
|
163
|
+
});
|
|
164
|
+
// A warning even under strict: callers promote warnings themselves
|
|
165
|
+
// (the export kernel throws, the browser pipeline returns rows).
|
|
166
|
+
if (removed.size > 0) {
|
|
167
|
+
options.warn?.(`logo ${logoRef}: removed unsupported SVG content: ${[...removed].join(', ')}`);
|
|
168
|
+
}
|
|
169
|
+
return tag('svg', {
|
|
170
|
+
'data-layer': 'logo',
|
|
171
|
+
x: num(x),
|
|
172
|
+
y: num(y),
|
|
173
|
+
width: num(width),
|
|
174
|
+
height: num(height),
|
|
175
|
+
viewBox: `0 0 ${num(intrinsic.width)} ${num(intrinsic.height)}`,
|
|
176
|
+
preserveAspectRatio: 'xMidYMid meet',
|
|
177
|
+
overflow: 'hidden',
|
|
178
|
+
}, cleaned);
|
|
179
|
+
}
|
|
180
|
+
if (mime === 'image/png' ||
|
|
181
|
+
mime === 'image/jpeg' ||
|
|
182
|
+
mime === 'image/jpg' ||
|
|
183
|
+
mime === 'image/webp') {
|
|
184
|
+
const b64 = bytesToBase64(asset.bytes);
|
|
185
|
+
return tag('image', {
|
|
186
|
+
'data-layer': 'logo',
|
|
187
|
+
href: `data:${mime};base64,${b64}`,
|
|
188
|
+
x: num(x),
|
|
189
|
+
y: num(y),
|
|
190
|
+
width: num(width),
|
|
191
|
+
height: num(height),
|
|
192
|
+
preserveAspectRatio: 'xMidYMid meet',
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const msg = `unsupported logo format: ${mime} (${logoRef})`;
|
|
196
|
+
if (options.strict)
|
|
197
|
+
throw new Error(msg);
|
|
198
|
+
options.warn?.(msg);
|
|
199
|
+
return '';
|
|
200
|
+
}
|
|
201
|
+
// Base64 without depending on Node's Buffer (renderer stays browser-safe).
|
|
202
|
+
function bytesToBase64(bytes) {
|
|
203
|
+
if (typeof btoa !== 'undefined') {
|
|
204
|
+
let bin = '';
|
|
205
|
+
for (let i = 0; i < bytes.length; i++)
|
|
206
|
+
bin += String.fromCharCode(bytes[i]);
|
|
207
|
+
return btoa(bin);
|
|
208
|
+
}
|
|
209
|
+
// Node fallback without importing Buffer directly; use lazy dynamic require.
|
|
210
|
+
const g = globalThis;
|
|
211
|
+
if (g.Buffer)
|
|
212
|
+
return g.Buffer.from(bytes).toString('base64');
|
|
213
|
+
throw new Error('renderer: no base64 encoder available');
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/svg/header.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,aAAa;AAGb,OAAO,EACH,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,EACzB,4BAA4B,EAC5B,iBAAiB,EACjB,gBAAgB,EAChB,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,GAChC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,UAAU,YAAY,CACxB,CAAmB,EACnB,QAAgB,EAChB,OAAc,EACd,KAAmB;IAEnB,sEAAsE;IACtE,+DAA+D;IAC/D,qEAAqE;IACrE,sBAAsB;IACtB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAClC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IAChF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE;QACrB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QACb,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QACb,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;QACvB,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,WAAW;QACnB,cAAc,EAAE,CAAC;QACjB,MAAM,EAAE,QAAQ,QAAQ,iBAAiB;KAC5C,CAAC,CAAC;IACH,2DAA2D;IAC3D,gEAAgE;IAChE,sDAAsD;IACtD,sEAAsE;IACtE,8DAA8D;IAC9D,MAAM,KAAK,GAAG,KAAK,GAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,UAAU,CAAC,IAAI,CACX,OAAO,CACH;YACI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;YACb,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,uBAAuB,GAAG,CAAC,GAAG,2BAA2B,CAAC;YAC5E,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,WAAW,EAAE,yBAAyB;YACtC,aAAa,EAAE,GAAG;YAClB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;SACrB,EACD,IAAI,CACP,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,UAAU,GACZ,QAAQ;QACR,uBAAuB;QACvB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,2BAA2B,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC9B,WAAW,CAAC,IAAI,CACZ,OAAO,CACH;YACI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;YACb,CAAC,EAAE,GAAG,CACF,UAAU;gBACN,6BAA6B;gBAC7B,CAAC,GAAG,4BAA4B,CACvC;YACD,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,WAAW;SACpB,EACD,IAAI,CACP,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,OAAO,GAAG,CACN,GAAG,EACH,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,QAAQ,SAAS,EAAE,EAC3D,IAAI,GAAG,SAAS,GAAG,UAAU,CAChC,CAAC;AACN,CAAC;AAED,6DAA6D;AAC7D,kEAAkE;AAClE,kEAAkE;AAClE,uEAAuE;AACvE,uEAAuE;AACvE,mDAAmD;AACnD,MAAM,UAAU,qBAAqB,CAAC,KAAwB,EAAE,KAAmB;IAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9C,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACzC,oEAAoE;IACpE,iEAAiE;IACjE,gDAAgD;IAChD,MAAM,SAAS,GAAG,8BAA8B,CAAC;IACjD,MAAM,KAAK,GACP,OAAO,CACH;QACI,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,SAAS;QACZ,aAAa,EAAE,KAAK,CAAC,IAAI;QACzB,WAAW,EAAE,4BAA4B;QACzC,aAAa,EAAE,GAAG;QAClB,IAAI,EAAE,KAAK;KACd,EACD,gBAAgB,CACnB;QACD,OAAO,CACH;YACI,CAAC,EAAE,yBAAyB;YAC5B,CAAC,EAAE,SAAS;YACZ,aAAa,EAAE,KAAK,CAAC,IAAI;YACzB,WAAW,EAAE,8BAA8B;YAC3C,aAAa,EAAE,GAAG;YAClB,IAAI,EAAE,KAAK;SACd,EACD,KAAK,CACR;QACD,GAAG,CAAC,MAAM,EAAE;YACR,CAAC,EAAE,yBAAyB;YAC5B,CAAC,EAAE,EAAE;YACL,KAAK,EAAE,6BAA6B;YACpC,MAAM,EAAE,8BAA8B;YACtC,IAAI,EAAE,MAAM;SACf,CAAC;QACF,OAAO,CACH;YACI,CAAC,EAAE,yBAAyB;YAC5B,CAAC,EAAE,SAAS;YACZ,aAAa,EAAE,KAAK,CAAC,IAAI;YACzB,WAAW,EAAE,8BAA8B;YAC3C,aAAa,EAAE,GAAG;YAClB,IAAI,EAAE,KAAK;SACd,EACD,KAAK,CACR,CAAC;IACN,MAAM,KAAK,GAAG,GAAG,CACb,GAAG,EACH,EAAE,SAAS,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,GAAG,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAClF,KAAK,CACR,CAAC;IACF,OAAO,GAAG,CACN,GAAG,EACH;QACI,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,UAAU;QACf,YAAY,EAAE,oBAAoB;KACrC,EACD,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,CACnD,CAAC;AACN,CAAC;AAED,0EAA0E;AAC1E,yEAAyE;AACzE,wEAAwE;AACxE,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,IAAoB,EACpB,QAAmC,EACnC,QAAgB,EAChB,OAAsB;IAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACzC,IAAI,KAAiB,CAAC;IACtB,IAAI,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC/C,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YAClB,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACJ,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,wBAAwB,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QACpG,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,GAAG,CAAC;QAC9B,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC/E,6DAA6D;QAC7D,+DAA+D;QAC/D,mEAAmE;QACnE,sDAAsD;QACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,EAAE,GAAG,QAAQ,OAAO;YAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACtE,aAAa,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,mEAAmE;QACnE,iEAAiE;QACjE,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,EAAE,CACV,QAAQ,OAAO,sCAAsC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;QACN,CAAC;QACD,OAAO,GAAG,CACN,KAAK,EACL;YACI,YAAY,EAAE,MAAM;YACpB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACT,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACT,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC;YACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YAC/D,mBAAmB,EAAE,eAAe;YACpC,QAAQ,EAAE,QAAQ;SACrB,EACD,OAAO,CACV,CAAC;IACN,CAAC;IACD,IACI,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,YAAY,EACvB,CAAC;QACC,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC,OAAO,EAAE;YAChB,YAAY,EAAE,MAAM;YACpB,IAAI,EAAE,QAAQ,IAAI,WAAW,GAAG,EAAE;YAClC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACT,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACT,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC;YACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;YACnB,mBAAmB,EAAE,eAAe;SACvC,CAAC,CAAC;IACP,CAAC;IACD,MAAM,GAAG,GAAG,4BAA4B,IAAI,KAAK,OAAO,GAAG,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,EAAE,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,SAAS,aAAa,CAAC,KAAiB;IACpC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,6EAA6E;IAC7E,MAAM,CAAC,GAAG,UAET,CAAC;IACF,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PositionedIncludeRegion, PositionedRoadmap, Theme } from '@nowline/layout';
|
|
2
|
+
import type { FontFamilies, RenderOptions } from './render.js';
|
|
3
|
+
export declare function renderIncludeRegion(r: PositionedIncludeRegion, options: RenderOptions, idPrefix: string, palette: Theme, fonts: FontFamilies, model?: PositionedRoadmap): string;
|
|
4
|
+
//# sourceMappingURL=include-region.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include-region.d.ts","sourceRoot":"","sources":["../../src/svg/include-region.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAER,uBAAuB,EACvB,iBAAiB,EACjB,KAAK,EACR,MAAM,iBAAiB,CAAC;AAczB,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM/D,wBAAgB,mBAAmB,CAC/B,CAAC,EAAE,uBAAuB,EAC1B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAoKR"}
|