@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.
Files changed (338) hide show
  1. package/dist/axis-columns.d.ts +70 -0
  2. package/dist/axis-columns.d.ts.map +1 -0
  3. package/dist/axis-columns.js +104 -0
  4. package/dist/axis-columns.js.map +1 -0
  5. package/dist/calendar-resolver.d.ts +27 -0
  6. package/dist/calendar-resolver.d.ts.map +1 -0
  7. package/dist/calendar-resolver.js +132 -0
  8. package/dist/calendar-resolver.js.map +1 -0
  9. package/dist/calendar.d.ts +0 -19
  10. package/dist/calendar.d.ts.map +1 -1
  11. package/dist/calendar.js +4 -44
  12. package/dist/calendar.js.map +1 -1
  13. package/dist/canvas-width.d.ts +23 -0
  14. package/dist/canvas-width.d.ts.map +1 -0
  15. package/dist/canvas-width.js +26 -0
  16. package/dist/canvas-width.js.map +1 -0
  17. package/dist/capacity.d.ts +28 -0
  18. package/dist/capacity.d.ts.map +1 -1
  19. package/dist/capacity.js +64 -29
  20. package/dist/capacity.js.map +1 -1
  21. package/dist/chart-translation.d.ts +22 -0
  22. package/dist/chart-translation.d.ts.map +1 -0
  23. package/dist/chart-translation.js +83 -0
  24. package/dist/chart-translation.js.map +1 -0
  25. package/dist/container-header-geometry.d.ts +64 -0
  26. package/dist/container-header-geometry.d.ts.map +1 -0
  27. package/dist/container-header-geometry.js +89 -0
  28. package/dist/container-header-geometry.js.map +1 -0
  29. package/dist/dsl-utils.d.ts +3 -4
  30. package/dist/dsl-utils.d.ts.map +1 -1
  31. package/dist/dsl-utils.js +8 -25
  32. package/dist/dsl-utils.js.map +1 -1
  33. package/dist/edge-routing.d.ts +69 -78
  34. package/dist/edge-routing.d.ts.map +1 -1
  35. package/dist/edge-routing.js +271 -401
  36. package/dist/edge-routing.js.map +1 -1
  37. package/dist/frame-tab-geometry.d.ts +24 -14
  38. package/dist/frame-tab-geometry.d.ts.map +1 -1
  39. package/dist/frame-tab-geometry.js +69 -23
  40. package/dist/frame-tab-geometry.js.map +1 -1
  41. package/dist/header-card-geometry.d.ts +12 -0
  42. package/dist/header-card-geometry.d.ts.map +1 -1
  43. package/dist/header-card-geometry.js +14 -2
  44. package/dist/header-card-geometry.js.map +1 -1
  45. package/dist/header-logo.d.ts +28 -0
  46. package/dist/header-logo.d.ts.map +1 -0
  47. package/dist/header-logo.js +51 -0
  48. package/dist/header-logo.js.map +1 -0
  49. package/dist/i18n.d.ts +11 -0
  50. package/dist/i18n.d.ts.map +1 -1
  51. package/dist/i18n.js +11 -1
  52. package/dist/i18n.js.map +1 -1
  53. package/dist/index.d.ts +20 -8
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +17 -7
  56. package/dist/index.js.map +1 -1
  57. package/dist/inline-date-pin-geometry.d.ts +19 -11
  58. package/dist/inline-date-pin-geometry.d.ts.map +1 -1
  59. package/dist/inline-date-pin-geometry.js +45 -46
  60. package/dist/inline-date-pin-geometry.js.map +1 -1
  61. package/dist/item-bar-geometry.d.ts +192 -4
  62. package/dist/item-bar-geometry.d.ts.map +1 -1
  63. package/dist/item-bar-geometry.js +258 -5
  64. package/dist/item-bar-geometry.js.map +1 -1
  65. package/dist/item-port-geometry.d.ts +13 -0
  66. package/dist/item-port-geometry.d.ts.map +1 -0
  67. package/dist/item-port-geometry.js +63 -0
  68. package/dist/item-port-geometry.js.map +1 -0
  69. package/dist/layout-context.d.ts +115 -51
  70. package/dist/layout-context.d.ts.map +1 -1
  71. package/dist/layout-context.js +96 -5
  72. package/dist/layout-context.js.map +1 -1
  73. package/dist/layout-insights.d.ts.map +1 -1
  74. package/dist/layout-insights.js +73 -1
  75. package/dist/layout-insights.js.map +1 -1
  76. package/dist/layout.d.ts +35 -0
  77. package/dist/layout.d.ts.map +1 -1
  78. package/dist/layout.js +18 -1315
  79. package/dist/layout.js.map +1 -1
  80. package/dist/nodes/anchor-node.d.ts.map +1 -1
  81. package/dist/nodes/anchor-node.js +11 -4
  82. package/dist/nodes/anchor-node.js.map +1 -1
  83. package/dist/nodes/content-extent.d.ts +24 -0
  84. package/dist/nodes/content-extent.d.ts.map +1 -0
  85. package/dist/nodes/content-extent.js +100 -0
  86. package/dist/nodes/content-extent.js.map +1 -0
  87. package/dist/nodes/dependency-edges.d.ts +6 -0
  88. package/dist/nodes/dependency-edges.d.ts.map +1 -0
  89. package/dist/nodes/dependency-edges.js +148 -0
  90. package/dist/nodes/dependency-edges.js.map +1 -0
  91. package/dist/nodes/footnote-node.d.ts +24 -3
  92. package/dist/nodes/footnote-node.d.ts.map +1 -1
  93. package/dist/nodes/footnote-node.js +129 -25
  94. package/dist/nodes/footnote-node.js.map +1 -1
  95. package/dist/nodes/group-node.d.ts +10 -21
  96. package/dist/nodes/group-node.d.ts.map +1 -1
  97. package/dist/nodes/group-node.js +79 -152
  98. package/dist/nodes/group-node.js.map +1 -1
  99. package/dist/nodes/header-node.d.ts +56 -0
  100. package/dist/nodes/header-node.d.ts.map +1 -0
  101. package/dist/nodes/header-node.js +163 -0
  102. package/dist/nodes/header-node.js.map +1 -0
  103. package/dist/nodes/include-node.d.ts +22 -12
  104. package/dist/nodes/include-node.d.ts.map +1 -1
  105. package/dist/nodes/include-node.js +95 -62
  106. package/dist/nodes/include-node.js.map +1 -1
  107. package/dist/nodes/item-measure.d.ts +135 -0
  108. package/dist/nodes/item-measure.d.ts.map +1 -0
  109. package/dist/nodes/item-measure.js +514 -0
  110. package/dist/nodes/item-measure.js.map +1 -0
  111. package/dist/nodes/item-node.d.ts +162 -9
  112. package/dist/nodes/item-node.d.ts.map +1 -1
  113. package/dist/nodes/item-node.js +256 -69
  114. package/dist/nodes/item-node.js.map +1 -1
  115. package/dist/nodes/marker-band.d.ts +118 -0
  116. package/dist/nodes/marker-band.d.ts.map +1 -0
  117. package/dist/nodes/marker-band.js +303 -0
  118. package/dist/nodes/marker-band.js.map +1 -0
  119. package/dist/nodes/marker-geometry.js +1 -1
  120. package/dist/nodes/marker-geometry.js.map +1 -1
  121. package/dist/nodes/milestone-node.d.ts +112 -15
  122. package/dist/nodes/milestone-node.d.ts.map +1 -1
  123. package/dist/nodes/milestone-node.js +246 -95
  124. package/dist/nodes/milestone-node.js.map +1 -1
  125. package/dist/nodes/nowline-node.d.ts +8 -0
  126. package/dist/nodes/nowline-node.d.ts.map +1 -0
  127. package/dist/nodes/nowline-node.js +74 -0
  128. package/dist/nodes/nowline-node.js.map +1 -0
  129. package/dist/nodes/parallel-node.d.ts +7 -12
  130. package/dist/nodes/parallel-node.d.ts.map +1 -1
  131. package/dist/nodes/parallel-node.js +66 -30
  132. package/dist/nodes/parallel-node.js.map +1 -1
  133. package/dist/nodes/region-markers.d.ts +41 -0
  134. package/dist/nodes/region-markers.d.ts.map +1 -0
  135. package/dist/nodes/region-markers.js +130 -0
  136. package/dist/nodes/region-markers.js.map +1 -0
  137. package/dist/nodes/roadmap-node.d.ts +9 -72
  138. package/dist/nodes/roadmap-node.d.ts.map +1 -1
  139. package/dist/nodes/roadmap-node.js +38 -788
  140. package/dist/nodes/roadmap-node.js.map +1 -1
  141. package/dist/nodes/row-track.d.ts +33 -0
  142. package/dist/nodes/row-track.d.ts.map +1 -0
  143. package/dist/nodes/row-track.js +170 -0
  144. package/dist/nodes/row-track.js.map +1 -0
  145. package/dist/nodes/sequence-item.d.ts +25 -0
  146. package/dist/nodes/sequence-item.d.ts.map +1 -0
  147. package/dist/nodes/sequence-item.js +396 -0
  148. package/dist/nodes/sequence-item.js.map +1 -0
  149. package/dist/nodes/sequence-one.d.ts +5 -0
  150. package/dist/nodes/sequence-one.d.ts.map +1 -0
  151. package/dist/nodes/sequence-one.js +26 -0
  152. package/dist/nodes/sequence-one.js.map +1 -0
  153. package/dist/nodes/swimlane-node.d.ts +5 -17
  154. package/dist/nodes/swimlane-node.d.ts.map +1 -1
  155. package/dist/nodes/swimlane-node.js +62 -145
  156. package/dist/nodes/swimlane-node.js.map +1 -1
  157. package/dist/nodes/wave-node.d.ts +52 -0
  158. package/dist/nodes/wave-node.d.ts.map +1 -0
  159. package/dist/nodes/wave-node.js +483 -0
  160. package/dist/nodes/wave-node.js.map +1 -0
  161. package/dist/non-working-display.d.ts +14 -0
  162. package/dist/non-working-display.d.ts.map +1 -0
  163. package/dist/non-working-display.js +28 -0
  164. package/dist/non-working-display.js.map +1 -0
  165. package/dist/phases/date-window.d.ts +48 -0
  166. package/dist/phases/date-window.d.ts.map +1 -0
  167. package/dist/phases/date-window.js +130 -0
  168. package/dist/phases/date-window.js.map +1 -0
  169. package/dist/phases/finalize.d.ts +198 -0
  170. package/dist/phases/finalize.d.ts.map +1 -0
  171. package/dist/phases/finalize.js +1058 -0
  172. package/dist/phases/finalize.js.map +1 -0
  173. package/dist/phases/measure.d.ts +77 -0
  174. package/dist/phases/measure.d.ts.map +1 -0
  175. package/dist/phases/measure.js +222 -0
  176. package/dist/phases/measure.js.map +1 -0
  177. package/dist/phases/place.d.ts +28 -0
  178. package/dist/phases/place.d.ts.map +1 -0
  179. package/dist/phases/place.js +225 -0
  180. package/dist/phases/place.js.map +1 -0
  181. package/dist/renderable.d.ts.map +1 -1
  182. package/dist/renderable.js +23 -3
  183. package/dist/renderable.js.map +1 -1
  184. package/dist/resolve-today.d.ts +11 -1
  185. package/dist/resolve-today.d.ts.map +1 -1
  186. package/dist/resolve-today.js +26 -12
  187. package/dist/resolve-today.js.map +1 -1
  188. package/dist/row-packer.d.ts +42 -16
  189. package/dist/row-packer.d.ts.map +1 -1
  190. package/dist/row-packer.js +51 -78
  191. package/dist/row-packer.js.map +1 -1
  192. package/dist/schedule.d.ts +58 -1
  193. package/dist/schedule.d.ts.map +1 -1
  194. package/dist/schedule.js +280 -106
  195. package/dist/schedule.js.map +1 -1
  196. package/dist/start-rules.d.ts +27 -0
  197. package/dist/start-rules.d.ts.map +1 -0
  198. package/dist/start-rules.js +91 -0
  199. package/dist/start-rules.js.map +1 -0
  200. package/dist/start-terms.d.ts +23 -0
  201. package/dist/start-terms.d.ts.map +1 -0
  202. package/dist/start-terms.js +27 -0
  203. package/dist/start-terms.js.map +1 -0
  204. package/dist/status-dot.d.ts +46 -0
  205. package/dist/status-dot.d.ts.map +1 -0
  206. package/dist/status-dot.js +78 -0
  207. package/dist/status-dot.js.map +1 -0
  208. package/dist/style-resolution.d.ts.map +1 -1
  209. package/dist/style-resolution.js +23 -43
  210. package/dist/style-resolution.js.map +1 -1
  211. package/dist/text-measure.d.ts +28 -0
  212. package/dist/text-measure.d.ts.map +1 -0
  213. package/dist/text-measure.js +70 -0
  214. package/dist/text-measure.js.map +1 -0
  215. package/dist/themes/contrast.d.ts +4 -0
  216. package/dist/themes/contrast.d.ts.map +1 -0
  217. package/dist/themes/contrast.js +32 -0
  218. package/dist/themes/contrast.js.map +1 -0
  219. package/dist/themes/dark.d.ts.map +1 -1
  220. package/dist/themes/dark.js +28 -1
  221. package/dist/themes/dark.js.map +1 -1
  222. package/dist/themes/grayscale.d.ts.map +1 -1
  223. package/dist/themes/grayscale.js +28 -1
  224. package/dist/themes/grayscale.js.map +1 -1
  225. package/dist/themes/index.d.ts +4 -11
  226. package/dist/themes/index.d.ts.map +1 -1
  227. package/dist/themes/index.js +6 -4
  228. package/dist/themes/index.js.map +1 -1
  229. package/dist/themes/light.d.ts.map +1 -1
  230. package/dist/themes/light.js +28 -1
  231. package/dist/themes/light.js.map +1 -1
  232. package/dist/themes/shape.d.ts +31 -0
  233. package/dist/themes/shape.d.ts.map +1 -1
  234. package/dist/themes/shared.d.ts +44 -50
  235. package/dist/themes/shared.d.ts.map +1 -1
  236. package/dist/themes/shared.js +79 -83
  237. package/dist/themes/shared.js.map +1 -1
  238. package/dist/time-scale.d.ts +42 -6
  239. package/dist/time-scale.d.ts.map +1 -1
  240. package/dist/time-scale.js +109 -17
  241. package/dist/time-scale.js.map +1 -1
  242. package/dist/types.d.ts +528 -11
  243. package/dist/types.d.ts.map +1 -1
  244. package/dist/view-preset.d.ts +61 -6
  245. package/dist/view-preset.d.ts.map +1 -1
  246. package/dist/view-preset.js +439 -24
  247. package/dist/view-preset.js.map +1 -1
  248. package/dist/wave-barrier.d.ts +107 -0
  249. package/dist/wave-barrier.d.ts.map +1 -0
  250. package/dist/wave-barrier.js +174 -0
  251. package/dist/wave-barrier.js.map +1 -0
  252. package/dist/wave-hatch.d.ts +4 -0
  253. package/dist/wave-hatch.d.ts.map +1 -0
  254. package/dist/wave-hatch.js +21 -0
  255. package/dist/wave-hatch.js.map +1 -0
  256. package/dist/wave-layout.d.ts +99 -0
  257. package/dist/wave-layout.d.ts.map +1 -0
  258. package/dist/wave-layout.js +130 -0
  259. package/dist/wave-layout.js.map +1 -0
  260. package/dist/working-calendar.d.ts +128 -4
  261. package/dist/working-calendar.d.ts.map +1 -1
  262. package/dist/working-calendar.js +725 -51
  263. package/dist/working-calendar.js.map +1 -1
  264. package/dist/working-span.d.ts +11 -0
  265. package/dist/working-span.d.ts.map +1 -0
  266. package/dist/working-span.js +18 -0
  267. package/dist/working-span.js.map +1 -0
  268. package/package.json +4 -4
  269. package/src/axis-columns.ts +140 -0
  270. package/src/calendar-resolver.ts +161 -0
  271. package/src/calendar.ts +4 -45
  272. package/src/canvas-width.ts +36 -0
  273. package/src/capacity.ts +71 -30
  274. package/src/chart-translation.ts +88 -0
  275. package/src/container-header-geometry.ts +116 -0
  276. package/src/dsl-utils.ts +8 -26
  277. package/src/edge-routing.ts +347 -491
  278. package/src/frame-tab-geometry.ts +78 -25
  279. package/src/header-card-geometry.ts +17 -2
  280. package/src/header-logo.ts +67 -0
  281. package/src/i18n.ts +22 -1
  282. package/src/index.ts +97 -12
  283. package/src/inline-date-pin-geometry.ts +55 -58
  284. package/src/item-bar-geometry.ts +341 -5
  285. package/src/item-port-geometry.ts +69 -0
  286. package/src/layout-context.ts +210 -72
  287. package/src/layout-insights.ts +109 -2
  288. package/src/layout.ts +57 -1530
  289. package/src/nodes/anchor-node.ts +11 -4
  290. package/src/nodes/content-extent.ts +107 -0
  291. package/src/nodes/dependency-edges.ts +171 -0
  292. package/src/nodes/footnote-node.ts +171 -31
  293. package/src/nodes/group-node.ts +92 -214
  294. package/src/nodes/header-node.ts +255 -0
  295. package/src/nodes/include-node.ts +124 -110
  296. package/src/nodes/item-measure.ts +723 -0
  297. package/src/nodes/item-node.ts +358 -80
  298. package/src/nodes/marker-band.ts +406 -0
  299. package/src/nodes/marker-geometry.ts +1 -1
  300. package/src/nodes/milestone-node.ts +321 -136
  301. package/src/nodes/nowline-node.ts +87 -0
  302. package/src/nodes/parallel-node.ts +69 -38
  303. package/src/nodes/region-markers.ts +194 -0
  304. package/src/nodes/roadmap-node.ts +46 -950
  305. package/src/nodes/row-track.ts +217 -0
  306. package/src/nodes/sequence-item.ts +433 -0
  307. package/src/nodes/sequence-one.ts +40 -0
  308. package/src/nodes/swimlane-node.ts +66 -205
  309. package/src/nodes/wave-node.ts +609 -0
  310. package/src/non-working-display.ts +32 -0
  311. package/src/phases/date-window.ts +191 -0
  312. package/src/phases/finalize.ts +1303 -0
  313. package/src/phases/measure.ts +329 -0
  314. package/src/phases/place.ts +318 -0
  315. package/src/renderable.ts +23 -3
  316. package/src/resolve-today.ts +28 -25
  317. package/src/row-packer.ts +85 -84
  318. package/src/schedule.ts +362 -114
  319. package/src/start-rules.ts +113 -0
  320. package/src/start-terms.ts +38 -0
  321. package/src/status-dot.ts +81 -0
  322. package/src/style-resolution.ts +27 -57
  323. package/src/text-measure.ts +71 -0
  324. package/src/themes/contrast.ts +34 -0
  325. package/src/themes/dark.ts +28 -1
  326. package/src/themes/grayscale.ts +28 -1
  327. package/src/themes/index.ts +10 -7
  328. package/src/themes/light.ts +28 -1
  329. package/src/themes/shape.ts +38 -0
  330. package/src/themes/shared.ts +85 -93
  331. package/src/time-scale.ts +117 -19
  332. package/src/types.ts +529 -20
  333. package/src/view-preset.ts +520 -27
  334. package/src/wave-barrier.ts +242 -0
  335. package/src/wave-hatch.ts +25 -0
  336. package/src/wave-layout.ts +203 -0
  337. package/src/working-calendar.ts +875 -57
  338. package/src/working-span.ts +19 -0
@@ -1,8 +1,10 @@
1
- // RowPacker — the topmost-fit row-pack engine shared by `SwimlaneNode`
2
- // and `GroupNode`. Tracks rows of variable height (each row's height is
3
- // the max of its placed children's heights, with a per-packer minimum)
4
- // and bumps a child to a new row when it would collide with a sibling's
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
- // When a row's height grows after later rows already exist, the packer
16
- // shifts every subsequent row (and every positioned child placed in it)
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
- placedChildren: [],
33
+ contentOffsetY: 0,
33
34
  },
34
35
  ];
35
36
  }
36
37
  /**
37
- * Find the topmost row where the item's natural extent fits without
38
- * colliding with sibling content or a slack corridor; appending a
39
- * fresh row at the bottom when none of the existing rows fit.
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
- for (let i = 0; i < this.rows.length; i += 1) {
43
- const r = this.rows[i];
44
- if (input.desiredStart < r.rightEdge)
45
- continue;
46
- if (input.desiredStart < r.spillX)
47
- continue;
48
- if (this.rowIntersectsCorridor(r, input))
49
- continue;
50
- return { rowIndex: i, y: r.y };
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`, sets the caption spill, and
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
- const target = Math.max(input.placed.box.height, input.rowHeight ?? 0);
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
- this.growRowHeight(input.rowIndex, input.blockHeight);
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
- row.placedChildren.push(input.placed);
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. Empty rows contribute
100
- * `laneLeftX`. */
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.opts.laneLeftX;
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
- placedChildren: [],
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
@@ -1 +1 @@
1
- {"version":3,"file":"row-packer.js","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"row-packer.js","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"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"}
@@ -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.
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAER,eAAe,EACf,oBAAoB,EACpB,WAAW,EAEX,aAAa,EAEhB,MAAM,eAAe,CAAC;AAWvB,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;CACb;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC5B,kDAAkD;IAClD,SAAS,EAAE,IAAI,CAAC;IAChB,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;CAC9B;AAED,MAAM,WAAW,eAAe;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,IAAI,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,eAAoB,GAC9B,eAAe,CA4IjB"}
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"}