@nowline/layout 0.8.6 → 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 (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
package/dist/schedule.js CHANGED
@@ -1,155 +1,329 @@
1
1
  // scheduleRoadmap — compute the floating calendar start/end date for every
2
2
  // named entity (items, milestones, anchors) without running the full layout.
3
3
  //
4
- // The sequencing rules exactly mirror `computeContentEndDay` in `layout.ts`
5
- // plus the roadmap-start resolution in `RoadmapNode.place`:
6
- // - date: / start: — absolute pin (date: wins over start:)
7
- // - after:[id|DATE] — start after the maximum predecessor end
4
+ // This is the only day-level scheduler (specs/scheduler-unification.md): the
5
+ // date window reads its content day from `extent`, and the exporters read the
6
+ // dates. The pixel layout keeps its own placement and differs from it in the
7
+ // catalogued ways of `test/engine-divergences.json`. The rules, with the
8
+ // roadmap-start resolution of the date-window phase (`resolveDateWindow` in
9
+ // `phases/date-window.ts`):
8
10
  // - sequential default — start where the previous item in the lane ended
11
+ // - after:[id|DATE] — start no earlier than the maximum predecessor end
12
+ // (work has no fixed start pin: `date:` / `start:` on an item are
13
+ // unknown keys, specs/dsl.md § Item Properties); a parallel ends at its
14
+ // latest track end, a group at its last child's end
15
+ // - wave barriers (roadmaps with waves only) — every start is floored by
16
+ // its wave's start S_k, iterated to a fixpoint by `solveWaveBarriers`
17
+ // (specs/waves.md §8.5)
9
18
  //
10
- // Used by the XLSX exporter to populate the "Start" / "End" date columns and
11
- // the milestone "Date" cell when no explicit `date:` is set. Keeping it
12
- // separate from `computeContentEndDay` avoids mutating the byte-stable snapshot
13
- // pipeline.
14
- import { isGroupBlock, isItemDeclaration, isParallelBlock } from '@nowline/core';
15
- import { addDays, daysBetween, deriveItemDurationDays, resolveCalendar, resolveSizes, } from './calendar.js';
16
- import { parseDate, propValue, propValues } from './dsl-utils.js';
19
+ // Offsets are working-day indices from the start (specs/working-calendar.md
20
+ // §5): dates convert with `workingIndexOf`, so an `after:` date on a
21
+ // non-working day starts on the next working day. A start (and an after-only milestone) is a
22
+ // point, `dateAtWorkingIndex`; an exclusive end is `spanEndDate`, so a
23
+ // Mon–Fri item ends on Saturday. Anchors and dated milestones keep their own
24
+ // dates. A calendar with no non-working day keeps calendar-day arithmetic.
25
+ //
26
+ // The schedule is every exporter's source for the chart's calendar and
27
+ // durations (handoff m2p decision 16): `calendar` is the file's resolved
28
+ // calendar and `ScheduledItem.days` the duration engine C placed. The XLSX
29
+ // exporter also reads the Start / End dates, the milestone dates and the
30
+ // wave spans; the Mermaid exporter reads the wave spans.
31
+ import { buildWavePlan, isGroupBlock, isItemDeclaration, isParallelBlock } from '@nowline/core';
32
+ import { trackChildren } from '@nowline/core/internal';
33
+ import { deriveItemDurationDays, resolveSizes } from './calendar.js';
34
+ import { resolveWorkingCalendar } from './calendar-resolver.js';
35
+ import { parseIsoDate, propValue } from './dsl-utils.js';
36
+ import { startTermsOf } from './start-terms.js';
37
+ import { solveWaveBarriers, summarizeWaves, WavePass, waveFloorDays } from './wave-barrier.js';
38
+ import { spanEndDate } from './working-calendar.js';
39
+ /**
40
+ * True when some wave has a member (specs/waves.md §9.1). With none, the
41
+ * roadmap draws no waves: no strip, no hatch, no legend. The barrier still
42
+ * runs, so wave floors and `after:<wave>` keep their dates.
43
+ */
44
+ export function hasVisibleWaves(schedule) {
45
+ for (const wave of schedule.waves?.values() ?? []) {
46
+ if (wave.memberCount > 0)
47
+ return true;
48
+ }
49
+ return false;
50
+ }
17
51
  /**
18
52
  * Compute the scheduled start/end date for every named entity in the roadmap.
19
53
  * Does NOT run the full layout (no SVG geometry, no pixel coordinates).
20
54
  */
21
55
  export function scheduleRoadmap(file, resolved, options = {}) {
22
- const cal = resolveCalendar(file, resolved.config.calendar);
56
+ const resolvedCalendar = resolveWorkingCalendar(file, resolved);
57
+ const { config: cal, working: calendar } = resolvedCalendar;
23
58
  const sizes = resolveSizes(resolved.content.sizes, cal);
24
- // Resolve roadmap start date — same precedence as RoadmapNode.place.
59
+ // Resolve roadmap start date — same precedence as the date-window phase.
25
60
  const startRaw = propValue(file.roadmapDecl?.properties ?? [], 'start');
26
- const startDate = parseDate(startRaw) ?? utcMidnight(options.today ?? new Date());
61
+ const startDate = parseIsoDate(startRaw) ?? utcMidnight(options.today ?? new Date());
62
+ // Working-day index of a date, and back: a point and an exclusive end.
63
+ const dayOf = (date) => calendar.workingIndexOf(startDate, date);
64
+ const pointAt = (day) => calendar.dateAtWorkingIndex(startDate, day);
65
+ const endAt = (start, end) => spanEndDate(calendar, startDate, start, end);
66
+ // The latest day any lane cursor, anchor, milestone or wave edge reaches.
67
+ let contentEndDay = 0;
68
+ const reachMax = (day) => {
69
+ contentEndDay = Math.max(contentEndDay, day);
70
+ };
27
71
  // These maps accumulate end-day offsets (from startDate) for cross-entity
28
- // `after:` resolution, matching computeContentEndDay exactly.
29
- const itemEnd = new Map(); // id → end day
72
+ // `after:` resolution. In a roadmap with waves the item maps are rebuilt on
73
+ // every barrier pass.
74
+ let itemEnd = new Map(); // item, group, parallel or wave id → end day
30
75
  const anchorEnd = new Map(); // id → date day
31
76
  const milestoneEnd = new Map(); // id → date day
32
77
  // Result maps (Date objects).
33
- const itemResults = new Map();
34
- const itemByNode = new WeakMap();
78
+ let itemResults = new Map();
79
+ let itemByNode = new WeakMap();
35
80
  const milestoneResults = new Map();
36
81
  const milestoneByNode = new WeakMap();
37
82
  const anchorResults = new Map();
38
- // Resolve a single `after:` element to a day-offset.
39
- const resolveAfterDay = (ref) => {
40
- const inlineDate = parseDate(ref);
41
- if (inlineDate)
42
- return daysBetween(startDate, inlineDate);
43
- if (itemEnd.has(ref))
44
- return itemEnd.get(ref);
45
- if (anchorEnd.has(ref))
46
- return anchorEnd.get(ref);
47
- if (milestoneEnd.has(ref))
48
- return milestoneEnd.get(ref);
49
- return 0;
50
- };
51
83
  // Pre-seed named anchors (they may be referenced by item after: before we
52
84
  // walk the lanes).
53
85
  for (const [id, anchor] of resolved.content.anchors) {
54
- const d = parseDate(propValue(anchor.properties, 'date'));
86
+ const d = parseIsoDate(propValue(anchor.properties, 'date'));
55
87
  if (d) {
56
- const day = daysBetween(startDate, d);
88
+ const day = dayOf(d);
57
89
  anchorEnd.set(id, day);
58
- anchorResults.set(id, addDays(startDate, day));
90
+ anchorResults.set(id, d);
91
+ reachMax(day);
59
92
  }
60
93
  }
61
- // Walk a sequential lane, returning the end-day of the last child.
62
- const walkLane = (children, baselineEnd) => {
63
- let prevEnd = baselineEnd;
64
- for (const child of children) {
65
- if (child.$type === 'DescriptionDirective')
66
- continue;
67
- prevEnd = walkNode(child, prevEnd);
68
- }
69
- return prevEnd;
70
- };
71
- const walkNode = (node, prevEnd) => {
72
- if (isItemDeclaration(node)) {
73
- const dur = deriveItemDurationDays(node.properties, sizes, cal);
74
- const dateProp = parseDate(propValue(node.properties, 'date'));
75
- const startProp = parseDate(propValue(node.properties, 'start'));
76
- const afterRefs = propValues(node.properties, 'after');
77
- let start = prevEnd;
78
- if (dateProp) {
79
- start = daysBetween(startDate, dateProp);
94
+ const mainScope = () => ({
95
+ itemEnd,
96
+ anchorEnd,
97
+ milestoneEnd,
98
+ sizes,
99
+ itemResults,
100
+ inByNode: true,
101
+ });
102
+ // `wave` is the current barrier pass, undefined when there are no waves;
103
+ // `reach` receives every lane cursor, so a container start that passes
104
+ // every child (an empty `group after:x`) still counts in the extent.
105
+ const makeWalker = (scope, wave, reach) => {
106
+ // Resolve a single `after:` element to a day-offset.
107
+ const resolveAfterDay = (term) => {
108
+ if ('date' in term)
109
+ return dayOf(term.date);
110
+ const ref = term.ref;
111
+ if (scope.itemEnd.has(ref))
112
+ return scope.itemEnd.get(ref);
113
+ if (scope.anchorEnd.has(ref))
114
+ return scope.anchorEnd.get(ref);
115
+ if (scope.milestoneEnd.has(ref))
116
+ return scope.milestoneEnd.get(ref);
117
+ return 0;
118
+ };
119
+ // Walk a sequential lane or group, returning the end-day of the last
120
+ // child. Core's `trackChildren` says what a child is; the recursion
121
+ // stays here because it carries the cursor and the wave pass.
122
+ const walkLane = (container, baselineEnd) => {
123
+ let prevEnd = baselineEnd;
124
+ for (const child of trackChildren(container)) {
125
+ prevEnd = walkNode(child, prevEnd);
126
+ reach(prevEnd);
80
127
  }
81
- else if (startProp) {
82
- start = daysBetween(startDate, startProp);
128
+ return prevEnd;
129
+ };
130
+ const walkNode = (node, prevEnd) => {
131
+ if (isItemDeclaration(node)) {
132
+ const dur = deriveItemDurationDays(node.properties, scope.sizes, cal);
133
+ const { after } = startTermsOf(node.properties);
134
+ let start = after.length > 0 ? Math.max(prevEnd, ...after.map(resolveAfterDay)) : prevEnd;
135
+ // The barrier floor is one more term in the max.
136
+ if (wave)
137
+ start = wave.apply(node, start);
138
+ const end = start + dur;
139
+ const scheduled = {
140
+ start: pointAt(start),
141
+ end: endAt(start, end),
142
+ days: dur,
143
+ };
144
+ if (scope.inByNode)
145
+ itemByNode.set(node, scheduled);
146
+ if (node.name) {
147
+ scope.itemEnd.set(node.name, end);
148
+ scope.itemResults?.set(node.name, scheduled);
149
+ }
150
+ wave?.accumulate(node, end);
151
+ return end;
83
152
  }
84
- else if (afterRefs.length > 0) {
85
- start = Math.max(prevEnd, ...afterRefs.map(resolveAfterDay));
153
+ if (isParallelBlock(node)) {
154
+ const { after } = startTermsOf(node.properties);
155
+ let containerStart = after.length > 0 ? Math.max(prevEnd, ...after.map(resolveAfterDay)) : prevEnd;
156
+ if (wave)
157
+ containerStart = wave.apply(node, containerStart);
158
+ let parallelEnd = containerStart;
159
+ for (const child of trackChildren(node)) {
160
+ parallelEnd = Math.max(parallelEnd, walkNode(child, containerStart));
161
+ }
162
+ // `after:` a parallel waits for its latest track end.
163
+ if (node.name)
164
+ scope.itemEnd.set(node.name, parallelEnd);
165
+ return parallelEnd;
86
166
  }
87
- const end = start + dur;
88
- const scheduled = {
89
- start: addDays(startDate, start),
90
- end: addDays(startDate, end),
91
- };
92
- itemByNode.set(node, scheduled);
93
- if (node.name) {
94
- itemEnd.set(node.name, end);
95
- itemResults.set(node.name, scheduled);
167
+ if (isGroupBlock(node)) {
168
+ const { after } = startTermsOf(node.properties);
169
+ let containerStart = after.length > 0 ? Math.max(prevEnd, ...after.map(resolveAfterDay)) : prevEnd;
170
+ if (wave)
171
+ containerStart = wave.apply(node, containerStart);
172
+ // `after:` a group waits for its last child's end.
173
+ const groupEnd = walkLane(node, containerStart);
174
+ if (node.name)
175
+ scope.itemEnd.set(node.name, groupEnd);
176
+ return groupEnd;
96
177
  }
97
- return end;
98
- }
99
- if (isParallelBlock(node)) {
100
- const afterRefs = propValues(node.properties, 'after');
101
- const containerStart = afterRefs.length > 0
102
- ? Math.max(prevEnd, ...afterRefs.map(resolveAfterDay))
103
- : prevEnd;
104
- let parallelEnd = containerStart;
105
- for (const child of node.content) {
106
- if (child.$type === 'DescriptionDirective')
107
- continue;
108
- const childEnd = walkNode(child, containerStart);
109
- parallelEnd = Math.max(parallelEnd, childEnd);
178
+ return prevEnd;
179
+ };
180
+ return { walkLane, resolveAfterDay };
181
+ };
182
+ // A milestone is a point: its `date:`, else its latest predecessor end.
183
+ // Returns the day, or undefined when it has neither.
184
+ const milestoneDay = (ms, resolveAfterDay) => {
185
+ const d = parseIsoDate(propValue(ms.properties, 'date'));
186
+ if (d)
187
+ return dayOf(d);
188
+ const { after } = startTermsOf(ms.properties);
189
+ return after.length > 0 ? Math.max(0, ...after.map(resolveAfterDay)) : undefined;
190
+ };
191
+ // An isolated region in a roadmap without waves: fresh id maps, its own
192
+ // sizes (specs/scheduler-unification.md §8, decision 2), its anchors and
193
+ // milestones (resolved inside the region and counted in the extent, never
194
+ // in the results) and its nested regions.
195
+ // First-level region items join `byNode`; their ids stay out of `items`.
196
+ const scheduleRegion = (content, firstLevel) => {
197
+ const regionItemEnd = new Map();
198
+ const regionAnchorEnd = new Map();
199
+ const regionMilestoneEnd = new Map();
200
+ for (const [id, anchor] of content.anchors) {
201
+ const d = parseIsoDate(propValue(anchor.properties, 'date'));
202
+ if (d) {
203
+ const day = dayOf(d);
204
+ regionAnchorEnd.set(id, day);
205
+ reachMax(day);
110
206
  }
111
- return parallelEnd;
112
207
  }
113
- if (isGroupBlock(node)) {
114
- const afterRefs = propValues(node.properties, 'after');
115
- const containerStart = afterRefs.length > 0
116
- ? Math.max(prevEnd, ...afterRefs.map(resolveAfterDay))
117
- : prevEnd;
118
- return walkLane(node.content, containerStart);
208
+ const { walkLane, resolveAfterDay } = makeWalker({
209
+ itemEnd: regionItemEnd,
210
+ anchorEnd: regionAnchorEnd,
211
+ milestoneEnd: regionMilestoneEnd,
212
+ sizes: resolveSizes(content.sizes, cal),
213
+ inByNode: firstLevel,
214
+ }, undefined, reachMax);
215
+ for (const lane of content.swimlanes.values())
216
+ walkLane(lane, 0);
217
+ for (const [id, ms] of content.milestones) {
218
+ const day = milestoneDay(ms, resolveAfterDay);
219
+ if (day === undefined)
220
+ continue;
221
+ regionMilestoneEnd.set(id, day);
222
+ reachMax(day);
119
223
  }
120
- return prevEnd;
224
+ for (const nested of content.isolatedRegions)
225
+ scheduleRegion(nested.content, false);
121
226
  };
122
- for (const lane of resolved.content.swimlanes.values()) {
123
- walkLane(lane.content, 0);
227
+ const plan = options.plan !== undefined ? (options.plan ?? undefined) : buildWavePlan(resolved);
228
+ let waves;
229
+ if (!plan) {
230
+ const { walkLane } = makeWalker(mainScope(), undefined, reachMax);
231
+ for (const lane of resolved.content.swimlanes.values()) {
232
+ walkLane(lane, 0);
233
+ }
124
234
  }
125
- // Milestones — same pass order as computeContentEndDay (after items so
126
- // after: can resolve item end-days).
235
+ else {
236
+ // Wave barriers (specs/waves.md §8.5): iterate the lane walk to the
237
+ // least fixpoint. The final pass's results are the schedule.
238
+ const ids = plan.waves.map((w) => w.name);
239
+ const floors = waveFloorDays(plan, startDate, calendar);
240
+ let finalPass;
241
+ // The extent of the latest pass; the final one ran with the solved S/E.
242
+ let passMax = 0;
243
+ const reachPass = (day) => {
244
+ passMax = Math.max(passMax, day);
245
+ };
246
+ const result = solveWaveBarriers(ids.length, 0, floors, (S, E) => {
247
+ // Reset the item maps, keep the anchors, and seed each wave id
248
+ // with E_k so `after:<wave>` resolves to the wave's end.
249
+ const seeds = ids.map((id, i) => [id, E[i]]);
250
+ itemEnd = new Map(seeds);
251
+ itemResults = new Map();
252
+ itemByNode = new WeakMap();
253
+ passMax = 0;
254
+ const pass = new WavePass(plan, S);
255
+ const { walkLane } = makeWalker(mainScope(), pass, reachPass);
256
+ for (const lane of resolved.content.swimlanes.values()) {
257
+ walkLane(lane, 0);
258
+ }
259
+ // Exactly one level of isolated regions, each with fresh id maps
260
+ // seeded only with the wave edges. Region items join the barrier
261
+ // and `byNode`; their ids stay out of `items`. Region anchors,
262
+ // region milestones and nested regions are not walked: engine A
263
+ // draws none of them.
264
+ for (const region of resolved.content.isolatedRegions) {
265
+ const regionWalker = makeWalker({
266
+ itemEnd: new Map(seeds),
267
+ anchorEnd: new Map(),
268
+ milestoneEnd: new Map(),
269
+ sizes: resolveSizes(region.content.sizes, cal),
270
+ inByNode: true,
271
+ }, pass, reachPass);
272
+ for (const lane of region.content.swimlanes.values()) {
273
+ regionWalker.walkLane(lane, 0);
274
+ }
275
+ }
276
+ finalPass = pass;
277
+ return pass;
278
+ });
279
+ // The content end covers the last wave's end and every wave start,
280
+ // so floors and empty trailing waves stay inside the window.
281
+ reachMax(Math.max(passMax, ...result.S, ...result.E.slice(-1)));
282
+ waves = new Map();
283
+ for (const span of summarizeWaves(plan, result, finalPass, 0, floors)) {
284
+ waves.set(span.id, {
285
+ index: span.index,
286
+ start: pointAt(span.start),
287
+ end: endAt(span.start, span.end),
288
+ memberCount: span.memberCount,
289
+ ...(span.heldBy !== undefined ? { heldBy: span.heldBy } : {}),
290
+ ...(span.floorRef !== undefined ? { floorRef: span.floorRef } : {}),
291
+ });
292
+ }
293
+ }
294
+ // Milestones, after the items so after: can resolve item end-days, and
295
+ // wave ids their E_k.
296
+ const { resolveAfterDay } = makeWalker(mainScope(), undefined, reachMax);
127
297
  for (const [id, ms] of resolved.content.milestones) {
128
- const d = parseDate(propValue(ms.properties, 'date'));
129
- if (d) {
130
- const day = daysBetween(startDate, d);
131
- const resolved2 = addDays(startDate, day);
132
- milestoneEnd.set(id, day);
133
- milestoneResults.set(id, resolved2);
134
- milestoneByNode.set(ms, resolved2);
298
+ const day = milestoneDay(ms, resolveAfterDay);
299
+ if (day === undefined)
135
300
  continue;
136
- }
137
- const after = propValues(ms.properties, 'after');
138
- if (after.length > 0) {
139
- const day = Math.max(0, ...after.map(resolveAfterDay));
140
- const resolved2 = addDays(startDate, day);
141
- milestoneEnd.set(id, day);
142
- milestoneResults.set(id, resolved2);
143
- milestoneByNode.set(ms, resolved2);
301
+ // A dated milestone keeps its own date; an after-only one is a point
302
+ // at the latest predecessor end: the next working day.
303
+ const date = parseIsoDate(propValue(ms.properties, 'date')) ?? pointAt(day);
304
+ milestoneEnd.set(id, day);
305
+ milestoneResults.set(id, date);
306
+ milestoneByNode.set(ms, date);
307
+ reachMax(day);
308
+ }
309
+ // Isolated regions without waves (with waves they joined the passes).
310
+ if (!plan) {
311
+ for (const region of resolved.content.isolatedRegions) {
312
+ scheduleRegion(region.content, true);
144
313
  }
145
314
  }
146
315
  return {
147
316
  startDate,
317
+ calendar: resolvedCalendar,
148
318
  items: itemResults,
149
319
  byNode: itemByNode,
150
320
  milestones: milestoneResults,
151
321
  milestoneByNode,
152
322
  anchors: anchorResults,
323
+ ...(waves ? { waves } : {}),
324
+ ...(plan ? { plan } : {}),
325
+ resolved,
326
+ extent: { contentEndDay },
153
327
  };
154
328
  }
155
329
  function utcMidnight(d) {
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { EntityProperty, GroupBlock, ItemDeclaration, ParallelBlock } from '@nowline/core';
2
+ import type { LayoutContext } from './layout-context.js';
3
+ import type { PositionedItem } from './types.js';
4
+ export declare function resolveChildStart(child: ItemDeclaration | GroupBlock | ParallelBlock, seqDefault: number, ctx: LayoutContext): number;
5
+ /**
6
+ * Turn the warm start from the day schedule on or off: the barrier seed of
7
+ * the place phase. Tests turn it off to compare against a cold start (same
8
+ * output, more barrier passes); layout never does.
9
+ */
10
+ export declare function setScheduleWarmStart(enabled: boolean): void;
11
+ /** True unless a test turned the warm start off (`setScheduleWarmStart`). */
12
+ export declare function isScheduleWarmStart(): boolean;
13
+ /**
14
+ * The start before the wave floor: the latest `after:` end (ids and inline
15
+ * dates inside the window) no earlier than `seqDefault`, else `seqDefault`.
16
+ */
17
+ export declare function resolvePinnedOrSequentialStart(props: EntityProperty[], seqDefault: number, ctx: LayoutContext): number;
18
+ /**
19
+ * The inline `after:` date on a non-working day that set an item's start
20
+ * (NL.I1008, specs/working-calendar.md §6), for an item placed at `startX`.
21
+ * It reports only when it set the start, that is when the item starts at
22
+ * the date's x (within the edge tolerance): a later `after:` ref, the lane
23
+ * cursor or a wave floor that pushed the item past it never reports. A date
24
+ * on a working day or outside the date window reports nothing.
25
+ */
26
+ export declare function nonWorkingPinOf(props: EntityProperty[], startX: number, ctx: LayoutContext): PositionedItem['nonWorkingPin'];
27
+ //# sourceMappingURL=start-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-rules.d.ts","sourceRoot":"","sources":["../src/start-rules.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiBjD,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,eAAe,GAAG,UAAU,GAAG,aAAa,EACnD,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,aAAa,GACnB,MAAM,CAMR;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE3D;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,cAAc,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,aAAa,GACnB,MAAM,CAgBR;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,aAAa,GACnB,cAAc,CAAC,eAAe,CAAC,CAOjC"}
@@ -0,0 +1,91 @@
1
+ // Start rules — engine A's (the pixel layout's) start rule for a lane or
2
+ // group child, built on the parsed terms of `start-terms.ts`: the latest of
3
+ // the sequential default and the `after:` terms (refs and inline dates),
4
+ // then the wave floor (specs/waves.md §8.4). Also the inline
5
+ // `after:` date that reports NL.I1008 when it set an item's start on a
6
+ // non-working day (specs/working-calendar.md §6).
7
+ import { formatIsoDate } from './dsl-utils.js';
8
+ import { startTermsOf } from './start-terms.js';
9
+ import { dateAtX, WAVE_EDGE_TOLERANCE_PX, waveFloorX } from './wave-layout.js';
10
+ // Resolve the desired startX for a swimlane child: the latest of the
11
+ // sequential default (`seqDefault`, the lane's rightmost time cursor across
12
+ // all rows) and every `after:` term. Work has no fixed start pin, so
13
+ // `after:` only ever delays (specs/dsl.md § Item Properties).
14
+ //
15
+ // `after:` accepts both entity ids (looked up in `ctx.entityRightEdges`) and
16
+ // inline ISO date literals (looked up via `ctx.scale.forwardWithinDomain`).
17
+ // The validator already enforces "at most one inline date per direction" so
18
+ // at most one element in the list will hit the date path.
19
+ //
20
+ // In a roadmap with waves the result is floored by the child's wave and,
21
+ // for a container, its lead wave (specs/waves.md §8.4), so the row
22
+ // packer's predicted start matches the start `sequenceItem` / the
23
+ // container node places.
24
+ export function resolveChildStart(child, seqDefault, ctx) {
25
+ return waveFloorX(child, resolvePinnedOrSequentialStart(child.properties, seqDefault, ctx), ctx);
26
+ }
27
+ let scheduleWarmStart = true;
28
+ /**
29
+ * Turn the warm start from the day schedule on or off: the barrier seed of
30
+ * the place phase. Tests turn it off to compare against a cold start (same
31
+ * output, more barrier passes); layout never does.
32
+ */
33
+ export function setScheduleWarmStart(enabled) {
34
+ scheduleWarmStart = enabled;
35
+ }
36
+ /** True unless a test turned the warm start off (`setScheduleWarmStart`). */
37
+ export function isScheduleWarmStart() {
38
+ return scheduleWarmStart;
39
+ }
40
+ /**
41
+ * The start before the wave floor: the latest `after:` end (ids and inline
42
+ * dates inside the window) no earlier than `seqDefault`, else `seqDefault`.
43
+ */
44
+ export function resolvePinnedOrSequentialStart(props, seqDefault, ctx) {
45
+ const { after } = startTermsOf(props);
46
+ if (after.length > 0) {
47
+ let maxEnd = seqDefault;
48
+ for (const term of after) {
49
+ if ('date' in term) {
50
+ const xd = ctx.scale.forwardWithinDomain(term.date);
51
+ if (xd !== null)
52
+ maxEnd = Math.max(maxEnd, xd);
53
+ continue;
54
+ }
55
+ const endX = ctx.entityRightEdges.get(term.ref);
56
+ if (endX !== undefined)
57
+ maxEnd = Math.max(maxEnd, endX);
58
+ }
59
+ return maxEnd;
60
+ }
61
+ return seqDefault;
62
+ }
63
+ /**
64
+ * The inline `after:` date on a non-working day that set an item's start
65
+ * (NL.I1008, specs/working-calendar.md §6), for an item placed at `startX`.
66
+ * It reports only when it set the start, that is when the item starts at
67
+ * the date's x (within the edge tolerance): a later `after:` ref, the lane
68
+ * cursor or a wave floor that pushed the item past it never reports. A date
69
+ * on a working day or outside the date window reports nothing.
70
+ */
71
+ export function nonWorkingPinOf(props, startX, ctx) {
72
+ if (!ctx.calendar.hasNonWorkingDays)
73
+ return undefined;
74
+ const pin = startPinOf(props);
75
+ if (!pin || ctx.calendar.isWorkingDay(pin.date))
76
+ return undefined;
77
+ const pinX = ctx.scale.forwardWithinDomain(pin.date);
78
+ if (pinX === null || Math.abs(startX - pinX) >= WAVE_EDGE_TOLERANCE_PX)
79
+ return undefined;
80
+ return { key: pin.key, pin: pin.raw, start: formatIsoDate(dateAtX(startX, ctx)) };
81
+ }
82
+ /** The inline `after:` date that can set an item's start. */
83
+ function startPinOf(props) {
84
+ const { after } = startTermsOf(props);
85
+ for (const term of after) {
86
+ if ('date' in term)
87
+ return { key: 'after', raw: term.raw, date: term.date };
88
+ }
89
+ return undefined;
90
+ }
91
+ //# sourceMappingURL=start-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-rules.js","sourceRoot":"","sources":["../src/start-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { EntityProperty, WavePlan } from '@nowline/core';
2
+ /** One element of `after:`: an ISO date, or the id of an entity. */
3
+ export type AfterTerm = {
4
+ raw: string;
5
+ date: Date;
6
+ } | {
7
+ raw: string;
8
+ ref: string;
9
+ };
10
+ export interface StartTerms {
11
+ /** `after:` elements in source order: an ISO date or an id. */
12
+ after: ReadonlyArray<AfterTerm>;
13
+ }
14
+ /** The start terms of an item, group or parallel from its properties. */
15
+ export declare function startTermsOf(props: EntityProperty[]): StartTerms;
16
+ /**
17
+ * The declaration date of each wave's floor (`null` for a wave without a
18
+ * floor or whose date does not parse), at index `k - 1` for wave `k`. The
19
+ * dates are the plan's unclamped declarations: the day engine maps them with
20
+ * `workingIndexOf`, the pixel engine with `scale.forward`.
21
+ */
22
+ export declare function waveFloorDates(plan: WavePlan): Array<Date | null>;
23
+ //# sourceMappingURL=start-terms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-terms.d.ts","sourceRoot":"","sources":["../src/start-terms.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9D,oEAAoE;AACpE,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,MAAM,WAAW,UAAU;IACvB,+DAA+D;IAC/D,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACnC;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,UAAU,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAEjE"}