@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,483 @@
1
+ // Positioned waves (specs/waves.md §8.7, §9.1-§9.5): the solved spans engine
2
+ // A's barrier driver settled on, in declaration order, plus everything the
3
+ // renderer draws for them: strip cells (label fit chain, tooltip, empty-wave
4
+ // diamonds, gap labels, the all-empty placeholder), styled colours, boundary
5
+ // lines, crossings over background bars, and the legend.
6
+ //
7
+ // Built from the frozen `WaveLayoutState` after the post-layout extent growth
8
+ // and the marker-row `deltaY` shift, so the dates read the final scale and
9
+ // every y is final. Growth only extends the domain end (origin and
10
+ // pixels-per-day are unchanged), so the spans' x never move.
11
+ import { propKey } from '@nowline/core/internal';
12
+ import { propValue } from '../dsl-utils.js';
13
+ import { pickInlineDate } from '../inline-date-pin-geometry.js';
14
+ import { INLINE_DATE_GLYPH_GAP_PX, INLINE_DATE_GLYPH_INSET_LEFT_PX, INLINE_DATE_GLYPH_TILE_SIZE_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, } from '../item-bar-geometry.js';
15
+ import { estimateTextWidth } from '../text-measure.js';
16
+ import { contrastRatio, hexToRgb } from '../themes/contrast.js';
17
+ import { resolveColor } from '../themes/index.js';
18
+ import { WAVE_CELL_INSET_PX, WAVE_LABEL_HALO_INSET_Y_PX, WAVE_LABEL_HALO_PAD_PX, WAVE_LEGEND_BASELINE_OFFSET_PX, WAVE_LEGEND_LINE_PX, WAVE_LEGEND_SWATCH_GAP_PX, WAVE_LEGEND_SWATCH_HEIGHT_PX, WAVE_LEGEND_SWATCH_WIDTH_PX, WAVE_STRIP_LABEL_FONT_SIZE_PX, WAVE_STRIP_LABEL_PAD_PX, WAVE_STYLED_STRIP_MIX_OPACITY, } from '../themes/shared.js';
19
+ import { summarizeWaves } from '../wave-barrier.js';
20
+ import { waveHatchKind } from '../wave-hatch.js';
21
+ import { dateAtX, spanEndDateAtX, WAVE_EDGE_TOLERANCE_PX, } from '../wave-layout.js';
22
+ import { MARKER_BOLD_WIDTH_FACTOR } from './marker-geometry.js';
23
+ /** WCAG AA floor for the strip label against its composited cell fill. */
24
+ const WAVE_LABEL_MIN_CONTRAST = 4.5;
25
+ /**
26
+ * Build the positioned waves, boundaries and crossings. `state` must be
27
+ * frozen: its `pass` is the pass that ran with the solved `S`/`E`, so its
28
+ * member counts cover the main lanes and the first-level regions exactly
29
+ * once (later placements never accumulate). `ctx.timeline.waveStrip` is
30
+ * set whenever some wave has items; when none does, nothing is drawn and the
31
+ * waves carry their spans only (specs/waves.md §9.1).
32
+ */
33
+ export function buildWaves(state, ctx, strings, swimlanes, includes) {
34
+ if (!state.frozen || !state.solve) {
35
+ throw new Error('buildWaves: the wave barrier has not settled');
36
+ }
37
+ const spans = summarizeWaves(state.plan, state.solve, state.pass, state.origin, state.floors, WAVE_EDGE_TOLERANCE_PX);
38
+ const allEmpty = spans.every((s) => s.memberCount === 0);
39
+ // With every wave empty the roadmap draws no strip: the waves keep a
40
+ // zero-height one under the tick panel, for their boxes only.
41
+ const strip = ctx.timeline.waveStrip ?? {
42
+ y: ctx.timeline.tickPanelY + ctx.timeline.tickPanelHeight,
43
+ height: 0,
44
+ };
45
+ if (!ctx.timeline.waveStrip && !allEmpty) {
46
+ throw new Error('buildWaves: the timeline has no wave strip');
47
+ }
48
+ // The visible part of a span is its overlap with the timeline.
49
+ const visLeft = ctx.timeline.box.x;
50
+ const visRight = visLeft + ctx.timeline.box.width;
51
+ // Every strip halo spans the strip less a vertical inset.
52
+ const haloY = strip.y + WAVE_LABEL_HALO_INSET_Y_PX;
53
+ const haloHeight = strip.height - 2 * WAVE_LABEL_HALO_INSET_Y_PX;
54
+ let ordinal = 0;
55
+ const waves = spans.map((span, i) => {
56
+ const decl = state.plan.waves[i];
57
+ const title = decl.title ?? span.id;
58
+ const empty = span.memberCount === 0;
59
+ const startDate = dateAtX(span.start, ctx);
60
+ const endDate = spanEndDateAtX(span.start, span.end, ctx);
61
+ const visibleOrdinal = empty ? undefined : ordinal++;
62
+ const footnoteIndicators = waveFootnoteIndicators(span.id, ctx);
63
+ const style = waveStyle(decl.properties, visibleOrdinal, ctx);
64
+ const cellLeft = Math.max(span.start, visLeft);
65
+ const cellRight = Math.min(span.end, visRight);
66
+ const visibleWidth = Math.max(0, cellRight - cellLeft);
67
+ // A declared date floor (`after:2026-11-02`) puts a calendar glyph at
68
+ // the cell's left, whether or not the floor opened a gap (§9.1); the
69
+ // label clears it like it clears the superscripts.
70
+ const floorDate = pickInlineDate(state.plan.floors[i]?.ref !== undefined ? [state.plan.floors[i].ref] : []);
71
+ const glyphFits = floorDate !== undefined &&
72
+ visibleWidth >=
73
+ INLINE_DATE_GLYPH_INSET_LEFT_PX +
74
+ INLINE_DATE_GLYPH_TILE_SIZE_PX +
75
+ WAVE_STRIP_LABEL_PAD_PX;
76
+ const glyphReserve = glyphFits
77
+ ? INLINE_DATE_GLYPH_TILE_SIZE_PX + INLINE_DATE_GLYPH_GAP_PX
78
+ : 0;
79
+ // Fit chain (§9.1): try every candidate beside the footnote
80
+ // superscripts; when none fits with them, the superscripts move
81
+ // to the legend and the chain runs again on the label alone.
82
+ let fit;
83
+ let footnotesShown = false;
84
+ if (!empty) {
85
+ if (footnoteIndicators.length > 0) {
86
+ const superscriptWidth = footnoteIndicators.length * ITEM_FOOTNOTE_INDICATOR_STEP_PX;
87
+ fit = fitStripLabel(title, span.id, i + 1, visibleWidth, superscriptWidth + glyphReserve);
88
+ footnotesShown = fit !== undefined;
89
+ }
90
+ fit ??= fitStripLabel(title, span.id, i + 1, visibleWidth, glyphReserve);
91
+ }
92
+ // An empty wave is not drawn (§9.1); the NL.I1006 insight names it.
93
+ const labelX = empty ? span.start : (cellLeft + cellRight) / 2;
94
+ const range = empty ? isoDay(startDate) : `${isoDay(startDate)} – ${isoDay(endDate)}`;
95
+ const tooltipParts = [title, range];
96
+ if (empty)
97
+ tooltipParts.push(strings.waveNoItems);
98
+ else if (span.heldBy !== undefined) {
99
+ tooltipParts.push(`${strings.waveHeldBy} ${span.heldBy}`);
100
+ }
101
+ // A gap (S_k > E_{k-1}) shows the floor reference that opened it.
102
+ let gapLabel;
103
+ const prior = spans[i - 1];
104
+ if (!allEmpty &&
105
+ prior !== undefined &&
106
+ span.floorRef !== undefined &&
107
+ span.start - prior.end > WAVE_EDGE_TOLERANCE_PX) {
108
+ const gapLeft = Math.max(prior.end, visLeft);
109
+ const gapRight = Math.min(span.start, visRight);
110
+ const textWidth = estimateTextWidth(span.floorRef, WAVE_STRIP_LABEL_FONT_SIZE_PX);
111
+ if (textWidth + 2 * WAVE_STRIP_LABEL_PAD_PX <= gapRight - gapLeft) {
112
+ const x = (gapLeft + gapRight) / 2;
113
+ const haloWidth = textWidth + 2 * WAVE_LABEL_HALO_PAD_PX;
114
+ gapLabel = {
115
+ text: span.floorRef,
116
+ x,
117
+ halo: { x: x - haloWidth / 2, y: haloY, width: haloWidth, height: haloHeight },
118
+ };
119
+ }
120
+ }
121
+ // The painted cell, and in it the label and superscript halos
122
+ // (§9.1): the superscripts right-aligned, the label centred on the
123
+ // visible span but never under them.
124
+ const stripBox = {
125
+ x: span.start,
126
+ y: strip.y,
127
+ width: span.end - span.start,
128
+ height: strip.height,
129
+ };
130
+ const cell = empty ? undefined : stripCellBox(stripBox, ctx.timeline.box);
131
+ let labelDraw;
132
+ let superscripts;
133
+ let inlineDatePin;
134
+ if (cell) {
135
+ if (glyphFits && floorDate !== undefined) {
136
+ inlineDatePin = {
137
+ side: 'after',
138
+ isoDate: floorDate,
139
+ glyphTopLeft: {
140
+ x: cell.x + INLINE_DATE_GLYPH_INSET_LEFT_PX,
141
+ y: strip.y + (strip.height - INLINE_DATE_GLYPH_TILE_SIZE_PX) / 2,
142
+ },
143
+ glyphSize: INLINE_DATE_GLYPH_TILE_SIZE_PX,
144
+ spilled: false,
145
+ };
146
+ }
147
+ const paintedRight = cell.x + cell.width;
148
+ const superscriptWidth = footnotesShown
149
+ ? footnoteIndicators.length * ITEM_FOOTNOTE_INDICATOR_STEP_PX
150
+ : 0;
151
+ if (superscriptWidth) {
152
+ const right = paintedRight - WAVE_STRIP_LABEL_PAD_PX + WAVE_LABEL_HALO_PAD_PX;
153
+ const left = paintedRight -
154
+ WAVE_STRIP_LABEL_PAD_PX -
155
+ superscriptWidth -
156
+ WAVE_LABEL_HALO_PAD_PX;
157
+ superscripts = {
158
+ rightX: paintedRight - WAVE_STRIP_LABEL_PAD_PX,
159
+ halo: { x: left, y: haloY, width: right - left, height: haloHeight },
160
+ };
161
+ }
162
+ if (fit) {
163
+ const textWidth = stripLabelWidth(fit.label);
164
+ const rightBound = superscriptWidth
165
+ ? Math.min(labelX, paintedRight - WAVE_STRIP_LABEL_PAD_PX - superscriptWidth - textWidth / 2)
166
+ : labelX;
167
+ const x = inlineDatePin
168
+ ? Math.max(rightBound, inlineDatePin.glyphTopLeft.x +
169
+ INLINE_DATE_GLYPH_TILE_SIZE_PX +
170
+ INLINE_DATE_GLYPH_GAP_PX +
171
+ textWidth / 2)
172
+ : rightBound;
173
+ const haloWidth = textWidth + 2 * WAVE_LABEL_HALO_PAD_PX;
174
+ labelDraw = {
175
+ x,
176
+ halo: { x: x - haloWidth / 2, y: haloY, width: haloWidth, height: haloHeight },
177
+ };
178
+ }
179
+ }
180
+ return {
181
+ id: span.id,
182
+ title,
183
+ index: i,
184
+ ...(visibleOrdinal !== undefined ? { visibleOrdinal } : {}),
185
+ startX: span.start,
186
+ endX: span.end,
187
+ startDate,
188
+ endDate,
189
+ memberCount: span.memberCount,
190
+ empty,
191
+ ...(span.heldBy !== undefined ? { heldBy: span.heldBy } : {}),
192
+ ...(span.floorRef !== undefined ? { floorRef: span.floorRef } : {}),
193
+ columnBox: {
194
+ x: span.start,
195
+ y: ctx.chartTopY,
196
+ width: span.end - span.start,
197
+ height: ctx.swimlaneBottomY - ctx.chartTopY,
198
+ },
199
+ strip: {
200
+ box: {
201
+ x: span.start,
202
+ y: strip.y,
203
+ width: span.end - span.start,
204
+ height: strip.height,
205
+ },
206
+ ...(fit ? { label: fit.label } : {}),
207
+ labelKind: fit?.kind ?? 'none',
208
+ labelX,
209
+ ...(cell ? { cell } : {}),
210
+ ...(labelDraw ? { labelDraw } : {}),
211
+ ...(inlineDatePin ? { inlineDatePin } : {}),
212
+ ...(superscripts ? { superscripts } : {}),
213
+ tooltip: tooltipParts.join(' · '),
214
+ footnotesShown,
215
+ ...(gapLabel ? { gapLabel } : {}),
216
+ },
217
+ style,
218
+ footnoteIndicators,
219
+ };
220
+ });
221
+ const boundaries = allEmpty ? [] : buildBoundaries(waves, state.origin, strip.y, ctx);
222
+ const mainBackground = backgroundItems(swimlanes);
223
+ // Background items already carry their tooltip: `sequenceItem` sets it
224
+ // where it places them.
225
+ const regionBackground = includes.map((inc) => backgroundItems(inc.nestedSwimlanes));
226
+ const built = {
227
+ waves,
228
+ boundaries,
229
+ crossings: crossingsOver(mainBackground, boundaries),
230
+ regionCrossings: regionBackground.map((items) => crossingsOver(items, boundaries)),
231
+ hasBackground: mainBackground.length + regionBackground.flat().length > 0,
232
+ };
233
+ return built;
234
+ }
235
+ /**
236
+ * A strip cell's painted box: the wave's strip box clipped to the timeline's
237
+ * backing panel, inset by half the panel's 1 px stroke so the cell never
238
+ * covers it. Undefined when the two do not overlap (an off-screen wave).
239
+ */
240
+ function stripCellBox(box, timelineBox) {
241
+ const inset = WAVE_CELL_INSET_PX;
242
+ const a = {
243
+ x: box.x,
244
+ y: box.y + inset,
245
+ width: box.width,
246
+ height: box.height - 2 * inset,
247
+ };
248
+ const b = {
249
+ x: timelineBox.x + inset,
250
+ y: box.y,
251
+ width: timelineBox.width - 2 * inset,
252
+ height: box.height,
253
+ };
254
+ const x1 = Math.max(a.x, b.x);
255
+ const y1 = Math.max(a.y, b.y);
256
+ const x2 = Math.min(a.x + a.width, b.x + b.width);
257
+ const y2 = Math.min(a.y + a.height, b.y + b.height);
258
+ if (x2 <= x1 || y2 <= y1)
259
+ return undefined;
260
+ return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };
261
+ }
262
+ /** A strip label's estimated width: 10 px text, widened for its bold weight. */
263
+ function stripLabelWidth(text) {
264
+ return estimateTextWidth(text, WAVE_STRIP_LABEL_FONT_SIZE_PX) * MARKER_BOLD_WIDTH_FACTOR;
265
+ }
266
+ /**
267
+ * The first strip label candidate that fits (§9.1): the title, the id, the
268
+ * title ellipsized to 3 or more characters plus "…", then the 1-based
269
+ * `#k`. The test is the bold 10 px width estimate plus `extraWidth` (the
270
+ * footnote superscripts) plus 6 px padding on each side. Undefined: no
271
+ * label.
272
+ */
273
+ export function fitStripLabel(title, id, ordinal, visibleWidth, extraWidth) {
274
+ const fits = (text) => stripLabelWidth(text) + extraWidth + 2 * WAVE_STRIP_LABEL_PAD_PX <= visibleWidth;
275
+ if (fits(title))
276
+ return { kind: 'title', label: title };
277
+ if (id !== title && fits(id))
278
+ return { kind: 'id', label: id };
279
+ for (let n = title.length - 1; n >= 3; n--) {
280
+ const prefix = title.slice(0, n).trimEnd();
281
+ if (prefix.length < 3)
282
+ break;
283
+ const text = `${prefix}…`;
284
+ if (fits(text))
285
+ return { kind: 'ellipsis', label: text };
286
+ }
287
+ const hash = `#${ordinal}`;
288
+ if (fits(hash))
289
+ return { kind: 'ordinal', label: hash };
290
+ return undefined;
291
+ }
292
+ /** Footnotes whose `on:` names the wave, as 1-based numbers, ascending. */
293
+ function waveFootnoteIndicators(id, ctx) {
294
+ const out = [];
295
+ for (const [fid, hosts] of ctx.footnoteHosts.entries()) {
296
+ if (!hosts.includes(id))
297
+ continue;
298
+ const n = ctx.footnoteIndex.get(fid);
299
+ if (n !== undefined)
300
+ out.push(n);
301
+ }
302
+ return out.sort((a, b) => a - b);
303
+ }
304
+ /**
305
+ * A wave's colours (§9.4). Only the named `style:` applies (there is no
306
+ * `default wave`), and of it only `bg`, `fg`, `text` and `border`. The
307
+ * style is read raw.
308
+ */
309
+ function waveStyle(properties, visibleOrdinal, ctx) {
310
+ const theme = ctx.styleCtx.theme;
311
+ const raw = new Map();
312
+ const styleId = propValue(properties, 'style');
313
+ const decl = styleId ? ctx.styleCtx.styles.get(styleId) : undefined;
314
+ for (const p of (decl?.properties ?? [])) {
315
+ raw.set(propKey(p), p.value);
316
+ }
317
+ const color = (key) => {
318
+ const v = raw.get(key);
319
+ if (v === undefined)
320
+ return undefined;
321
+ const c = resolveColor(v, theme);
322
+ return c === 'none' ? undefined : c;
323
+ };
324
+ const tint = color('bg');
325
+ const stripFill = visibleOrdinal !== undefined && visibleOrdinal % 2 === 1
326
+ ? theme.wave.stripFillAlt
327
+ : theme.wave.stripFill;
328
+ // The cell the label sits on: the strip fill under the tint overlay.
329
+ const cellFill = tint
330
+ ? (mixHex(stripFill, tint, WAVE_STYLED_STRIP_MIX_OPACITY) ?? stripFill)
331
+ : stripFill;
332
+ const border = raw.get('border');
333
+ return {
334
+ ...(tint ? { tint } : {}),
335
+ stripFill,
336
+ text: color('text') ?? readableLabelText(theme.wave, cellFill),
337
+ boundary: color('fg') ?? theme.wave.boundary,
338
+ boundaryDash: border === 'dashed' ? '4 2' : border === 'dotted' ? '1 2' : null,
339
+ };
340
+ }
341
+ const HEX_RE = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
342
+ /** `top` composited over `base` at `alpha`, as `#rrggbb`; undefined unless both are hex. */
343
+ function mixHex(base, top, alpha) {
344
+ if (!HEX_RE.test(base) || !HEX_RE.test(top))
345
+ return undefined;
346
+ const b = hexToRgb(base);
347
+ const t = hexToRgb(top);
348
+ return `#${b
349
+ .map((v, i) => Math.round(v * (1 - alpha) + t[i] * alpha)
350
+ .toString(16)
351
+ .padStart(2, '0'))
352
+ .join('')}`;
353
+ }
354
+ /**
355
+ * `wave.labelText` when it reaches 4.5:1 against `fill` (or either colour is
356
+ * not hex), else whichever of the theme's dark (`hatch`) and light
357
+ * (`hatchOnDark`) strokes contrasts more.
358
+ */
359
+ export function readableLabelText(wave, fill) {
360
+ const preferred = wave.labelText;
361
+ if (!HEX_RE.test(preferred) || !HEX_RE.test(fill))
362
+ return preferred;
363
+ if (contrastRatio(preferred, fill) >= WAVE_LABEL_MIN_CONTRAST)
364
+ return preferred;
365
+ return contrastRatio(wave.hatch, fill) >= contrastRatio(wave.hatchOnDark, fill)
366
+ ? wave.hatch
367
+ : wave.hatchOnDark;
368
+ }
369
+ /**
370
+ * One line at every distinct x in `{S_k} ∪ {E_k}` of the non-empty waves,
371
+ * except the origin (§9.2): contiguous waves share a line, a gap gives two,
372
+ * and an empty wave adds none of its own. A wave's opening line uses its
373
+ * own style; a closing line that opens nothing (a gap, or `E_n`) uses the
374
+ * closing wave's.
375
+ */
376
+ function buildBoundaries(waves, origin, topY, ctx) {
377
+ const edges = [];
378
+ for (const w of waves) {
379
+ if (w.empty)
380
+ continue;
381
+ edges.push({ x: w.startX, wave: w, opening: true });
382
+ edges.push({ x: w.endX, wave: w, opening: false });
383
+ }
384
+ edges.sort((a, b) => a.x - b.x);
385
+ const out = [];
386
+ let i = 0;
387
+ while (i < edges.length) {
388
+ let j = i;
389
+ while (j < edges.length && edges[j].x - edges[i].x < WAVE_EDGE_TOLERANCE_PX)
390
+ j++;
391
+ const group = edges.slice(i, j);
392
+ i = j;
393
+ const x = group[0].x;
394
+ if (Math.abs(x - origin) < WAVE_EDGE_TOLERANCE_PX)
395
+ continue;
396
+ const owner = (group.find((e) => e.opening) ?? group[0]).wave;
397
+ out.push({
398
+ x,
399
+ topY,
400
+ bottomY: ctx.swimlaneBottomY,
401
+ stroke: owner.style.boundary,
402
+ dash: owner.style.boundaryDash,
403
+ });
404
+ }
405
+ return out;
406
+ }
407
+ /** Background items (`waveRole: 'background'`) in lane and document order. */
408
+ function backgroundItems(lanes) {
409
+ const out = [];
410
+ const walk = (children) => {
411
+ for (const child of children) {
412
+ if (child.kind === 'item') {
413
+ if (child.waveRole === 'background')
414
+ out.push(child);
415
+ }
416
+ else {
417
+ walk(child.children);
418
+ }
419
+ }
420
+ };
421
+ for (const lane of lanes) {
422
+ walk(lane.children);
423
+ out.push(...backgroundItems(lane.nested));
424
+ }
425
+ return out;
426
+ }
427
+ /**
428
+ * A crossing for every boundary strictly inside a background bar's visual
429
+ * extent (§9.3). Item boxes are visual (inset from the logical edges), so a
430
+ * boundary at a bar's logical edge falls in the inset and gets none.
431
+ */
432
+ function crossingsOver(items, boundaries) {
433
+ const out = [];
434
+ for (const item of items) {
435
+ const left = item.box.x;
436
+ const right = item.box.x + item.box.width;
437
+ for (const b of boundaries) {
438
+ if (left < b.x && b.x < right) {
439
+ out.push({
440
+ x: b.x,
441
+ topY: item.box.y,
442
+ bottomY: item.box.y + item.box.height,
443
+ stroke: b.stroke,
444
+ });
445
+ }
446
+ }
447
+ }
448
+ return out;
449
+ }
450
+ /**
451
+ * The wave legend (§9.5), or undefined without background work (which there
452
+ * is only when some wave is drawn): one hatch swatch, `Background work (not
453
+ * in a wave)`, `WAVE_LEGEND_LINE_PX` high from `topY` at the chart origin.
454
+ */
455
+ export function buildWaveLegend(built, ctx, strings, topY) {
456
+ if (!built.hasBackground)
457
+ return undefined;
458
+ const left = ctx.timeline.originX;
459
+ const text = strings.waveLegendBackground;
460
+ const textX0 = WAVE_LEGEND_SWATCH_WIDTH_PX + WAVE_LEGEND_SWATCH_GAP_PX;
461
+ const width = textX0 + estimateTextWidth(text, WAVE_STRIP_LABEL_FONT_SIZE_PX);
462
+ const entry = {
463
+ kind: 'background',
464
+ text,
465
+ swatch: {
466
+ x: left,
467
+ y: topY + (WAVE_LEGEND_LINE_PX - WAVE_LEGEND_SWATCH_HEIGHT_PX) / 2,
468
+ width: WAVE_LEGEND_SWATCH_WIDTH_PX,
469
+ height: WAVE_LEGEND_SWATCH_HEIGHT_PX,
470
+ },
471
+ // The hatched swatch is a default item bar.
472
+ hatch: waveHatchKind(ctx.styleCtx.theme.entities.item.bg),
473
+ runs: [{ text, x: left + textX0, y: topY + WAVE_LEGEND_BASELINE_OFFSET_PX }],
474
+ };
475
+ return {
476
+ box: { x: left, y: topY, width, height: WAVE_LEGEND_LINE_PX },
477
+ entries: [entry],
478
+ };
479
+ }
480
+ function isoDay(d) {
481
+ return d.toISOString().slice(0, 10);
482
+ }
483
+ //# sourceMappingURL=wave-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave-node.js","sourceRoot":"","sources":["../../src/nodes/wave-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { NON_WORKING_DISPLAYS, type NonWorkingDisplay } from '@nowline/core/internal';
2
+ /** A non-working display value. */
3
+ export type { NonWorkingDisplay };
4
+ /** Every display value, in documentation order. */
5
+ export { NON_WORKING_DISPLAYS };
6
+ /** True when `value` is a display value. */
7
+ export declare function isNonWorkingDisplay(value: unknown): value is NonWorkingDisplay;
8
+ /**
9
+ * Parse a raw surface option. Empty or missing input is "unset" and returns
10
+ * undefined, so the file's `default roadmap non-working:` key still applies;
11
+ * anything other than `hide` or `show` throws a `RangeError`.
12
+ */
13
+ export declare function parseNonWorkingDisplay(raw: string | undefined): NonWorkingDisplay | undefined;
14
+ //# sourceMappingURL=non-working-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"non-working-display.d.ts","sourceRoot":"","sources":["../src/non-working-display.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,mCAAmC;AACnC,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,mDAAmD;AACnD,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAI7F"}
@@ -0,0 +1,28 @@
1
+ // How the chart shows a calendar's non-working days (specs/working-
2
+ // calendar.md §4.2): `hide` collapses them to zero width (the default),
3
+ // `show` draws them at full width as shaded bands. One shared definition
4
+ // for the layout and every surface that takes a render-time option, so the
5
+ // accepted spellings cannot drift between them. The table itself lives in
6
+ // core (`value-tables.ts`), which the validator and the editor completions
7
+ // read too; the GitHub Action still has its own copy, though it bundles
8
+ // layout's theme parser.
9
+ import { NON_WORKING_DISPLAYS } from '@nowline/core/internal';
10
+ /** Every display value, in documentation order. */
11
+ export { NON_WORKING_DISPLAYS };
12
+ /** True when `value` is a display value. */
13
+ export function isNonWorkingDisplay(value) {
14
+ return value === 'hide' || value === 'show';
15
+ }
16
+ /**
17
+ * Parse a raw surface option. Empty or missing input is "unset" and returns
18
+ * undefined, so the file's `default roadmap non-working:` key still applies;
19
+ * anything other than `hide` or `show` throws a `RangeError`.
20
+ */
21
+ export function parseNonWorkingDisplay(raw) {
22
+ if (raw === undefined || raw === '')
23
+ return undefined;
24
+ if (isNonWorkingDisplay(raw))
25
+ return raw;
26
+ throw new RangeError(`Invalid non-working display "${raw}". Expected hide or show.`);
27
+ }
28
+ //# sourceMappingURL=non-working-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"non-working-display.js","sourceRoot":"","sources":["../src/non-working-display.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,wEAAwE;AACxE,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,2EAA2E;AAC3E,wEAAwE;AACxE,yBAAyB;AAEzB,OAAO,EAAE,oBAAoB,EAA0B,MAAM,wBAAwB,CAAC;AAKtF,mDAAmD;AACnD,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC,4CAA4C;AAC5C,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAC9C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAuB;IAC1D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,mBAAmB,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACzC,MAAM,IAAI,UAAU,CAAC,gCAAgC,GAAG,2BAA2B,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { NowlineFile, ResolveResult } from '@nowline/core';
2
+ import { type CalendarConfig } from '../calendar.js';
3
+ import type { LayoutOptions } from '../layout.js';
4
+ import { type NonWorkingDisplay } from '../non-working-display.js';
5
+ import type { RoadmapSchedule } from '../schedule.js';
6
+ import { type StyleContext } from '../style-resolution.js';
7
+ import { type Theme, type ThemeName } from '../themes/index.js';
8
+ import type { ResolvedStyle } from '../types.js';
9
+ import { type ViewPreset } from '../view-preset.js';
10
+ import { type WorkingCalendar } from '../working-calendar.js';
11
+ /** What every later phase reads about the roadmap as a whole. */
12
+ export interface RoadmapScope {
13
+ themeName: ThemeName;
14
+ theme: Theme;
15
+ /** The resolved locale: the surface option, then the directive, then `en-US`. */
16
+ locale: string;
17
+ styleCtx: StyleContext;
18
+ /** `default roadmap`: header position and height, timeline position, minor grid, non-working. */
19
+ roadmapStyle: ResolvedStyle;
20
+ }
21
+ /**
22
+ * The natural date window and the calendar it is counted in. Item sizes
23
+ * are not part of it: `createLayoutContext` resolves each file's own sizes
24
+ * under `cal`, because an isolated region declares its own.
25
+ */
26
+ export interface DateWindow {
27
+ cal: CalendarConfig;
28
+ calendar: WorkingCalendar;
29
+ /** The view preset (`scale:` block): tick unit, pixels per unit, labels. */
30
+ preset: ViewPreset;
31
+ schedule: RoadmapSchedule;
32
+ startDate: Date;
33
+ /** The natural end. Finalize step f2 may extend the axis past it; nothing else moves it. */
34
+ naturalEndDate: Date;
35
+ /** Working days in the natural window. */
36
+ spanDays: number;
37
+ /** Calendar days under `non-working:show`, else `spanDays`. */
38
+ timelineDays: number;
39
+ /** How non-working days are drawn: the surface option, then `default roadmap`. */
40
+ nonWorking: NonWorkingDisplay;
41
+ }
42
+ export declare function resolveScope(file: NowlineFile, resolved: ResolveResult, options: LayoutOptions): RoadmapScope;
43
+ export declare function resolveDateWindow(file: NowlineFile, resolved: ResolveResult, options: LayoutOptions, scope: RoadmapScope, schedule: RoadmapSchedule): DateWindow;
44
+ export declare function computeDateWindow(file: NowlineFile, schedule: RoadmapSchedule, today: Date | undefined, scale: ViewPreset): {
45
+ startDate: Date;
46
+ endDate: Date;
47
+ };
48
+ //# sourceMappingURL=date-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-window.d.ts","sourceRoot":"","sources":["../../src/phases/date-window.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,KAAK,cAAc,EAA8B,MAAM,gBAAgB,CAAC;AAIjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAU,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE3E,iEAAiE;AACjE,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,iGAAiG;IACjG,YAAY,EAAE,aAAa,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,cAAc,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,4EAA4E;IAC5E,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,4FAA4F;IAC5F,cAAc,EAAE,IAAI,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,UAAU,EAAE,iBAAiB,CAAC;CACjC;AAED,wBAAgB,YAAY,CACxB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,GACvB,YAAY,CAed;AAED,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,eAAe,GAC1B,UAAU,CAiCZ;AAuBD,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,IAAI,GAAG,SAAS,EACvB,KAAK,EAAE,UAAU,GAClB;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CA0CpC"}