@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.
Files changed (61) hide show
  1. package/dist/svg/edges.d.ts +3 -0
  2. package/dist/svg/edges.d.ts.map +1 -0
  3. package/dist/svg/edges.js +144 -0
  4. package/dist/svg/edges.js.map +1 -0
  5. package/dist/svg/footnotes.d.ts +4 -0
  6. package/dist/svg/footnotes.d.ts.map +1 -0
  7. package/dist/svg/footnotes.js +81 -0
  8. package/dist/svg/footnotes.js.map +1 -0
  9. package/dist/svg/header.d.ts +6 -0
  10. package/dist/svg/header.d.ts.map +1 -0
  11. package/dist/svg/header.js +215 -0
  12. package/dist/svg/header.js.map +1 -0
  13. package/dist/svg/include-region.d.ts +4 -0
  14. package/dist/svg/include-region.d.ts.map +1 -0
  15. package/dist/svg/include-region.js +157 -0
  16. package/dist/svg/include-region.js.map +1 -0
  17. package/dist/svg/item.d.ts +36 -0
  18. package/dist/svg/item.d.ts.map +1 -0
  19. package/dist/svg/item.js +544 -0
  20. package/dist/svg/item.js.map +1 -0
  21. package/dist/svg/markers.d.ts +7 -0
  22. package/dist/svg/markers.d.ts.map +1 -0
  23. package/dist/svg/markers.js +135 -0
  24. package/dist/svg/markers.js.map +1 -0
  25. package/dist/svg/nowline.d.ts +4 -0
  26. package/dist/svg/nowline.d.ts.map +1 -0
  27. package/dist/svg/nowline.js +133 -0
  28. package/dist/svg/nowline.js.map +1 -0
  29. package/dist/svg/primitives.d.ts +7 -0
  30. package/dist/svg/primitives.d.ts.map +1 -0
  31. package/dist/svg/primitives.js +70 -0
  32. package/dist/svg/primitives.js.map +1 -0
  33. package/dist/svg/render.d.ts +6 -7
  34. package/dist/svg/render.d.ts.map +1 -1
  35. package/dist/svg/render.js +25 -2437
  36. package/dist/svg/render.js.map +1 -1
  37. package/dist/svg/swimlanes.d.ts +5 -0
  38. package/dist/svg/swimlanes.d.ts.map +1 -0
  39. package/dist/svg/swimlanes.js +228 -0
  40. package/dist/svg/swimlanes.js.map +1 -0
  41. package/dist/svg/timeline.d.ts +24 -0
  42. package/dist/svg/timeline.d.ts.map +1 -0
  43. package/dist/svg/timeline.js +284 -0
  44. package/dist/svg/timeline.js.map +1 -0
  45. package/dist/svg/waves.d.ts +64 -0
  46. package/dist/svg/waves.d.ts.map +1 -0
  47. package/dist/svg/waves.js +438 -0
  48. package/dist/svg/waves.js.map +1 -0
  49. package/package.json +3 -3
  50. package/src/svg/edges.ts +154 -0
  51. package/src/svg/footnotes.ts +115 -0
  52. package/src/svg/header.ts +285 -0
  53. package/src/svg/include-region.ts +201 -0
  54. package/src/svg/item.ts +668 -0
  55. package/src/svg/markers.ts +160 -0
  56. package/src/svg/nowline.ts +152 -0
  57. package/src/svg/primitives.ts +86 -0
  58. package/src/svg/render.ts +47 -3000
  59. package/src/svg/swimlanes.ts +317 -0
  60. package/src/svg/timeline.ts +343 -0
  61. package/src/svg/waves.ts +562 -0
@@ -0,0 +1,3 @@
1
+ import type { PositionedDependencyEdge, Theme } from '@nowline/layout';
2
+ export declare function renderEdge(e: PositionedDependencyEdge, palette: Theme): string;
3
+ //# sourceMappingURL=edges.d.ts.map
@@ -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":"AAAA,6EAA6E;AAC7E,6EAA6E;AAG7E,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,0FAA0F;AAC1F,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,yEAAyE;AACzE,4EAA4E;AAC5E,4EAA4E;AAC5E,uEAAuE;AACvE,mCAAmC;AACnC,MAAM,UAAU,UAAU,CAAC,CAA2B,EAAE,OAAc;IAClE,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC;IAC3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7B,mEAAmE;IACnE,cAAc;IACd,MAAM,UAAU,GACZ,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,oBAAoB,CAAC,GAAG,mBAAmB,CAAC;IACzF,kDAAkD;IAClD,MAAM,GAAG,GACL,GAAG,GAAG,UAAU;QACZ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;QACtF,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACN,GAAG,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC1B,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC1B,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;SACjB,CAAC,CACL,CAAC;IACN,CAAC;SAAM,CAAC;QACJ,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;QACnC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;QACnC,KAAK,CAAC,IAAI,CACN,GAAG,CAAC,MAAM,EAAE;YACR,CAAC,EACG,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;gBACjD,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBAC/B,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI;YACtD,IAAI,EAAE,QAAQ;SACjB,CAAC,CACL,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,oEAAoE;AACpE,2EAA2E;AAC3E,4CAA4C;AAC5C,SAAS,QAAQ,CAAC,GAAY,EAAE,KAAc,EAAE,KAAa;IACzD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;IAChG,IAAI,CAAC,KAAK;QACN,OAAO,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACzF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAClE,OAAO,CACH,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,CAAC,MAAM;YACH,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE;gBACR,CAAC,EAAE,MAAM;gBACT,GAAG,MAAM;gBACT,kBAAkB,EAAE,UAAU;gBAC9B,gBAAgB,EAAE,OAAO;aAC5B,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC,CACZ,CAAC;AACN,CAAC;AAED,wEAAwE;AACxE,wEAAwE;AACxE,wBAAwB;AACxB,SAAS,cAAc,CAAC,MAAe,EAAE,MAAc;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAY,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACR,KAAK,CAAC,IAAI,CACN,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;gBACvC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3E,CAAC;QACN,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAClE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,wEAAwE;AACxE,2EAA2E;AAC3E,2EAA2E;AAC3E,wBAAwB;AACxB,SAAS,qBAAqB,CAAC,MAAe,EAAE,MAAc;IAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,SAAS;QACb,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,SAAS;QACb,CAAC;QACD,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
@@ -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":"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"}
@@ -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"}