@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,225 @@
|
|
|
1
|
+
// Phase 3, place (specs/layout-phases.md §3.4): the root context, the
|
|
2
|
+
// entity-edge seeds from the date-pinned markers, the footnote index, the
|
|
3
|
+
// lanes inside the wave barrier driver (P1), the corridor rerun (P2), the
|
|
4
|
+
// kept isolated regions (P4), the chart bottom (P5) and the milestones (P6).
|
|
5
|
+
//
|
|
6
|
+
// Placement never reads the canvas: lanes leave their width to finalize,
|
|
7
|
+
// regions are fitted only there, and milestones get their marker row and
|
|
8
|
+
// label box from the final pack. It places on the natural scale, which
|
|
9
|
+
// finalize may extend but never re-places on.
|
|
10
|
+
//
|
|
11
|
+
// Placement lays the chart out in local coordinates, with its top at y 0:
|
|
12
|
+
// lanes, regions, milestone cut lines and slack arrows. The chart's top on
|
|
13
|
+
// the canvas is known only once the header rows above it stop growing, so
|
|
14
|
+
// finalize translates the whole chart there, once (f7).
|
|
15
|
+
import { AxisColumns } from '../axis-columns.js';
|
|
16
|
+
import { defaultRowBand } from '../band-scale.js';
|
|
17
|
+
import { localeStrings } from '../i18n.js';
|
|
18
|
+
import { createLayoutContext } from '../layout-context.js';
|
|
19
|
+
import { indexFootnotes } from '../nodes/footnote-node.js';
|
|
20
|
+
import { buildIncludeRegions } from '../nodes/include-node.js';
|
|
21
|
+
import { buildMilestones, collectSlackCorridors, } from '../nodes/milestone-node.js';
|
|
22
|
+
import { SwimlaneNode } from '../nodes/swimlane-node.js';
|
|
23
|
+
import { hasVisibleWaves } from '../schedule.js';
|
|
24
|
+
import { isScheduleWarmStart } from '../start-rules.js';
|
|
25
|
+
import { resolveStyle } from '../style-resolution.js';
|
|
26
|
+
import { SPACING_PX } from '../themes/shared.js';
|
|
27
|
+
import { solveWaveBarriers } from '../wave-barrier.js';
|
|
28
|
+
import { beginWavePass, createWaveLayoutState, freezeWaves, seedWaveEdges, WAVE_EDGE_TOLERANCE_PX, } from '../wave-layout.js';
|
|
29
|
+
/** Gap (px) between the last lane and the first isolated region's tab. */
|
|
30
|
+
const LANES_TO_REGIONS_GAP_PX = 8;
|
|
31
|
+
export function placeChart(resolved, scope, window, measured, helpers) {
|
|
32
|
+
const { theme, styleCtx } = scope;
|
|
33
|
+
const { cal, calendar, schedule } = window;
|
|
34
|
+
const plan = schedule.plan;
|
|
35
|
+
const { originX, scale: timeScale } = measured.axis;
|
|
36
|
+
const { timeline } = measured;
|
|
37
|
+
// Footnotes index must exist before sequencing items reference
|
|
38
|
+
// them.
|
|
39
|
+
const ctx = createLayoutContext(resolved, {
|
|
40
|
+
theme,
|
|
41
|
+
cal,
|
|
42
|
+
schedule,
|
|
43
|
+
timeline,
|
|
44
|
+
scale: timeScale,
|
|
45
|
+
calendar,
|
|
46
|
+
axisColumns: new AxisColumns(window, timeScale),
|
|
47
|
+
bandScale: defaultRowBand(),
|
|
48
|
+
waves: plan
|
|
49
|
+
? createWaveLayoutState(plan, timeScale, originX, localeStrings(scope.locale).waveBackgroundItem, hasVisibleWaves(schedule))
|
|
50
|
+
: undefined,
|
|
51
|
+
}, {
|
|
52
|
+
chartTopY: 0,
|
|
53
|
+
chartBottomY: 0,
|
|
54
|
+
swimlaneBottomY: 0,
|
|
55
|
+
}, {
|
|
56
|
+
footnotes: indexFootnotes(resolved.content.footnotes),
|
|
57
|
+
// A copy: the final pack (P10) replaces the context's
|
|
58
|
+
// placements, and the estimate stays as measured.
|
|
59
|
+
markerRowPlacements: new Map(measured.markers.placements),
|
|
60
|
+
});
|
|
61
|
+
// Seed the entity-edge maps from the date-pinned pack so item
|
|
62
|
+
// `after:kickoff` references resolve before swimlanes run. Mid
|
|
63
|
+
// points use the row-aware centerY so dependency arrows from the
|
|
64
|
+
// anchor land on the diamond's actual row.
|
|
65
|
+
for (const e of measured.markers.datePinned) {
|
|
66
|
+
const placement = ctx.markerRowPlacements.get(e.id);
|
|
67
|
+
if (!placement)
|
|
68
|
+
continue;
|
|
69
|
+
ctx.entityLeftEdges.set(e.id, e.centerX);
|
|
70
|
+
ctx.entityRightEdges.set(e.id, e.centerX);
|
|
71
|
+
ctx.entityMidpoints.set(e.id, { x: e.centerX, y: placement.centerY });
|
|
72
|
+
}
|
|
73
|
+
// Snapshot the entity maps after pre-positioning so we can reset
|
|
74
|
+
// them between the two swimlane passes. Date-pinned anchors and
|
|
75
|
+
// milestones live in this baseline; item-derived entries get
|
|
76
|
+
// re-added on each pass.
|
|
77
|
+
const baselineEntityLeft = new Map(ctx.entityLeftEdges);
|
|
78
|
+
const baselineEntityRight = new Map(ctx.entityRightEdges);
|
|
79
|
+
const baselineEntityMid = new Map(ctx.entityMidpoints);
|
|
80
|
+
// Item-only maps don't carry baseline entries (date-pinned
|
|
81
|
+
// markers are never placed items), so pass-2 reruns reset them
|
|
82
|
+
// to fresh empties. With waves, every reset re-seeds the wave
|
|
83
|
+
// edges (`entityRightEdges[w_k] = E_k`, `entityLeftEdges[w_k] =
|
|
84
|
+
// S_k`) on top of the baseline, so forward references stay
|
|
85
|
+
// dropped exactly as they are without waves.
|
|
86
|
+
const resetEntityMaps = () => {
|
|
87
|
+
ctx.entityLeftEdges = new Map(baselineEntityLeft);
|
|
88
|
+
ctx.entityRightEdges = new Map(baselineEntityRight);
|
|
89
|
+
ctx.entityMidpoints = new Map(baselineEntityMid);
|
|
90
|
+
// placedItems and itemFlowKey only ever hold item entries
|
|
91
|
+
// (markers never write to them), so a fresh map is the right
|
|
92
|
+
// reset: the next pass's items will repopulate.
|
|
93
|
+
ctx.placedItems = new Map();
|
|
94
|
+
ctx.itemFlowKey = new Map();
|
|
95
|
+
ctx.currentFlowKey = '';
|
|
96
|
+
if (ctx.waves)
|
|
97
|
+
seedWaveEdges(ctx.waves, ctx.entityLeftEdges, ctx.entityRightEdges);
|
|
98
|
+
};
|
|
99
|
+
// Build swimlanes (declared order). Inter-band gap comes from
|
|
100
|
+
// the swimlane default style's `spacing` bucket. Default
|
|
101
|
+
// `spacing: none` keeps existing samples byte-stable; bumping to
|
|
102
|
+
// `md` introduces an 8 px gap.
|
|
103
|
+
const laneEntries = [...resolved.content.swimlanes.values()];
|
|
104
|
+
const swimlaneDefaultStyle = resolveStyle('swimlane', [], styleCtx);
|
|
105
|
+
const interBandGapPx = SPACING_PX[swimlaneDefaultStyle.spacing] ?? 0;
|
|
106
|
+
const runSwimlaneLoop = () => {
|
|
107
|
+
ctx.nextParallelId = 0;
|
|
108
|
+
ctx.nextGroupId = 0;
|
|
109
|
+
const out = [];
|
|
110
|
+
let cursorY = ctx.chartTopY;
|
|
111
|
+
let bIndex = 0;
|
|
112
|
+
let maxRightX = ctx.timeline.originX;
|
|
113
|
+
for (const lane of laneEntries) {
|
|
114
|
+
if (bIndex > 0)
|
|
115
|
+
cursorY += interBandGapPx;
|
|
116
|
+
const { positioned, usedHeight, usedRightX } = new SwimlaneNode({ lane, bandIndex: bIndex }, helpers).place({ x: ctx.timeline.originX, y: cursorY }, ctx);
|
|
117
|
+
out.push(positioned);
|
|
118
|
+
cursorY += usedHeight;
|
|
119
|
+
if (usedRightX > maxRightX)
|
|
120
|
+
maxRightX = usedRightX;
|
|
121
|
+
bIndex++;
|
|
122
|
+
}
|
|
123
|
+
return { swimlanes: out, nextY: cursorY, maxRightX };
|
|
124
|
+
};
|
|
125
|
+
const isolated = resolved.content.isolatedRegions;
|
|
126
|
+
// Pass 1 — place items without corridor knowledge. With waves
|
|
127
|
+
// (specs/waves.md §8.3-§8.4) it is the barrier driver's pass
|
|
128
|
+
// loop: each pass resets the maps, re-seeds the wave edges, places
|
|
129
|
+
// the lanes with the pass's floors, then places the isolated
|
|
130
|
+
// regions only to accumulate their members (those region
|
|
131
|
+
// placements are discarded). The driver iterates to the least
|
|
132
|
+
// fixpoint; its last pass ran with the solved S/E, so its lane
|
|
133
|
+
// placements are kept.
|
|
134
|
+
let pass;
|
|
135
|
+
let waveSolve;
|
|
136
|
+
const waves = ctx.waves;
|
|
137
|
+
if (waves) {
|
|
138
|
+
let last;
|
|
139
|
+
// Warm start (specs/scheduler-unification.md §5, F4): engine C's
|
|
140
|
+
// `S_k` and `E_k`, projected, are a lower bound of engine A's, so
|
|
141
|
+
// the passes start from them and settle on the same fixpoint in
|
|
142
|
+
// fewer passes.
|
|
143
|
+
const seed = isScheduleWarmStart() ? waveSeed(waves.ids, schedule, timeScale) : undefined;
|
|
144
|
+
const solved = solveWaveBarriers(waves.ids.length, waves.origin, waves.floors, (S, E) => {
|
|
145
|
+
beginWavePass(waves, S, E);
|
|
146
|
+
resetEntityMaps();
|
|
147
|
+
last = runSwimlaneLoop();
|
|
148
|
+
if (isolated.length > 0) {
|
|
149
|
+
buildIncludeRegions(isolated, ctx, last.nextY + LANES_TO_REGIONS_GAP_PX, helpers, measured.naturalChartRightX);
|
|
150
|
+
}
|
|
151
|
+
return waves.pass;
|
|
152
|
+
}, WAVE_EDGE_TOLERANCE_PX, seed);
|
|
153
|
+
// From here on the barrier is frozen: later placements floor
|
|
154
|
+
// with the solved S/E and accumulate nothing.
|
|
155
|
+
freezeWaves(waves, solved);
|
|
156
|
+
waveSolve = { passes: solved.passes, capped: solved.capped };
|
|
157
|
+
pass = last;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
pass = runSwimlaneLoop();
|
|
161
|
+
}
|
|
162
|
+
let swimlanes = pass.swimlanes;
|
|
163
|
+
let y = pass.nextY;
|
|
164
|
+
// Collect slack-arrow corridors from the milestones (mirrors
|
|
165
|
+
// MilestoneNode.place's pred resolution). When the result is
|
|
166
|
+
// non-empty, an item sat inside an arrow's path on pass 1 — rerun
|
|
167
|
+
// the swimlane loop with corridors known so the row-packer can
|
|
168
|
+
// bump the offending items down to a clear row. Bumping never
|
|
169
|
+
// changes an item's x, so corridors stay valid across the rerun;
|
|
170
|
+
// no fixed-point iteration needed. With waves the rerun runs once,
|
|
171
|
+
// after the barrier has settled: it floors with the frozen S/E,
|
|
172
|
+
// and the reset re-seeds the wave edges.
|
|
173
|
+
const corridors = collectSlackCorridors(resolved.content.milestones, ctx);
|
|
174
|
+
if (corridors.length > 0) {
|
|
175
|
+
resetEntityMaps();
|
|
176
|
+
ctx.slackCorridors = corridors;
|
|
177
|
+
pass = runSwimlaneLoop();
|
|
178
|
+
swimlanes = pass.swimlanes;
|
|
179
|
+
y = pass.nextY;
|
|
180
|
+
}
|
|
181
|
+
// Include regions under the swimlanes. Reserve the 8 px gap +
|
|
182
|
+
// tab-reserve only when there's at least one isolated region —
|
|
183
|
+
// otherwise the now-line and chart bottom would extend past the
|
|
184
|
+
// last swimlane into empty space. With waves this is the one kept
|
|
185
|
+
// region placement, floored with the frozen S/E.
|
|
186
|
+
let includes = [];
|
|
187
|
+
let regionContexts = [];
|
|
188
|
+
if (isolated.length > 0) {
|
|
189
|
+
const r = buildIncludeRegions(isolated, ctx, y + LANES_TO_REGIONS_GAP_PX, helpers, measured.naturalChartRightX);
|
|
190
|
+
includes = r.regions;
|
|
191
|
+
regionContexts = r.contexts;
|
|
192
|
+
y = r.endY;
|
|
193
|
+
}
|
|
194
|
+
ctx.chartBottomY = y;
|
|
195
|
+
ctx.swimlaneBottomY = y;
|
|
196
|
+
// Milestones first so anchors know which xs are occupied (for
|
|
197
|
+
// collision bumps). Placement gives each its x, slack arrows and
|
|
198
|
+
// overrun; its marker row and label box come from the final pack in
|
|
199
|
+
// finalize, once every centerX is known and the canvas is final.
|
|
200
|
+
const milestones = buildMilestones(resolved.content.milestones, ctx);
|
|
201
|
+
return {
|
|
202
|
+
ctx,
|
|
203
|
+
swimlanes,
|
|
204
|
+
includes,
|
|
205
|
+
regionContexts,
|
|
206
|
+
milestones,
|
|
207
|
+
laneEntries,
|
|
208
|
+
maxRightX: pass.maxRightX,
|
|
209
|
+
bottomY: y,
|
|
210
|
+
...(waveSolve ? { waveSolve } : {}),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* The barrier driver's warm start: engine C's wave spans projected to px
|
|
215
|
+
* (`start` is `S_k`; the exclusive `end` projects to `E_k`). A wave C did
|
|
216
|
+
* not schedule seeds nothing.
|
|
217
|
+
*/
|
|
218
|
+
function waveSeed(ids, schedule, scale) {
|
|
219
|
+
const spans = ids.map((id) => schedule.waves?.get(id));
|
|
220
|
+
return {
|
|
221
|
+
S: spans.map((w) => (w ? scale.forward(w.start) : null)),
|
|
222
|
+
E: spans.map((w) => (w ? scale.forward(w.end) : null)),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=place.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"place.js","sourceRoot":"","sources":["../../src/phases/place.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,uEAAuE;AACvE,8CAA8C;AAC9C,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,wDAAwD;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAA0C,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACH,eAAe,EACf,qBAAqB,GAExB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAwB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACH,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,sBAAsB,GACzB,MAAM,mBAAmB,CAAC;AAI3B,0EAA0E;AAC1E,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAuBlC,MAAM,UAAU,UAAU,CACtB,QAAuB,EACvB,KAAmB,EACnB,MAAkB,EAClB,QAAyB,EACzB,OAAsB;IAEtB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAE9B,+DAA+D;IAC/D,QAAQ;IACR,MAAM,GAAG,GAAG,mBAAmB,CAC3B,QAAQ,EACR;QACI,KAAK;QACL,GAAG;QACH,QAAQ;QACR,QAAQ;QACR,KAAK,EAAE,SAAS;QAChB,QAAQ;QACR,WAAW,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,cAAc,EAAE;QAC3B,KAAK,EAAE,IAAI;YACP,CAAC,CAAC,qBAAqB,CACjB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,kBAAkB,EAC9C,eAAe,CAAC,QAAQ,CAAC,CAC5B;YACH,CAAC,CAAC,SAAS;KAClB,EACD;QACI,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;KACrB,EACD;QACI,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QACrD,sDAAsD;QACtD,kDAAkD;QAClD,mBAAmB,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;KAC5D,CACJ,CAAC;IAEF,8DAA8D;IAC9D,+DAA+D;IAC/D,iEAAiE;IACjE,2CAA2C;IAC3C,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACzC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1C,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,iEAAiE;IACjE,gEAAgE;IAChE,6DAA6D;IAC7D,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACxD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACvD,2DAA2D;IAC3D,+DAA+D;IAC/D,8DAA8D;IAC9D,gEAAgE;IAChE,2DAA2D;IAC3D,6CAA6C;IAC7C,MAAM,eAAe,GAAG,GAAS,EAAE;QAC/B,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClD,GAAG,CAAC,gBAAgB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACpD,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjD,0DAA0D;QAC1D,6DAA6D;QAC7D,gDAAgD;QAChD,GAAG,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,GAAG,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,KAAK;YAAE,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvF,CAAC,CAAC;IAEF,8DAA8D;IAC9D,yDAAyD;IACzD,iEAAiE;IACjE,+BAA+B;IAC/B,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,MAAM,oBAAoB,GAAG,YAAY,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,UAAU,CAAC,oBAAoB,CAAC,OAAkC,CAAC,IAAI,CAAC,CAAC;IAEhG,MAAM,eAAe,GAAG,GAItB,EAAE;QACA,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;QACvB,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,GAAG,GAAyB,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC7B,IAAI,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,cAAc,CAAC;YAC1C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,YAAY,CAC3D,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAC3B,OAAO,CACV,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,OAAO,IAAI,UAAU,CAAC;YACtB,IAAI,UAAU,GAAG,SAAS;gBAAE,SAAS,GAAG,UAAU,CAAC;YACnD,MAAM,EAAE,CAAC;QACb,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;IAElD,8DAA8D;IAC9D,6DAA6D;IAC7D,mEAAmE;IACnE,6DAA6D;IAC7D,yDAAyD;IACzD,8DAA8D;IAC9D,+DAA+D;IAC/D,uBAAuB;IACvB,IAAI,IAAwC,CAAC;IAC7C,IAAI,SAAyC,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,KAAK,EAAE,CAAC;QACR,IAAI,IAAoD,CAAC;QACzD,iEAAiE;QACjE,kEAAkE;QAClE,gEAAgE;QAChE,gBAAgB;QAChB,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,MAAM,GAAG,iBAAiB,CAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,EAChB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,EACZ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACL,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,eAAe,EAAE,CAAC;YAClB,IAAI,GAAG,eAAe,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,mBAAmB,CACf,QAAQ,EACR,GAAG,EACH,IAAI,CAAC,KAAK,GAAG,uBAAuB,EACpC,OAAO,EACP,QAAQ,CAAC,kBAAkB,CAC9B,CAAC;YACN,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC;QACtB,CAAC,EACD,sBAAsB,EACtB,IAAI,CACP,CAAC;QACF,6DAA6D;QAC7D,8CAA8C;QAC9C,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3B,SAAS,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7D,IAAI,GAAG,IAA0C,CAAC;IACtD,CAAC;SAAM,CAAC;QACJ,IAAI,GAAG,eAAe,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAEnB,6DAA6D;IAC7D,6DAA6D;IAC7D,kEAAkE;IAClE,+DAA+D;IAC/D,8DAA8D;IAC9D,iEAAiE;IACjE,mEAAmE;IACnE,gEAAgE;IAChE,yCAAyC;IACzC,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,eAAe,EAAE,CAAC;QAClB,GAAG,CAAC,cAAc,GAAG,SAAS,CAAC;QAC/B,IAAI,GAAG,eAAe,EAAE,CAAC;QACzB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3B,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,8DAA8D;IAC9D,+DAA+D;IAC/D,gEAAgE;IAChE,kEAAkE;IAClE,iDAAiD;IACjD,IAAI,QAAQ,GAA8B,EAAE,CAAC;IAC7C,IAAI,cAAc,GAAoB,EAAE,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,mBAAmB,CACzB,QAAQ,EACR,GAAG,EACH,CAAC,GAAG,uBAAuB,EAC3B,OAAO,EACP,QAAQ,CAAC,kBAAkB,CAC9B,CAAC;QACF,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC;QACrB,cAAc,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC5B,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACf,CAAC;IAED,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;IACrB,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;IAExB,8DAA8D;IAC9D,iEAAiE;IACjE,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAErE,OAAO;QACH,GAAG;QACH,SAAS;QACT,QAAQ;QACR,cAAc;QACd,UAAU;QACV,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,CAAC;QACV,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CACb,GAAsB,EACtB,QAAyB,EACzB,KAAgB;IAEhB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO;QACH,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KACzD,CAAC;AACN,CAAC"}
|
package/dist/renderable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderable.d.ts","sourceRoot":"","sources":["../src/renderable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderable.d.ts","sourceRoot":"","sources":["../src/renderable.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,KAAK;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC1B;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAChD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU,CAAC,WAAW;IACnC,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,aAAa,CAAC;IAC5C,gEAAgE;IAChE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAG,WAAW,CAAC;CACxD"}
|
package/dist/renderable.js
CHANGED
|
@@ -14,8 +14,28 @@
|
|
|
14
14
|
// Recursively places children inside this call.
|
|
15
15
|
//
|
|
16
16
|
// `place` may invoke `measure` again — implementations should make
|
|
17
|
-
// `measure` cheap.
|
|
18
|
-
//
|
|
19
|
-
//
|
|
17
|
+
// `measure` cheap: O(content), without I/O. Of the production nodes
|
|
18
|
+
// only `ItemNode` implements the interface (below).
|
|
19
|
+
//
|
|
20
|
+
// Which nodes measure (specs/layout-phases.md, §3.6 and §3.7):
|
|
21
|
+
//
|
|
22
|
+
// - `ItemNode` implements `Renderable`, and its measure is complete:
|
|
23
|
+
// `measureItem` (`nodes/item-measure.ts`) sizes the bar once, wrapped
|
|
24
|
+
// title and chip growth included, and the row track takes the row
|
|
25
|
+
// pitch from it before the item is placed. Nothing patches a placed
|
|
26
|
+
// item's height afterwards.
|
|
27
|
+
// - Lanes, groups and parallels do not measure. Their height is the
|
|
28
|
+
// result of row packing on x positions, so measuring them would be
|
|
29
|
+
// placing them twice; they stay single-pass (`sequenceRowTrack`).
|
|
30
|
+
// Anchors, milestones, include regions and the footnote panel place
|
|
31
|
+
// directly as well.
|
|
32
|
+
// - `HeaderNode` has `measure()` and `place()` of its own and does not
|
|
33
|
+
// take this signature: it has no time scale or band to measure
|
|
34
|
+
// against. Its logo slot and text inset live there; drawing the logo
|
|
35
|
+
// stays in the renderer.
|
|
36
|
+
// - The roadmap itself is split by phase, not by node: the measure
|
|
37
|
+
// phase (`phases/measure.ts`) sizes the header, the axis and the
|
|
38
|
+
// header rows before any lane is placed, and the finalize phase
|
|
39
|
+
// (`phases/finalize.ts`) runs everything that needs final geometry.
|
|
20
40
|
export {};
|
|
21
41
|
//# sourceMappingURL=renderable.js.map
|
package/dist/renderable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderable.js","sourceRoot":"","sources":["../src/renderable.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,oEAAoE;AACpE,sEAAsE;AACtE,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,qCAAqC;AACrC,sEAAsE;AACtE,iEAAiE;AACjE,EAAE;AACF,yCAAyC;AACzC,mEAAmE;AACnE,qDAAqD;AACrD,EAAE;AACF,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"renderable.js","sourceRoot":"","sources":["../src/renderable.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,oEAAoE;AACpE,sEAAsE;AACtE,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,qCAAqC;AACrC,sEAAsE;AACtE,iEAAiE;AACjE,EAAE;AACF,yCAAyC;AACzC,mEAAmE;AACnE,qDAAqD;AACrD,EAAE;AACF,mEAAmE;AACnE,oEAAoE;AACpE,oDAAoD;AACpD,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,wEAAwE;AACxE,gCAAgC;AAChC,sEAAsE;AACtE,uEAAuE;AACvE,sEAAsE;AACtE,wEAAwE;AACxE,wBAAwB;AACxB,yEAAyE;AACzE,mEAAmE;AACnE,yEAAyE;AACzE,6BAA6B;AAC7B,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AACpE,wEAAwE"}
|
package/dist/resolve-today.d.ts
CHANGED
|
@@ -44,6 +44,13 @@ export declare function normalizeZone(raw: string | undefined): NormalizedZone;
|
|
|
44
44
|
* for authored dates).
|
|
45
45
|
*/
|
|
46
46
|
export declare function civilDateInZone(instant: Date, zone: NormalizedZone): Date;
|
|
47
|
+
/**
|
|
48
|
+
* True when `raw` has one of the `now` string shapes but its leading
|
|
49
|
+
* `YYYY-MM-DD` is not a real calendar day (`2026-02-30`). {@link resolveToday}
|
|
50
|
+
* returns undefined for such a value, as for any unrecognised string; this
|
|
51
|
+
* lets an option parser say why.
|
|
52
|
+
*/
|
|
53
|
+
export declare function hasImpossibleNowDate(raw: string): boolean;
|
|
47
54
|
export interface ResolveTodayOptions {
|
|
48
55
|
/**
|
|
49
56
|
* Raw now value: the CLI's `--now` string, a pre-resolved `Date`, `null`
|
|
@@ -77,11 +84,14 @@ export interface ResolveTodayOptions {
|
|
|
77
84
|
* Precedence (from highest to lowest):
|
|
78
85
|
* 1. `now === '-'` / `null` → `undefined` (suppress)
|
|
79
86
|
* 2. `now` is a `Date` object → returned as-is (caller must supply UTC midnight)
|
|
80
|
-
* 3. `now` bare `YYYY-MM-DD` → floating;
|
|
87
|
+
* 3. `now` bare `YYYY-MM-DD` → floating; UTC midnight of that day regardless of zone
|
|
81
88
|
* 4. `now` ISO 8601 + Z/offset → embedded offset wins; zone ignored
|
|
82
89
|
* 5. `now` ISO 8601 without offset→ floating; written date part; zone ignored
|
|
83
90
|
* 6. `now` omitted → civil date of `clock()` in effective `zone`
|
|
84
91
|
*
|
|
92
|
+
* A string whose `YYYY-MM-DD` is not a real calendar day (`2026-02-30`) is
|
|
93
|
+
* rejected like an unrecognised one, never rolled over to the next month.
|
|
94
|
+
*
|
|
85
95
|
* The `zone` is ONLY consulted for case 6 (clock-based default). Authored
|
|
86
96
|
* dates — item bars, milestones, anchors, the axis ticks — are floating and
|
|
87
97
|
* are never affected by this function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-today.d.ts","sourceRoot":"","sources":["../src/resolve-today.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolve-today.d.ts","sourceRoot":"","sources":["../src/resolve-today.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;;GAGG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACpC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACJ;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAgCrE;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAsCzE;AAYD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIzD;AAID,MAAM,WAAW,mBAAmB;IAChC;;;;;;;;;OASG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,IAAI,GAAG,SAAS,CAmD7E"}
|
package/dist/resolve-today.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
// an embedded ISO 8601 offset/Z, that offset determines the civil day; the
|
|
20
20
|
// --timezone is ignored. --timezone only governs the clock-based default
|
|
21
21
|
// (when --now is omitted).
|
|
22
|
+
import { ISO_DATE_RE, isRealIsoDate, parseIsoDate } from '@nowline/core/internal';
|
|
22
23
|
/**
|
|
23
24
|
* Thrown by {@link normalizeZone} when the raw timezone string is not
|
|
24
25
|
* recognised. CLI surfaces catch this and re-throw as `CliError`.
|
|
@@ -123,14 +124,21 @@ export function civilDateInZone(instant, zone) {
|
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
// ---- Now-value parsing ------------------------------------------------------
|
|
126
|
-
// Bare YYYY-MM-DD (floating date, zone-independent)
|
|
127
|
-
const BARE_DATE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
128
127
|
// ISO 8601 instant with explicit Z or ±HH / ±HH:MM / ±HHMM offset.
|
|
129
128
|
// Captures: [1] datetime part, [2] sign or Z, [3] hours, [4] minutes (optional)
|
|
130
129
|
const ISO_WITH_OFFSET_RE = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?)(Z|([+-])(\d{2})(?::?(\d{2}))?)$/;
|
|
131
130
|
// ISO 8601 with time but no offset (floating local date-time).
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
const ISO_FLOATING_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?$/;
|
|
132
|
+
/**
|
|
133
|
+
* True when `raw` has one of the `now` string shapes but its leading
|
|
134
|
+
* `YYYY-MM-DD` is not a real calendar day (`2026-02-30`). {@link resolveToday}
|
|
135
|
+
* returns undefined for such a value, as for any unrecognised string; this
|
|
136
|
+
* lets an option parser say why.
|
|
137
|
+
*/
|
|
138
|
+
export function hasImpossibleNowDate(raw) {
|
|
139
|
+
const isNowShape = ISO_DATE_RE.test(raw) || ISO_WITH_OFFSET_RE.test(raw) || ISO_FLOATING_RE.test(raw);
|
|
140
|
+
return isNowShape && !isRealIsoDate(raw.slice(0, 10));
|
|
141
|
+
}
|
|
134
142
|
/**
|
|
135
143
|
* Resolve the now-line anchor date.
|
|
136
144
|
*
|
|
@@ -140,11 +148,14 @@ const ISO_FLOATING_RE = /^(\d{4})-(\d{2})-(\d{2})T\d{2}:\d{2}:\d{2}(?:\.\d+)?$/;
|
|
|
140
148
|
* Precedence (from highest to lowest):
|
|
141
149
|
* 1. `now === '-'` / `null` → `undefined` (suppress)
|
|
142
150
|
* 2. `now` is a `Date` object → returned as-is (caller must supply UTC midnight)
|
|
143
|
-
* 3. `now` bare `YYYY-MM-DD` → floating;
|
|
151
|
+
* 3. `now` bare `YYYY-MM-DD` → floating; UTC midnight of that day regardless of zone
|
|
144
152
|
* 4. `now` ISO 8601 + Z/offset → embedded offset wins; zone ignored
|
|
145
153
|
* 5. `now` ISO 8601 without offset→ floating; written date part; zone ignored
|
|
146
154
|
* 6. `now` omitted → civil date of `clock()` in effective `zone`
|
|
147
155
|
*
|
|
156
|
+
* A string whose `YYYY-MM-DD` is not a real calendar day (`2026-02-30`) is
|
|
157
|
+
* rejected like an unrecognised one, never rolled over to the next month.
|
|
158
|
+
*
|
|
148
159
|
* The `zone` is ONLY consulted for case 6 (clock-based default). Authored
|
|
149
160
|
* dates — item bars, milestones, anchors, the axis ticks — are floating and
|
|
150
161
|
* are never affected by this function.
|
|
@@ -160,11 +171,15 @@ export function resolveToday(opts = {}) {
|
|
|
160
171
|
if (now instanceof Date)
|
|
161
172
|
return now;
|
|
162
173
|
if (now !== undefined) {
|
|
174
|
+
// Every string form leads with a YYYY-MM-DD. `Date.UTC` and `new Date`
|
|
175
|
+
// would both roll an impossible one over (`2026-02-30` to March 2), so
|
|
176
|
+
// reject it here and let the option layer report it.
|
|
177
|
+
if (hasImpossibleNowDate(now))
|
|
178
|
+
return undefined;
|
|
163
179
|
// 3. Bare YYYY-MM-DD — floating; zone ignored
|
|
164
|
-
const
|
|
165
|
-
if (
|
|
166
|
-
return
|
|
167
|
-
}
|
|
180
|
+
const bare = parseIsoDate(now);
|
|
181
|
+
if (bare)
|
|
182
|
+
return bare;
|
|
168
183
|
// 4. ISO 8601 instant with explicit Z or offset — embedded offset WINS
|
|
169
184
|
const withOffset = ISO_WITH_OFFSET_RE.exec(now);
|
|
170
185
|
if (withOffset) {
|
|
@@ -183,9 +198,8 @@ export function resolveToday(opts = {}) {
|
|
|
183
198
|
}
|
|
184
199
|
}
|
|
185
200
|
// 5. ISO 8601 without offset — floating; use written date part; zone ignored
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
return new Date(Date.UTC(parseInt(floating[1], 10), parseInt(floating[2], 10) - 1, parseInt(floating[3], 10)));
|
|
201
|
+
if (ISO_FLOATING_RE.test(now)) {
|
|
202
|
+
return parseIsoDate(now.slice(0, 10)) ?? undefined;
|
|
189
203
|
}
|
|
190
204
|
// Unrecognised string — caller should have validated before calling.
|
|
191
205
|
// Return undefined so a bad value doesn't crash the render pipeline.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-today.js","sourceRoot":"","sources":["../src/resolve-today.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,wEAAwE;AACxE,EAAE;AACF,kEAAkE;AAClE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,8BAA8B;
|
|
1
|
+
{"version":3,"file":"resolve-today.js","sourceRoot":"","sources":["../src/resolve-today.ts"],"names":[],"mappings":"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"}
|
package/dist/row-packer.d.ts
CHANGED
|
@@ -9,10 +9,11 @@ export interface PackedRow {
|
|
|
9
9
|
/** Reserved x for caption spill. Items whose `desiredStart < spillX`
|
|
10
10
|
* bump to a new row even if `rightEdge` would let them in. */
|
|
11
11
|
spillX: number;
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
12
|
+
/** How far below `y` an item joining this row sits: 0 for a row of items,
|
|
13
|
+
* and for a row a parallel or group opened, the distance from its top to
|
|
14
|
+
* its first track, so the item beside it aligns with that track rather
|
|
15
|
+
* than with the block's header band. */
|
|
16
|
+
contentOffsetY: number;
|
|
16
17
|
}
|
|
17
18
|
export interface RowPackerOptions {
|
|
18
19
|
/** Logical left x of the track this packer owns (lane left edge or
|
|
@@ -40,6 +41,10 @@ export interface ItemPlacementInput {
|
|
|
40
41
|
* initial height when this is the first item in a fresh row, or
|
|
41
42
|
* to grow the row when a taller item lands in an existing row. */
|
|
42
43
|
predictedHeight: number;
|
|
44
|
+
/** Ids of the items still to come in this track. A slack corridor
|
|
45
|
+
* whose arrow starts at one of them never bumps this item: rows
|
|
46
|
+
* never move up, so that item would follow it down. */
|
|
47
|
+
pendingIds?: ReadonlySet<string>;
|
|
43
48
|
}
|
|
44
49
|
/** Result of a `placeItem` query. */
|
|
45
50
|
export interface ItemPlacement {
|
|
@@ -50,10 +55,9 @@ export interface ItemPlacement {
|
|
|
50
55
|
export interface ItemCommitInput {
|
|
51
56
|
rowIndex: number;
|
|
52
57
|
placed: PositionedItem;
|
|
53
|
-
/** Logical right edge of the placed item
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* bars). */
|
|
58
|
+
/** Logical right edge of the placed item: its span in time, so the
|
|
59
|
+
* next chained item butts edge-to-edge in logical space (each bar
|
|
60
|
+
* keeps its seams inside its own dates). */
|
|
57
61
|
logicalEnd: number;
|
|
58
62
|
/** Reserved spill x for captions that overflow the bar's right
|
|
59
63
|
* edge. `null` resets the row's spill reservation to `laneLeftX`. */
|
|
@@ -83,15 +87,31 @@ export interface BlockCommitInput {
|
|
|
83
87
|
blockHeight: number;
|
|
84
88
|
/** Logical right edge of the block. */
|
|
85
89
|
blockEnd: number;
|
|
90
|
+
/** Distance from the block's top to its first track (header band plus
|
|
91
|
+
* body pad); 0 when it has no header or children. An item that joins
|
|
92
|
+
* the block's row lands this far down. */
|
|
93
|
+
contentOffsetY?: number;
|
|
94
|
+
/** Reserved spill x for what the block paints past its right edge
|
|
95
|
+
* (a header title, a caption its children spill). Omitted or
|
|
96
|
+
* `null` resets the row's spill reservation to `laneLeftX`. */
|
|
97
|
+
spillReservation?: number | null;
|
|
98
|
+
/** Rightmost x anything inside the block paints, when it can pass
|
|
99
|
+
* `blockEnd` (see `trackChildPaintedRightX`): a container's box spans
|
|
100
|
+
* only its dates, so a caption its children spill is not in it. It widens
|
|
101
|
+
* `usedRightX()` (the lane's extent, and so the canvas); the
|
|
102
|
+
* caller reserves it on the row through `spillReservation`. */
|
|
103
|
+
paintedRight?: number;
|
|
86
104
|
}
|
|
87
105
|
export declare class RowPacker {
|
|
88
106
|
readonly rows: PackedRow[];
|
|
89
107
|
private readonly opts;
|
|
108
|
+
/** Rightmost `BlockCommitInput.paintedRight` committed so far. */
|
|
109
|
+
private paintedRightX;
|
|
90
110
|
constructor(opts: RowPackerOptions);
|
|
91
111
|
/**
|
|
92
|
-
*
|
|
93
|
-
* colliding with sibling content or a slack
|
|
94
|
-
*
|
|
112
|
+
* Join the last row (the last committed child's) when the item's natural
|
|
113
|
+
* extent fits there without colliding with sibling content or a slack
|
|
114
|
+
* corridor; otherwise append a fresh row below it.
|
|
95
115
|
*/
|
|
96
116
|
placeItem(input: ItemPlacementInput): ItemPlacement;
|
|
97
117
|
/**
|
|
@@ -103,8 +123,7 @@ export declare class RowPacker {
|
|
|
103
123
|
placeBlock(): BlockPlacement;
|
|
104
124
|
/**
|
|
105
125
|
* Record a placed item back into its row. Grows the row's height to
|
|
106
|
-
* fit the item, advances `rightEdge
|
|
107
|
-
* shifts later rows down if this row got taller.
|
|
126
|
+
* fit the item, advances `rightEdge` and sets the caption spill.
|
|
108
127
|
*/
|
|
109
128
|
commitItem(input: ItemCommitInput): void;
|
|
110
129
|
/**
|
|
@@ -115,11 +134,18 @@ export declare class RowPacker {
|
|
|
115
134
|
/** Total vertical extent reached (last row's bottom - originY). */
|
|
116
135
|
usedHeight(): number;
|
|
117
136
|
/** Rightmost extent reached — bar logical end OR caption spill,
|
|
118
|
-
* whichever is wider, across every row
|
|
119
|
-
* `
|
|
137
|
+
* whichever is wider, across every row, and anything a committed
|
|
138
|
+
* block paints past its own box (`BlockCommitInput.paintedRight`).
|
|
139
|
+
* Empty rows contribute `laneLeftX`. */
|
|
120
140
|
usedRightX(): number;
|
|
121
141
|
private rowIntersectsCorridor;
|
|
142
|
+
/**
|
|
143
|
+
* An overrun slack arrow runs left, from its source back to a milestone
|
|
144
|
+
* dated before the source ends. Rows never move up, so the source cannot
|
|
145
|
+
* push the work before it out of that path; it drops to a row where the
|
|
146
|
+
* path is clear instead.
|
|
147
|
+
*/
|
|
148
|
+
private rowCrossesOwnCorridor;
|
|
122
149
|
private appendRow;
|
|
123
|
-
private growRowHeight;
|
|
124
150
|
}
|
|
125
151
|
//# sourceMappingURL=row-packer.d.ts.map
|
package/dist/row-packer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row-packer.d.ts","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"row-packer.d.ts","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"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"}
|