@nowline/renderer 0.8.5 → 0.9.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.
Files changed (88) hide show
  1. package/dist/image-size.d.ts +9 -0
  2. package/dist/image-size.d.ts.map +1 -0
  3. package/dist/image-size.js +104 -0
  4. package/dist/image-size.js.map +1 -0
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +4 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/logo.d.ts +24 -0
  10. package/dist/logo.d.ts.map +1 -0
  11. package/dist/logo.js +60 -0
  12. package/dist/logo.js.map +1 -0
  13. package/dist/stage.d.ts +78 -0
  14. package/dist/stage.d.ts.map +1 -0
  15. package/dist/stage.js +88 -0
  16. package/dist/stage.js.map +1 -0
  17. package/dist/svg/edges.d.ts +3 -0
  18. package/dist/svg/edges.d.ts.map +1 -0
  19. package/dist/svg/edges.js +144 -0
  20. package/dist/svg/edges.js.map +1 -0
  21. package/dist/svg/footnotes.d.ts +4 -0
  22. package/dist/svg/footnotes.d.ts.map +1 -0
  23. package/dist/svg/footnotes.js +81 -0
  24. package/dist/svg/footnotes.js.map +1 -0
  25. package/dist/svg/header.d.ts +6 -0
  26. package/dist/svg/header.d.ts.map +1 -0
  27. package/dist/svg/header.js +215 -0
  28. package/dist/svg/header.js.map +1 -0
  29. package/dist/svg/ids.d.ts.map +1 -1
  30. package/dist/svg/ids.js.map +1 -1
  31. package/dist/svg/include-region.d.ts +4 -0
  32. package/dist/svg/include-region.d.ts.map +1 -0
  33. package/dist/svg/include-region.js +157 -0
  34. package/dist/svg/include-region.js.map +1 -0
  35. package/dist/svg/item.d.ts +36 -0
  36. package/dist/svg/item.d.ts.map +1 -0
  37. package/dist/svg/item.js +549 -0
  38. package/dist/svg/item.js.map +1 -0
  39. package/dist/svg/markers.d.ts +7 -0
  40. package/dist/svg/markers.d.ts.map +1 -0
  41. package/dist/svg/markers.js +151 -0
  42. package/dist/svg/markers.js.map +1 -0
  43. package/dist/svg/nowline.d.ts +4 -0
  44. package/dist/svg/nowline.d.ts.map +1 -0
  45. package/dist/svg/nowline.js +133 -0
  46. package/dist/svg/nowline.js.map +1 -0
  47. package/dist/svg/primitives.d.ts +7 -0
  48. package/dist/svg/primitives.d.ts.map +1 -0
  49. package/dist/svg/primitives.js +70 -0
  50. package/dist/svg/primitives.js.map +1 -0
  51. package/dist/svg/render.d.ts +13 -7
  52. package/dist/svg/render.d.ts.map +1 -1
  53. package/dist/svg/render.js +64 -1701
  54. package/dist/svg/render.js.map +1 -1
  55. package/dist/svg/sanitize.d.ts +10 -0
  56. package/dist/svg/sanitize.d.ts.map +1 -1
  57. package/dist/svg/sanitize.js +264 -16
  58. package/dist/svg/sanitize.js.map +1 -1
  59. package/dist/svg/swimlanes.d.ts +5 -0
  60. package/dist/svg/swimlanes.d.ts.map +1 -0
  61. package/dist/svg/swimlanes.js +228 -0
  62. package/dist/svg/swimlanes.js.map +1 -0
  63. package/dist/svg/timeline.d.ts +24 -0
  64. package/dist/svg/timeline.d.ts.map +1 -0
  65. package/dist/svg/timeline.js +284 -0
  66. package/dist/svg/timeline.js.map +1 -0
  67. package/dist/svg/waves.d.ts +62 -0
  68. package/dist/svg/waves.d.ts.map +1 -0
  69. package/dist/svg/waves.js +397 -0
  70. package/dist/svg/waves.js.map +1 -0
  71. package/package.json +7 -7
  72. package/src/image-size.ts +113 -0
  73. package/src/index.ts +10 -1
  74. package/src/logo.ts +82 -0
  75. package/src/stage.ts +191 -0
  76. package/src/svg/edges.ts +154 -0
  77. package/src/svg/footnotes.ts +115 -0
  78. package/src/svg/header.ts +285 -0
  79. package/src/svg/include-region.ts +201 -0
  80. package/src/svg/item.ts +672 -0
  81. package/src/svg/markers.ts +178 -0
  82. package/src/svg/nowline.ts +152 -0
  83. package/src/svg/primitives.ts +86 -0
  84. package/src/svg/render.ts +94 -2110
  85. package/src/svg/sanitize.ts +286 -16
  86. package/src/svg/swimlanes.ts +317 -0
  87. package/src/svg/timeline.ts +343 -0
  88. package/src/svg/waves.ts +502 -0
@@ -0,0 +1,549 @@
1
+ // The item layer: a work item's bar, hatch overlay, progress strip, status dot,
2
+ // inline date pins, caption (title and meta line, inside or spilled), footnote
3
+ // indicators, link icon, overflow tail and label chips, plus the capacity suffix
4
+ // and inline date pins that lanes and containers reuse.
5
+ import { CORNER_RADIUS_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, ITEM_CAPTION_TITLE_LINE_HEIGHT_PX, ITEM_DECORATION_SPILL_GAP_PX, ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX, ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX, ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, ITEM_LINK_ICON_INSET_PX, ITEM_LINK_ICON_TILE_SIZE_PX, ITEM_STATUS_DOT_INSET_RIGHT_PX, ITEM_STATUS_DOT_INSET_TOP_PX, ITEM_STATUS_DOT_RADIUS_PX, itemCaptionInsetX, itemCaptionMetaBaselineOffset, META_SUFFIX_DX_EM, PROGRESS_STRIP_HEIGHT_PX, TEXT_SIZE_PX, } from '@nowline/layout';
6
+ import { BUILTIN_ICON_SVG, CAPACITY_ICON_SVG } from './icons.js';
7
+ import { fontAttrs, rectFrame } from './primitives.js';
8
+ import { shadowFilterUrl } from './shadow.js';
9
+ import { hatchOverlay } from './waves.js';
10
+ import { escAttr, escText, num, tag, textTag } from './xml.js';
11
+ /**
12
+ * A built-in capacity icon's x: the run start plus layout's
13
+ * `iconDxTerms`, added one at a time in order so the double is the same
14
+ * as summing the widths onto x in turn.
15
+ */
16
+ function iconXFrom(x0, capacity) {
17
+ let x = x0;
18
+ for (const term of capacity.iconDxTerms ?? [])
19
+ x += term;
20
+ return x;
21
+ }
22
+ /**
23
+ * Paint an item / lane capacity suffix starting at `(x0, baselineY)`. The
24
+ * capacity model arrives pre-resolved from layout (`PositionedCapacity`):
25
+ * `text` is the formatted number, `icon` is either `null` (no glyph), a
26
+ * built-in name, or an inline literal string, and `iconDxTerms` places a
27
+ * built-in SVG icon.
28
+ *
29
+ * Three rendering paths:
30
+ *
31
+ * 1. `icon === null` (the resolved `capacity-icon` was `'none'`): paint
32
+ * the bare number as a single `<text>` node.
33
+ * 2. `icon.kind === 'builtin'` and `name === 'multiplier'`: paint
34
+ * `5×` as a single `<text>` node — the multiplication sign is a
35
+ * typographic operator with consistent rendering across system
36
+ * fonts and built-in side bearing, so no `<tspan dx>` separator.
37
+ * 3. `icon.kind === 'builtin'` and `name` ∈ {person, people, points,
38
+ * time}: paint the number as `<text>`, then drop the curated SVG
39
+ * icon at `x0` plus `iconDxTerms` (layout's `capacityIconDxTerms`:
40
+ * the number's estimated width and a `0.25em` gap, sized to one em). The
41
+ * icon's `style="color:..."` propagates through the
42
+ * `currentColor`-bound paths in the icon library.
43
+ * 4. `icon.kind === 'literal'` (inline Unicode literal or
44
+ * dereferenced custom `symbol`): paint number + glyph in a single
45
+ * `<text>`, with a `<tspan dx="0.1em">` separator before the
46
+ * glyph payload.
47
+ *
48
+ * The number always starts the run at `x0`: an item with meta text paints
49
+ * its suffix through `renderItemMetaLine` instead.
50
+ */
51
+ export function renderCapacitySuffix(capacity, x0, baselineY, fontSize, fontFamily, color) {
52
+ const numberX = x0;
53
+ const { text: numberStr, icon } = capacity;
54
+ const baseAttrs = {
55
+ 'font-family': fontFamily,
56
+ 'font-size': fontSize,
57
+ fill: color,
58
+ };
59
+ if (!icon) {
60
+ return textTag({ x: num(numberX), y: num(baselineY), ...baseAttrs }, numberStr);
61
+ }
62
+ if (icon.kind === 'builtin' && icon.name === 'multiplier') {
63
+ return textTag({ x: num(numberX), y: num(baselineY), ...baseAttrs }, `${numberStr}\u00D7`);
64
+ }
65
+ if (icon.kind === 'builtin') {
66
+ const def = CAPACITY_ICON_SVG[icon.name];
67
+ // Render `<text>5</text>` followed by the curated SVG icon. The
68
+ // icon sits at one font-em wide and tall, where layout placed it
69
+ // past the number. Vertical positioning lifts the icon so its
70
+ // visual center sits on the text x-height
71
+ // (`baselineY - fontSize * 0.85`); this matches how Lucide-style
72
+ // outline icons read in inline text.
73
+ const numberSvg = textTag({ x: num(numberX), y: num(baselineY), ...baseAttrs }, numberStr);
74
+ const iconSize = fontSize;
75
+ const iconX = iconXFrom(x0, capacity);
76
+ const iconY = baselineY - fontSize * 0.85;
77
+ const iconSvg = `<svg x="${num(iconX)}" y="${num(iconY)}" width="${num(iconSize)}" height="${num(iconSize)}" viewBox="${def.viewBox}" style="color:${escAttr(color)}" aria-hidden="true">${def.body}</svg>`;
78
+ return numberSvg + iconSvg;
79
+ }
80
+ // Literal glyph (inline Unicode literal or dereferenced custom glyph).
81
+ // Single <text> node with the number + a tspan-separated glyph.
82
+ const dx = num(fontSize * 0.1);
83
+ return (`<text x="${num(numberX)}" y="${num(baselineY)}" font-family="${escAttr(fontFamily)}"` +
84
+ ` font-size="${fontSize}" fill="${escAttr(color)}">` +
85
+ `${escText(numberStr)}<tspan dx="${dx}">${escText(icon.text)}</tspan>` +
86
+ '</text>');
87
+ }
88
+ /**
89
+ * Paint the item meta line (metaText plus optional capacity suffix) as
90
+ * a single SVG fragment. Call sites used to emit metaText and the
91
+ * suffix as two unrelated `<text>` nodes whose horizontal offsets came
92
+ * from `estimateTextWidth` — fine for short metas like `2w`, but
93
+ * the per-character estimate over-reserves for longer captions like
94
+ * `L 1w — 1w remaining`, leaving a visible gap before `2×`.
95
+ *
96
+ * The fix flows the suffix INSIDE the same `<text>` element via
97
+ * `<tspan dx>` whenever the suffix is pure inline text (multiplier,
98
+ * literal glyph, or no glyph). Browsers compute the dx anchor relative
99
+ * to the previously rendered glyph so the gap matches the spec
100
+ * regardless of how wide metaText actually rendered.
101
+ *
102
+ * Built-in SVG icons (person/people/points/time) still need an `<svg>`
103
+ * sibling outside `<text>`, so their number leaves the flow too: layout's
104
+ * `capacity.iconDxTerms` (from `capacityIconDxTerms`) place both the number
105
+ * and the icon, inside the suffix's spill reservation.
106
+ */
107
+ function renderItemMetaLine(opts) {
108
+ const { metaText, capacity, x, baselineY, fontSize, fontFamily, color } = opts;
109
+ if (!metaText && !capacity)
110
+ return '';
111
+ const baseAttrs = {
112
+ 'font-family': fontFamily,
113
+ 'font-size': fontSize,
114
+ fill: color,
115
+ };
116
+ if (!capacity) {
117
+ return textTag({ x: num(x), y: num(baselineY), ...baseAttrs }, metaText);
118
+ }
119
+ if (!metaText) {
120
+ return renderCapacitySuffix(capacity, x, baselineY, fontSize, fontFamily, color);
121
+ }
122
+ const sepDx = num(fontSize * META_SUFFIX_DX_EM);
123
+ const openText = `<text x="${num(x)}" y="${num(baselineY)}" font-family="${escAttr(fontFamily)}"` +
124
+ ` font-size="${fontSize}" fill="${escAttr(color)}">`;
125
+ const { text: numberStr, icon } = capacity;
126
+ if (!icon) {
127
+ return (openText +
128
+ escText(metaText) +
129
+ `<tspan dx="${sepDx}">${escText(numberStr)}</tspan>` +
130
+ '</text>');
131
+ }
132
+ if (icon.kind === 'builtin' && icon.name === 'multiplier') {
133
+ return (openText +
134
+ escText(metaText) +
135
+ `<tspan dx="${sepDx}">${escText(numberStr)}\u00D7</tspan>` +
136
+ '</text>');
137
+ }
138
+ if (icon.kind === 'literal') {
139
+ const glyphDx = num(fontSize * 0.1);
140
+ return (openText +
141
+ escText(metaText) +
142
+ `<tspan dx="${sepDx}">${escText(numberStr)}</tspan>` +
143
+ `<tspan dx="${glyphDx}">${escText(icon.text)}</tspan>` +
144
+ '</text>');
145
+ }
146
+ // Built-in SVG icon: the number is NOT flowed after metaText, because
147
+ // the icon's x can only come from layout's estimates; a number drawn
148
+ // after the real metaText sits wherever the font put it, and the icon
149
+ // landed on it. Paint metaText, then the number and the icon both where
150
+ // layout's `iconDxTerms` place them, so they agree as on a lane badge.
151
+ const terms = capacity.iconDxTerms ?? [];
152
+ let numberX = x;
153
+ for (const term of terms.slice(0, 2))
154
+ numberX += term;
155
+ const def = CAPACITY_ICON_SVG[icon.name];
156
+ const iconSize = fontSize;
157
+ const iconX = iconXFrom(x, capacity);
158
+ const iconY = baselineY - fontSize * 0.85;
159
+ const textPart = openText +
160
+ escText(metaText) +
161
+ '</text>' +
162
+ textTag({ x: num(numberX), y: num(baselineY), ...baseAttrs }, numberStr);
163
+ const iconPart = `<svg x="${num(iconX)}" y="${num(iconY)}" width="${num(iconSize)}" height="${num(iconSize)}" viewBox="${def.viewBox}" style="color:${escAttr(color)}" aria-hidden="true">${def.body}</svg>`;
164
+ return textPart + iconPart;
165
+ }
166
+ /**
167
+ * Paint one inline-date pin (`after:DATE` / `before:DATE`) as a small
168
+ * `calendar` glyph from the curated icon library. Wrapped in a `<g>`
169
+ * carrying `<title>YYYY-MM-DD</title>` so browsers surface the date as
170
+ * a native hover tooltip; non-interactive exports (PDF / PNG) still
171
+ * carry the date in the title text. Z-order: above the bar fill,
172
+ * alongside status dot and footnote indicators, below dependency
173
+ * arrowheads.
174
+ *
175
+ * Shared by item, group, and parallel render paths so the visual is
176
+ * identical across every entity type.
177
+ */
178
+ function renderInlineDatePin(pin, color) {
179
+ const def = BUILTIN_ICON_SVG.calendar;
180
+ const inner = `<svg x="${num(pin.glyphTopLeft.x)}" y="${num(pin.glyphTopLeft.y)}"` +
181
+ ` width="${num(pin.glyphSize)}" height="${num(pin.glyphSize)}"` +
182
+ ` viewBox="${def.viewBox}" style="color:${escAttr(color)}" aria-hidden="true">${def.body}</svg>`;
183
+ const titleEl = `<title>${escText(pin.isoDate)}</title>`;
184
+ return tag('g', {
185
+ 'data-layer': 'inline-date-pin',
186
+ 'data-side': pin.side,
187
+ 'data-date': pin.isoDate,
188
+ 'data-spilled': pin.spilled ? 'true' : null,
189
+ }, titleEl + inner);
190
+ }
191
+ export function renderInlineDatePins(pins, color) {
192
+ if (!pins || pins.length === 0)
193
+ return '';
194
+ return pins.map((pin) => renderInlineDatePin(pin, color)).join('');
195
+ }
196
+ export function hasAfterPin(pins) {
197
+ return pins?.some((pin) => pin.side === 'after') ?? false;
198
+ }
199
+ /**
200
+ * The bar's hover tooltip: the full title when the caption cap at the
201
+ * chart's end truncated it (specs/rendering.md § "Caption cap at the
202
+ * chart's end"), then background work's line (specs/waves.md §9.3).
203
+ */
204
+ function renderItemTooltip(i) {
205
+ const tooltipLines = [];
206
+ if (i.titleTruncated)
207
+ tooltipLines.push(i.title);
208
+ if (i.waveTooltip !== undefined)
209
+ tooltipLines.push(i.waveTooltip);
210
+ if (tooltipLines.length > 0)
211
+ return `<title>${escText(tooltipLines.join('\n'))}</title>`;
212
+ return '';
213
+ }
214
+ /** The bar rect, plus background work's hatch overlay when the item is one. */
215
+ function renderItemBar(i, idPrefix) {
216
+ const parts = [];
217
+ const shadow = shadowFilterUrl(idPrefix, i.style.shadow);
218
+ parts.push(rectFrame(i.box.x, i.box.y, i.box.width, i.box.height, i.style, {
219
+ filter: shadow ?? null,
220
+ }));
221
+ // Background work's hatch overlay: a second rect right after the bar
222
+ // rect (which stays the item group's first <rect>), under the progress
223
+ // strip, the status dot and the text.
224
+ if (i.waveRole === 'background' && i.waveHatch) {
225
+ parts.push(hatchOverlay(i.box, i.style, i.waveHatch, idPrefix));
226
+ }
227
+ return parts.join('');
228
+ }
229
+ /**
230
+ * Bottom progress strip along the bottom edge. Height comes from
231
+ * `PROGRESS_STRIP_HEIGHT_PX` so layout's chip placement and the
232
+ * milestone slack-arrow attach Y stay in sync if it's ever bumped.
233
+ */
234
+ function renderItemProgress(i) {
235
+ if (i.progressFraction > 0) {
236
+ const pw = Math.max(0, Math.min(i.box.width, i.box.width * i.progressFraction));
237
+ return tag('rect', {
238
+ x: num(i.box.x),
239
+ y: num(i.box.y + i.box.height - PROGRESS_STRIP_HEIGHT_PX),
240
+ width: num(pw),
241
+ height: PROGRESS_STRIP_HEIGHT_PX,
242
+ fill: i.style.fg,
243
+ opacity: 0.55,
244
+ });
245
+ }
246
+ return '';
247
+ }
248
+ function renderItemStatusDot(i) {
249
+ // Status-dot color — layout resolves it from the bar bg's relative
250
+ // luminance and the item's status (`statusDotColor`, layout's
251
+ // `status-dot.ts`), so the dot reads on pale and dark bars alike.
252
+ //
253
+ // Status dot — upper-right inset inside the bar, OR pushed into
254
+ // the spill column when the bar is too narrow to host the dot's
255
+ // full inset (`dotSpills`). Layout pre-computes `dotSpillCx` for
256
+ // the spilled case so the renderer stays geometry-dumb.
257
+ const dotCx = i.dotSpills && i.dotSpillCx !== null
258
+ ? i.dotSpillCx
259
+ : i.box.x + i.box.width - ITEM_STATUS_DOT_INSET_RIGHT_PX;
260
+ return tag('circle', {
261
+ cx: num(dotCx),
262
+ cy: num(i.box.y + ITEM_STATUS_DOT_INSET_TOP_PX),
263
+ r: ITEM_STATUS_DOT_RADIUS_PX,
264
+ fill: i.statusDotColor,
265
+ });
266
+ }
267
+ /**
268
+ * Where the title and meta lines start. Title + meta are an atomic caption.
269
+ * When `textSpills` is set the layout has already bumped the next item to a
270
+ * fresh row, so we draw both lines BESIDE the bar (just past its right edge,
271
+ * stacked) at the same vertical positions they would occupy inside. When
272
+ * they fit, both go inside at the bar's left padding.
273
+ *
274
+ * The spilled-decoration cluster reads `[bar] [icon?] [title]
275
+ * [footnote?] [dot?]` — the only decoration to the LEFT of the
276
+ * title is the link icon (the icon→title affordance must stay
277
+ * adjacent). The dot trails the title to mirror its in-bar
278
+ * upper-right position; the footnote walks alongside the title
279
+ * (between title and dot) just like its in-bar `text-anchor: end`
280
+ * placement at the upper-right.
281
+ */
282
+ function itemCaptionX(i, options) {
283
+ let captionX;
284
+ if (i.textSpills) {
285
+ captionX = i.box.x + i.box.width + ITEM_CAPTION_SPILL_GAP_PX;
286
+ if (i.iconSpills) {
287
+ captionX += ITEM_LINK_ICON_TILE_SIZE_PX + ITEM_DECORATION_SPILL_GAP_PX;
288
+ }
289
+ }
290
+ else {
291
+ // Same inset layout used to size the wrap: 12px, 24px past a
292
+ // link-icon tile (spanning `box.x + 6 .. box.x + 20`), and past an
293
+ // in-bar `after:` glyph too (22px, or 40px beside the link tile).
294
+ // `linkIcon` is the string 'none' (truthy) for an item without a
295
+ // `link:`, and `noLinks` omits the tile entirely, so only indent
296
+ // for the tile when it is really drawn. An icon that spilled out
297
+ // of the bar forces the caption to spill too, so that case never
298
+ // reaches here.
299
+ const hasLink = !!i.linkIcon && i.linkIcon !== 'none';
300
+ const afterPin = i.inlineDatePins?.find((p) => p.side === 'after' && !p.spilled);
301
+ // Layout placed an `after:` glyph beside the link tile whether or
302
+ // not `noLinks` hides it, so the glyph's clearance keys off the
303
+ // `link:` itself rather than off the tile being drawn.
304
+ const insetX = afterPin
305
+ ? itemCaptionInsetX(hasLink, { barWidth: i.box.width })
306
+ : itemCaptionInsetX(!options.noLinks && hasLink && !i.iconSpills);
307
+ captionX = i.box.x + insetX;
308
+ }
309
+ return captionX;
310
+ }
311
+ /** The title lines and the meta line (with its capacity suffix). */
312
+ function renderItemCaption(i, captionX, palette, fonts) {
313
+ const parts = [];
314
+ // When the caption spills outside the bar it renders on the
315
+ // chart / group bg instead of the bar fill — `i.style.text` is
316
+ // resolved against the bar (e.g. `enterprise-style` propagates
317
+ // `text:white` from a label and audit-log's title becomes
318
+ // white-on-blue inside, but white-on-peach when spilled onto
319
+ // the orange-tinted audit-track group). Use the theme's
320
+ // default item text color (always tuned for chart bg) when
321
+ // text spills, and the per-bar color when it stays inside.
322
+ const captionInsideTextColor = i.style.text;
323
+ const captionOutsideTextColor = palette.entities.item.text;
324
+ const titleColor = i.textSpills ? captionOutsideTextColor : captionInsideTextColor;
325
+ const metaColor = i.textSpills ? captionOutsideTextColor : i.style.fg;
326
+ // A title that auto-wrapped inside the bar, or that carries explicit
327
+ // `\n` breaks (in-bar or spilled), arrives pre-split in `titleLines`;
328
+ // paint one `<text>` per line at the same baselines either way, the
329
+ // same pattern as the header card, with the meta line below the last
330
+ // one. Everything else (a single-line title) is just `[title]`. A blank
331
+ // line between two explicit breaks keeps its baseline slot but paints
332
+ // nothing.
333
+ const titleLines = i.titleLines ?? (i.title ? [i.title] : []);
334
+ titleLines.forEach((line, n) => {
335
+ if (line === '')
336
+ return;
337
+ parts.push(textTag({
338
+ x: num(captionX),
339
+ y: num(i.box.y +
340
+ ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX +
341
+ n * ITEM_CAPTION_TITLE_LINE_HEIGHT_PX),
342
+ 'font-family': fonts[i.style.font],
343
+ 'font-size': ITEM_CAPTION_TITLE_FONT_SIZE_PX,
344
+ 'font-weight': 600,
345
+ fill: titleColor,
346
+ }, line));
347
+ });
348
+ // Meta line and capacity suffix render as a unified SVG fragment.
349
+ // For pure-text suffixes (multiplier, literal glyph, no glyph) the
350
+ // unified path emits a single `<text>` element with `<tspan dx>`
351
+ // for the gap so the suffix hugs the metaText regardless of how
352
+ // wide it actually rendered. Built-in SVG icon glyphs emit their
353
+ // number and a sibling `<svg>` where layout placed them. See
354
+ // `renderItemMetaLine` for the full case-by-case.
355
+ if (i.metaText || i.capacity) {
356
+ parts.push(renderItemMetaLine({
357
+ metaText: i.metaText,
358
+ capacity: i.capacity,
359
+ x: captionX,
360
+ baselineY: i.box.y + itemCaptionMetaBaselineOffset(titleLines.length),
361
+ fontSize: ITEM_CAPTION_META_FONT_SIZE_PX,
362
+ fontFamily: fonts[i.style.font],
363
+ color: metaColor,
364
+ }));
365
+ }
366
+ return parts.join('');
367
+ }
368
+ /** Footnote superscript indicators, in the bar or spilled beside it. */
369
+ function renderItemFootnoteIndicators(i, palette, fonts) {
370
+ const parts = [];
371
+ const captionOutsideTextColor = palette.entities.item.text;
372
+ // Footnote superscript indicators. Two render modes:
373
+ // - In-bar (default): glyphs walk LEFT from
374
+ // `bar.right - ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX`,
375
+ // anchored end. They sit on the bar fill, so use the bar's
376
+ // resolved text color for contrast (a hardcoded red was
377
+ // getting lost on saturated mid-tone bars from `bg:blue`
378
+ // labels). The "footnote = red" attention cue lives on the
379
+ // footnote PANEL's red number column at the bottom of the
380
+ // chart where red reads cleanly against white.
381
+ // - Spilled (narrow bars): the glyphs render in the spill
382
+ // column to the right of the bar, walking RIGHT from
383
+ // `footnoteSpillStartX` so they read in the same numerical
384
+ // order as the in-bar case. They sit on the chart bg, so
385
+ // use the chart-tuned default text color (same as spilled
386
+ // captions).
387
+ if (i.footnoteIndicators.length > 0) {
388
+ const footnoteY = i.box.y + ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX;
389
+ if (i.footnoteSpills && i.footnoteSpillStartX !== null) {
390
+ let fx = i.footnoteSpillStartX;
391
+ for (let k = 0; k < i.footnoteIndicators.length; k++) {
392
+ const n2 = i.footnoteIndicators[k];
393
+ parts.push(textTag({
394
+ x: num(fx),
395
+ y: num(footnoteY),
396
+ 'font-family': fonts.sans,
397
+ 'font-size': ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX,
398
+ 'font-weight': 700,
399
+ fill: captionOutsideTextColor,
400
+ }, String(n2)));
401
+ fx += ITEM_FOOTNOTE_INDICATOR_STEP_PX;
402
+ }
403
+ }
404
+ else {
405
+ let fx = i.box.x + i.box.width - ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX;
406
+ for (let k = i.footnoteIndicators.length - 1; k >= 0; k--) {
407
+ const n2 = i.footnoteIndicators[k];
408
+ parts.push(textTag({
409
+ x: num(fx),
410
+ y: num(footnoteY),
411
+ 'font-family': fonts.sans,
412
+ 'font-size': ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX,
413
+ 'font-weight': 700,
414
+ fill: i.style.text,
415
+ 'text-anchor': 'end',
416
+ }, String(n2)));
417
+ fx -= ITEM_FOOTNOTE_INDICATOR_STEP_PX;
418
+ }
419
+ }
420
+ }
421
+ return parts.join('');
422
+ }
423
+ function renderItemLinkIcon(i, options, palette) {
424
+ const parts = [];
425
+ // Link icon — colored tile + white external-link glyph. Default
426
+ // position is the bar's UPPER-LEFT corner; on a bar too narrow
427
+ // to host both the icon and the status-dot column with a gap
428
+ // between them, the icon spills out to the right of the bar
429
+ // (in front of the spilled title) so the icon→title affordance
430
+ // stays intact. The glyph is the same outbound-arrow ↗ for
431
+ // every link kind (linear / github / jira / generic) — they
432
+ // only differ in tile color. The include FILE-LEVEL region
433
+ // (`include "./other.nowline"`) uses a separate stacked-sheets
434
+ // glyph rendered by `renderIncludeRegion`, distinct from this
435
+ // item-level link icon.
436
+ if (!options.noLinks && i.linkIcon && i.linkIcon !== 'none') {
437
+ const tileColor = {
438
+ linear: '#5e6ad2',
439
+ github: '#0f172a',
440
+ jira: '#0052cc',
441
+ generic: palette.item.linkIconFg,
442
+ };
443
+ const tile = tileColor[i.linkIcon] ?? tileColor.generic;
444
+ const tileSize = ITEM_LINK_ICON_TILE_SIZE_PX;
445
+ const tileX = i.iconSpills && i.iconSpillX !== null
446
+ ? i.iconSpillX
447
+ : i.box.x + ITEM_LINK_ICON_INSET_PX;
448
+ const tileY = i.box.y + ITEM_LINK_ICON_INSET_PX;
449
+ const tileRect = tag('rect', {
450
+ x: num(tileX),
451
+ y: num(tileY),
452
+ width: tileSize,
453
+ height: tileSize,
454
+ rx: 2,
455
+ ry: 2,
456
+ fill: tile,
457
+ });
458
+ const gx = tileX;
459
+ const gy = tileY;
460
+ const glyph = tag('path', {
461
+ d: `M${num(gx + 4)} ${num(gy + 10)} L${num(gx + 10)} ${num(gy + 4)} M${num(gx + 6)} ${num(gy + 4)} H${num(gx + 10)} V${num(gy + 8)}`,
462
+ stroke: '#ffffff',
463
+ fill: 'none',
464
+ 'stroke-width': 1.1,
465
+ 'stroke-linecap': 'round',
466
+ 'stroke-linejoin': 'round',
467
+ });
468
+ const inner = tileRect + glyph;
469
+ const link = i.linkHref
470
+ ? tag('a', { href: i.linkHref, target: '_blank', rel: 'noopener' }, inner)
471
+ : inner;
472
+ parts.push(link);
473
+ }
474
+ return parts.join('');
475
+ }
476
+ function renderItemOverflowTail(i, palette, fonts) {
477
+ const parts = [];
478
+ // Overflow tail — red fill + stroke + caption.
479
+ if (i.hasOverflow && i.overflowBox) {
480
+ const tailFill = palette.item.overflowTailFill;
481
+ const tailStroke = palette.item.overflowTailStroke;
482
+ const captionColor = palette.item.overflowCaption;
483
+ parts.push(tag('rect', {
484
+ x: num(i.overflowBox.x),
485
+ y: num(i.overflowBox.y),
486
+ width: num(i.overflowBox.width),
487
+ height: num(i.overflowBox.height),
488
+ fill: tailFill,
489
+ stroke: tailStroke,
490
+ 'stroke-width': 1,
491
+ }));
492
+ if (i.overflowAnchorId && i.overflowBox.width > 60) {
493
+ parts.push(textTag({
494
+ x: num(i.overflowBox.x + i.overflowBox.width / 2),
495
+ y: num(i.overflowBox.y + i.overflowBox.height / 2 + 3),
496
+ 'font-family': fonts.sans,
497
+ 'font-size': 9,
498
+ 'font-weight': 700,
499
+ fill: captionColor,
500
+ 'text-anchor': 'middle',
501
+ }, `past ${i.overflowAnchorId}`));
502
+ }
503
+ }
504
+ return parts.join('');
505
+ }
506
+ function renderItemLabelChips(i, fonts) {
507
+ const parts = [];
508
+ // Label chips
509
+ for (const chip of i.labelChips) {
510
+ const rx = Math.min(CORNER_RADIUS_PX[chip.style.cornerRadius] ?? 8, chip.box.height / 2);
511
+ parts.push(tag('rect', {
512
+ x: num(chip.box.x),
513
+ y: num(chip.box.y),
514
+ width: num(chip.box.width),
515
+ height: num(chip.box.height),
516
+ rx: num(rx),
517
+ ry: num(rx),
518
+ fill: chip.style.bg === 'none' ? 'transparent' : chip.style.bg,
519
+ stroke: chip.style.fg,
520
+ 'stroke-width': 0.5,
521
+ }));
522
+ parts.push(textTag({
523
+ x: num(chip.box.x + chip.box.width / 2),
524
+ y: num(chip.box.y + chip.box.height / 2 + 3),
525
+ ...fontAttrs(chip.style, fonts, TEXT_SIZE_PX.xs),
526
+ 'text-anchor': 'middle',
527
+ }, chip.text));
528
+ }
529
+ return parts.join('');
530
+ }
531
+ export function renderItem(i, options, idPrefix, palette, fonts) {
532
+ const parts = [];
533
+ parts.push(renderItemTooltip(i));
534
+ parts.push(renderItemBar(i, idPrefix));
535
+ parts.push(renderItemProgress(i));
536
+ parts.push(renderItemStatusDot(i));
537
+ // Inline-date pins (after:DATE / before:DATE). Same z-order family as
538
+ // the status dot and footnote indicators — small badge in the top
539
+ // decoration row. Color matches the bar's resolved meta (`fg`) so the
540
+ // glyph reads against the bar fill the same way the meta text does.
541
+ parts.push(renderInlineDatePins(i.inlineDatePins, i.style.fg));
542
+ parts.push(renderItemCaption(i, itemCaptionX(i, options), palette, fonts));
543
+ parts.push(renderItemFootnoteIndicators(i, palette, fonts));
544
+ parts.push(renderItemLinkIcon(i, options, palette));
545
+ parts.push(renderItemOverflowTail(i, palette, fonts));
546
+ parts.push(renderItemLabelChips(i, fonts));
547
+ return tag('g', { 'data-layer': 'item', 'data-id': i.id ?? null }, parts.join(''));
548
+ }
549
+ //# sourceMappingURL=item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/svg/item.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,wDAAwD;AAGxD,OAAO,EACH,gBAAgB,EAChB,8BAA8B,EAC9B,yBAAyB,EACzB,qCAAqC,EACrC,+BAA+B,EAC/B,iCAAiC,EACjC,4BAA4B,EAC5B,0CAA0C,EAC1C,oCAAoC,EACpC,sCAAsC,EACtC,+BAA+B,EAC/B,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAC9B,4BAA4B,EAC5B,yBAAyB,EACzB,iBAAiB,EACjB,6BAA6B,EAC7B,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE/D;;;;GAIG;AACH,SAAS,SAAS,CAAC,EAAU,EAAE,QAA4B;IACvD,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,IAAI,EAAE;QAAE,CAAC,IAAI,IAAI,CAAC;IACzD,OAAO,CAAC,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,oBAAoB,CAChC,QAA4B,EAC5B,EAAU,EACV,SAAiB,EACjB,QAAgB,EAChB,UAAkB,EAClB,KAAa;IAEb,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG;QACd,aAAa,EAAE,UAAU;QACzB,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,KAAK;KACL,CAAC;IAEX,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACxD,OAAO,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,gEAAgE;QAChE,iEAAiE;QACjE,8DAA8D;QAC9D,0CAA0C;QAC1C,iEAAiE;QACjE,qCAAqC;QACrC,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3F,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,OAAO,kBAAkB,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,IAAI,QAAQ,CAAC;QAC5M,OAAO,SAAS,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC/B,OAAO,CACH,YAAY,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,kBAAkB,OAAO,CAAC,UAAU,CAAC,GAAG;QACtF,eAAe,QAAQ,WAAW,OAAO,CAAC,KAAK,CAAC,IAAI;QACpD,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU;QACtE,SAAS,CACZ,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,kBAAkB,CAAC,IAQ3B;IACG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC/E,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG;QACd,aAAa,EAAE,UAAU;QACzB,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,KAAK;KACL,CAAC;IACX,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,QAAS,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,oBAAoB,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,iBAAiB,CAAC,CAAC;IAChD,MAAM,QAAQ,GACV,YAAY,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,kBAAkB,OAAO,CAAC,UAAU,CAAC,GAAG;QAChF,eAAe,QAAQ,WAAW,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;IACzD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CACH,QAAQ;YACR,OAAO,CAAC,QAAQ,CAAC;YACjB,cAAc,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,UAAU;YACpD,SAAS,CACZ,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACxD,OAAO,CACH,QAAQ;YACR,OAAO,CAAC,QAAQ,CAAC;YACjB,cAAc,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,gBAAgB;YAC1D,SAAS,CACZ,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QACpC,OAAO,CACH,QAAQ;YACR,OAAO,CAAC,QAAQ,CAAC;YACjB,cAAc,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,UAAU;YACpD,cAAc,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU;YACtD,SAAS,CACZ,CAAC;IACN,CAAC;IACD,sEAAsE;IACtE,qEAAqE;IACrE,sEAAsE;IACtE,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;IACzC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC;IACtD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC1C,MAAM,QAAQ,GACV,QAAQ;QACR,OAAO,CAAC,QAAQ,CAAC;QACjB,SAAS;QACT,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,WAAW,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,OAAO,kBAAkB,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,IAAI,QAAQ,CAAC;IAC7M,OAAO,QAAQ,GAAG,QAAQ,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAAC,GAAkB,EAAE,KAAa;IAC1D,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC;IACtC,MAAM,KAAK,GACP,WAAW,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG;QACpE,WAAW,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG;QAC/D,aAAa,GAAG,CAAC,OAAO,kBAAkB,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,IAAI,QAAQ,CAAC;IACrG,MAAM,OAAO,GAAG,UAAU,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;IACzD,OAAO,GAAG,CACN,GAAG,EACH;QACI,YAAY,EAAE,iBAAiB;QAC/B,WAAW,EAAE,GAAG,CAAC,IAAI;QACrB,WAAW,EAAE,GAAG,CAAC,OAAO;QACxB,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;KAC9C,EACD,OAAO,GAAG,KAAK,CAClB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAiC,EAAE,KAAa;IACjF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAiC;IACzD,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,CAAiB;IACxC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,CAAC,CAAC,cAAc;QAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;QAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IACzF,OAAO,EAAE,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,SAAS,aAAa,CAAC,CAAiB,EAAE,QAAgB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CACN,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE;QAC5D,MAAM,EAAE,MAAM,IAAI,IAAI;KACzB,CAAC,CACL,CAAC;IACF,qEAAqE;IACrE,uEAAuE;IACvE,sCAAsC;IACtC,IAAI,CAAC,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,CAAiB;IACzC,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC,MAAM,EAAE;YACf,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACf,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,wBAAwB,CAAC;YACzD,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,EAAE,wBAAwB;YAChC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;YAChB,OAAO,EAAE,IAAI;SAChB,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAiB;IAC1C,mEAAmE;IACnE,8DAA8D;IAC9D,kEAAkE;IAClE,EAAE;IACF,gEAAgE;IAChE,gEAAgE;IAChE,iEAAiE;IACjE,wDAAwD;IACxD,MAAM,KAAK,GACP,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI;QAChC,CAAC,CAAC,CAAC,CAAC,UAAU;QACd,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,8BAA8B,CAAC;IACjE,OAAO,GAAG,CAAC,QAAQ,EAAE;QACjB,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC;QACd,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,4BAA4B,CAAC;QAC/C,CAAC,EAAE,yBAAyB;QAC5B,IAAI,EAAE,CAAC,CAAC,cAAc;KACzB,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,YAAY,CAAC,CAAiB,EAAE,OAAsB;IAC3D,IAAI,QAAgB,CAAC;IAErB,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACf,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,yBAAyB,CAAC;QAC7D,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACf,QAAQ,IAAI,2BAA2B,GAAG,4BAA4B,CAAC;QAC3E,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,6DAA6D;QAC7D,mEAAmE;QACnE,kEAAkE;QAClE,iEAAiE;QACjE,iEAAiE;QACjE,iEAAiE;QACjE,iEAAiE;QACjE,gBAAgB;QAChB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjF,kEAAkE;QAClE,gEAAgE;QAChE,uDAAuD;QACvD,MAAM,MAAM,GAAG,QAAQ;YACnB,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACvD,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACtE,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IAChC,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,oEAAoE;AACpE,SAAS,iBAAiB,CACtB,CAAiB,EACjB,QAAgB,EAChB,OAAc,EACd,KAAmB;IAEnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,4DAA4D;IAC5D,+DAA+D;IAC/D,+DAA+D;IAC/D,0DAA0D;IAC1D,6DAA6D;IAC7D,wDAAwD;IACxD,2DAA2D;IAC3D,2DAA2D;IAC3D,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5C,MAAM,uBAAuB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3D,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACnF,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACtE,qEAAqE;IACrE,sEAAsE;IACtE,oEAAoE;IACpE,qEAAqE;IACrE,wEAAwE;IACxE,sEAAsE;IACtE,WAAW;IACX,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9D,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO;QACxB,KAAK,CAAC,IAAI,CACN,OAAO,CACH;YACI,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC;YAChB,CAAC,EAAE,GAAG,CACF,CAAC,CAAC,GAAG,CAAC,CAAC;gBACH,qCAAqC;gBACrC,CAAC,GAAG,iCAAiC,CAC5C;YACD,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,WAAW,EAAE,+BAA+B;YAC5C,aAAa,EAAE,GAAG;YAClB,IAAI,EAAE,UAAU;SACnB,EACD,IAAI,CACP,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IACH,kEAAkE;IAClE,mEAAmE;IACnE,iEAAiE;IACjE,gEAAgE;IAChE,iEAAiE;IACjE,6DAA6D;IAC7D,kDAAkD;IAClD,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CACN,kBAAkB,CAAC;YACf,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,CAAC,EAAE,QAAQ;YACX,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,6BAA6B,CAAC,UAAU,CAAC,MAAM,CAAC;YACrE,QAAQ,EAAE,8BAA8B;YACxC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/B,KAAK,EAAE,SAAS;SACnB,CAAC,CACL,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,wEAAwE;AACxE,SAAS,4BAA4B,CACjC,CAAiB,EACjB,OAAc,EACd,KAAmB;IAEnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,uBAAuB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAE3D,qDAAqD;IACrD,8CAA8C;IAC9C,4DAA4D;IAC5D,+DAA+D;IAC/D,4DAA4D;IAC5D,6DAA6D;IAC7D,+DAA+D;IAC/D,8DAA8D;IAC9D,mDAAmD;IACnD,4DAA4D;IAC5D,yDAAyD;IACzD,+DAA+D;IAC/D,6DAA6D;IAC7D,8DAA8D;IAC9D,iBAAiB;IACjB,IAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,0CAA0C,CAAC;QACvE,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,mBAAmB,KAAK,IAAI,EAAE,CAAC;YACrD,IAAI,EAAE,GAAG,CAAC,CAAC,mBAAmB,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,MAAM,EAAE,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACnC,KAAK,CAAC,IAAI,CACN,OAAO,CACH;oBACI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBACV,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC;oBACjB,aAAa,EAAE,KAAK,CAAC,IAAI;oBACzB,WAAW,EAAE,oCAAoC;oBACjD,aAAa,EAAE,GAAG;oBAClB,IAAI,EAAE,uBAAuB;iBAChC,EACD,MAAM,CAAC,EAAE,CAAC,CACb,CACJ,CAAC;gBACF,EAAE,IAAI,+BAA+B,CAAC;YAC1C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,sCAAsC,CAAC;YACxE,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxD,MAAM,EAAE,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACnC,KAAK,CAAC,IAAI,CACN,OAAO,CACH;oBACI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBACV,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC;oBACjB,aAAa,EAAE,KAAK,CAAC,IAAI;oBACzB,WAAW,EAAE,oCAAoC;oBACjD,aAAa,EAAE,GAAG;oBAClB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;oBAClB,aAAa,EAAE,KAAK;iBACvB,EACD,MAAM,CAAC,EAAE,CAAC,CACb,CACJ,CAAC;gBACF,EAAE,IAAI,+BAA+B,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAiB,EAAE,OAAsB,EAAE,OAAc;IACjF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,gEAAgE;IAChE,+DAA+D;IAC/D,6DAA6D;IAC7D,4DAA4D;IAC5D,+DAA+D;IAC/D,2DAA2D;IAC3D,4DAA4D;IAC5D,2DAA2D;IAC3D,+DAA+D;IAC/D,8DAA8D;IAC9D,wBAAwB;IACxB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC1D,MAAM,SAAS,GAA2B;YACtC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU;SACnC,CAAC;QACF,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC;QACxD,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QAC7C,MAAM,KAAK,GACP,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI;YACjC,CAAC,CAAC,CAAC,CAAC,UAAU;YACd,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,uBAAuB,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,uBAAuB,CAAC;QAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE;YACzB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;YACb,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;YACb,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,CAAC;QACjB,MAAM,EAAE,GAAG,KAAK,CAAC;QACjB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE;YACtB,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YACpI,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,MAAM;YACZ,cAAc,EAAE,GAAG;YACnB,gBAAgB,EAAE,OAAO;YACzB,iBAAiB,EAAE,OAAO;SAC7B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ;YACnB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC;YAC1E,CAAC,CAAC,KAAK,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAiB,EAAE,OAAc,EAAE,KAAmB;IAClF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,+CAA+C;IAC/C,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACnD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC;QAClD,KAAK,CAAC,IAAI,CACN,GAAG,CAAC,MAAM,EAAE;YACR,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACvB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACvB,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;YAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YACjC,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,CAAC;SACpB,CAAC,CACL,CAAC;QACF,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CACN,OAAO,CACH;gBACI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;gBACjD,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtD,aAAa,EAAE,KAAK,CAAC,IAAI;gBACzB,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,GAAG;gBAClB,IAAI,EAAE,YAAY;gBAClB,aAAa,EAAE,QAAQ;aAC1B,EACD,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAC/B,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAiB,EAAE,KAAmB;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,cAAc;IACd,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CACN,GAAG,CAAC,MAAM,EAAE;YACR,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAClB,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAClB,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5B,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC9D,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;YACrB,cAAc,EAAE,GAAG;SACtB,CAAC,CACL,CAAC;QACF,KAAK,CAAC,IAAI,CACN,OAAO,CACH;YACI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACvC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YAChD,aAAa,EAAE,QAAQ;SAC1B,EACD,IAAI,CAAC,IAAI,CACZ,CACJ,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CACtB,CAAiB,EACjB,OAAsB,EACtB,QAAgB,EAChB,OAAc,EACd,KAAmB;IAEnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,sEAAsE;IACtE,kEAAkE;IAClE,sEAAsE;IACtE,oEAAoE;IACpE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PositionedAnchor, PositionedMilestone, Theme } from '@nowline/layout';
2
+ import type { FontFamilies } from './render.js';
3
+ export declare function renderAnchor(a: PositionedAnchor, palette: Theme, fonts: FontFamilies): string;
4
+ export declare function renderAnchorCutLine(a: PositionedAnchor, palette: Theme): string;
5
+ export declare function renderMilestone(m: PositionedMilestone, palette: Theme, fonts: FontFamilies): string;
6
+ export declare function renderMilestoneCutLine(m: PositionedMilestone, idPrefix: string, palette: Theme): string;
7
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../src/svg/markers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAgB,YAAY,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAoC7F;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,GAAG,MAAM,CAW/E;AAED,wBAAgB,eAAe,CAC3B,CAAC,EAAE,mBAAmB,EACtB,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,YAAY,GACpB,MAAM,CAuDR;AAYD,wBAAgB,sBAAsB,CAClC,CAAC,EAAE,mBAAmB,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,GACf,MAAM,CA2CR"}