@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
@@ -0,0 +1,514 @@
1
+ // Item measure (specs/layout-phases.md §3.6): everything about an item bar
2
+ // that does not depend on where the bar lands vertically or on what was
3
+ // placed before it. `measureItem` is the front half of `sequenceItem`
4
+ // without the start resolution and the `before:` caps: duration, width,
5
+ // style and status tint, progress, meta line, link icon, chip samples,
6
+ // caption fit, and the growth a wrapped title or a chip column adds to
7
+ // the bar. It reads the scope, the scale and the footnote index, never an
8
+ // entity edge or a placed item, so the row track can measure an item to
9
+ // size its row and hand the same measure to `sequenceItem`, which places
10
+ // it.
11
+ import { deriveTotalEffortDays, resolveDuration } from '../calendar.js';
12
+ import { capacityIconDxTerms, estimateCapacitySuffixWidth, formatCapacityNumber, META_SUFFIX_DX_EM, parseCapacityValue, resolveCapacityIcon, } from '../capacity.js';
13
+ import { propValue, propValues } from '../dsl-utils.js';
14
+ import { pickInlineDate } from '../inline-date-pin-geometry.js';
15
+ import { computeTitleBarExtra, ITEM_CAPTION_INSET_X_PX, ITEM_CAPTION_META_BASELINE_OFFSET_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, itemCaptionLastBaselineOffset, itemTitleFirstLineRightReservePx, LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX, LABEL_CHIP_GAP_BETWEEN_PX, LABEL_CHIP_HEIGHT_PX, LABEL_CHIP_ROW_STEP_PX, layoutSpillCluster, MIN_BAR_WIDTH_FOR_DOT_PX, MIN_BAR_WIDTH_FOR_FOOTNOTE_PX, MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX, packSpillChips, } from '../item-bar-geometry.js';
16
+ import { scheduledItemDays } from '../layout-context.js';
17
+ import { resolveLabelChipStyle, resolveStyle } from '../style-resolution.js';
18
+ import { ellipsizeToWidth, estimateTextWidth } from '../text-measure.js';
19
+ import { PADDING_PX, PROGRESS_STRIP_HEIGHT_PX } from '../themes/shared.js';
20
+ import { itemSpanPx } from '../working-span.js';
21
+ import { itemBarInsetPx, itemVisualWidth, measureItemCaption, resolveCaptionTitleLines, } from './item-node.js';
22
+ export function statusFromProp(raw) {
23
+ switch (raw) {
24
+ case 'done':
25
+ case 'completed':
26
+ return 'done';
27
+ case 'in-progress':
28
+ case 'active':
29
+ return 'in-progress';
30
+ case 'at-risk':
31
+ case 'blocked':
32
+ case 'planned':
33
+ return raw;
34
+ case undefined:
35
+ return 'planned';
36
+ default:
37
+ return 'neutral';
38
+ }
39
+ }
40
+ function parseProgressFraction(raw) {
41
+ if (!raw)
42
+ return 0;
43
+ const m = /^(\d{1,3})%$/.exec(raw);
44
+ if (!m)
45
+ return 0;
46
+ return Math.max(0, Math.min(100, parseInt(m[1], 10))) / 100;
47
+ }
48
+ // Resolve a `size:NAME` value to its size declaration's effort literal, used
49
+ // by displays that want the literal duration string (not days). Returns the
50
+ // original string for raw literals (`1w`, `3d`) and undefined for missing
51
+ // values. m5 will adjust callers to apply capacity-aware derivation when the
52
+ // caller wants the calendar duration; this helper continues to expose the
53
+ // raw effort/duration literal for chips, captions, and tooltips.
54
+ function resolveDurationLiteral(raw, ctx) {
55
+ if (!raw)
56
+ return undefined;
57
+ if (/^\d+(?:\.\d+)?[dwmqy]$/.test(raw) || /^\d+%$/.test(raw))
58
+ return raw;
59
+ return ctx.sizes.get(raw)?.effortLiteral ?? raw;
60
+ }
61
+ // Resolve a person/team id to its declared title when present (id otherwise).
62
+ function resolveActorDisplay(raw, ctx) {
63
+ if (!raw)
64
+ return undefined;
65
+ return ctx.teams.get(raw)?.title ?? ctx.persons.get(raw)?.title ?? raw;
66
+ }
67
+ export function parseLinkIcon(link) {
68
+ if (!link)
69
+ return { icon: 'none' };
70
+ const lower = link.toLowerCase();
71
+ if (lower.includes('linear.app'))
72
+ return { icon: 'linear', href: link };
73
+ if (lower.includes('github.com'))
74
+ return { icon: 'github', href: link };
75
+ if (lower.includes('atlassian.net') || lower.includes('jira.')) {
76
+ return { icon: 'jira', href: link };
77
+ }
78
+ return { icon: 'generic', href: link };
79
+ }
80
+ // Bake a named/hex color from a label's `bg:` or `fg:` into the chip style.
81
+ export function buildLabelChip(label, ctx, x, y, maxWidth) {
82
+ const style = resolveLabelChipStyle(label, ctx);
83
+ // Prefer the short name (id) when it exists — chips inside an item bar
84
+ // are tight; the long title risks overflowing.
85
+ const text = label.name ?? label.title ?? '';
86
+ const padKey = style.padding === 'none' ? 'xs' : style.padding;
87
+ const pad = PADDING_PX[padKey];
88
+ let width = Math.max(20, Math.round(text.length * 5.5 + pad * 2));
89
+ if (maxWidth !== undefined)
90
+ width = Math.min(width, maxWidth);
91
+ return {
92
+ text,
93
+ style,
94
+ box: { x, y, width, height: LABEL_CHIP_HEIGHT_PX },
95
+ };
96
+ }
97
+ /**
98
+ * Status kind and 0..1 progress fraction for an item: a pure function of
99
+ * the item's properties and the layout scope.
100
+ */
101
+ export function resolveItemProgress(props, ctx) {
102
+ // Total work in single-engineer days, used below to normalize a literal
103
+ // `remaining:` value into a progress fraction. Stays per-engineer
104
+ // regardless of the item's `capacity:` so a `remaining:1w` always means
105
+ // "one engineer-week of work left".
106
+ const totalEffortDays = deriveTotalEffortDays(props, ctx.sizes, ctx.cal);
107
+ const remainingDays = resolveDuration(propValue(props, 'remaining'), ctx.sizes, ctx.cal);
108
+ const statusRaw = propValue(props, 'status');
109
+ const status = statusFromProp(statusRaw);
110
+ let progress = parseProgressFraction(statusRaw);
111
+ if (progress === 0 && status === 'done')
112
+ progress = 1;
113
+ const remainingPctMatch = /^(\d{1,3})%$/.exec(propValue(props, 'remaining') ?? '');
114
+ if (progress === 0 && status === 'in-progress' && remainingPctMatch) {
115
+ const pct = Math.max(0, Math.min(100, parseInt(remainingPctMatch[1], 10))) / 100;
116
+ progress = 1 - pct;
117
+ }
118
+ if (progress === 0 && status === 'in-progress' && remainingDays > 0 && totalEffortDays > 0) {
119
+ // `remaining:` literal is single-engineer days; `totalEffortDays`
120
+ // is also single-engineer days, so the ratio is unit-correct.
121
+ // Clamp to [0, 1] — the renderer paints 100% remaining when the
122
+ // author overshot, matching the spec's "warn-and-clamp" overflow
123
+ // behavior. (Validation defers the warn to layout-time today; a
124
+ // future diagnostics channel can surface it back to the user.)
125
+ progress = Math.max(0, Math.min(1, 1 - remainingDays / totalEffortDays));
126
+ }
127
+ return { status, progress };
128
+ }
129
+ /**
130
+ * Assemble an item's meta line and capacity suffix. The caption fit needs
131
+ * the real meta width to know whether a title wraps or spills, and
132
+ * `sequenceItem` paints from the same result.
133
+ */
134
+ export function resolveItemMeta(props, ctx, sizeResolved, status, progress, capacityIconName) {
135
+ // Driver-only meta line (`rendering.md` § Item size chip): exactly one
136
+ // leading token — the explicit non-empty `duration:LITERAL` when set,
137
+ // otherwise the size chip when `size:` drives. Never both; bar width
138
+ // already encodes derived calendar span for sized items.
139
+ const explicitDurationLiteral = propValue(props, 'duration');
140
+ const durationDrives = !!explicitDurationLiteral && /^\d+(?:\.\d+)?[dwmqy]$/.test(explicitDurationLiteral);
141
+ const sizeChipText = sizeResolved ? (sizeResolved.title ?? sizeResolved.name) : '';
142
+ const driverToken = durationDrives
143
+ ? explicitDurationLiteral
144
+ : sizeChipText || undefined;
145
+ const remainingRaw = propValue(props, 'remaining');
146
+ const remainingLiteral = resolveDurationLiteral(remainingRaw, ctx);
147
+ const ownerDisplay = resolveActorDisplay(propValue(props, 'owner'), ctx);
148
+ const metaHead = () => [driverToken, ownerDisplay].filter(Boolean).join(' ');
149
+ let metaText;
150
+ if (status === 'in-progress' && remainingLiteral) {
151
+ const head = metaHead();
152
+ metaText = head
153
+ ? `${head} — ${remainingLiteral} remaining`
154
+ : `${remainingLiteral} remaining`;
155
+ }
156
+ else if (status === 'in-progress' && progress > 0 && progress < 1) {
157
+ const pct = Math.round((1 - progress) * 100);
158
+ const head = metaHead();
159
+ metaText = head ? `${head} — ${pct}% remaining` : `${pct}% remaining`;
160
+ }
161
+ else if (ownerDisplay || driverToken) {
162
+ metaText = metaHead() || undefined;
163
+ }
164
+ // Capacity suffix — appended after metaText at render time. Layout's
165
+ // job here is to (a) parse the value out of `capacity:`, (b) format
166
+ // the display number, (c) resolve `capacity-icon` to either a
167
+ // built-in name or a literal string the renderer can paint directly,
168
+ // and (d) feed the suffix's estimated width into the caption fit so
169
+ // spill detection accounts for `2w 5×` rather than just `2w`. The
170
+ // suffix disappears entirely when capacity is missing or non-positive.
171
+ const capacityRaw = propValue(props, 'capacity');
172
+ const capacityValue = parseCapacityValue(capacityRaw);
173
+ let capacity = null;
174
+ let capacityTrailingWidth = 0;
175
+ if (capacityValue !== null) {
176
+ const capacityText = formatCapacityNumber(capacityValue);
177
+ const capacityIcon = resolveCapacityIcon(capacityIconName, ctx.symbols);
178
+ const META_FONT_SIZE_PX_LOCAL = 11;
179
+ const iconDxTerms = capacityIconDxTerms(capacityText, capacityIcon, META_FONT_SIZE_PX_LOCAL, metaText);
180
+ capacity = {
181
+ value: capacityValue,
182
+ text: capacityText,
183
+ icon: capacityIcon,
184
+ ...(iconDxTerms !== undefined ? { iconDxTerms } : {}),
185
+ };
186
+ // Add a small leading separator (a single space's worth) only when
187
+ // the suffix sits next to existing meta text, so `m 5×` has air
188
+ // between the driver token and the count. Standalone suffix needs no
189
+ // leading separator. A built-in SVG icon is placed past exactly the
190
+ // `META_SUFFIX_DX_EM` separator, so reserve that, not a space's
191
+ // estimate, or the icon ends past the reservation.
192
+ const separatorPx = iconDxTerms !== undefined
193
+ ? META_FONT_SIZE_PX_LOCAL * META_SUFFIX_DX_EM
194
+ : estimateTextWidth(' ', META_FONT_SIZE_PX_LOCAL);
195
+ const separatorWidth = metaText ? separatorPx : 0;
196
+ capacityTrailingWidth =
197
+ separatorWidth +
198
+ estimateCapacitySuffixWidth(capacityText, capacityIcon, META_FONT_SIZE_PX_LOCAL);
199
+ }
200
+ return { metaText, ownerDisplay, capacity, capacityTrailingWidth };
201
+ }
202
+ /**
203
+ * Footnote numbers attached to an item, ascending. Per `specs/dsl.md`,
204
+ * footnotes attach via the `on:` property on the footnote declaration
205
+ * only — there is no forward `footnote:` property on the host entity.
206
+ * Walk `footnoteHosts` (built from each footnote's `on:` list) and
207
+ * collect every footnote that names this item. The caption fit needs
208
+ * them, since the indicators narrow the title's first line.
209
+ */
210
+ export function collectItemFootnoteIndicators(name, ctx) {
211
+ const set = new Set();
212
+ if (name) {
213
+ for (const [fid, hosts] of ctx.footnoteHosts.entries()) {
214
+ if (hosts.includes(name)) {
215
+ const n = ctx.footnoteIndex.get(fid);
216
+ if (n !== undefined)
217
+ set.add(n);
218
+ }
219
+ }
220
+ }
221
+ return [...set].sort((a, b) => a - b);
222
+ }
223
+ /**
224
+ * How far the title's first line must stay from the bar's right edge so
225
+ * it clears the top-right decoration cluster.
226
+ */
227
+ export function resolveTitleFirstLineReserve(barWidth, footnoteIndicators, beforeRaw) {
228
+ return itemTitleFirstLineRightReservePx({
229
+ barWidth,
230
+ footnoteLabels: footnoteIndicators.map(String),
231
+ hasBeforeGlyph: pickInlineDate(beforeRaw) !== undefined,
232
+ });
233
+ }
234
+ /** `StatusKind` to the key `Theme.status` and `Theme.statusTint` use. */
235
+ const THEME_STATUS_KEY = {
236
+ done: 'done',
237
+ 'in-progress': 'inProgress',
238
+ 'at-risk': 'atRisk',
239
+ blocked: 'blocked',
240
+ planned: 'planned',
241
+ neutral: 'neutral',
242
+ };
243
+ /**
244
+ * Copy of an item's resolved style with the theme's status tint as `bg` when
245
+ * `bg` is still `entities.item.bg`, and the status color as `fg` when `fg` is
246
+ * still `entities.item.fg`.
247
+ */
248
+ function applyStatusTheme(resolved, status, theme) {
249
+ const key = THEME_STATUS_KEY[status];
250
+ const style = { ...resolved };
251
+ if (style.bg === theme.entities.item.bg) {
252
+ style.bg = theme.statusTint[key];
253
+ }
254
+ if (style.fg === theme.entities.item.fg) {
255
+ style.fg = theme.status[key];
256
+ }
257
+ return style;
258
+ }
259
+ /**
260
+ * Compute the extra vertical px the bar grows to fit its label chips
261
+ * (a spilled chip column, or inside-bar chips stacked below a caption
262
+ * that reaches past the default chip row). The bar's painted footprint
263
+ * becomes `bandwidth + chipBarExtra`, the progress strip rides the new
264
+ * bottom, and chip rows pack inside the taller bar (anchored from the
265
+ * bar TOP so row 0 doesn't shift when the bar grows).
266
+ *
267
+ * Returns 0 when chips fit inside the bar, when there are no chips,
268
+ * or when the spilled column happens to fit inside `bandwidth` (a
269
+ * single row with the caption inside, for instance).
270
+ *
271
+ * `captionLastBaseline` is the in-bar caption's last text baseline
272
+ * (px from the bar's top): the meta baseline when the item has a meta
273
+ * line, otherwise the last title line's baseline. A wrapped title
274
+ * pushes it down; see `itemCaptionLastBaselineOffset`.
275
+ *
276
+ * The bar's final growth is `max(titleBarExtra, chipBarExtra)`; the
277
+ * same number is the row-pitch increase the swimlane / group
278
+ * row-packer reserves so the next row clears the taller bar.
279
+ */
280
+ export function computeChipBarExtra(chipsOutside, captionSpills, chipRowCount, bandwidth, captionLastBaseline) {
281
+ if (chipRowCount === 0)
282
+ return 0;
283
+ // Row 0 anchor relative to the bar's TOP — three regimes:
284
+ //
285
+ // 1. chipsOutside + captionSpills → chips stack below the
286
+ // spilled meta line. A break-free spilled caption is the
287
+ // single-line title + meta stack, so this clears the classic
288
+ // meta baseline; a spilled block with explicit breaks is
289
+ // taller, so it clears its own last baseline instead.
290
+ // 2. chips INSIDE the bar → chip top must clear the caption's
291
+ // last baseline (meta line, else the last title line); the
292
+ // natural `baseTop` sits ABOVE the meta line at default
293
+ // bandwidth (=56) and above line 2 of a wrapped title, so we
294
+ // take whichever is lower of base/captionStack. For a
295
+ // single-line title with no meta the caption bottom is above
296
+ // `baseTop`, so this is `baseTop`.
297
+ // 3. otherwise (chipsOutside w/o caption spill) → row 0 hugs
298
+ // the bar bottom at `baseTop`.
299
+ //
300
+ // Cases (2) and (3-with-multi-row-spill) can both grow the bar;
301
+ // case (3-with-single-row-inside-no-meta) never grows.
302
+ const baseTop = bandwidth -
303
+ PROGRESS_STRIP_HEIGHT_PX -
304
+ LABEL_CHIP_HEIGHT_PX -
305
+ LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX;
306
+ let chipRow0Top;
307
+ if (chipsOutside && captionSpills) {
308
+ chipRow0Top =
309
+ Math.max(ITEM_CAPTION_META_BASELINE_OFFSET_PX, captionLastBaseline) +
310
+ LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX;
311
+ }
312
+ else if (!chipsOutside) {
313
+ chipRow0Top = Math.max(baseTop, captionLastBaseline + LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX);
314
+ }
315
+ else {
316
+ chipRow0Top = baseTop;
317
+ }
318
+ const lastRowBottomTop = chipRow0Top + (chipRowCount - 1) * LABEL_CHIP_ROW_STEP_PX + LABEL_CHIP_HEIGHT_PX;
319
+ // The bar must be tall enough to fit `lastRowBottomTop` plus a
320
+ // GAP above the progress strip plus the progress strip itself.
321
+ const requiredHeight = lastRowBottomTop + LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX + PROGRESS_STRIP_HEIGHT_PX;
322
+ return Math.max(0, requiredHeight - bandwidth);
323
+ }
324
+ /**
325
+ * Cap a spilled caption at the chart's end (specs/scheduler-unification.md
326
+ * §8 decision 12). When the spill column (`layoutSpillCluster`: icon,
327
+ * caption, footnotes, dot) would end past `AxisColumns.captionCapX`, the
328
+ * overhang budget past the axis end, every title line wider than the room
329
+ * left is truncated with `…` so the column ends there; finalize f2 grows the
330
+ * axis by the columns it reaches. The meta line is never truncated. A
331
+ * caption in the middle of the chart, or one that ends inside the budget,
332
+ * keeps its lines.
333
+ */
334
+ function capCaptionAtAxisEnd(lines, input, ctx) {
335
+ const columns = ctx.axisColumns;
336
+ if (!input.textSpills || !columns)
337
+ return { lines, truncated: false };
338
+ const titleWidth = Math.max(0, ...lines.map((line) => estimateTextWidth(line, ITEM_CAPTION_TITLE_FONT_SIZE_PX)));
339
+ const { metaText, capacityTrailingWidth } = input.meta;
340
+ const metaWidth = (metaText ? estimateTextWidth(metaText, ITEM_CAPTION_META_FONT_SIZE_PX) : 0) +
341
+ capacityTrailingWidth;
342
+ const captionWidth = Math.max(titleWidth, metaWidth);
343
+ const spill = layoutSpillCluster({
344
+ barRightX: input.barRightX,
345
+ iconSpills: input.iconSpills,
346
+ captionWidth,
347
+ footnoteCount: input.visualWidth < MIN_BAR_WIDTH_FOR_FOOTNOTE_PX ? input.footnoteCount : 0,
348
+ dotSpills: input.visualWidth < MIN_BAR_WIDTH_FOR_DOT_PX,
349
+ });
350
+ const capX = columns.captionCapX(input.barRightX);
351
+ if (spill.rightX <= capX + CAPTION_CAP_TOLERANCE_PX || spill.captionX === null) {
352
+ return { lines, truncated: false };
353
+ }
354
+ // The room for a title line: up to the cap, less what trails the caption.
355
+ const trailing = spill.rightX - (spill.captionX + captionWidth);
356
+ const room = capX - spill.captionX - trailing;
357
+ let truncated = false;
358
+ const out = lines.map((line) => {
359
+ const fitted = ellipsizeToWidth(line, room, ITEM_CAPTION_TITLE_FONT_SIZE_PX);
360
+ if (fitted !== line)
361
+ truncated = true;
362
+ return fitted;
363
+ });
364
+ return { lines: out, truncated };
365
+ }
366
+ /** Pixel float noise the caption cap ignores. */
367
+ const CAPTION_CAP_TOLERANCE_PX = 1e-6;
368
+ /**
369
+ * Measure `node` as a bar starting at `startX`, the snapped start
370
+ * (`ctx.scale.startX`) it will be placed at. Pure: it writes nothing to
371
+ * `ctx`.
372
+ */
373
+ export function measureItem(node, startX, ctx) {
374
+ const props = node.properties;
375
+ const resolvedStyle = resolveStyle('item', props, ctx.styleCtx);
376
+ // Sizing precedence (specs/dsl.md § "Sizing precedence"):
377
+ // 1. `duration:LITERAL` wins as the calendar duration — `size:NAME`
378
+ // becomes a pure annotation (chip only).
379
+ // 2. Otherwise, `size:NAME` derives `effort ÷ capacity` (default
380
+ // capacity = 1).
381
+ // The validator requires one of the two on every item.
382
+ const sizeRef = propValue(props, 'size');
383
+ const sizeResolved = sizeRef ? (ctx.sizes.get(sizeRef) ?? null) : null;
384
+ const durationDays = scheduledItemDays(ctx, node);
385
+ const afterRaw = propValues(props, 'after');
386
+ const beforeRaw = propValues(props, 'before');
387
+ // The bar spans exactly its dates (specs/true-width-layout.md §3.1):
388
+ // the logical width is the span, and the box `ItemNode` paints is that
389
+ // span less its seams, at least the 1 px floor.
390
+ const naturalWidth = itemSpanPx(ctx, startX, durationDays);
391
+ const visualWidth = itemVisualWidth(naturalWidth);
392
+ const link = parseLinkIcon(propValue(props, 'link'));
393
+ const hasLinkIcon = link.icon !== 'none';
394
+ // The chip row: every chip at its NATURAL text-fit width on a single
395
+ // horizontal row, never truncated. Only the total row width matters
396
+ // here, to decide whether the row fits inside the bar; `sequenceItem`
397
+ // places the chips once the bar box is known.
398
+ //
399
+ // Chips sit at the bar's bottom (just above the progress strip) and
400
+ // the link icon (when present) sits in the bar's UPPER-LEFT corner,
401
+ // so they never share a vertical band: chips have the full
402
+ // caption-inset-bounded inner width whether or not a link icon is
403
+ // rendered. The link-icon column's horizontal cost is borne by the
404
+ // caption (title/meta) inset instead, see `measureItemCaption`.
405
+ const naturalVisualWidth = itemVisualWidth(naturalWidth);
406
+ const labelIds = propValues(props, 'labels');
407
+ const chipSamples = [];
408
+ for (const labelId of labelIds) {
409
+ const label = ctx.labels.get(labelId);
410
+ if (!label)
411
+ continue;
412
+ const sample = buildLabelChip(label, ctx.styleCtx, 0, 0);
413
+ chipSamples.push({ id: label, width: sample.box.width });
414
+ }
415
+ let chipRowWidth = 0;
416
+ for (let i = 0; i < chipSamples.length; i += 1) {
417
+ if (i > 0)
418
+ chipRowWidth += LABEL_CHIP_GAP_BETWEEN_PX;
419
+ chipRowWidth += chipSamples[i].width;
420
+ }
421
+ const chipInsideAvailWidth = Math.max(0, naturalVisualWidth - 2 * ITEM_CAPTION_INSET_X_PX);
422
+ const chipsOutside = chipSamples.length > 0 && chipRowWidth > chipInsideAvailWidth;
423
+ const { status, progress } = resolveItemProgress(props, ctx);
424
+ // Apply the status-tinted item background and status border when the
425
+ // resolved bg / fg is still the theme default. Authors who set explicit
426
+ // `bg:` / `fg:` keep their override. Per m2d handoff Resolution 3: layout
427
+ // owns this so the renderer stays palette-dumb. The tokens live in the
428
+ // theme (`statusTint`, `status`); the style is copied, never mutated.
429
+ const style = applyStatusTheme(resolvedStyle, status, ctx.styleCtx.theme);
430
+ // The secondary line shown inside the item bar, plus the capacity
431
+ // suffix that renders after it.
432
+ const meta = resolveItemMeta(props, ctx, sizeResolved, status, progress, style.capacityIcon);
433
+ const title = node.title ?? node.name ?? '';
434
+ // Footnote indicators and the `before:` glyph share the bar's
435
+ // upper-right with the title's first line, so resolve them BEFORE the
436
+ // caption is fit: the first line stops short of that cluster.
437
+ const footnoteIndicators = collectItemFootnoteIndicators(node.name, ctx);
438
+ const captionFit = measureItemCaption({
439
+ title,
440
+ visualWidth,
441
+ metaText: meta.metaText,
442
+ metaTrailingWidth: meta.capacityTrailingWidth,
443
+ hasLinkIcon,
444
+ hasAfterGlyph: pickInlineDate(afterRaw) !== undefined,
445
+ titleFirstLineRightReservePx: resolveTitleFirstLineReserve(naturalVisualWidth, footnoteIndicators, beforeRaw),
446
+ });
447
+ // A bar too narrow for the link icon spills it, and the caption with
448
+ // it, so the icon and the title stay adjacent; see `sequenceItem`.
449
+ const iconSpills = hasLinkIcon && visualWidth < MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX;
450
+ const textSpills = captionFit.fit.textSpills || iconSpills;
451
+ // The lines the title paints on. A title that word-wrapped INSIDE the
452
+ // bar paints on two lines; if a narrow-bar icon spill forces the caption
453
+ // out anyway, that wrap is dropped (a spilled break-free title is a
454
+ // single line to the right). A title with explicit `\n` breaks keeps the
455
+ // author's lines whether it stays in-bar or spills.
456
+ // A spilled caption that would run past the axis end is truncated to
457
+ // end within the overhang budget past it (specs/rendering.md § "Caption
458
+ // cap at the chart's end").
459
+ const capped = capCaptionAtAxisEnd(resolveCaptionTitleLines(title, captionFit.fit, iconSpills), {
460
+ textSpills,
461
+ iconSpills,
462
+ barRightX: startX + itemBarInsetPx(naturalWidth) + visualWidth,
463
+ visualWidth,
464
+ footnoteCount: footnoteIndicators.length,
465
+ meta,
466
+ }, ctx);
467
+ const lines = capped.lines;
468
+ // A chip set that does not fit inside the bar moves to the spill column
469
+ // and packs into rows capped at the bar's visual width.
470
+ const chipPack = chipsOutside ? packSpillChips(chipSamples, visualWidth) : null;
471
+ const chipRowCount = chipPack ? chipPack.rows.length : chipSamples.length > 0 ? 1 : 0;
472
+ // Capacity suffix renders on the same line as metaText. Treat the meta
473
+ // line as present whenever EITHER metaText OR a capacity suffix will
474
+ // paint, so chip-row pitch reserves the right amount of vertical space.
475
+ const hasMeta = meta.metaText !== undefined || meta.capacity !== null;
476
+ // Baseline (px from the bar's top) of the caption's last line: the
477
+ // meta line when present, else the last title line. Chips stacked
478
+ // inside the bar must clear it.
479
+ const lastBaseline = itemCaptionLastBaselineOffset(lines.length, hasMeta);
480
+ const titleBarExtra = computeTitleBarExtra(lines.length, hasMeta);
481
+ const chipBarExtra = computeChipBarExtra(chipsOutside, textSpills, chipRowCount, ctx.bandScale.bandwidth(), lastBaseline);
482
+ return {
483
+ node,
484
+ id: node.name ?? '',
485
+ startX,
486
+ durationDays,
487
+ naturalWidth,
488
+ visualWidth,
489
+ naturalVisualWidth,
490
+ style,
491
+ size: sizeResolved,
492
+ status,
493
+ progress,
494
+ meta,
495
+ link,
496
+ chips: {
497
+ samples: chipSamples,
498
+ outside: chipsOutside,
499
+ pack: chipPack,
500
+ rowCount: chipRowCount,
501
+ },
502
+ footnoteIndicators,
503
+ caption: {
504
+ ...captionFit,
505
+ title,
506
+ iconSpills,
507
+ lines,
508
+ truncated: capped.truncated,
509
+ lastBaseline,
510
+ },
511
+ barExtra: Math.max(titleBarExtra, chipBarExtra),
512
+ };
513
+ }
514
+ //# sourceMappingURL=item-measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-measure.js","sourceRoot":"","sources":["../../src/nodes/item-measure.ts"],"names":[],"mappings":"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"}