@nowline/layout 0.8.6 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/dist/axis-columns.d.ts +70 -0
  2. package/dist/axis-columns.d.ts.map +1 -0
  3. package/dist/axis-columns.js +104 -0
  4. package/dist/axis-columns.js.map +1 -0
  5. package/dist/calendar-resolver.d.ts +27 -0
  6. package/dist/calendar-resolver.d.ts.map +1 -0
  7. package/dist/calendar-resolver.js +132 -0
  8. package/dist/calendar-resolver.js.map +1 -0
  9. package/dist/calendar.d.ts +0 -19
  10. package/dist/calendar.d.ts.map +1 -1
  11. package/dist/calendar.js +4 -44
  12. package/dist/calendar.js.map +1 -1
  13. package/dist/canvas-width.d.ts +23 -0
  14. package/dist/canvas-width.d.ts.map +1 -0
  15. package/dist/canvas-width.js +26 -0
  16. package/dist/canvas-width.js.map +1 -0
  17. package/dist/capacity.d.ts +28 -0
  18. package/dist/capacity.d.ts.map +1 -1
  19. package/dist/capacity.js +64 -29
  20. package/dist/capacity.js.map +1 -1
  21. package/dist/chart-translation.d.ts +22 -0
  22. package/dist/chart-translation.d.ts.map +1 -0
  23. package/dist/chart-translation.js +83 -0
  24. package/dist/chart-translation.js.map +1 -0
  25. package/dist/container-header-geometry.d.ts +64 -0
  26. package/dist/container-header-geometry.d.ts.map +1 -0
  27. package/dist/container-header-geometry.js +89 -0
  28. package/dist/container-header-geometry.js.map +1 -0
  29. package/dist/dsl-utils.d.ts +3 -4
  30. package/dist/dsl-utils.d.ts.map +1 -1
  31. package/dist/dsl-utils.js +8 -25
  32. package/dist/dsl-utils.js.map +1 -1
  33. package/dist/edge-routing.d.ts +69 -78
  34. package/dist/edge-routing.d.ts.map +1 -1
  35. package/dist/edge-routing.js +271 -401
  36. package/dist/edge-routing.js.map +1 -1
  37. package/dist/frame-tab-geometry.d.ts +24 -14
  38. package/dist/frame-tab-geometry.d.ts.map +1 -1
  39. package/dist/frame-tab-geometry.js +69 -23
  40. package/dist/frame-tab-geometry.js.map +1 -1
  41. package/dist/header-card-geometry.d.ts +12 -0
  42. package/dist/header-card-geometry.d.ts.map +1 -1
  43. package/dist/header-card-geometry.js +14 -2
  44. package/dist/header-card-geometry.js.map +1 -1
  45. package/dist/header-logo.d.ts +28 -0
  46. package/dist/header-logo.d.ts.map +1 -0
  47. package/dist/header-logo.js +51 -0
  48. package/dist/header-logo.js.map +1 -0
  49. package/dist/i18n.d.ts +11 -0
  50. package/dist/i18n.d.ts.map +1 -1
  51. package/dist/i18n.js +11 -1
  52. package/dist/i18n.js.map +1 -1
  53. package/dist/index.d.ts +20 -8
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +17 -7
  56. package/dist/index.js.map +1 -1
  57. package/dist/inline-date-pin-geometry.d.ts +19 -11
  58. package/dist/inline-date-pin-geometry.d.ts.map +1 -1
  59. package/dist/inline-date-pin-geometry.js +45 -46
  60. package/dist/inline-date-pin-geometry.js.map +1 -1
  61. package/dist/item-bar-geometry.d.ts +192 -4
  62. package/dist/item-bar-geometry.d.ts.map +1 -1
  63. package/dist/item-bar-geometry.js +258 -5
  64. package/dist/item-bar-geometry.js.map +1 -1
  65. package/dist/item-port-geometry.d.ts +13 -0
  66. package/dist/item-port-geometry.d.ts.map +1 -0
  67. package/dist/item-port-geometry.js +63 -0
  68. package/dist/item-port-geometry.js.map +1 -0
  69. package/dist/layout-context.d.ts +115 -51
  70. package/dist/layout-context.d.ts.map +1 -1
  71. package/dist/layout-context.js +96 -5
  72. package/dist/layout-context.js.map +1 -1
  73. package/dist/layout-insights.d.ts.map +1 -1
  74. package/dist/layout-insights.js +73 -1
  75. package/dist/layout-insights.js.map +1 -1
  76. package/dist/layout.d.ts +35 -0
  77. package/dist/layout.d.ts.map +1 -1
  78. package/dist/layout.js +18 -1315
  79. package/dist/layout.js.map +1 -1
  80. package/dist/nodes/anchor-node.d.ts.map +1 -1
  81. package/dist/nodes/anchor-node.js +11 -4
  82. package/dist/nodes/anchor-node.js.map +1 -1
  83. package/dist/nodes/content-extent.d.ts +24 -0
  84. package/dist/nodes/content-extent.d.ts.map +1 -0
  85. package/dist/nodes/content-extent.js +100 -0
  86. package/dist/nodes/content-extent.js.map +1 -0
  87. package/dist/nodes/dependency-edges.d.ts +6 -0
  88. package/dist/nodes/dependency-edges.d.ts.map +1 -0
  89. package/dist/nodes/dependency-edges.js +148 -0
  90. package/dist/nodes/dependency-edges.js.map +1 -0
  91. package/dist/nodes/footnote-node.d.ts +24 -3
  92. package/dist/nodes/footnote-node.d.ts.map +1 -1
  93. package/dist/nodes/footnote-node.js +129 -25
  94. package/dist/nodes/footnote-node.js.map +1 -1
  95. package/dist/nodes/group-node.d.ts +10 -21
  96. package/dist/nodes/group-node.d.ts.map +1 -1
  97. package/dist/nodes/group-node.js +79 -152
  98. package/dist/nodes/group-node.js.map +1 -1
  99. package/dist/nodes/header-node.d.ts +56 -0
  100. package/dist/nodes/header-node.d.ts.map +1 -0
  101. package/dist/nodes/header-node.js +163 -0
  102. package/dist/nodes/header-node.js.map +1 -0
  103. package/dist/nodes/include-node.d.ts +22 -12
  104. package/dist/nodes/include-node.d.ts.map +1 -1
  105. package/dist/nodes/include-node.js +95 -62
  106. package/dist/nodes/include-node.js.map +1 -1
  107. package/dist/nodes/item-measure.d.ts +135 -0
  108. package/dist/nodes/item-measure.d.ts.map +1 -0
  109. package/dist/nodes/item-measure.js +514 -0
  110. package/dist/nodes/item-measure.js.map +1 -0
  111. package/dist/nodes/item-node.d.ts +162 -9
  112. package/dist/nodes/item-node.d.ts.map +1 -1
  113. package/dist/nodes/item-node.js +256 -69
  114. package/dist/nodes/item-node.js.map +1 -1
  115. package/dist/nodes/marker-band.d.ts +118 -0
  116. package/dist/nodes/marker-band.d.ts.map +1 -0
  117. package/dist/nodes/marker-band.js +303 -0
  118. package/dist/nodes/marker-band.js.map +1 -0
  119. package/dist/nodes/marker-geometry.js +1 -1
  120. package/dist/nodes/marker-geometry.js.map +1 -1
  121. package/dist/nodes/milestone-node.d.ts +112 -15
  122. package/dist/nodes/milestone-node.d.ts.map +1 -1
  123. package/dist/nodes/milestone-node.js +246 -95
  124. package/dist/nodes/milestone-node.js.map +1 -1
  125. package/dist/nodes/nowline-node.d.ts +8 -0
  126. package/dist/nodes/nowline-node.d.ts.map +1 -0
  127. package/dist/nodes/nowline-node.js +74 -0
  128. package/dist/nodes/nowline-node.js.map +1 -0
  129. package/dist/nodes/parallel-node.d.ts +7 -12
  130. package/dist/nodes/parallel-node.d.ts.map +1 -1
  131. package/dist/nodes/parallel-node.js +66 -30
  132. package/dist/nodes/parallel-node.js.map +1 -1
  133. package/dist/nodes/region-markers.d.ts +41 -0
  134. package/dist/nodes/region-markers.d.ts.map +1 -0
  135. package/dist/nodes/region-markers.js +130 -0
  136. package/dist/nodes/region-markers.js.map +1 -0
  137. package/dist/nodes/roadmap-node.d.ts +9 -72
  138. package/dist/nodes/roadmap-node.d.ts.map +1 -1
  139. package/dist/nodes/roadmap-node.js +38 -788
  140. package/dist/nodes/roadmap-node.js.map +1 -1
  141. package/dist/nodes/row-track.d.ts +33 -0
  142. package/dist/nodes/row-track.d.ts.map +1 -0
  143. package/dist/nodes/row-track.js +170 -0
  144. package/dist/nodes/row-track.js.map +1 -0
  145. package/dist/nodes/sequence-item.d.ts +25 -0
  146. package/dist/nodes/sequence-item.d.ts.map +1 -0
  147. package/dist/nodes/sequence-item.js +396 -0
  148. package/dist/nodes/sequence-item.js.map +1 -0
  149. package/dist/nodes/sequence-one.d.ts +5 -0
  150. package/dist/nodes/sequence-one.d.ts.map +1 -0
  151. package/dist/nodes/sequence-one.js +26 -0
  152. package/dist/nodes/sequence-one.js.map +1 -0
  153. package/dist/nodes/swimlane-node.d.ts +5 -17
  154. package/dist/nodes/swimlane-node.d.ts.map +1 -1
  155. package/dist/nodes/swimlane-node.js +62 -145
  156. package/dist/nodes/swimlane-node.js.map +1 -1
  157. package/dist/nodes/wave-node.d.ts +52 -0
  158. package/dist/nodes/wave-node.d.ts.map +1 -0
  159. package/dist/nodes/wave-node.js +483 -0
  160. package/dist/nodes/wave-node.js.map +1 -0
  161. package/dist/non-working-display.d.ts +14 -0
  162. package/dist/non-working-display.d.ts.map +1 -0
  163. package/dist/non-working-display.js +28 -0
  164. package/dist/non-working-display.js.map +1 -0
  165. package/dist/phases/date-window.d.ts +48 -0
  166. package/dist/phases/date-window.d.ts.map +1 -0
  167. package/dist/phases/date-window.js +130 -0
  168. package/dist/phases/date-window.js.map +1 -0
  169. package/dist/phases/finalize.d.ts +198 -0
  170. package/dist/phases/finalize.d.ts.map +1 -0
  171. package/dist/phases/finalize.js +1058 -0
  172. package/dist/phases/finalize.js.map +1 -0
  173. package/dist/phases/measure.d.ts +77 -0
  174. package/dist/phases/measure.d.ts.map +1 -0
  175. package/dist/phases/measure.js +222 -0
  176. package/dist/phases/measure.js.map +1 -0
  177. package/dist/phases/place.d.ts +28 -0
  178. package/dist/phases/place.d.ts.map +1 -0
  179. package/dist/phases/place.js +225 -0
  180. package/dist/phases/place.js.map +1 -0
  181. package/dist/renderable.d.ts.map +1 -1
  182. package/dist/renderable.js +23 -3
  183. package/dist/renderable.js.map +1 -1
  184. package/dist/resolve-today.d.ts +11 -1
  185. package/dist/resolve-today.d.ts.map +1 -1
  186. package/dist/resolve-today.js +26 -12
  187. package/dist/resolve-today.js.map +1 -1
  188. package/dist/row-packer.d.ts +42 -16
  189. package/dist/row-packer.d.ts.map +1 -1
  190. package/dist/row-packer.js +51 -78
  191. package/dist/row-packer.js.map +1 -1
  192. package/dist/schedule.d.ts +58 -1
  193. package/dist/schedule.d.ts.map +1 -1
  194. package/dist/schedule.js +280 -106
  195. package/dist/schedule.js.map +1 -1
  196. package/dist/start-rules.d.ts +27 -0
  197. package/dist/start-rules.d.ts.map +1 -0
  198. package/dist/start-rules.js +91 -0
  199. package/dist/start-rules.js.map +1 -0
  200. package/dist/start-terms.d.ts +23 -0
  201. package/dist/start-terms.d.ts.map +1 -0
  202. package/dist/start-terms.js +27 -0
  203. package/dist/start-terms.js.map +1 -0
  204. package/dist/status-dot.d.ts +46 -0
  205. package/dist/status-dot.d.ts.map +1 -0
  206. package/dist/status-dot.js +78 -0
  207. package/dist/status-dot.js.map +1 -0
  208. package/dist/style-resolution.d.ts.map +1 -1
  209. package/dist/style-resolution.js +23 -43
  210. package/dist/style-resolution.js.map +1 -1
  211. package/dist/text-measure.d.ts +28 -0
  212. package/dist/text-measure.d.ts.map +1 -0
  213. package/dist/text-measure.js +70 -0
  214. package/dist/text-measure.js.map +1 -0
  215. package/dist/themes/contrast.d.ts +4 -0
  216. package/dist/themes/contrast.d.ts.map +1 -0
  217. package/dist/themes/contrast.js +32 -0
  218. package/dist/themes/contrast.js.map +1 -0
  219. package/dist/themes/dark.d.ts.map +1 -1
  220. package/dist/themes/dark.js +28 -1
  221. package/dist/themes/dark.js.map +1 -1
  222. package/dist/themes/grayscale.d.ts.map +1 -1
  223. package/dist/themes/grayscale.js +28 -1
  224. package/dist/themes/grayscale.js.map +1 -1
  225. package/dist/themes/index.d.ts +4 -11
  226. package/dist/themes/index.d.ts.map +1 -1
  227. package/dist/themes/index.js +6 -4
  228. package/dist/themes/index.js.map +1 -1
  229. package/dist/themes/light.d.ts.map +1 -1
  230. package/dist/themes/light.js +28 -1
  231. package/dist/themes/light.js.map +1 -1
  232. package/dist/themes/shape.d.ts +31 -0
  233. package/dist/themes/shape.d.ts.map +1 -1
  234. package/dist/themes/shared.d.ts +44 -50
  235. package/dist/themes/shared.d.ts.map +1 -1
  236. package/dist/themes/shared.js +79 -83
  237. package/dist/themes/shared.js.map +1 -1
  238. package/dist/time-scale.d.ts +42 -6
  239. package/dist/time-scale.d.ts.map +1 -1
  240. package/dist/time-scale.js +109 -17
  241. package/dist/time-scale.js.map +1 -1
  242. package/dist/types.d.ts +528 -11
  243. package/dist/types.d.ts.map +1 -1
  244. package/dist/view-preset.d.ts +61 -6
  245. package/dist/view-preset.d.ts.map +1 -1
  246. package/dist/view-preset.js +439 -24
  247. package/dist/view-preset.js.map +1 -1
  248. package/dist/wave-barrier.d.ts +107 -0
  249. package/dist/wave-barrier.d.ts.map +1 -0
  250. package/dist/wave-barrier.js +174 -0
  251. package/dist/wave-barrier.js.map +1 -0
  252. package/dist/wave-hatch.d.ts +4 -0
  253. package/dist/wave-hatch.d.ts.map +1 -0
  254. package/dist/wave-hatch.js +21 -0
  255. package/dist/wave-hatch.js.map +1 -0
  256. package/dist/wave-layout.d.ts +99 -0
  257. package/dist/wave-layout.d.ts.map +1 -0
  258. package/dist/wave-layout.js +130 -0
  259. package/dist/wave-layout.js.map +1 -0
  260. package/dist/working-calendar.d.ts +128 -4
  261. package/dist/working-calendar.d.ts.map +1 -1
  262. package/dist/working-calendar.js +725 -51
  263. package/dist/working-calendar.js.map +1 -1
  264. package/dist/working-span.d.ts +11 -0
  265. package/dist/working-span.d.ts.map +1 -0
  266. package/dist/working-span.js +18 -0
  267. package/dist/working-span.js.map +1 -0
  268. package/package.json +4 -4
  269. package/src/axis-columns.ts +140 -0
  270. package/src/calendar-resolver.ts +161 -0
  271. package/src/calendar.ts +4 -45
  272. package/src/canvas-width.ts +36 -0
  273. package/src/capacity.ts +71 -30
  274. package/src/chart-translation.ts +88 -0
  275. package/src/container-header-geometry.ts +116 -0
  276. package/src/dsl-utils.ts +8 -26
  277. package/src/edge-routing.ts +347 -491
  278. package/src/frame-tab-geometry.ts +78 -25
  279. package/src/header-card-geometry.ts +17 -2
  280. package/src/header-logo.ts +67 -0
  281. package/src/i18n.ts +22 -1
  282. package/src/index.ts +97 -12
  283. package/src/inline-date-pin-geometry.ts +55 -58
  284. package/src/item-bar-geometry.ts +341 -5
  285. package/src/item-port-geometry.ts +69 -0
  286. package/src/layout-context.ts +210 -72
  287. package/src/layout-insights.ts +109 -2
  288. package/src/layout.ts +57 -1530
  289. package/src/nodes/anchor-node.ts +11 -4
  290. package/src/nodes/content-extent.ts +107 -0
  291. package/src/nodes/dependency-edges.ts +171 -0
  292. package/src/nodes/footnote-node.ts +171 -31
  293. package/src/nodes/group-node.ts +92 -214
  294. package/src/nodes/header-node.ts +255 -0
  295. package/src/nodes/include-node.ts +124 -110
  296. package/src/nodes/item-measure.ts +723 -0
  297. package/src/nodes/item-node.ts +358 -80
  298. package/src/nodes/marker-band.ts +406 -0
  299. package/src/nodes/marker-geometry.ts +1 -1
  300. package/src/nodes/milestone-node.ts +321 -136
  301. package/src/nodes/nowline-node.ts +87 -0
  302. package/src/nodes/parallel-node.ts +69 -38
  303. package/src/nodes/region-markers.ts +194 -0
  304. package/src/nodes/roadmap-node.ts +46 -950
  305. package/src/nodes/row-track.ts +217 -0
  306. package/src/nodes/sequence-item.ts +433 -0
  307. package/src/nodes/sequence-one.ts +40 -0
  308. package/src/nodes/swimlane-node.ts +66 -205
  309. package/src/nodes/wave-node.ts +609 -0
  310. package/src/non-working-display.ts +32 -0
  311. package/src/phases/date-window.ts +191 -0
  312. package/src/phases/finalize.ts +1303 -0
  313. package/src/phases/measure.ts +329 -0
  314. package/src/phases/place.ts +318 -0
  315. package/src/renderable.ts +23 -3
  316. package/src/resolve-today.ts +28 -25
  317. package/src/row-packer.ts +85 -84
  318. package/src/schedule.ts +362 -114
  319. package/src/start-rules.ts +113 -0
  320. package/src/start-terms.ts +38 -0
  321. package/src/status-dot.ts +81 -0
  322. package/src/style-resolution.ts +27 -57
  323. package/src/text-measure.ts +71 -0
  324. package/src/themes/contrast.ts +34 -0
  325. package/src/themes/dark.ts +28 -1
  326. package/src/themes/grayscale.ts +28 -1
  327. package/src/themes/index.ts +10 -7
  328. package/src/themes/light.ts +28 -1
  329. package/src/themes/shape.ts +38 -0
  330. package/src/themes/shared.ts +85 -93
  331. package/src/time-scale.ts +117 -19
  332. package/src/types.ts +529 -20
  333. package/src/view-preset.ts +520 -27
  334. package/src/wave-barrier.ts +242 -0
  335. package/src/wave-hatch.ts +25 -0
  336. package/src/wave-layout.ts +203 -0
  337. package/src/working-calendar.ts +875 -57
  338. package/src/working-span.ts +19 -0
@@ -0,0 +1,130 @@
1
+ // Phase 1, the date window (specs/layout-phases.md §3.2): the roadmap's
2
+ // scope (theme, locale, style context, `default roadmap` style) and the
3
+ // natural date window, a projection of the day schedule
4
+ // (specs/scheduler-unification.md §3.3). Nothing here knows about pixels.
5
+ import { findProp } from '@nowline/core/internal';
6
+ import { daysBetween, literalToDays } from '../calendar.js';
7
+ import { resolveWorkingCalendar } from '../calendar-resolver.js';
8
+ import { propValue } from '../dsl-utils.js';
9
+ import { resolveLocale } from '../i18n.js';
10
+ import { isNonWorkingDisplay } from '../non-working-display.js';
11
+ import { resolveStyle } from '../style-resolution.js';
12
+ import { themes } from '../themes/index.js';
13
+ import { resolveScale, tickBoundaryAtOrAfter } from '../view-preset.js';
14
+ import { daysPerUnit } from '../working-calendar.js';
15
+ export function resolveScope(file, resolved, options) {
16
+ const themeName = options.theme ?? 'light';
17
+ const theme = themes[themeName];
18
+ const locale = resolveLocale(options.locale, directiveLocale(file));
19
+ const styleCtx = {
20
+ theme,
21
+ styles: resolved.config.styles,
22
+ defaults: resolved.config.defaults,
23
+ labels: resolved.content.labels,
24
+ };
25
+ // Raw style props (including `timeline-position` and `minor-grid`) are
26
+ // banned on the roadmap declaration itself, so the values come from the
27
+ // level-2 `default roadmap` line in config.
28
+ const roadmapStyle = resolveStyle('roadmap', file.roadmapDecl?.properties ?? [], styleCtx);
29
+ return { themeName, theme, locale, styleCtx, roadmapStyle };
30
+ }
31
+ export function resolveDateWindow(file, resolved, options, scope, schedule) {
32
+ // The working calendar maps dates to working-day indices for the
33
+ // window, the axis and every placement (specs/working-calendar.md
34
+ // §5, §7.1).
35
+ const { config: cal, working: calendar } = resolveWorkingCalendar(file, resolved);
36
+ const preset = resolveScale(file, resolved.config.scale);
37
+ // Window is content-aware: when `length:` is omitted we derive the end
38
+ // day from the latest dated/sequenced entity (item, anchor, milestone,
39
+ // today's now-line) instead of defaulting to a 180-day desert.
40
+ const { startDate, endDate } = computeDateWindow(file, schedule, options.today, preset);
41
+ // How non-working days are drawn: the surface option, then the file's
42
+ // `default roadmap non-working:` key (resolved to `hide` when absent).
43
+ // It reaches every placement through the time scale.
44
+ const nonWorking = isNonWorkingDisplay(options.nonWorking)
45
+ ? options.nonWorking
46
+ : scope.roadmapStyle.nonWorking;
47
+ // `TimeScale.showsNonWorking`, needed here to size the scale's range.
48
+ const showsNonWorking = nonWorking === 'show' && calendar.hasNonWorkingDays;
49
+ const spanDays = Math.max(1, calendar.workingIndexOf(startDate, endDate));
50
+ // Under `show` every calendar day takes a pixel width of its own, so
51
+ // the chart widens by the non-working days in the window.
52
+ const timelineDays = showsNonWorking ? Math.max(1, daysBetween(startDate, endDate)) : spanDays;
53
+ return {
54
+ cal,
55
+ calendar,
56
+ preset,
57
+ schedule,
58
+ startDate,
59
+ naturalEndDate: endDate,
60
+ spanDays,
61
+ timelineDays,
62
+ nonWorking,
63
+ };
64
+ }
65
+ // Compute a sensible [startDate, endDate] window from the roadmap's day
66
+ // schedule (`scheduleRoadmap`, specs/scheduler-unification.md §3.3).
67
+ //
68
+ // Precedence:
69
+ // 1. An explicit `length:` is a minimum span; content (including wave
70
+ // barriers E_n and every S_k) past it grows the window to the next
71
+ // tick boundary.
72
+ // 2. Otherwise we derive the end day from the actual content extent
73
+ // (`schedule.extent.contentEndDay`: latest lane cursor, anchor date,
74
+ // milestone date/after, wave edge) and today's now-line if it falls
75
+ // past the content. This keeps the rendered chart from defaulting to
76
+ // a 180-day desert when the content only spans a few weeks.
77
+ // 3. As a last resort (no content + no length), fall back to a small
78
+ // 4-week placeholder so an empty roadmap still draws a sensible axis.
79
+ //
80
+ // The start is `schedule.startDate`: the roadmap's `start:`, else `today`
81
+ // (see `scheduleRoadmap`). Every day count is a working-day index from the
82
+ // start (specs/working-calendar.md §5) under the schedule's calendar. A
83
+ // calendar with no non-working day keeps calendar-day arithmetic.
84
+ //
85
+ // Exported for tests; not part of the package surface.
86
+ export function computeDateWindow(file, schedule, today, scale) {
87
+ const props = file.roadmapDecl?.properties ?? [];
88
+ const { config: cal, working: calendar } = schedule.calendar;
89
+ const { startDate } = schedule;
90
+ const lengthRaw = propValue(props, 'length');
91
+ let minDays = 0;
92
+ if (lengthRaw) {
93
+ const days = literalToDays(lengthRaw, cal);
94
+ if (days > 0) {
95
+ minDays = days;
96
+ }
97
+ }
98
+ // An explicit `length:` bounds the now-line: a far-future `today` must
99
+ // not stretch a deliberately-sized roadmap (that case stays out of range
100
+ // and surfaces as an NL.W1000 insight). Content overflow — items,
101
+ // anchors, milestones — still grows the window below via `padded`, with
102
+ // `length:` acting purely as the floor. Without `length:`, `today`
103
+ // extends the window so the now-line is always in range.
104
+ let contentDays = schedule.extent.contentEndDay;
105
+ if (today && !(minDays > 0)) {
106
+ const t = calendar.workingIndexOf(startDate, today);
107
+ if (t > 0)
108
+ contentDays = Math.max(contentDays, t);
109
+ }
110
+ const tickDays = daysPerUnit(scale.unit, cal);
111
+ // Round up to the smallest tick boundary that is `>= contentDays`. When
112
+ // the latest content lands exactly on a tick boundary the chart ends
113
+ // exactly there (no extra trailing tick); otherwise we extend to the
114
+ // next tick so the right edge always sits on a labelled column. For
115
+ // month / quarter / year scales the boundary is a real month /
116
+ // quarter / year start, not a multiple of `days-per-month` etc.
117
+ const padded = tickBoundaryAtOrAfter(startDate, contentDays > 0 ? contentDays : 4 * cal.daysPerWeek, scale.unit, tickDays, calendar);
118
+ const finalDays = Math.max(minDays, padded);
119
+ return {
120
+ startDate,
121
+ endDate: calendar.dateAtWorkingIndex(startDate, Math.max(1, finalDays)),
122
+ };
123
+ }
124
+ // Read the optional `locale:` property from the file's `nowline` directive.
125
+ // Layout receives an already-parsed AST, so this is a cheap lookup with no
126
+ // validation work — that's the validator's job in `@nowline/core`.
127
+ function directiveLocale(file) {
128
+ return findProp(file.directive?.properties ?? [], 'locale')?.value;
129
+ }
130
+ //# sourceMappingURL=date-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-window.js","sourceRoot":"","sources":["../../src/phases/date-window.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ import type { NowlineFile, ResolveResult } from '@nowline/core';
2
+ import type { LayoutOptions, LayoutResult } from '../layout.js';
3
+ import type { LayoutContext } from '../layout-context.js';
4
+ import type { PositionedHeaderParts } from '../nodes/header-node.js';
5
+ import { type MarkerBand, type MarkerEntity } from '../nodes/marker-band.js';
6
+ import { type BuiltWaves } from '../nodes/wave-node.js';
7
+ import { TimeScale } from '../time-scale.js';
8
+ import type { BoundingBox, PositionedAnchor, PositionedDependencyEdge, PositionedFootnoteArea, PositionedMilestone, PositionedNowline, PositionedWaveLegend } from '../types.js';
9
+ import type { DateWindow, RoadmapScope } from './date-window.js';
10
+ import { type MeasuredRoadmap } from './measure.js';
11
+ import type { PlacedChart } from './place.js';
12
+ /**
13
+ * The canvas right edge. `grow` is the single mutator: every artifact that
14
+ * wants the canvas wider passes the absolute x it must contain, its
15
+ * breathing room (typically `GUTTER_PX`) included. Today: item caption
16
+ * spills (f1), the timeline extension (f2) and marker-row labels (f3).
17
+ * f3 freezes it; `final` reads it only after that.
18
+ *
19
+ * The now-pill is intentionally NOT a contributor — when the line lands
20
+ * close to either edge, `buildNowline` switches the pill to "flag" mode
21
+ * (squared edge against the line, rounded edge into the chart), so the
22
+ * pill always fits inside the canvas.
23
+ */
24
+ export declare class CanvasExtent {
25
+ private rightX;
26
+ private frozen;
27
+ constructor(rightX: number);
28
+ /** Grow the canvas to contain `x`; returns whether it grew. Throws once frozen. */
29
+ grow(x: number): boolean;
30
+ /** The canvas is final from here on. */
31
+ freeze(): void;
32
+ /** The right edge so far. Only the step that freezes the canvas (f3) reads it before `final`. */
33
+ get provisional(): number;
34
+ /** The final right edge. Throws before `freeze`. */
35
+ get final(): number;
36
+ }
37
+ /** The pieces of the model the steps produce. Each is set once, by its step. */
38
+ export interface ModelDraft {
39
+ /** Every marker with its final x, and how many of them are calendar labels (f3). */
40
+ markerEntries?: {
41
+ all: MarkerEntity[];
42
+ calendarCount: number;
43
+ };
44
+ milestones?: PositionedMilestone[];
45
+ waves?: BuiltWaves;
46
+ anchors?: PositionedAnchor[];
47
+ edges?: PositionedDependencyEdge[];
48
+ nowline?: PositionedNowline | null;
49
+ waveLegend?: PositionedWaveLegend;
50
+ footnotes?: PositionedFootnoteArea;
51
+ header?: PositionedHeaderParts;
52
+ attributionBox?: BoundingBox;
53
+ /** The canvas height, below the attribution mark. */
54
+ height?: number;
55
+ }
56
+ /**
57
+ * The top of the header rows on the final axis. The measure phase reserves
58
+ * the now-pill row only when `today` falls inside the natural window; when
59
+ * the axis extension (f2) brings `today` in, the pill row is reserved here
60
+ * (L2, specs/layout-phases.md §1.3), and the tick panel, wave strip and
61
+ * marker band below it move down by `shift`.
62
+ */
63
+ export interface HeaderRowsTop {
64
+ timelineY: number;
65
+ pillRowHeight: number;
66
+ tickPanelY: number;
67
+ /** The marker band's top, where f5 packs it. */
68
+ markerRowY: number;
69
+ /** How far the tick panel, wave strip and marker band move down from the measure. */
70
+ shift: number;
71
+ }
72
+ /**
73
+ * Reports whether a finalize step changed something and, for a step that
74
+ * says (`FinalizeContext.explain`), why; see `setFinalizeTrace`.
75
+ */
76
+ export type FinalizeTrace = (step: string, changed: boolean, why?: readonly string[]) => void;
77
+ /**
78
+ * What passed the natural window when f2 grew the axis (specs/layout-phases.md
79
+ * §9, F3): a leaf item bar (a bug: the schedule's extent and the placement
80
+ * disagree), a spilled caption (its one capped column), a date-pinned marker
81
+ * (a dated anchor or milestone on the last day), or an after-only milestone
82
+ * on the window end (decision 14), in the main chart or in an isolated
83
+ * region. A diamond sits on its day, so its right half passes a window that
84
+ * ends on that day.
85
+ */
86
+ export type TimelineExtensionCause = 'bar' | 'caption' | 'datedMarker' | 'afterMilestone';
87
+ /**
88
+ * Install (or, with `undefined`, remove) the `FinalizeTrace`. Internal: the
89
+ * coverage register (`finalize-coverage.test.ts`) records with it which
90
+ * steps change something on each sample.
91
+ */
92
+ export declare function setFinalizeTrace(trace: FinalizeTrace | undefined): void;
93
+ export declare class FinalizeContext {
94
+ readonly file: NowlineFile;
95
+ readonly resolved: ResolveResult;
96
+ readonly options: LayoutOptions;
97
+ readonly scope: RoadmapScope;
98
+ readonly window: DateWindow;
99
+ readonly measured: MeasuredRoadmap;
100
+ readonly chart: PlacedChart;
101
+ /** The canvas right edge: `grow` until f3 freezes it, `final` only after. */
102
+ readonly canvas: CanvasExtent;
103
+ /** Chart top, bottom of the lanes, bottom including the panels below them. */
104
+ readonly chartY: {
105
+ top: number;
106
+ swimlaneBottom: number;
107
+ bottom: number;
108
+ };
109
+ /** Pieces of the model the steps produce. */
110
+ readonly draft: ModelDraft;
111
+ private scaleIsFinal;
112
+ private band;
113
+ private rowsTop;
114
+ private rowsBottom;
115
+ private why;
116
+ constructor(file: NowlineFile, resolved: ResolveResult, options: LayoutOptions, scope: RoadmapScope, window: DateWindow, measured: MeasuredRoadmap, chart: PlacedChart);
117
+ /** The placement context of the kept pass. */
118
+ get ctx(): LayoutContext;
119
+ /** The axis scale. f2 may replace it; `finalScale()` throws before f2 ran. */
120
+ get scale(): TimeScale;
121
+ finalScale(): TimeScale;
122
+ /** Replace the axis scale with an extended one (f2 only). */
123
+ extendScale(scale: TimeScale): void;
124
+ /** The scale is final from here on (f2, whether or not it extended it). */
125
+ settleScale(): void;
126
+ /** The final marker pack, set by f5; reading it earlier throws. */
127
+ markerBand(): MarkerBand;
128
+ /** Set the final marker pack (f5 only); the context's placements become its. */
129
+ setMarkerBand(band: MarkerBand): void;
130
+ /**
131
+ * The header rows' top on the final axis. It reads the final scale, so
132
+ * it throws before f2; f5 packs the marker band at it and f7 moves the
133
+ * rows to it.
134
+ */
135
+ headerRowsTop(): HeaderRowsTop;
136
+ /** The bottom of the grown header rows, set by f7; reading it earlier throws. */
137
+ headerRowsBottom(): number;
138
+ /** Set the bottom of the grown header rows (f7 only). */
139
+ setHeaderRowsBottom(y: number): void;
140
+ /** Say why the running step changed something; its report carries it. */
141
+ explain(why: readonly string[]): void;
142
+ /** Report a step's effect to the trace, when one is installed. */
143
+ report(step: string, changed: boolean): void;
144
+ }
145
+ /**
146
+ * The header rows' top once the axis is final. When the measure phase left
147
+ * the pill row at 0 and `today` lies on the final axis, f2 brought it in:
148
+ * the rows grow by `NOW_PILL_HEIGHT_PX` above the tick panel, and the
149
+ * timeline y follows the beside-card rule (`headerRowsTimelineY`), so a
150
+ * card that already pushed the rows down absorbs some or all of the pill
151
+ * row instead of the rows growing by its full height.
152
+ */
153
+ export declare function resolveHeaderRowsTop(measured: MeasuredRoadmap, today: Date | undefined, scale: TimeScale): HeaderRowsTop;
154
+ /**
155
+ * What a finalize step reads or writes. `placement` is everything place
156
+ * left (lanes, regions, items, milestone x, the date-pinned markers),
157
+ * `window` the date window and `headerBands` the measured header rows;
158
+ * the rest are the slots finalize produces.
159
+ */
160
+ export type FinalizeSlot = 'placement' | 'window' | 'headerBands' | 'canvas' | 'scale' | 'timeline' | 'calendarRuns' | 'markerEntries' | 'laneWidths' | 'markerBand' | 'milestones' | 'calendarLabels' | 'markerMidpoints' | 'chartTop' | 'rowsBottom' | 'laneBottom' | 'chartBottom' | 'laneY' | 'waves' | 'anchors' | 'edges' | 'nowline' | 'legend' | 'footnotes' | 'header' | 'attribution';
161
+ /**
162
+ * The rule a slot follows:
163
+ * - `input`: nothing in finalize writes it.
164
+ * - `final`: steps up to `finalAfter` may write it, none after; only
165
+ * `finalAfter` itself may read it before then.
166
+ * - `cursor`: only the `advancers` write it (each reads it as it advances
167
+ * it); every other reader comes after the last advancer.
168
+ * - `product`: one step writes it; readers come after that step.
169
+ */
170
+ export type SlotRule = {
171
+ kind: 'input';
172
+ } | {
173
+ kind: 'final';
174
+ finalAfter: string;
175
+ } | {
176
+ kind: 'cursor';
177
+ advancers: readonly string[];
178
+ } | {
179
+ kind: 'product';
180
+ };
181
+ export declare const SLOT_RULES: Readonly<Record<FinalizeSlot, SlotRule>>;
182
+ export interface FinalizeStep {
183
+ readonly name: string;
184
+ readonly reads: readonly FinalizeSlot[];
185
+ readonly writes: readonly FinalizeSlot[];
186
+ /** Run the step; returns whether it changed something (for the coverage trace). */
187
+ run(fx: FinalizeContext): boolean;
188
+ }
189
+ /**
190
+ * Every way `steps` breaks `rules`, as one message each; empty when the
191
+ * order holds.
192
+ */
193
+ export declare function checkFinalizeOrder(steps: readonly FinalizeStep[], rules?: Readonly<Record<FinalizeSlot, SlotRule>>): string[];
194
+ /** The finalize pass, in order (specs/layout-phases.md §3.5). */
195
+ export declare const FINALIZE_STEPS: readonly FinalizeStep[];
196
+ /** Run the finalize pass over `fx` and assemble the positioned model. */
197
+ export declare function finalizeRoadmap(fx: FinalizeContext, steps?: readonly FinalizeStep[]): LayoutResult;
198
+ //# sourceMappingURL=finalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize.d.ts","sourceRoot":"","sources":["../../src/phases/finalize.ts"],"names":[],"mappings":"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"}