@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
package/dist/row-packer.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
// RowPacker — the
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// `rightEdge`, caption `spillX`, or a slack-arrow corridor.
|
|
1
|
+
// RowPacker — the row-pack engine shared by `SwimlaneNode` and
|
|
2
|
+
// `GroupNode`. A child never lands above the one before it
|
|
3
|
+
// (specs/true-width-layout.md §3.2), so it either joins the last row or
|
|
4
|
+
// opens a new one below it: it drops a row when it would collide with the
|
|
5
|
+
// last row's `rightEdge`, caption `spillX`, or a slack-arrow corridor.
|
|
6
|
+
// Each row's height is the max of its placed children's heights, with a
|
|
7
|
+
// per-packer minimum.
|
|
6
8
|
//
|
|
7
9
|
// Two-phase API per child:
|
|
8
10
|
// 1) `placeItem(...)` / `placeBlock(...)` decides which row the child
|
|
@@ -12,45 +14,41 @@
|
|
|
12
14
|
// back into the packer so the row's `rightEdge` / `spillX` advance
|
|
13
15
|
// and the row's height grows to accommodate the new child.
|
|
14
16
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// downward by the delta. Items keep their row-anchored top edge; the
|
|
18
|
-
// row simply gets taller. This keeps the contract "all children in a
|
|
19
|
-
// row share that row's top y" intact while letting individual children
|
|
20
|
-
// grow vertically (e.g. wrapped label-chiclet stacks in m3).
|
|
17
|
+
// A child only ever commits to the last row, so a row that grows has no
|
|
18
|
+
// rows below it to move.
|
|
21
19
|
export class RowPacker {
|
|
22
20
|
rows;
|
|
23
21
|
opts;
|
|
22
|
+
/** Rightmost `BlockCommitInput.paintedRight` committed so far. */
|
|
23
|
+
paintedRightX;
|
|
24
24
|
constructor(opts) {
|
|
25
25
|
this.opts = opts;
|
|
26
|
+
this.paintedRightX = opts.laneLeftX;
|
|
26
27
|
this.rows = [
|
|
27
28
|
{
|
|
28
29
|
y: opts.originY,
|
|
29
30
|
height: opts.minRowHeight,
|
|
30
31
|
rightEdge: opts.laneLeftX,
|
|
31
32
|
spillX: opts.laneLeftX,
|
|
32
|
-
|
|
33
|
+
contentOffsetY: 0,
|
|
33
34
|
},
|
|
34
35
|
];
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
|
-
*
|
|
38
|
-
* colliding with sibling content or a slack
|
|
39
|
-
*
|
|
38
|
+
* Join the last row (the last committed child's) when the item's natural
|
|
39
|
+
* extent fits there without colliding with sibling content or a slack
|
|
40
|
+
* corridor; otherwise append a fresh row below it.
|
|
40
41
|
*/
|
|
41
42
|
placeItem(input) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
const fresh = this.appendRow(Math.max(this.opts.minRowHeight, input.predictedHeight));
|
|
53
|
-
return { rowIndex: this.rows.length - 1, y: fresh.y };
|
|
43
|
+
const last = this.rows[this.rows.length - 1];
|
|
44
|
+
const fits = input.desiredStart >= last.rightEdge &&
|
|
45
|
+
input.desiredStart >= last.spillX &&
|
|
46
|
+
!this.rowIntersectsCorridor(last, input) &&
|
|
47
|
+
!this.rowCrossesOwnCorridor(last, input);
|
|
48
|
+
const row = fits
|
|
49
|
+
? last
|
|
50
|
+
: this.appendRow(Math.max(this.opts.minRowHeight, input.predictedHeight));
|
|
51
|
+
return { rowIndex: this.rows.length - 1, y: row.y + row.contentOffsetY };
|
|
54
52
|
}
|
|
55
53
|
/**
|
|
56
54
|
* Blocks (parallel / group) always claim a fresh row at the bottom
|
|
@@ -68,16 +66,13 @@ export class RowPacker {
|
|
|
68
66
|
}
|
|
69
67
|
/**
|
|
70
68
|
* Record a placed item back into its row. Grows the row's height to
|
|
71
|
-
* fit the item, advances `rightEdge
|
|
72
|
-
* shifts later rows down if this row got taller.
|
|
69
|
+
* fit the item, advances `rightEdge` and sets the caption spill.
|
|
73
70
|
*/
|
|
74
71
|
commitItem(input) {
|
|
75
72
|
const row = this.rows[input.rowIndex];
|
|
76
|
-
|
|
77
|
-
this.growRowHeight(input.rowIndex, target);
|
|
73
|
+
row.height = Math.max(row.height, row.contentOffsetY + Math.max(input.placed.box.height, input.rowHeight ?? 0));
|
|
78
74
|
row.rightEdge = input.logicalEnd;
|
|
79
75
|
row.spillX = input.spillReservation ?? this.opts.laneLeftX;
|
|
80
|
-
row.placedChildren.push(input.placed);
|
|
81
76
|
}
|
|
82
77
|
/**
|
|
83
78
|
* Record a placed block. Sets the row's height to the block's full
|
|
@@ -85,10 +80,13 @@ export class RowPacker {
|
|
|
85
80
|
*/
|
|
86
81
|
commitBlock(input) {
|
|
87
82
|
const row = this.rows[input.rowIndex];
|
|
88
|
-
|
|
83
|
+
row.height = Math.max(row.height, input.blockHeight);
|
|
84
|
+
row.contentOffsetY = input.contentOffsetY ?? 0;
|
|
89
85
|
row.rightEdge = input.blockEnd;
|
|
90
|
-
row.spillX = this.opts.laneLeftX;
|
|
91
|
-
|
|
86
|
+
row.spillX = input.spillReservation ?? this.opts.laneLeftX;
|
|
87
|
+
if (input.paintedRight !== undefined && input.paintedRight > this.paintedRightX) {
|
|
88
|
+
this.paintedRightX = input.paintedRight;
|
|
89
|
+
}
|
|
92
90
|
}
|
|
93
91
|
/** Total vertical extent reached (last row's bottom - originY). */
|
|
94
92
|
usedHeight() {
|
|
@@ -96,10 +94,11 @@ export class RowPacker {
|
|
|
96
94
|
return last.y + last.height - this.opts.originY;
|
|
97
95
|
}
|
|
98
96
|
/** Rightmost extent reached — bar logical end OR caption spill,
|
|
99
|
-
* whichever is wider, across every row
|
|
100
|
-
* `
|
|
97
|
+
* whichever is wider, across every row, and anything a committed
|
|
98
|
+
* block paints past its own box (`BlockCommitInput.paintedRight`).
|
|
99
|
+
* Empty rows contribute `laneLeftX`. */
|
|
101
100
|
usedRightX() {
|
|
102
|
-
let x = this.
|
|
101
|
+
let x = this.paintedRightX;
|
|
103
102
|
for (const r of this.rows) {
|
|
104
103
|
if (r.rightEdge > x)
|
|
105
104
|
x = r.rightEdge;
|
|
@@ -113,7 +112,19 @@ export class RowPacker {
|
|
|
113
112
|
c.y < r.y + r.height &&
|
|
114
113
|
p.desiredStart < c.xEnd &&
|
|
115
114
|
p.desiredEnd > c.xStart &&
|
|
116
|
-
c.slackPredId !== p.childId
|
|
115
|
+
c.slackPredId !== p.childId &&
|
|
116
|
+
!p.pendingIds?.has(c.slackPredId));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* An overrun slack arrow runs left, from its source back to a milestone
|
|
120
|
+
* dated before the source ends. Rows never move up, so the source cannot
|
|
121
|
+
* push the work before it out of that path; it drops to a row where the
|
|
122
|
+
* path is clear instead.
|
|
123
|
+
*/
|
|
124
|
+
rowCrossesOwnCorridor(r, p) {
|
|
125
|
+
return this.opts.slackCorridors.some((c) => c.slackPredId === p.childId &&
|
|
126
|
+
c.xStart < p.desiredStart &&
|
|
127
|
+
r.rightEdge > Math.max(c.xStart, this.opts.laneLeftX));
|
|
117
128
|
}
|
|
118
129
|
appendRow(height) {
|
|
119
130
|
const last = this.rows[this.rows.length - 1];
|
|
@@ -122,48 +133,10 @@ export class RowPacker {
|
|
|
122
133
|
height,
|
|
123
134
|
rightEdge: this.opts.laneLeftX,
|
|
124
135
|
spillX: this.opts.laneLeftX,
|
|
125
|
-
|
|
136
|
+
contentOffsetY: 0,
|
|
126
137
|
};
|
|
127
138
|
this.rows.push(r);
|
|
128
139
|
return r;
|
|
129
140
|
}
|
|
130
|
-
growRowHeight(rowIndex, newHeight) {
|
|
131
|
-
const row = this.rows[rowIndex];
|
|
132
|
-
const delta = newHeight - row.height;
|
|
133
|
-
if (delta <= 0)
|
|
134
|
-
return;
|
|
135
|
-
row.height = newHeight;
|
|
136
|
-
for (let i = rowIndex + 1; i < this.rows.length; i += 1) {
|
|
137
|
-
const r = this.rows[i];
|
|
138
|
-
r.y += delta;
|
|
139
|
-
for (const child of r.placedChildren) {
|
|
140
|
-
shiftPositionedY(child, delta);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Walk a positioned subtree and shift every absolute y by `dy`. Used
|
|
147
|
-
* when an earlier row in the packer grows, retroactively pushing every
|
|
148
|
-
* later row (and its placed subtrees) down to keep them clear.
|
|
149
|
-
*
|
|
150
|
-
* Items: shift the bar box plus label chips and any overflow box.
|
|
151
|
-
* Groups / parallels: shift the container box and recurse into
|
|
152
|
-
* children. The caller's `box.y` already moved with the parent.
|
|
153
|
-
*/
|
|
154
|
-
function shiftPositionedY(p, dy) {
|
|
155
|
-
p.box.y += dy;
|
|
156
|
-
if (p.kind === 'item') {
|
|
157
|
-
for (const chip of p.labelChips) {
|
|
158
|
-
chip.box.y += dy;
|
|
159
|
-
}
|
|
160
|
-
if (p.overflowBox) {
|
|
161
|
-
p.overflowBox.y += dy;
|
|
162
|
-
}
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
for (const child of p.children) {
|
|
166
|
-
shiftPositionedY(child, dy);
|
|
167
|
-
}
|
|
168
141
|
}
|
|
169
142
|
//# sourceMappingURL=row-packer.js.map
|
package/dist/row-packer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row-packer.js","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"row-packer.js","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"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"}
|
package/dist/schedule.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import type { ItemDeclaration, MilestoneDeclaration, NowlineFile, ResolveResult } from '@nowline/core';
|
|
1
|
+
import type { ItemDeclaration, MilestoneDeclaration, NowlineFile, ResolveResult, WavePlan } from '@nowline/core';
|
|
2
|
+
import { type ResolvedCalendar } from './calendar-resolver.js';
|
|
2
3
|
/** Per-item scheduled interval, keyed by item id (name). */
|
|
3
4
|
export interface ScheduledItem {
|
|
4
5
|
start: Date;
|
|
5
6
|
end: Date;
|
|
7
|
+
/**
|
|
8
|
+
* Duration in working days: the `duration:` literal, or the size's effort
|
|
9
|
+
* divided by `capacity:`, under the file's calendar. 0 when the item has
|
|
10
|
+
* neither, or names an undeclared size.
|
|
11
|
+
*/
|
|
12
|
+
days: number;
|
|
6
13
|
}
|
|
7
14
|
/**
|
|
8
15
|
* Result of scheduling a roadmap. All dates are UTC midnight.
|
|
@@ -15,6 +22,8 @@ export interface ScheduledItem {
|
|
|
15
22
|
export interface RoadmapSchedule {
|
|
16
23
|
/** Resolved roadmap start date (UTC midnight). */
|
|
17
24
|
startDate: Date;
|
|
25
|
+
/** The file's calendar, which every date and `days` here uses. */
|
|
26
|
+
calendar: ResolvedCalendar;
|
|
18
27
|
/** Named items keyed by their DSL id (`name`). */
|
|
19
28
|
items: Map<string, ScheduledItem>;
|
|
20
29
|
/** Every item keyed by AST node identity (named and anonymous). */
|
|
@@ -25,10 +34,58 @@ export interface RoadmapSchedule {
|
|
|
25
34
|
milestoneByNode: WeakMap<MilestoneDeclaration, Date>;
|
|
26
35
|
/** Named anchors: their declared or computed date. */
|
|
27
36
|
anchors: Map<string, Date>;
|
|
37
|
+
/**
|
|
38
|
+
* Waves by id, in declaration order (specs/waves.md §8.5). Present only
|
|
39
|
+
* when the roadmap declares waves.
|
|
40
|
+
*/
|
|
41
|
+
waves?: Map<string, ScheduledWave>;
|
|
42
|
+
/** The wave plan the schedule ran with; undefined without waves. */
|
|
43
|
+
plan?: WavePlan;
|
|
44
|
+
/** The `ResolveResult` this schedule was built from. */
|
|
45
|
+
resolved: ResolveResult;
|
|
46
|
+
/** What the date window needs (specs/scheduler-unification.md §3.3). */
|
|
47
|
+
extent: ScheduleExtent;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* True when some wave has a member (specs/waves.md §9.1). With none, the
|
|
51
|
+
* roadmap draws no waves: no strip, no hatch, no legend. The barrier still
|
|
52
|
+
* runs, so wave floors and `after:<wave>` keep their dates.
|
|
53
|
+
*/
|
|
54
|
+
export declare function hasVisibleWaves(schedule: Pick<RoadmapSchedule, 'waves'>): boolean;
|
|
55
|
+
/** A wave's solved span (specs/waves.md §5.1). */
|
|
56
|
+
export interface ScheduledWave {
|
|
57
|
+
/** 1-based declaration order. */
|
|
58
|
+
index: number;
|
|
59
|
+
/** `S_k` (UTC midnight). */
|
|
60
|
+
start: Date;
|
|
61
|
+
/** `E_k`, exclusive (UTC midnight); equals `start` for an empty wave. */
|
|
62
|
+
end: Date;
|
|
63
|
+
/** Members placed in the main lanes and first-level isolated regions. */
|
|
64
|
+
memberCount: number;
|
|
65
|
+
/** The member that sets `E_k` (id ?? title); omitted when none ends past `S_k`. */
|
|
66
|
+
heldBy?: string;
|
|
67
|
+
/** The wave's `after:` element that set `S_k`, when it beat the previous wave's end. */
|
|
68
|
+
floorRef?: string;
|
|
28
69
|
}
|
|
29
70
|
export interface ScheduleOptions {
|
|
30
71
|
/** Passed as the reference date when the roadmap omits `start:`. */
|
|
31
72
|
today?: Date;
|
|
73
|
+
/**
|
|
74
|
+
* The roadmap's wave plan from `buildWavePlan(resolved)`, when the caller
|
|
75
|
+
* already built it; `null` means "built, no waves". Omitted: built here.
|
|
76
|
+
*/
|
|
77
|
+
plan?: WavePlan | null;
|
|
78
|
+
}
|
|
79
|
+
/** What the date window needs from the schedule (specs/scheduler-unification.md §3.2). */
|
|
80
|
+
export interface ScheduleExtent {
|
|
81
|
+
/**
|
|
82
|
+
* Latest working-day offset from `startDate` reached by any lane cursor
|
|
83
|
+
* (item ends and container starts), any dated anchor, any milestone, and,
|
|
84
|
+
* with waves, every `S_k` and `E_n`. Isolated regions count too: without
|
|
85
|
+
* waves every region at any depth with its anchors and milestones, with
|
|
86
|
+
* waves the first-level regions' lanes. `today` is not included.
|
|
87
|
+
*/
|
|
88
|
+
contentEndDay: number;
|
|
32
89
|
}
|
|
33
90
|
/**
|
|
34
91
|
* Compute the scheduled start/end date for every named entity in the roadmap.
|
package/dist/schedule.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAER,eAAe,EACf,oBAAoB,EACpB,WAAW,EAEX,aAAa,EAEb,QAAQ,EACX,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,KAAK,gBAAgB,EAA0B,MAAM,wBAAwB,CAAC;AAMvF,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC5B,kDAAkD;IAClD,SAAS,EAAE,IAAI,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,kDAAkD;IAClD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClC,mEAAmE;IACnE,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAChD,8CAA8C;IAC9C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9B,wEAAwE;IACxE,eAAe,EAAE,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IACrD,sDAAsD;IACtD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,oEAAoE;IACpE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,wDAAwD;IACxD,QAAQ,EAAE,aAAa,CAAC;IACxB,wEAAwE;IACxE,MAAM,EAAE,cAAc,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,OAAO,CAKjF;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC1B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,KAAK,EAAE,IAAI,CAAC;IACZ,yEAAyE;IACzE,GAAG,EAAE,IAAI,CAAC;IACV,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,IAAI,CAAC;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC1B;AAED,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC3B;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,eAAoB,GAC9B,eAAe,CAmTjB"}
|