@nowline/layout 0.8.6 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/axis-columns.d.ts +70 -0
- package/dist/axis-columns.d.ts.map +1 -0
- package/dist/axis-columns.js +104 -0
- package/dist/axis-columns.js.map +1 -0
- package/dist/calendar-resolver.d.ts +27 -0
- package/dist/calendar-resolver.d.ts.map +1 -0
- package/dist/calendar-resolver.js +132 -0
- package/dist/calendar-resolver.js.map +1 -0
- package/dist/calendar.d.ts +0 -19
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +4 -44
- package/dist/calendar.js.map +1 -1
- package/dist/canvas-width.d.ts +23 -0
- package/dist/canvas-width.d.ts.map +1 -0
- package/dist/canvas-width.js +26 -0
- package/dist/canvas-width.js.map +1 -0
- package/dist/capacity.d.ts +28 -0
- package/dist/capacity.d.ts.map +1 -1
- package/dist/capacity.js +64 -29
- package/dist/capacity.js.map +1 -1
- package/dist/chart-translation.d.ts +22 -0
- package/dist/chart-translation.d.ts.map +1 -0
- package/dist/chart-translation.js +83 -0
- package/dist/chart-translation.js.map +1 -0
- package/dist/container-header-geometry.d.ts +64 -0
- package/dist/container-header-geometry.d.ts.map +1 -0
- package/dist/container-header-geometry.js +89 -0
- package/dist/container-header-geometry.js.map +1 -0
- package/dist/dsl-utils.d.ts +3 -4
- package/dist/dsl-utils.d.ts.map +1 -1
- package/dist/dsl-utils.js +8 -25
- package/dist/dsl-utils.js.map +1 -1
- package/dist/edge-routing.d.ts +69 -78
- package/dist/edge-routing.d.ts.map +1 -1
- package/dist/edge-routing.js +271 -401
- package/dist/edge-routing.js.map +1 -1
- package/dist/frame-tab-geometry.d.ts +24 -14
- package/dist/frame-tab-geometry.d.ts.map +1 -1
- package/dist/frame-tab-geometry.js +69 -23
- package/dist/frame-tab-geometry.js.map +1 -1
- package/dist/header-card-geometry.d.ts +12 -0
- package/dist/header-card-geometry.d.ts.map +1 -1
- package/dist/header-card-geometry.js +14 -2
- package/dist/header-card-geometry.js.map +1 -1
- package/dist/header-logo.d.ts +28 -0
- package/dist/header-logo.d.ts.map +1 -0
- package/dist/header-logo.js +51 -0
- package/dist/header-logo.js.map +1 -0
- package/dist/i18n.d.ts +11 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +11 -1
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +20 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -7
- package/dist/index.js.map +1 -1
- package/dist/inline-date-pin-geometry.d.ts +19 -11
- package/dist/inline-date-pin-geometry.d.ts.map +1 -1
- package/dist/inline-date-pin-geometry.js +45 -46
- package/dist/inline-date-pin-geometry.js.map +1 -1
- package/dist/item-bar-geometry.d.ts +192 -4
- package/dist/item-bar-geometry.d.ts.map +1 -1
- package/dist/item-bar-geometry.js +258 -5
- package/dist/item-bar-geometry.js.map +1 -1
- package/dist/item-port-geometry.d.ts +13 -0
- package/dist/item-port-geometry.d.ts.map +1 -0
- package/dist/item-port-geometry.js +63 -0
- package/dist/item-port-geometry.js.map +1 -0
- package/dist/layout-context.d.ts +115 -51
- package/dist/layout-context.d.ts.map +1 -1
- package/dist/layout-context.js +96 -5
- package/dist/layout-context.js.map +1 -1
- package/dist/layout-insights.d.ts.map +1 -1
- package/dist/layout-insights.js +73 -1
- package/dist/layout-insights.js.map +1 -1
- package/dist/layout.d.ts +35 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +18 -1315
- package/dist/layout.js.map +1 -1
- package/dist/nodes/anchor-node.d.ts.map +1 -1
- package/dist/nodes/anchor-node.js +11 -4
- package/dist/nodes/anchor-node.js.map +1 -1
- package/dist/nodes/content-extent.d.ts +24 -0
- package/dist/nodes/content-extent.d.ts.map +1 -0
- package/dist/nodes/content-extent.js +100 -0
- package/dist/nodes/content-extent.js.map +1 -0
- package/dist/nodes/dependency-edges.d.ts +6 -0
- package/dist/nodes/dependency-edges.d.ts.map +1 -0
- package/dist/nodes/dependency-edges.js +148 -0
- package/dist/nodes/dependency-edges.js.map +1 -0
- package/dist/nodes/footnote-node.d.ts +24 -3
- package/dist/nodes/footnote-node.d.ts.map +1 -1
- package/dist/nodes/footnote-node.js +129 -25
- package/dist/nodes/footnote-node.js.map +1 -1
- package/dist/nodes/group-node.d.ts +10 -21
- package/dist/nodes/group-node.d.ts.map +1 -1
- package/dist/nodes/group-node.js +79 -152
- package/dist/nodes/group-node.js.map +1 -1
- package/dist/nodes/header-node.d.ts +56 -0
- package/dist/nodes/header-node.d.ts.map +1 -0
- package/dist/nodes/header-node.js +163 -0
- package/dist/nodes/header-node.js.map +1 -0
- package/dist/nodes/include-node.d.ts +22 -12
- package/dist/nodes/include-node.d.ts.map +1 -1
- package/dist/nodes/include-node.js +95 -62
- package/dist/nodes/include-node.js.map +1 -1
- package/dist/nodes/item-measure.d.ts +135 -0
- package/dist/nodes/item-measure.d.ts.map +1 -0
- package/dist/nodes/item-measure.js +514 -0
- package/dist/nodes/item-measure.js.map +1 -0
- package/dist/nodes/item-node.d.ts +162 -9
- package/dist/nodes/item-node.d.ts.map +1 -1
- package/dist/nodes/item-node.js +256 -69
- package/dist/nodes/item-node.js.map +1 -1
- package/dist/nodes/marker-band.d.ts +118 -0
- package/dist/nodes/marker-band.d.ts.map +1 -0
- package/dist/nodes/marker-band.js +303 -0
- package/dist/nodes/marker-band.js.map +1 -0
- package/dist/nodes/marker-geometry.js +1 -1
- package/dist/nodes/marker-geometry.js.map +1 -1
- package/dist/nodes/milestone-node.d.ts +112 -15
- package/dist/nodes/milestone-node.d.ts.map +1 -1
- package/dist/nodes/milestone-node.js +246 -95
- package/dist/nodes/milestone-node.js.map +1 -1
- package/dist/nodes/nowline-node.d.ts +8 -0
- package/dist/nodes/nowline-node.d.ts.map +1 -0
- package/dist/nodes/nowline-node.js +74 -0
- package/dist/nodes/nowline-node.js.map +1 -0
- package/dist/nodes/parallel-node.d.ts +7 -12
- package/dist/nodes/parallel-node.d.ts.map +1 -1
- package/dist/nodes/parallel-node.js +66 -30
- package/dist/nodes/parallel-node.js.map +1 -1
- package/dist/nodes/region-markers.d.ts +41 -0
- package/dist/nodes/region-markers.d.ts.map +1 -0
- package/dist/nodes/region-markers.js +130 -0
- package/dist/nodes/region-markers.js.map +1 -0
- package/dist/nodes/roadmap-node.d.ts +9 -72
- package/dist/nodes/roadmap-node.d.ts.map +1 -1
- package/dist/nodes/roadmap-node.js +38 -788
- package/dist/nodes/roadmap-node.js.map +1 -1
- package/dist/nodes/row-track.d.ts +33 -0
- package/dist/nodes/row-track.d.ts.map +1 -0
- package/dist/nodes/row-track.js +170 -0
- package/dist/nodes/row-track.js.map +1 -0
- package/dist/nodes/sequence-item.d.ts +25 -0
- package/dist/nodes/sequence-item.d.ts.map +1 -0
- package/dist/nodes/sequence-item.js +396 -0
- package/dist/nodes/sequence-item.js.map +1 -0
- package/dist/nodes/sequence-one.d.ts +5 -0
- package/dist/nodes/sequence-one.d.ts.map +1 -0
- package/dist/nodes/sequence-one.js +26 -0
- package/dist/nodes/sequence-one.js.map +1 -0
- package/dist/nodes/swimlane-node.d.ts +5 -17
- package/dist/nodes/swimlane-node.d.ts.map +1 -1
- package/dist/nodes/swimlane-node.js +62 -145
- package/dist/nodes/swimlane-node.js.map +1 -1
- package/dist/nodes/wave-node.d.ts +52 -0
- package/dist/nodes/wave-node.d.ts.map +1 -0
- package/dist/nodes/wave-node.js +483 -0
- package/dist/nodes/wave-node.js.map +1 -0
- package/dist/non-working-display.d.ts +14 -0
- package/dist/non-working-display.d.ts.map +1 -0
- package/dist/non-working-display.js +28 -0
- package/dist/non-working-display.js.map +1 -0
- package/dist/phases/date-window.d.ts +48 -0
- package/dist/phases/date-window.d.ts.map +1 -0
- package/dist/phases/date-window.js +130 -0
- package/dist/phases/date-window.js.map +1 -0
- package/dist/phases/finalize.d.ts +198 -0
- package/dist/phases/finalize.d.ts.map +1 -0
- package/dist/phases/finalize.js +1058 -0
- package/dist/phases/finalize.js.map +1 -0
- package/dist/phases/measure.d.ts +77 -0
- package/dist/phases/measure.d.ts.map +1 -0
- package/dist/phases/measure.js +222 -0
- package/dist/phases/measure.js.map +1 -0
- package/dist/phases/place.d.ts +28 -0
- package/dist/phases/place.d.ts.map +1 -0
- package/dist/phases/place.js +225 -0
- package/dist/phases/place.js.map +1 -0
- package/dist/renderable.d.ts.map +1 -1
- package/dist/renderable.js +23 -3
- package/dist/renderable.js.map +1 -1
- package/dist/resolve-today.d.ts +11 -1
- package/dist/resolve-today.d.ts.map +1 -1
- package/dist/resolve-today.js +26 -12
- package/dist/resolve-today.js.map +1 -1
- package/dist/row-packer.d.ts +42 -16
- package/dist/row-packer.d.ts.map +1 -1
- package/dist/row-packer.js +51 -78
- package/dist/row-packer.js.map +1 -1
- package/dist/schedule.d.ts +58 -1
- package/dist/schedule.d.ts.map +1 -1
- package/dist/schedule.js +280 -106
- package/dist/schedule.js.map +1 -1
- package/dist/start-rules.d.ts +27 -0
- package/dist/start-rules.d.ts.map +1 -0
- package/dist/start-rules.js +91 -0
- package/dist/start-rules.js.map +1 -0
- package/dist/start-terms.d.ts +23 -0
- package/dist/start-terms.d.ts.map +1 -0
- package/dist/start-terms.js +27 -0
- package/dist/start-terms.js.map +1 -0
- package/dist/status-dot.d.ts +46 -0
- package/dist/status-dot.d.ts.map +1 -0
- package/dist/status-dot.js +78 -0
- package/dist/status-dot.js.map +1 -0
- package/dist/style-resolution.d.ts.map +1 -1
- package/dist/style-resolution.js +23 -43
- package/dist/style-resolution.js.map +1 -1
- package/dist/text-measure.d.ts +28 -0
- package/dist/text-measure.d.ts.map +1 -0
- package/dist/text-measure.js +70 -0
- package/dist/text-measure.js.map +1 -0
- package/dist/themes/contrast.d.ts +4 -0
- package/dist/themes/contrast.d.ts.map +1 -0
- package/dist/themes/contrast.js +32 -0
- package/dist/themes/contrast.js.map +1 -0
- package/dist/themes/dark.d.ts.map +1 -1
- package/dist/themes/dark.js +28 -1
- package/dist/themes/dark.js.map +1 -1
- package/dist/themes/grayscale.d.ts.map +1 -1
- package/dist/themes/grayscale.js +28 -1
- package/dist/themes/grayscale.js.map +1 -1
- package/dist/themes/index.d.ts +4 -11
- package/dist/themes/index.d.ts.map +1 -1
- package/dist/themes/index.js +6 -4
- package/dist/themes/index.js.map +1 -1
- package/dist/themes/light.d.ts.map +1 -1
- package/dist/themes/light.js +28 -1
- package/dist/themes/light.js.map +1 -1
- package/dist/themes/shape.d.ts +31 -0
- package/dist/themes/shape.d.ts.map +1 -1
- package/dist/themes/shared.d.ts +44 -50
- package/dist/themes/shared.d.ts.map +1 -1
- package/dist/themes/shared.js +79 -83
- package/dist/themes/shared.js.map +1 -1
- package/dist/time-scale.d.ts +42 -6
- package/dist/time-scale.d.ts.map +1 -1
- package/dist/time-scale.js +109 -17
- package/dist/time-scale.js.map +1 -1
- package/dist/types.d.ts +528 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/view-preset.d.ts +61 -6
- package/dist/view-preset.d.ts.map +1 -1
- package/dist/view-preset.js +439 -24
- package/dist/view-preset.js.map +1 -1
- package/dist/wave-barrier.d.ts +107 -0
- package/dist/wave-barrier.d.ts.map +1 -0
- package/dist/wave-barrier.js +174 -0
- package/dist/wave-barrier.js.map +1 -0
- package/dist/wave-hatch.d.ts +4 -0
- package/dist/wave-hatch.d.ts.map +1 -0
- package/dist/wave-hatch.js +21 -0
- package/dist/wave-hatch.js.map +1 -0
- package/dist/wave-layout.d.ts +99 -0
- package/dist/wave-layout.d.ts.map +1 -0
- package/dist/wave-layout.js +130 -0
- package/dist/wave-layout.js.map +1 -0
- package/dist/working-calendar.d.ts +128 -4
- package/dist/working-calendar.d.ts.map +1 -1
- package/dist/working-calendar.js +725 -51
- package/dist/working-calendar.js.map +1 -1
- package/dist/working-span.d.ts +11 -0
- package/dist/working-span.d.ts.map +1 -0
- package/dist/working-span.js +18 -0
- package/dist/working-span.js.map +1 -0
- package/package.json +4 -4
- package/src/axis-columns.ts +140 -0
- package/src/calendar-resolver.ts +161 -0
- package/src/calendar.ts +4 -45
- package/src/canvas-width.ts +36 -0
- package/src/capacity.ts +71 -30
- package/src/chart-translation.ts +88 -0
- package/src/container-header-geometry.ts +116 -0
- package/src/dsl-utils.ts +8 -26
- package/src/edge-routing.ts +347 -491
- package/src/frame-tab-geometry.ts +78 -25
- package/src/header-card-geometry.ts +17 -2
- package/src/header-logo.ts +67 -0
- package/src/i18n.ts +22 -1
- package/src/index.ts +97 -12
- package/src/inline-date-pin-geometry.ts +55 -58
- package/src/item-bar-geometry.ts +341 -5
- package/src/item-port-geometry.ts +69 -0
- package/src/layout-context.ts +210 -72
- package/src/layout-insights.ts +109 -2
- package/src/layout.ts +57 -1530
- package/src/nodes/anchor-node.ts +11 -4
- package/src/nodes/content-extent.ts +107 -0
- package/src/nodes/dependency-edges.ts +171 -0
- package/src/nodes/footnote-node.ts +171 -31
- package/src/nodes/group-node.ts +92 -214
- package/src/nodes/header-node.ts +255 -0
- package/src/nodes/include-node.ts +124 -110
- package/src/nodes/item-measure.ts +723 -0
- package/src/nodes/item-node.ts +358 -80
- package/src/nodes/marker-band.ts +406 -0
- package/src/nodes/marker-geometry.ts +1 -1
- package/src/nodes/milestone-node.ts +321 -136
- package/src/nodes/nowline-node.ts +87 -0
- package/src/nodes/parallel-node.ts +69 -38
- package/src/nodes/region-markers.ts +194 -0
- package/src/nodes/roadmap-node.ts +46 -950
- package/src/nodes/row-track.ts +217 -0
- package/src/nodes/sequence-item.ts +433 -0
- package/src/nodes/sequence-one.ts +40 -0
- package/src/nodes/swimlane-node.ts +66 -205
- package/src/nodes/wave-node.ts +609 -0
- package/src/non-working-display.ts +32 -0
- package/src/phases/date-window.ts +191 -0
- package/src/phases/finalize.ts +1303 -0
- package/src/phases/measure.ts +329 -0
- package/src/phases/place.ts +318 -0
- package/src/renderable.ts +23 -3
- package/src/resolve-today.ts +28 -25
- package/src/row-packer.ts +85 -84
- package/src/schedule.ts +362 -114
- package/src/start-rules.ts +113 -0
- package/src/start-terms.ts +38 -0
- package/src/status-dot.ts +81 -0
- package/src/style-resolution.ts +27 -57
- package/src/text-measure.ts +71 -0
- package/src/themes/contrast.ts +34 -0
- package/src/themes/dark.ts +28 -1
- package/src/themes/grayscale.ts +28 -1
- package/src/themes/index.ts +10 -7
- package/src/themes/light.ts +28 -1
- package/src/themes/shape.ts +38 -0
- package/src/themes/shared.ts +85 -93
- package/src/time-scale.ts +117 -19
- package/src/types.ts +529 -20
- package/src/view-preset.ts +520 -27
- package/src/wave-barrier.ts +242 -0
- package/src/wave-hatch.ts +25 -0
- package/src/wave-layout.ts +203 -0
- package/src/working-calendar.ts +875 -57
- package/src/working-span.ts +19 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
// Item measure (specs/layout-phases.md §3.6): everything about an item bar
|
|
2
|
+
// that does not depend on where the bar lands vertically or on what was
|
|
3
|
+
// placed before it. `measureItem` is the front half of `sequenceItem`
|
|
4
|
+
// without the start resolution and the `before:` caps: duration, width,
|
|
5
|
+
// style and status tint, progress, meta line, link icon, chip samples,
|
|
6
|
+
// caption fit, and the growth a wrapped title or a chip column adds to
|
|
7
|
+
// the bar. It reads the scope, the scale and the footnote index, never an
|
|
8
|
+
// entity edge or a placed item, so the row track can measure an item to
|
|
9
|
+
// size its row and hand the same measure to `sequenceItem`, which places
|
|
10
|
+
// it.
|
|
11
|
+
import { deriveTotalEffortDays, resolveDuration } from '../calendar.js';
|
|
12
|
+
import { capacityIconDxTerms, estimateCapacitySuffixWidth, formatCapacityNumber, META_SUFFIX_DX_EM, parseCapacityValue, resolveCapacityIcon, } from '../capacity.js';
|
|
13
|
+
import { propValue, propValues } from '../dsl-utils.js';
|
|
14
|
+
import { pickInlineDate } from '../inline-date-pin-geometry.js';
|
|
15
|
+
import { computeTitleBarExtra, ITEM_CAPTION_INSET_X_PX, ITEM_CAPTION_META_BASELINE_OFFSET_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, itemCaptionLastBaselineOffset, itemTitleFirstLineRightReservePx, LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX, LABEL_CHIP_GAP_BETWEEN_PX, LABEL_CHIP_HEIGHT_PX, LABEL_CHIP_ROW_STEP_PX, layoutSpillCluster, MIN_BAR_WIDTH_FOR_DOT_PX, MIN_BAR_WIDTH_FOR_FOOTNOTE_PX, MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX, packSpillChips, } from '../item-bar-geometry.js';
|
|
16
|
+
import { scheduledItemDays } from '../layout-context.js';
|
|
17
|
+
import { resolveLabelChipStyle, resolveStyle } from '../style-resolution.js';
|
|
18
|
+
import { ellipsizeToWidth, estimateTextWidth } from '../text-measure.js';
|
|
19
|
+
import { PADDING_PX, PROGRESS_STRIP_HEIGHT_PX } from '../themes/shared.js';
|
|
20
|
+
import { itemSpanPx } from '../working-span.js';
|
|
21
|
+
import { itemBarInsetPx, itemVisualWidth, measureItemCaption, resolveCaptionTitleLines, } from './item-node.js';
|
|
22
|
+
export function statusFromProp(raw) {
|
|
23
|
+
switch (raw) {
|
|
24
|
+
case 'done':
|
|
25
|
+
case 'completed':
|
|
26
|
+
return 'done';
|
|
27
|
+
case 'in-progress':
|
|
28
|
+
case 'active':
|
|
29
|
+
return 'in-progress';
|
|
30
|
+
case 'at-risk':
|
|
31
|
+
case 'blocked':
|
|
32
|
+
case 'planned':
|
|
33
|
+
return raw;
|
|
34
|
+
case undefined:
|
|
35
|
+
return 'planned';
|
|
36
|
+
default:
|
|
37
|
+
return 'neutral';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function parseProgressFraction(raw) {
|
|
41
|
+
if (!raw)
|
|
42
|
+
return 0;
|
|
43
|
+
const m = /^(\d{1,3})%$/.exec(raw);
|
|
44
|
+
if (!m)
|
|
45
|
+
return 0;
|
|
46
|
+
return Math.max(0, Math.min(100, parseInt(m[1], 10))) / 100;
|
|
47
|
+
}
|
|
48
|
+
// Resolve a `size:NAME` value to its size declaration's effort literal, used
|
|
49
|
+
// by displays that want the literal duration string (not days). Returns the
|
|
50
|
+
// original string for raw literals (`1w`, `3d`) and undefined for missing
|
|
51
|
+
// values. m5 will adjust callers to apply capacity-aware derivation when the
|
|
52
|
+
// caller wants the calendar duration; this helper continues to expose the
|
|
53
|
+
// raw effort/duration literal for chips, captions, and tooltips.
|
|
54
|
+
function resolveDurationLiteral(raw, ctx) {
|
|
55
|
+
if (!raw)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (/^\d+(?:\.\d+)?[dwmqy]$/.test(raw) || /^\d+%$/.test(raw))
|
|
58
|
+
return raw;
|
|
59
|
+
return ctx.sizes.get(raw)?.effortLiteral ?? raw;
|
|
60
|
+
}
|
|
61
|
+
// Resolve a person/team id to its declared title when present (id otherwise).
|
|
62
|
+
function resolveActorDisplay(raw, ctx) {
|
|
63
|
+
if (!raw)
|
|
64
|
+
return undefined;
|
|
65
|
+
return ctx.teams.get(raw)?.title ?? ctx.persons.get(raw)?.title ?? raw;
|
|
66
|
+
}
|
|
67
|
+
export function parseLinkIcon(link) {
|
|
68
|
+
if (!link)
|
|
69
|
+
return { icon: 'none' };
|
|
70
|
+
const lower = link.toLowerCase();
|
|
71
|
+
if (lower.includes('linear.app'))
|
|
72
|
+
return { icon: 'linear', href: link };
|
|
73
|
+
if (lower.includes('github.com'))
|
|
74
|
+
return { icon: 'github', href: link };
|
|
75
|
+
if (lower.includes('atlassian.net') || lower.includes('jira.')) {
|
|
76
|
+
return { icon: 'jira', href: link };
|
|
77
|
+
}
|
|
78
|
+
return { icon: 'generic', href: link };
|
|
79
|
+
}
|
|
80
|
+
// Bake a named/hex color from a label's `bg:` or `fg:` into the chip style.
|
|
81
|
+
export function buildLabelChip(label, ctx, x, y, maxWidth) {
|
|
82
|
+
const style = resolveLabelChipStyle(label, ctx);
|
|
83
|
+
// Prefer the short name (id) when it exists — chips inside an item bar
|
|
84
|
+
// are tight; the long title risks overflowing.
|
|
85
|
+
const text = label.name ?? label.title ?? '';
|
|
86
|
+
const padKey = style.padding === 'none' ? 'xs' : style.padding;
|
|
87
|
+
const pad = PADDING_PX[padKey];
|
|
88
|
+
let width = Math.max(20, Math.round(text.length * 5.5 + pad * 2));
|
|
89
|
+
if (maxWidth !== undefined)
|
|
90
|
+
width = Math.min(width, maxWidth);
|
|
91
|
+
return {
|
|
92
|
+
text,
|
|
93
|
+
style,
|
|
94
|
+
box: { x, y, width, height: LABEL_CHIP_HEIGHT_PX },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Status kind and 0..1 progress fraction for an item: a pure function of
|
|
99
|
+
* the item's properties and the layout scope.
|
|
100
|
+
*/
|
|
101
|
+
export function resolveItemProgress(props, ctx) {
|
|
102
|
+
// Total work in single-engineer days, used below to normalize a literal
|
|
103
|
+
// `remaining:` value into a progress fraction. Stays per-engineer
|
|
104
|
+
// regardless of the item's `capacity:` so a `remaining:1w` always means
|
|
105
|
+
// "one engineer-week of work left".
|
|
106
|
+
const totalEffortDays = deriveTotalEffortDays(props, ctx.sizes, ctx.cal);
|
|
107
|
+
const remainingDays = resolveDuration(propValue(props, 'remaining'), ctx.sizes, ctx.cal);
|
|
108
|
+
const statusRaw = propValue(props, 'status');
|
|
109
|
+
const status = statusFromProp(statusRaw);
|
|
110
|
+
let progress = parseProgressFraction(statusRaw);
|
|
111
|
+
if (progress === 0 && status === 'done')
|
|
112
|
+
progress = 1;
|
|
113
|
+
const remainingPctMatch = /^(\d{1,3})%$/.exec(propValue(props, 'remaining') ?? '');
|
|
114
|
+
if (progress === 0 && status === 'in-progress' && remainingPctMatch) {
|
|
115
|
+
const pct = Math.max(0, Math.min(100, parseInt(remainingPctMatch[1], 10))) / 100;
|
|
116
|
+
progress = 1 - pct;
|
|
117
|
+
}
|
|
118
|
+
if (progress === 0 && status === 'in-progress' && remainingDays > 0 && totalEffortDays > 0) {
|
|
119
|
+
// `remaining:` literal is single-engineer days; `totalEffortDays`
|
|
120
|
+
// is also single-engineer days, so the ratio is unit-correct.
|
|
121
|
+
// Clamp to [0, 1] — the renderer paints 100% remaining when the
|
|
122
|
+
// author overshot, matching the spec's "warn-and-clamp" overflow
|
|
123
|
+
// behavior. (Validation defers the warn to layout-time today; a
|
|
124
|
+
// future diagnostics channel can surface it back to the user.)
|
|
125
|
+
progress = Math.max(0, Math.min(1, 1 - remainingDays / totalEffortDays));
|
|
126
|
+
}
|
|
127
|
+
return { status, progress };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Assemble an item's meta line and capacity suffix. The caption fit needs
|
|
131
|
+
* the real meta width to know whether a title wraps or spills, and
|
|
132
|
+
* `sequenceItem` paints from the same result.
|
|
133
|
+
*/
|
|
134
|
+
export function resolveItemMeta(props, ctx, sizeResolved, status, progress, capacityIconName) {
|
|
135
|
+
// Driver-only meta line (`rendering.md` § Item size chip): exactly one
|
|
136
|
+
// leading token — the explicit non-empty `duration:LITERAL` when set,
|
|
137
|
+
// otherwise the size chip when `size:` drives. Never both; bar width
|
|
138
|
+
// already encodes derived calendar span for sized items.
|
|
139
|
+
const explicitDurationLiteral = propValue(props, 'duration');
|
|
140
|
+
const durationDrives = !!explicitDurationLiteral && /^\d+(?:\.\d+)?[dwmqy]$/.test(explicitDurationLiteral);
|
|
141
|
+
const sizeChipText = sizeResolved ? (sizeResolved.title ?? sizeResolved.name) : '';
|
|
142
|
+
const driverToken = durationDrives
|
|
143
|
+
? explicitDurationLiteral
|
|
144
|
+
: sizeChipText || undefined;
|
|
145
|
+
const remainingRaw = propValue(props, 'remaining');
|
|
146
|
+
const remainingLiteral = resolveDurationLiteral(remainingRaw, ctx);
|
|
147
|
+
const ownerDisplay = resolveActorDisplay(propValue(props, 'owner'), ctx);
|
|
148
|
+
const metaHead = () => [driverToken, ownerDisplay].filter(Boolean).join(' ');
|
|
149
|
+
let metaText;
|
|
150
|
+
if (status === 'in-progress' && remainingLiteral) {
|
|
151
|
+
const head = metaHead();
|
|
152
|
+
metaText = head
|
|
153
|
+
? `${head} — ${remainingLiteral} remaining`
|
|
154
|
+
: `${remainingLiteral} remaining`;
|
|
155
|
+
}
|
|
156
|
+
else if (status === 'in-progress' && progress > 0 && progress < 1) {
|
|
157
|
+
const pct = Math.round((1 - progress) * 100);
|
|
158
|
+
const head = metaHead();
|
|
159
|
+
metaText = head ? `${head} — ${pct}% remaining` : `${pct}% remaining`;
|
|
160
|
+
}
|
|
161
|
+
else if (ownerDisplay || driverToken) {
|
|
162
|
+
metaText = metaHead() || undefined;
|
|
163
|
+
}
|
|
164
|
+
// Capacity suffix — appended after metaText at render time. Layout's
|
|
165
|
+
// job here is to (a) parse the value out of `capacity:`, (b) format
|
|
166
|
+
// the display number, (c) resolve `capacity-icon` to either a
|
|
167
|
+
// built-in name or a literal string the renderer can paint directly,
|
|
168
|
+
// and (d) feed the suffix's estimated width into the caption fit so
|
|
169
|
+
// spill detection accounts for `2w 5×` rather than just `2w`. The
|
|
170
|
+
// suffix disappears entirely when capacity is missing or non-positive.
|
|
171
|
+
const capacityRaw = propValue(props, 'capacity');
|
|
172
|
+
const capacityValue = parseCapacityValue(capacityRaw);
|
|
173
|
+
let capacity = null;
|
|
174
|
+
let capacityTrailingWidth = 0;
|
|
175
|
+
if (capacityValue !== null) {
|
|
176
|
+
const capacityText = formatCapacityNumber(capacityValue);
|
|
177
|
+
const capacityIcon = resolveCapacityIcon(capacityIconName, ctx.symbols);
|
|
178
|
+
const META_FONT_SIZE_PX_LOCAL = 11;
|
|
179
|
+
const iconDxTerms = capacityIconDxTerms(capacityText, capacityIcon, META_FONT_SIZE_PX_LOCAL, metaText);
|
|
180
|
+
capacity = {
|
|
181
|
+
value: capacityValue,
|
|
182
|
+
text: capacityText,
|
|
183
|
+
icon: capacityIcon,
|
|
184
|
+
...(iconDxTerms !== undefined ? { iconDxTerms } : {}),
|
|
185
|
+
};
|
|
186
|
+
// Add a small leading separator (a single space's worth) only when
|
|
187
|
+
// the suffix sits next to existing meta text, so `m 5×` has air
|
|
188
|
+
// between the driver token and the count. Standalone suffix needs no
|
|
189
|
+
// leading separator. A built-in SVG icon is placed past exactly the
|
|
190
|
+
// `META_SUFFIX_DX_EM` separator, so reserve that, not a space's
|
|
191
|
+
// estimate, or the icon ends past the reservation.
|
|
192
|
+
const separatorPx = iconDxTerms !== undefined
|
|
193
|
+
? META_FONT_SIZE_PX_LOCAL * META_SUFFIX_DX_EM
|
|
194
|
+
: estimateTextWidth(' ', META_FONT_SIZE_PX_LOCAL);
|
|
195
|
+
const separatorWidth = metaText ? separatorPx : 0;
|
|
196
|
+
capacityTrailingWidth =
|
|
197
|
+
separatorWidth +
|
|
198
|
+
estimateCapacitySuffixWidth(capacityText, capacityIcon, META_FONT_SIZE_PX_LOCAL);
|
|
199
|
+
}
|
|
200
|
+
return { metaText, ownerDisplay, capacity, capacityTrailingWidth };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Footnote numbers attached to an item, ascending. Per `specs/dsl.md`,
|
|
204
|
+
* footnotes attach via the `on:` property on the footnote declaration
|
|
205
|
+
* only — there is no forward `footnote:` property on the host entity.
|
|
206
|
+
* Walk `footnoteHosts` (built from each footnote's `on:` list) and
|
|
207
|
+
* collect every footnote that names this item. The caption fit needs
|
|
208
|
+
* them, since the indicators narrow the title's first line.
|
|
209
|
+
*/
|
|
210
|
+
export function collectItemFootnoteIndicators(name, ctx) {
|
|
211
|
+
const set = new Set();
|
|
212
|
+
if (name) {
|
|
213
|
+
for (const [fid, hosts] of ctx.footnoteHosts.entries()) {
|
|
214
|
+
if (hosts.includes(name)) {
|
|
215
|
+
const n = ctx.footnoteIndex.get(fid);
|
|
216
|
+
if (n !== undefined)
|
|
217
|
+
set.add(n);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return [...set].sort((a, b) => a - b);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* How far the title's first line must stay from the bar's right edge so
|
|
225
|
+
* it clears the top-right decoration cluster.
|
|
226
|
+
*/
|
|
227
|
+
export function resolveTitleFirstLineReserve(barWidth, footnoteIndicators, beforeRaw) {
|
|
228
|
+
return itemTitleFirstLineRightReservePx({
|
|
229
|
+
barWidth,
|
|
230
|
+
footnoteLabels: footnoteIndicators.map(String),
|
|
231
|
+
hasBeforeGlyph: pickInlineDate(beforeRaw) !== undefined,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/** `StatusKind` to the key `Theme.status` and `Theme.statusTint` use. */
|
|
235
|
+
const THEME_STATUS_KEY = {
|
|
236
|
+
done: 'done',
|
|
237
|
+
'in-progress': 'inProgress',
|
|
238
|
+
'at-risk': 'atRisk',
|
|
239
|
+
blocked: 'blocked',
|
|
240
|
+
planned: 'planned',
|
|
241
|
+
neutral: 'neutral',
|
|
242
|
+
};
|
|
243
|
+
/**
|
|
244
|
+
* Copy of an item's resolved style with the theme's status tint as `bg` when
|
|
245
|
+
* `bg` is still `entities.item.bg`, and the status color as `fg` when `fg` is
|
|
246
|
+
* still `entities.item.fg`.
|
|
247
|
+
*/
|
|
248
|
+
function applyStatusTheme(resolved, status, theme) {
|
|
249
|
+
const key = THEME_STATUS_KEY[status];
|
|
250
|
+
const style = { ...resolved };
|
|
251
|
+
if (style.bg === theme.entities.item.bg) {
|
|
252
|
+
style.bg = theme.statusTint[key];
|
|
253
|
+
}
|
|
254
|
+
if (style.fg === theme.entities.item.fg) {
|
|
255
|
+
style.fg = theme.status[key];
|
|
256
|
+
}
|
|
257
|
+
return style;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Compute the extra vertical px the bar grows to fit its label chips
|
|
261
|
+
* (a spilled chip column, or inside-bar chips stacked below a caption
|
|
262
|
+
* that reaches past the default chip row). The bar's painted footprint
|
|
263
|
+
* becomes `bandwidth + chipBarExtra`, the progress strip rides the new
|
|
264
|
+
* bottom, and chip rows pack inside the taller bar (anchored from the
|
|
265
|
+
* bar TOP so row 0 doesn't shift when the bar grows).
|
|
266
|
+
*
|
|
267
|
+
* Returns 0 when chips fit inside the bar, when there are no chips,
|
|
268
|
+
* or when the spilled column happens to fit inside `bandwidth` (a
|
|
269
|
+
* single row with the caption inside, for instance).
|
|
270
|
+
*
|
|
271
|
+
* `captionLastBaseline` is the in-bar caption's last text baseline
|
|
272
|
+
* (px from the bar's top): the meta baseline when the item has a meta
|
|
273
|
+
* line, otherwise the last title line's baseline. A wrapped title
|
|
274
|
+
* pushes it down; see `itemCaptionLastBaselineOffset`.
|
|
275
|
+
*
|
|
276
|
+
* The bar's final growth is `max(titleBarExtra, chipBarExtra)`; the
|
|
277
|
+
* same number is the row-pitch increase the swimlane / group
|
|
278
|
+
* row-packer reserves so the next row clears the taller bar.
|
|
279
|
+
*/
|
|
280
|
+
export function computeChipBarExtra(chipsOutside, captionSpills, chipRowCount, bandwidth, captionLastBaseline) {
|
|
281
|
+
if (chipRowCount === 0)
|
|
282
|
+
return 0;
|
|
283
|
+
// Row 0 anchor relative to the bar's TOP — three regimes:
|
|
284
|
+
//
|
|
285
|
+
// 1. chipsOutside + captionSpills → chips stack below the
|
|
286
|
+
// spilled meta line. A break-free spilled caption is the
|
|
287
|
+
// single-line title + meta stack, so this clears the classic
|
|
288
|
+
// meta baseline; a spilled block with explicit breaks is
|
|
289
|
+
// taller, so it clears its own last baseline instead.
|
|
290
|
+
// 2. chips INSIDE the bar → chip top must clear the caption's
|
|
291
|
+
// last baseline (meta line, else the last title line); the
|
|
292
|
+
// natural `baseTop` sits ABOVE the meta line at default
|
|
293
|
+
// bandwidth (=56) and above line 2 of a wrapped title, so we
|
|
294
|
+
// take whichever is lower of base/captionStack. For a
|
|
295
|
+
// single-line title with no meta the caption bottom is above
|
|
296
|
+
// `baseTop`, so this is `baseTop`.
|
|
297
|
+
// 3. otherwise (chipsOutside w/o caption spill) → row 0 hugs
|
|
298
|
+
// the bar bottom at `baseTop`.
|
|
299
|
+
//
|
|
300
|
+
// Cases (2) and (3-with-multi-row-spill) can both grow the bar;
|
|
301
|
+
// case (3-with-single-row-inside-no-meta) never grows.
|
|
302
|
+
const baseTop = bandwidth -
|
|
303
|
+
PROGRESS_STRIP_HEIGHT_PX -
|
|
304
|
+
LABEL_CHIP_HEIGHT_PX -
|
|
305
|
+
LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX;
|
|
306
|
+
let chipRow0Top;
|
|
307
|
+
if (chipsOutside && captionSpills) {
|
|
308
|
+
chipRow0Top =
|
|
309
|
+
Math.max(ITEM_CAPTION_META_BASELINE_OFFSET_PX, captionLastBaseline) +
|
|
310
|
+
LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX;
|
|
311
|
+
}
|
|
312
|
+
else if (!chipsOutside) {
|
|
313
|
+
chipRow0Top = Math.max(baseTop, captionLastBaseline + LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
chipRow0Top = baseTop;
|
|
317
|
+
}
|
|
318
|
+
const lastRowBottomTop = chipRow0Top + (chipRowCount - 1) * LABEL_CHIP_ROW_STEP_PX + LABEL_CHIP_HEIGHT_PX;
|
|
319
|
+
// The bar must be tall enough to fit `lastRowBottomTop` plus a
|
|
320
|
+
// GAP above the progress strip plus the progress strip itself.
|
|
321
|
+
const requiredHeight = lastRowBottomTop + LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX + PROGRESS_STRIP_HEIGHT_PX;
|
|
322
|
+
return Math.max(0, requiredHeight - bandwidth);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Cap a spilled caption at the chart's end (specs/scheduler-unification.md
|
|
326
|
+
* §8 decision 12). When the spill column (`layoutSpillCluster`: icon,
|
|
327
|
+
* caption, footnotes, dot) would end past `AxisColumns.captionCapX`, the
|
|
328
|
+
* overhang budget past the axis end, every title line wider than the room
|
|
329
|
+
* left is truncated with `…` so the column ends there; finalize f2 grows the
|
|
330
|
+
* axis by the columns it reaches. The meta line is never truncated. A
|
|
331
|
+
* caption in the middle of the chart, or one that ends inside the budget,
|
|
332
|
+
* keeps its lines.
|
|
333
|
+
*/
|
|
334
|
+
function capCaptionAtAxisEnd(lines, input, ctx) {
|
|
335
|
+
const columns = ctx.axisColumns;
|
|
336
|
+
if (!input.textSpills || !columns)
|
|
337
|
+
return { lines, truncated: false };
|
|
338
|
+
const titleWidth = Math.max(0, ...lines.map((line) => estimateTextWidth(line, ITEM_CAPTION_TITLE_FONT_SIZE_PX)));
|
|
339
|
+
const { metaText, capacityTrailingWidth } = input.meta;
|
|
340
|
+
const metaWidth = (metaText ? estimateTextWidth(metaText, ITEM_CAPTION_META_FONT_SIZE_PX) : 0) +
|
|
341
|
+
capacityTrailingWidth;
|
|
342
|
+
const captionWidth = Math.max(titleWidth, metaWidth);
|
|
343
|
+
const spill = layoutSpillCluster({
|
|
344
|
+
barRightX: input.barRightX,
|
|
345
|
+
iconSpills: input.iconSpills,
|
|
346
|
+
captionWidth,
|
|
347
|
+
footnoteCount: input.visualWidth < MIN_BAR_WIDTH_FOR_FOOTNOTE_PX ? input.footnoteCount : 0,
|
|
348
|
+
dotSpills: input.visualWidth < MIN_BAR_WIDTH_FOR_DOT_PX,
|
|
349
|
+
});
|
|
350
|
+
const capX = columns.captionCapX(input.barRightX);
|
|
351
|
+
if (spill.rightX <= capX + CAPTION_CAP_TOLERANCE_PX || spill.captionX === null) {
|
|
352
|
+
return { lines, truncated: false };
|
|
353
|
+
}
|
|
354
|
+
// The room for a title line: up to the cap, less what trails the caption.
|
|
355
|
+
const trailing = spill.rightX - (spill.captionX + captionWidth);
|
|
356
|
+
const room = capX - spill.captionX - trailing;
|
|
357
|
+
let truncated = false;
|
|
358
|
+
const out = lines.map((line) => {
|
|
359
|
+
const fitted = ellipsizeToWidth(line, room, ITEM_CAPTION_TITLE_FONT_SIZE_PX);
|
|
360
|
+
if (fitted !== line)
|
|
361
|
+
truncated = true;
|
|
362
|
+
return fitted;
|
|
363
|
+
});
|
|
364
|
+
return { lines: out, truncated };
|
|
365
|
+
}
|
|
366
|
+
/** Pixel float noise the caption cap ignores. */
|
|
367
|
+
const CAPTION_CAP_TOLERANCE_PX = 1e-6;
|
|
368
|
+
/**
|
|
369
|
+
* Measure `node` as a bar starting at `startX`, the snapped start
|
|
370
|
+
* (`ctx.scale.startX`) it will be placed at. Pure: it writes nothing to
|
|
371
|
+
* `ctx`.
|
|
372
|
+
*/
|
|
373
|
+
export function measureItem(node, startX, ctx) {
|
|
374
|
+
const props = node.properties;
|
|
375
|
+
const resolvedStyle = resolveStyle('item', props, ctx.styleCtx);
|
|
376
|
+
// Sizing precedence (specs/dsl.md § "Sizing precedence"):
|
|
377
|
+
// 1. `duration:LITERAL` wins as the calendar duration — `size:NAME`
|
|
378
|
+
// becomes a pure annotation (chip only).
|
|
379
|
+
// 2. Otherwise, `size:NAME` derives `effort ÷ capacity` (default
|
|
380
|
+
// capacity = 1).
|
|
381
|
+
// The validator requires one of the two on every item.
|
|
382
|
+
const sizeRef = propValue(props, 'size');
|
|
383
|
+
const sizeResolved = sizeRef ? (ctx.sizes.get(sizeRef) ?? null) : null;
|
|
384
|
+
const durationDays = scheduledItemDays(ctx, node);
|
|
385
|
+
const afterRaw = propValues(props, 'after');
|
|
386
|
+
const beforeRaw = propValues(props, 'before');
|
|
387
|
+
// The bar spans exactly its dates (specs/true-width-layout.md §3.1):
|
|
388
|
+
// the logical width is the span, and the box `ItemNode` paints is that
|
|
389
|
+
// span less its seams, at least the 1 px floor.
|
|
390
|
+
const naturalWidth = itemSpanPx(ctx, startX, durationDays);
|
|
391
|
+
const visualWidth = itemVisualWidth(naturalWidth);
|
|
392
|
+
const link = parseLinkIcon(propValue(props, 'link'));
|
|
393
|
+
const hasLinkIcon = link.icon !== 'none';
|
|
394
|
+
// The chip row: every chip at its NATURAL text-fit width on a single
|
|
395
|
+
// horizontal row, never truncated. Only the total row width matters
|
|
396
|
+
// here, to decide whether the row fits inside the bar; `sequenceItem`
|
|
397
|
+
// places the chips once the bar box is known.
|
|
398
|
+
//
|
|
399
|
+
// Chips sit at the bar's bottom (just above the progress strip) and
|
|
400
|
+
// the link icon (when present) sits in the bar's UPPER-LEFT corner,
|
|
401
|
+
// so they never share a vertical band: chips have the full
|
|
402
|
+
// caption-inset-bounded inner width whether or not a link icon is
|
|
403
|
+
// rendered. The link-icon column's horizontal cost is borne by the
|
|
404
|
+
// caption (title/meta) inset instead, see `measureItemCaption`.
|
|
405
|
+
const naturalVisualWidth = itemVisualWidth(naturalWidth);
|
|
406
|
+
const labelIds = propValues(props, 'labels');
|
|
407
|
+
const chipSamples = [];
|
|
408
|
+
for (const labelId of labelIds) {
|
|
409
|
+
const label = ctx.labels.get(labelId);
|
|
410
|
+
if (!label)
|
|
411
|
+
continue;
|
|
412
|
+
const sample = buildLabelChip(label, ctx.styleCtx, 0, 0);
|
|
413
|
+
chipSamples.push({ id: label, width: sample.box.width });
|
|
414
|
+
}
|
|
415
|
+
let chipRowWidth = 0;
|
|
416
|
+
for (let i = 0; i < chipSamples.length; i += 1) {
|
|
417
|
+
if (i > 0)
|
|
418
|
+
chipRowWidth += LABEL_CHIP_GAP_BETWEEN_PX;
|
|
419
|
+
chipRowWidth += chipSamples[i].width;
|
|
420
|
+
}
|
|
421
|
+
const chipInsideAvailWidth = Math.max(0, naturalVisualWidth - 2 * ITEM_CAPTION_INSET_X_PX);
|
|
422
|
+
const chipsOutside = chipSamples.length > 0 && chipRowWidth > chipInsideAvailWidth;
|
|
423
|
+
const { status, progress } = resolveItemProgress(props, ctx);
|
|
424
|
+
// Apply the status-tinted item background and status border when the
|
|
425
|
+
// resolved bg / fg is still the theme default. Authors who set explicit
|
|
426
|
+
// `bg:` / `fg:` keep their override. Per m2d handoff Resolution 3: layout
|
|
427
|
+
// owns this so the renderer stays palette-dumb. The tokens live in the
|
|
428
|
+
// theme (`statusTint`, `status`); the style is copied, never mutated.
|
|
429
|
+
const style = applyStatusTheme(resolvedStyle, status, ctx.styleCtx.theme);
|
|
430
|
+
// The secondary line shown inside the item bar, plus the capacity
|
|
431
|
+
// suffix that renders after it.
|
|
432
|
+
const meta = resolveItemMeta(props, ctx, sizeResolved, status, progress, style.capacityIcon);
|
|
433
|
+
const title = node.title ?? node.name ?? '';
|
|
434
|
+
// Footnote indicators and the `before:` glyph share the bar's
|
|
435
|
+
// upper-right with the title's first line, so resolve them BEFORE the
|
|
436
|
+
// caption is fit: the first line stops short of that cluster.
|
|
437
|
+
const footnoteIndicators = collectItemFootnoteIndicators(node.name, ctx);
|
|
438
|
+
const captionFit = measureItemCaption({
|
|
439
|
+
title,
|
|
440
|
+
visualWidth,
|
|
441
|
+
metaText: meta.metaText,
|
|
442
|
+
metaTrailingWidth: meta.capacityTrailingWidth,
|
|
443
|
+
hasLinkIcon,
|
|
444
|
+
hasAfterGlyph: pickInlineDate(afterRaw) !== undefined,
|
|
445
|
+
titleFirstLineRightReservePx: resolveTitleFirstLineReserve(naturalVisualWidth, footnoteIndicators, beforeRaw),
|
|
446
|
+
});
|
|
447
|
+
// A bar too narrow for the link icon spills it, and the caption with
|
|
448
|
+
// it, so the icon and the title stay adjacent; see `sequenceItem`.
|
|
449
|
+
const iconSpills = hasLinkIcon && visualWidth < MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX;
|
|
450
|
+
const textSpills = captionFit.fit.textSpills || iconSpills;
|
|
451
|
+
// The lines the title paints on. A title that word-wrapped INSIDE the
|
|
452
|
+
// bar paints on two lines; if a narrow-bar icon spill forces the caption
|
|
453
|
+
// out anyway, that wrap is dropped (a spilled break-free title is a
|
|
454
|
+
// single line to the right). A title with explicit `\n` breaks keeps the
|
|
455
|
+
// author's lines whether it stays in-bar or spills.
|
|
456
|
+
// A spilled caption that would run past the axis end is truncated to
|
|
457
|
+
// end within the overhang budget past it (specs/rendering.md § "Caption
|
|
458
|
+
// cap at the chart's end").
|
|
459
|
+
const capped = capCaptionAtAxisEnd(resolveCaptionTitleLines(title, captionFit.fit, iconSpills), {
|
|
460
|
+
textSpills,
|
|
461
|
+
iconSpills,
|
|
462
|
+
barRightX: startX + itemBarInsetPx(naturalWidth) + visualWidth,
|
|
463
|
+
visualWidth,
|
|
464
|
+
footnoteCount: footnoteIndicators.length,
|
|
465
|
+
meta,
|
|
466
|
+
}, ctx);
|
|
467
|
+
const lines = capped.lines;
|
|
468
|
+
// A chip set that does not fit inside the bar moves to the spill column
|
|
469
|
+
// and packs into rows capped at the bar's visual width.
|
|
470
|
+
const chipPack = chipsOutside ? packSpillChips(chipSamples, visualWidth) : null;
|
|
471
|
+
const chipRowCount = chipPack ? chipPack.rows.length : chipSamples.length > 0 ? 1 : 0;
|
|
472
|
+
// Capacity suffix renders on the same line as metaText. Treat the meta
|
|
473
|
+
// line as present whenever EITHER metaText OR a capacity suffix will
|
|
474
|
+
// paint, so chip-row pitch reserves the right amount of vertical space.
|
|
475
|
+
const hasMeta = meta.metaText !== undefined || meta.capacity !== null;
|
|
476
|
+
// Baseline (px from the bar's top) of the caption's last line: the
|
|
477
|
+
// meta line when present, else the last title line. Chips stacked
|
|
478
|
+
// inside the bar must clear it.
|
|
479
|
+
const lastBaseline = itemCaptionLastBaselineOffset(lines.length, hasMeta);
|
|
480
|
+
const titleBarExtra = computeTitleBarExtra(lines.length, hasMeta);
|
|
481
|
+
const chipBarExtra = computeChipBarExtra(chipsOutside, textSpills, chipRowCount, ctx.bandScale.bandwidth(), lastBaseline);
|
|
482
|
+
return {
|
|
483
|
+
node,
|
|
484
|
+
id: node.name ?? '',
|
|
485
|
+
startX,
|
|
486
|
+
durationDays,
|
|
487
|
+
naturalWidth,
|
|
488
|
+
visualWidth,
|
|
489
|
+
naturalVisualWidth,
|
|
490
|
+
style,
|
|
491
|
+
size: sizeResolved,
|
|
492
|
+
status,
|
|
493
|
+
progress,
|
|
494
|
+
meta,
|
|
495
|
+
link,
|
|
496
|
+
chips: {
|
|
497
|
+
samples: chipSamples,
|
|
498
|
+
outside: chipsOutside,
|
|
499
|
+
pack: chipPack,
|
|
500
|
+
rowCount: chipRowCount,
|
|
501
|
+
},
|
|
502
|
+
footnoteIndicators,
|
|
503
|
+
caption: {
|
|
504
|
+
...captionFit,
|
|
505
|
+
title,
|
|
506
|
+
iconSpills,
|
|
507
|
+
lines,
|
|
508
|
+
truncated: capped.truncated,
|
|
509
|
+
lastBaseline,
|
|
510
|
+
},
|
|
511
|
+
barExtra: Math.max(titleBarExtra, chipBarExtra),
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=item-measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-measure.js","sourceRoot":"","sources":["../../src/nodes/item-measure.ts"],"names":[],"mappings":"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"}
|