@nowline/layout 0.8.5 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) 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/band-scale.d.ts.map +1 -1
  6. package/dist/calendar-resolver.d.ts +27 -0
  7. package/dist/calendar-resolver.d.ts.map +1 -0
  8. package/dist/calendar-resolver.js +132 -0
  9. package/dist/calendar-resolver.js.map +1 -0
  10. package/dist/calendar.d.ts +0 -19
  11. package/dist/calendar.d.ts.map +1 -1
  12. package/dist/calendar.js +4 -44
  13. package/dist/calendar.js.map +1 -1
  14. package/dist/canvas-width.d.ts +23 -0
  15. package/dist/canvas-width.d.ts.map +1 -0
  16. package/dist/canvas-width.js +26 -0
  17. package/dist/canvas-width.js.map +1 -0
  18. package/dist/capacity.d.ts +28 -0
  19. package/dist/capacity.d.ts.map +1 -1
  20. package/dist/capacity.js +64 -29
  21. package/dist/capacity.js.map +1 -1
  22. package/dist/chart-translation.d.ts +22 -0
  23. package/dist/chart-translation.d.ts.map +1 -0
  24. package/dist/chart-translation.js +83 -0
  25. package/dist/chart-translation.js.map +1 -0
  26. package/dist/container-header-geometry.d.ts +64 -0
  27. package/dist/container-header-geometry.d.ts.map +1 -0
  28. package/dist/container-header-geometry.js +89 -0
  29. package/dist/container-header-geometry.js.map +1 -0
  30. package/dist/dsl-utils.d.ts +3 -4
  31. package/dist/dsl-utils.d.ts.map +1 -1
  32. package/dist/dsl-utils.js +8 -25
  33. package/dist/dsl-utils.js.map +1 -1
  34. package/dist/edge-routing.d.ts +69 -78
  35. package/dist/edge-routing.d.ts.map +1 -1
  36. package/dist/edge-routing.js +271 -401
  37. package/dist/edge-routing.js.map +1 -1
  38. package/dist/frame-tab-geometry.d.ts +24 -14
  39. package/dist/frame-tab-geometry.d.ts.map +1 -1
  40. package/dist/frame-tab-geometry.js +69 -23
  41. package/dist/frame-tab-geometry.js.map +1 -1
  42. package/dist/header-card-geometry.d.ts +12 -0
  43. package/dist/header-card-geometry.d.ts.map +1 -1
  44. package/dist/header-card-geometry.js +14 -2
  45. package/dist/header-card-geometry.js.map +1 -1
  46. package/dist/header-logo.d.ts +28 -0
  47. package/dist/header-logo.d.ts.map +1 -0
  48. package/dist/header-logo.js +51 -0
  49. package/dist/header-logo.js.map +1 -0
  50. package/dist/i18n.d.ts +11 -0
  51. package/dist/i18n.d.ts.map +1 -1
  52. package/dist/i18n.js +11 -1
  53. package/dist/i18n.js.map +1 -1
  54. package/dist/index.d.ts +20 -8
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +17 -7
  57. package/dist/index.js.map +1 -1
  58. package/dist/inline-date-pin-geometry.d.ts +19 -11
  59. package/dist/inline-date-pin-geometry.d.ts.map +1 -1
  60. package/dist/inline-date-pin-geometry.js +45 -46
  61. package/dist/inline-date-pin-geometry.js.map +1 -1
  62. package/dist/item-bar-geometry.d.ts +192 -4
  63. package/dist/item-bar-geometry.d.ts.map +1 -1
  64. package/dist/item-bar-geometry.js +258 -5
  65. package/dist/item-bar-geometry.js.map +1 -1
  66. package/dist/item-port-geometry.d.ts +13 -0
  67. package/dist/item-port-geometry.d.ts.map +1 -0
  68. package/dist/item-port-geometry.js +63 -0
  69. package/dist/item-port-geometry.js.map +1 -0
  70. package/dist/layout-context.d.ts +115 -51
  71. package/dist/layout-context.d.ts.map +1 -1
  72. package/dist/layout-context.js +96 -5
  73. package/dist/layout-context.js.map +1 -1
  74. package/dist/layout-insights.d.ts.map +1 -1
  75. package/dist/layout-insights.js +73 -1
  76. package/dist/layout-insights.js.map +1 -1
  77. package/dist/layout.d.ts +35 -0
  78. package/dist/layout.d.ts.map +1 -1
  79. package/dist/layout.js +18 -1315
  80. package/dist/layout.js.map +1 -1
  81. package/dist/nodes/anchor-node.d.ts.map +1 -1
  82. package/dist/nodes/anchor-node.js +11 -4
  83. package/dist/nodes/anchor-node.js.map +1 -1
  84. package/dist/nodes/content-extent.d.ts +24 -0
  85. package/dist/nodes/content-extent.d.ts.map +1 -0
  86. package/dist/nodes/content-extent.js +100 -0
  87. package/dist/nodes/content-extent.js.map +1 -0
  88. package/dist/nodes/dependency-edges.d.ts +6 -0
  89. package/dist/nodes/dependency-edges.d.ts.map +1 -0
  90. package/dist/nodes/dependency-edges.js +148 -0
  91. package/dist/nodes/dependency-edges.js.map +1 -0
  92. package/dist/nodes/footnote-node.d.ts +24 -3
  93. package/dist/nodes/footnote-node.d.ts.map +1 -1
  94. package/dist/nodes/footnote-node.js +129 -25
  95. package/dist/nodes/footnote-node.js.map +1 -1
  96. package/dist/nodes/group-node.d.ts +10 -21
  97. package/dist/nodes/group-node.d.ts.map +1 -1
  98. package/dist/nodes/group-node.js +79 -154
  99. package/dist/nodes/group-node.js.map +1 -1
  100. package/dist/nodes/header-node.d.ts +56 -0
  101. package/dist/nodes/header-node.d.ts.map +1 -0
  102. package/dist/nodes/header-node.js +163 -0
  103. package/dist/nodes/header-node.js.map +1 -0
  104. package/dist/nodes/include-node.d.ts +22 -12
  105. package/dist/nodes/include-node.d.ts.map +1 -1
  106. package/dist/nodes/include-node.js +95 -62
  107. package/dist/nodes/include-node.js.map +1 -1
  108. package/dist/nodes/item-measure.d.ts +135 -0
  109. package/dist/nodes/item-measure.d.ts.map +1 -0
  110. package/dist/nodes/item-measure.js +514 -0
  111. package/dist/nodes/item-measure.js.map +1 -0
  112. package/dist/nodes/item-node.d.ts +162 -9
  113. package/dist/nodes/item-node.d.ts.map +1 -1
  114. package/dist/nodes/item-node.js +256 -69
  115. package/dist/nodes/item-node.js.map +1 -1
  116. package/dist/nodes/marker-band.d.ts +118 -0
  117. package/dist/nodes/marker-band.d.ts.map +1 -0
  118. package/dist/nodes/marker-band.js +303 -0
  119. package/dist/nodes/marker-band.js.map +1 -0
  120. package/dist/nodes/marker-geometry.js +1 -1
  121. package/dist/nodes/marker-geometry.js.map +1 -1
  122. package/dist/nodes/milestone-node.d.ts +112 -15
  123. package/dist/nodes/milestone-node.d.ts.map +1 -1
  124. package/dist/nodes/milestone-node.js +246 -95
  125. package/dist/nodes/milestone-node.js.map +1 -1
  126. package/dist/nodes/nowline-node.d.ts +8 -0
  127. package/dist/nodes/nowline-node.d.ts.map +1 -0
  128. package/dist/nodes/nowline-node.js +74 -0
  129. package/dist/nodes/nowline-node.js.map +1 -0
  130. package/dist/nodes/parallel-node.d.ts +7 -12
  131. package/dist/nodes/parallel-node.d.ts.map +1 -1
  132. package/dist/nodes/parallel-node.js +66 -32
  133. package/dist/nodes/parallel-node.js.map +1 -1
  134. package/dist/nodes/region-markers.d.ts +41 -0
  135. package/dist/nodes/region-markers.d.ts.map +1 -0
  136. package/dist/nodes/region-markers.js +130 -0
  137. package/dist/nodes/region-markers.js.map +1 -0
  138. package/dist/nodes/roadmap-node.d.ts +9 -72
  139. package/dist/nodes/roadmap-node.d.ts.map +1 -1
  140. package/dist/nodes/roadmap-node.js +38 -788
  141. package/dist/nodes/roadmap-node.js.map +1 -1
  142. package/dist/nodes/row-track.d.ts +33 -0
  143. package/dist/nodes/row-track.d.ts.map +1 -0
  144. package/dist/nodes/row-track.js +170 -0
  145. package/dist/nodes/row-track.js.map +1 -0
  146. package/dist/nodes/sequence-item.d.ts +25 -0
  147. package/dist/nodes/sequence-item.d.ts.map +1 -0
  148. package/dist/nodes/sequence-item.js +396 -0
  149. package/dist/nodes/sequence-item.js.map +1 -0
  150. package/dist/nodes/sequence-one.d.ts +5 -0
  151. package/dist/nodes/sequence-one.d.ts.map +1 -0
  152. package/dist/nodes/sequence-one.js +26 -0
  153. package/dist/nodes/sequence-one.js.map +1 -0
  154. package/dist/nodes/swimlane-node.d.ts +5 -17
  155. package/dist/nodes/swimlane-node.d.ts.map +1 -1
  156. package/dist/nodes/swimlane-node.js +62 -147
  157. package/dist/nodes/swimlane-node.js.map +1 -1
  158. package/dist/nodes/wave-node.d.ts +52 -0
  159. package/dist/nodes/wave-node.d.ts.map +1 -0
  160. package/dist/nodes/wave-node.js +483 -0
  161. package/dist/nodes/wave-node.js.map +1 -0
  162. package/dist/non-working-display.d.ts +14 -0
  163. package/dist/non-working-display.d.ts.map +1 -0
  164. package/dist/non-working-display.js +28 -0
  165. package/dist/non-working-display.js.map +1 -0
  166. package/dist/phases/date-window.d.ts +48 -0
  167. package/dist/phases/date-window.d.ts.map +1 -0
  168. package/dist/phases/date-window.js +130 -0
  169. package/dist/phases/date-window.js.map +1 -0
  170. package/dist/phases/finalize.d.ts +198 -0
  171. package/dist/phases/finalize.d.ts.map +1 -0
  172. package/dist/phases/finalize.js +1058 -0
  173. package/dist/phases/finalize.js.map +1 -0
  174. package/dist/phases/measure.d.ts +77 -0
  175. package/dist/phases/measure.d.ts.map +1 -0
  176. package/dist/phases/measure.js +222 -0
  177. package/dist/phases/measure.js.map +1 -0
  178. package/dist/phases/place.d.ts +28 -0
  179. package/dist/phases/place.d.ts.map +1 -0
  180. package/dist/phases/place.js +225 -0
  181. package/dist/phases/place.js.map +1 -0
  182. package/dist/renderable.d.ts.map +1 -1
  183. package/dist/renderable.js +23 -3
  184. package/dist/renderable.js.map +1 -1
  185. package/dist/resolve-today.d.ts +11 -1
  186. package/dist/resolve-today.d.ts.map +1 -1
  187. package/dist/resolve-today.js +26 -12
  188. package/dist/resolve-today.js.map +1 -1
  189. package/dist/row-packer.d.ts +42 -16
  190. package/dist/row-packer.d.ts.map +1 -1
  191. package/dist/row-packer.js +51 -78
  192. package/dist/row-packer.js.map +1 -1
  193. package/dist/schedule.d.ts +58 -1
  194. package/dist/schedule.d.ts.map +1 -1
  195. package/dist/schedule.js +280 -106
  196. package/dist/schedule.js.map +1 -1
  197. package/dist/start-rules.d.ts +27 -0
  198. package/dist/start-rules.d.ts.map +1 -0
  199. package/dist/start-rules.js +91 -0
  200. package/dist/start-rules.js.map +1 -0
  201. package/dist/start-terms.d.ts +23 -0
  202. package/dist/start-terms.d.ts.map +1 -0
  203. package/dist/start-terms.js +27 -0
  204. package/dist/start-terms.js.map +1 -0
  205. package/dist/status-dot.d.ts +46 -0
  206. package/dist/status-dot.d.ts.map +1 -0
  207. package/dist/status-dot.js +78 -0
  208. package/dist/status-dot.js.map +1 -0
  209. package/dist/style-resolution.d.ts.map +1 -1
  210. package/dist/style-resolution.js +23 -43
  211. package/dist/style-resolution.js.map +1 -1
  212. package/dist/text-measure.d.ts +28 -0
  213. package/dist/text-measure.d.ts.map +1 -0
  214. package/dist/text-measure.js +70 -0
  215. package/dist/text-measure.js.map +1 -0
  216. package/dist/themes/contrast.d.ts +4 -0
  217. package/dist/themes/contrast.d.ts.map +1 -0
  218. package/dist/themes/contrast.js +32 -0
  219. package/dist/themes/contrast.js.map +1 -0
  220. package/dist/themes/dark.d.ts.map +1 -1
  221. package/dist/themes/dark.js +28 -1
  222. package/dist/themes/dark.js.map +1 -1
  223. package/dist/themes/grayscale.d.ts.map +1 -1
  224. package/dist/themes/grayscale.js +28 -1
  225. package/dist/themes/grayscale.js.map +1 -1
  226. package/dist/themes/index.d.ts +4 -11
  227. package/dist/themes/index.d.ts.map +1 -1
  228. package/dist/themes/index.js +6 -4
  229. package/dist/themes/index.js.map +1 -1
  230. package/dist/themes/light.d.ts.map +1 -1
  231. package/dist/themes/light.js +28 -1
  232. package/dist/themes/light.js.map +1 -1
  233. package/dist/themes/shape.d.ts +31 -0
  234. package/dist/themes/shape.d.ts.map +1 -1
  235. package/dist/themes/shared.d.ts +44 -50
  236. package/dist/themes/shared.d.ts.map +1 -1
  237. package/dist/themes/shared.js +79 -83
  238. package/dist/themes/shared.js.map +1 -1
  239. package/dist/time-scale.d.ts +42 -6
  240. package/dist/time-scale.d.ts.map +1 -1
  241. package/dist/time-scale.js +109 -17
  242. package/dist/time-scale.js.map +1 -1
  243. package/dist/types.d.ts +528 -11
  244. package/dist/types.d.ts.map +1 -1
  245. package/dist/view-preset.d.ts +61 -6
  246. package/dist/view-preset.d.ts.map +1 -1
  247. package/dist/view-preset.js +439 -24
  248. package/dist/view-preset.js.map +1 -1
  249. package/dist/wave-barrier.d.ts +107 -0
  250. package/dist/wave-barrier.d.ts.map +1 -0
  251. package/dist/wave-barrier.js +174 -0
  252. package/dist/wave-barrier.js.map +1 -0
  253. package/dist/wave-hatch.d.ts +4 -0
  254. package/dist/wave-hatch.d.ts.map +1 -0
  255. package/dist/wave-hatch.js +21 -0
  256. package/dist/wave-hatch.js.map +1 -0
  257. package/dist/wave-layout.d.ts +99 -0
  258. package/dist/wave-layout.d.ts.map +1 -0
  259. package/dist/wave-layout.js +130 -0
  260. package/dist/wave-layout.js.map +1 -0
  261. package/dist/working-calendar.d.ts +128 -4
  262. package/dist/working-calendar.d.ts.map +1 -1
  263. package/dist/working-calendar.js +725 -51
  264. package/dist/working-calendar.js.map +1 -1
  265. package/dist/working-span.d.ts +11 -0
  266. package/dist/working-span.d.ts.map +1 -0
  267. package/dist/working-span.js +18 -0
  268. package/dist/working-span.js.map +1 -0
  269. package/package.json +7 -7
  270. package/src/axis-columns.ts +140 -0
  271. package/src/calendar-resolver.ts +161 -0
  272. package/src/calendar.ts +4 -45
  273. package/src/canvas-width.ts +36 -0
  274. package/src/capacity.ts +71 -30
  275. package/src/chart-translation.ts +88 -0
  276. package/src/container-header-geometry.ts +116 -0
  277. package/src/dsl-utils.ts +8 -26
  278. package/src/edge-routing.ts +347 -491
  279. package/src/frame-tab-geometry.ts +78 -25
  280. package/src/header-card-geometry.ts +17 -2
  281. package/src/header-logo.ts +67 -0
  282. package/src/i18n.ts +22 -1
  283. package/src/index.ts +97 -12
  284. package/src/inline-date-pin-geometry.ts +55 -58
  285. package/src/item-bar-geometry.ts +341 -5
  286. package/src/item-port-geometry.ts +69 -0
  287. package/src/layout-context.ts +210 -72
  288. package/src/layout-insights.ts +109 -2
  289. package/src/layout.ts +57 -1530
  290. package/src/nodes/anchor-node.ts +11 -4
  291. package/src/nodes/content-extent.ts +107 -0
  292. package/src/nodes/dependency-edges.ts +171 -0
  293. package/src/nodes/footnote-node.ts +171 -31
  294. package/src/nodes/group-node.ts +92 -215
  295. package/src/nodes/header-node.ts +255 -0
  296. package/src/nodes/include-node.ts +124 -110
  297. package/src/nodes/item-measure.ts +723 -0
  298. package/src/nodes/item-node.ts +358 -80
  299. package/src/nodes/marker-band.ts +406 -0
  300. package/src/nodes/marker-geometry.ts +1 -1
  301. package/src/nodes/milestone-node.ts +321 -136
  302. package/src/nodes/nowline-node.ts +87 -0
  303. package/src/nodes/parallel-node.ts +69 -39
  304. package/src/nodes/region-markers.ts +194 -0
  305. package/src/nodes/roadmap-node.ts +46 -950
  306. package/src/nodes/row-track.ts +217 -0
  307. package/src/nodes/sequence-item.ts +433 -0
  308. package/src/nodes/sequence-one.ts +40 -0
  309. package/src/nodes/swimlane-node.ts +66 -206
  310. package/src/nodes/wave-node.ts +609 -0
  311. package/src/non-working-display.ts +32 -0
  312. package/src/phases/date-window.ts +191 -0
  313. package/src/phases/finalize.ts +1303 -0
  314. package/src/phases/measure.ts +329 -0
  315. package/src/phases/place.ts +318 -0
  316. package/src/renderable.ts +23 -3
  317. package/src/resolve-today.ts +28 -25
  318. package/src/row-packer.ts +85 -84
  319. package/src/schedule.ts +362 -114
  320. package/src/start-rules.ts +113 -0
  321. package/src/start-terms.ts +38 -0
  322. package/src/status-dot.ts +81 -0
  323. package/src/style-resolution.ts +27 -57
  324. package/src/text-measure.ts +71 -0
  325. package/src/themes/contrast.ts +34 -0
  326. package/src/themes/dark.ts +28 -1
  327. package/src/themes/grayscale.ts +28 -1
  328. package/src/themes/index.ts +10 -7
  329. package/src/themes/light.ts +28 -1
  330. package/src/themes/shape.ts +38 -0
  331. package/src/themes/shared.ts +85 -93
  332. package/src/time-scale.ts +117 -19
  333. package/src/types.ts +529 -20
  334. package/src/view-preset.ts +520 -27
  335. package/src/wave-barrier.ts +242 -0
  336. package/src/wave-hatch.ts +25 -0
  337. package/src/wave-layout.ts +203 -0
  338. package/src/working-calendar.ts +875 -57
  339. 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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderable.d.ts","sourceRoot":"","sources":["../src/renderable.ts"],"names":[],"mappings":"AAoBA,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"}
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"}
@@ -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. The production nodes (`ItemNode`, `SwimlaneNode`,
18
- // etc. under `nodes/`) follow this pattern: place re-measures, but
19
- // measure is O(content) without I/O.
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
@@ -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,qEAAqE;AACrE,mEAAmE;AACnE,qCAAqC"}
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"}
@@ -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; `Date.UTC(y, m, d)` regardless of zone
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":"AAwBA;;;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;gBACxB,OAAO,EAAE,MAAM;CAI9B;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;AAkBD,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;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,IAAI,GAAG,SAAS,CA6D7E"}
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"}
@@ -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
- // Captures: [1] year, [2] month, [3] day
133
- const ISO_FLOATING_RE = /^(\d{4})-(\d{2})-(\d{2})T\d{2}:\d{2}:\d{2}(?:\.\d+)?$/;
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; `Date.UTC(y, m, d)` regardless of zone
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 bareMatch = BARE_DATE_RE.exec(now);
165
- if (bareMatch) {
166
- return new Date(Date.UTC(parseInt(bareMatch[1], 10), parseInt(bareMatch[2], 10) - 1, parseInt(bareMatch[3], 10)));
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
- const floating = ISO_FLOATING_RE.exec(now);
187
- if (floating) {
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":"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"}
1
+ {"version":3,"file":"resolve-today.js","sourceRoot":"","sources":["../src/resolve-today.ts"],"names":[],"mappings":"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"}
@@ -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
- /** Children placed in this row. Used when the row's height grows
13
- * after later rows exist — every child in every later row shifts
14
- * down by the delta. */
15
- placedChildren: PositionedTrackChild[];
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. Includes the trailing
54
- * `ITEM_INSET_PX` so the next chained item butts edge-to-edge in
55
- * logical space (with a 2 × ITEM_INSET_PX visible gutter between
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
- * Find the topmost row where the item's natural extent fits without
93
- * colliding with sibling content or a slack corridor; appending a
94
- * fresh row at the bottom when none of the existing rows fit.
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`, sets the caption spill, and
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. Empty rows contribute
119
- * `laneLeftX`. */
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
@@ -1 +1 @@
1
- {"version":3,"file":"row-packer.d.ts","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,SAAS;IACtB,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB;mEAC+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf;;6BAEyB;IACzB,cAAc,EAAE,oBAAoB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC7B;;kCAE8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB;wEACoE;IACpE,cAAc,EAAE,aAAa,EAAE,CAAC;CACnC;AAED,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IAC/B;iEAC6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB;;uEAEmE;IACnE,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;CACb;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB;;;iBAGa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB;0EACsE;IACtE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;;;;8BAO0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;CACb;AAED,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,oBAAoB,CAAC;IAC7B;;uBAEmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IAClB,SAAgB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;gBAE5B,IAAI,EAAE,gBAAgB;IAalC;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa;IAYnD;;;;;OAKG;IACH,UAAU,IAAI,cAAc;IAS5B;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IASxC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAQ1C,mEAAmE;IACnE,UAAU,IAAI,MAAM;IAKpB;;uBAEmB;IACnB,UAAU,IAAI,MAAM;IASpB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,aAAa;CAaxB"}
1
+ {"version":3,"file":"row-packer.d.ts","sourceRoot":"","sources":["../src/row-packer.ts"],"names":[],"mappings":"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"}