@diagrammo/dgmo 0.73.0 → 0.75.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 (187) hide show
  1. package/dist/advanced.d.ts +11 -49
  2. package/dist/advanced.js +94 -94
  3. package/dist/{analyzer-KQWXVQOI.js → analyzer-QTDQEMS5.js} +4 -6
  4. package/dist/block.js +49 -49
  5. package/dist/{calculator-2Z5DUTOB.js → calculator-CVQ54JNE.js} +3 -3
  6. package/dist/chart-meta.js +42 -42
  7. package/dist/{charts-d3-S6JPQQFZ.js → charts-d3-SQEVMIAM.js} +8 -8
  8. package/dist/{chunk-OYK45NY5.js → chunk-2NRIGEHZ.js} +3 -3
  9. package/dist/{chunk-ZIJXK3U5.js → chunk-2QRIMMIH.js} +3 -3
  10. package/dist/{chunk-PFZDLHHG.js → chunk-32MOGTKT.js} +43 -206
  11. package/dist/{chunk-NQJ7DDUT.js → chunk-3H4PDNP4.js} +3 -3
  12. package/dist/{chunk-K7P4SCB3.js → chunk-3LJNQ6LR.js} +7 -7
  13. package/dist/{chunk-7VMUKH2Z.js → chunk-3SP6G4LN.js} +3 -3
  14. package/dist/{chunk-2PU5XWLA.js → chunk-3SQJZMPO.js} +4 -129
  15. package/dist/{chunk-4K5H6LON.js → chunk-4YER7UCV.js} +3 -3
  16. package/dist/{chunk-BVNTXVYJ.js → chunk-5PFNUDXR.js} +3 -3
  17. package/dist/{chunk-OR3OX32W.js → chunk-76IBFEYW.js} +6 -6
  18. package/dist/{chunk-4FKEI4MF.js → chunk-76LHNLGX.js} +2 -2
  19. package/dist/{chunk-JLSGQMRA.js → chunk-76NHL5UG.js} +2 -2
  20. package/dist/{chunk-KUDYLU3M.js → chunk-7BMX2M3F.js} +2 -2
  21. package/dist/{chunk-FQDH6AL3.js → chunk-7EZ5AKBK.js} +6 -6
  22. package/dist/{chunk-CLKRRKV6.js → chunk-7G4XMHDB.js} +8 -8
  23. package/dist/{chunk-3AXUJ5PT.js → chunk-7NSNE52V.js} +5 -4
  24. package/dist/{chunk-XVJWAE2F.js → chunk-AFR6GWXD.js} +5 -5
  25. package/dist/{chunk-25LXU4OQ.js → chunk-AYM472K3.js} +7 -7
  26. package/dist/{chunk-K3O2CZTD.js → chunk-BCB24FG7.js} +4 -4
  27. package/dist/{chunk-E27E4ZFN.js → chunk-BFTRW24X.js} +3 -3
  28. package/dist/{chunk-WPEHUSUQ.js → chunk-BWJLLNUX.js} +3 -3
  29. package/dist/{chunk-INOSOL3J.js → chunk-C2WH3BMS.js} +2 -2
  30. package/dist/{chunk-TP42IN23.js → chunk-CAPR5DET.js} +4 -4
  31. package/dist/{chunk-ABH626W7.js → chunk-CLQJAGWL.js} +58 -54
  32. package/dist/{chunk-3X3UD7PN.js → chunk-COCMMQXW.js} +4 -4
  33. package/dist/{chunk-V7E3RZLQ.js → chunk-CQKD6GOC.js} +3 -3
  34. package/dist/{chunk-2M2UC5EU.js → chunk-CRLVJZWX.js} +2 -2
  35. package/dist/{chunk-A4GOY3PE.js → chunk-DEW62ON3.js} +1 -3
  36. package/dist/{chunk-KCHCOXAL.js → chunk-DJL5PO27.js} +2 -2
  37. package/dist/{chunk-5EI23VVR.js → chunk-DSH7NJ2G.js} +5 -5
  38. package/dist/{chunk-LMJKHQ4W.js → chunk-DU3OIBQE.js} +3 -3
  39. package/dist/{chunk-VWIXRNY2.js → chunk-DY7KDZUF.js} +3 -3
  40. package/dist/{chunk-DTYZAXEH.js → chunk-F4CPZRG2.js} +3 -3
  41. package/dist/{chunk-2TFWQM3E.js → chunk-F4V67JXG.js} +2 -2
  42. package/dist/{chunk-RYHZFP7Y.js → chunk-FPRMP6YA.js} +3 -3
  43. package/dist/{chunk-H454ZVAS.js → chunk-GEURKGZS.js} +6 -6
  44. package/dist/{chunk-KI2L4DWM.js → chunk-GRN44Z6A.js} +2 -2
  45. package/dist/{chunk-X6LXZJPT.js → chunk-HFCKU73Y.js} +6 -6
  46. package/dist/{chunk-FQFQGPWA.js → chunk-HGFKDSKZ.js} +5 -5
  47. package/dist/{chunk-XGBUCXU7.js → chunk-HOIAQ3P2.js} +3 -3
  48. package/dist/{chunk-ARM4G2HJ.js → chunk-ICVIJLBA.js} +4 -4
  49. package/dist/{chunk-FGXBIOVK.js → chunk-IFC3JXCT.js} +2 -2
  50. package/dist/{chunk-B5CIHVBP.js → chunk-IGQW7TKM.js} +7 -7
  51. package/dist/{chunk-DZC2OCK3.js → chunk-IHUOYDLN.js} +8 -8
  52. package/dist/{chunk-54SJUHNY.js → chunk-JL7BDLC6.js} +6 -6
  53. package/dist/{chunk-SNZFXGSE.js → chunk-JLODGGN2.js} +3 -3
  54. package/dist/{chunk-3OKBXV3I.js → chunk-JQ575OAK.js} +3 -3
  55. package/dist/{chunk-OMQ5V5NH.js → chunk-KRTLS3G6.js} +4 -4
  56. package/dist/{chunk-4NYJEK4R.js → chunk-KWSBNLSC.js} +2 -2
  57. package/dist/{chunk-7GYSVN4Z.js → chunk-LKS56RDT.js} +2 -2
  58. package/dist/{chunk-3ATHNEOQ.js → chunk-LXXVHLTH.js} +3 -3
  59. package/dist/{chunk-QFHPGDR5.js → chunk-LYLRNAX2.js} +2 -2
  60. package/dist/{chunk-TTVHS3D5.js → chunk-M3IVOGZE.js} +102 -97
  61. package/dist/{chunk-CVGTEAIO.js → chunk-M526IKKH.js} +2 -2
  62. package/dist/{chunk-W242EWZZ.js → chunk-M5JT2AU7.js} +4 -4
  63. package/dist/{chunk-MK55PZVB.js → chunk-M5OOAP65.js} +4 -3
  64. package/dist/{chunk-YJMWEZOB.js → chunk-MG3DE3VO.js} +2 -2
  65. package/dist/{chunk-TJS3J5B3.js → chunk-NHQ7HUAS.js} +3 -3
  66. package/dist/{chunk-TXWW4UZM.js → chunk-OKXWPKUC.js} +2 -2
  67. package/dist/{chunk-PJHYUVD3.js → chunk-OUJG73YJ.js} +7 -7
  68. package/dist/{chunk-T4L4LKXO.js → chunk-Q6BAFS7I.js} +3 -3
  69. package/dist/{chunk-KZKRK57S.js → chunk-QI4Q5ZZH.js} +7 -7
  70. package/dist/{chunk-D5ZZOTE6.js → chunk-QMFIZQTB.js} +2 -2
  71. package/dist/{chunk-IDEJ3J4J.js → chunk-QOVM5VRC.js} +3 -3
  72. package/dist/{chunk-O7ZKDUDX.js → chunk-QT5UMFPE.js} +2 -2
  73. package/dist/{chunk-JPVRJS74.js → chunk-QUYYL3LP.js} +4 -4
  74. package/dist/{chunk-YGKYQ7LA.js → chunk-R5JPMW2F.js} +40 -40
  75. package/dist/{chunk-NE7JHZCQ.js → chunk-RWFMOVHG.js} +3 -3
  76. package/dist/{chunk-RJUMXXKR.js → chunk-S5P5Z5Y5.js} +3 -3
  77. package/dist/{chunk-XL2C26LV.js → chunk-SH4PPRU7.js} +2 -2
  78. package/dist/{chunk-XOOYMOIW.js → chunk-SUA56ZSB.js} +3 -3
  79. package/dist/{chunk-2AC2KTVM.js → chunk-SWEKCK34.js} +3 -3
  80. package/dist/{chunk-WTMP6VZ6.js → chunk-TDHD3HNO.js} +3 -3
  81. package/dist/{chunk-AMYMV4JZ.js → chunk-TN754B3R.js} +2 -2
  82. package/dist/{chunk-XUCHK3OJ.js → chunk-TPN7RJOM.js} +3 -3
  83. package/dist/{chunk-6G2GJGUC.js → chunk-U5B3TUEW.js} +3 -3
  84. package/dist/{chunk-6LGPL4LP.js → chunk-U74EGVOA.js} +4 -4
  85. package/dist/{chunk-LGASNVZE.js → chunk-U7AO6FRL.js} +4 -4
  86. package/dist/{chunk-RN3PAL4E.js → chunk-UBW53CNS.js} +2 -2
  87. package/dist/{chunk-VQEW7XMN.js → chunk-UCZBRGJN.js} +2 -2
  88. package/dist/{chunk-HQ34V2XV.js → chunk-UJBP57UJ.js} +28 -11
  89. package/dist/{chunk-EPJHJF3J.js → chunk-UTTRJ6KN.js} +5 -5
  90. package/dist/{chunk-RXSAE6F5.js → chunk-UWYZIGCB.js} +3 -3
  91. package/dist/{chunk-7S5WQXI3.js → chunk-VBJCGGNF.js} +2 -2
  92. package/dist/{chunk-IEZYF5CN.js → chunk-W7UBPARG.js} +3 -3
  93. package/dist/{chunk-X6LVGU4W.js → chunk-WQXD3IIN.js} +2 -2
  94. package/dist/{chunk-ITAFWUSB.js → chunk-XCAEHWQB.js} +3 -3
  95. package/dist/{chunk-WDKLODC3.js → chunk-XFLLYY3V.js} +7 -7
  96. package/dist/{chunk-MZMK474U.js → chunk-XHROEQ23.js} +6 -6
  97. package/dist/{chunk-Q446PFCV.js → chunk-Y2CYNRL7.js} +2 -2
  98. package/dist/{chunk-A34AXXBO.js → chunk-YVDBBWEP.js} +5 -5
  99. package/dist/{chunk-ZQ5SROS2.js → chunk-Z7KVOVE4.js} +2 -2
  100. package/dist/{chunk-I4YT5KL6.js → chunk-ZM27UI5O.js} +3 -3
  101. package/dist/{chunk-AG3Z47VY.js → chunk-ZMKCG3FT.js} +6 -6
  102. package/dist/completion-registry.js +4 -3
  103. package/dist/dgmo-router-KYNLRE7S.js +89 -0
  104. package/dist/{dimensions-PRZSDFWR.js → dimensions-NLQ64ED5.js} +6 -6
  105. package/dist/editor.js +1 -0
  106. package/dist/{flowchart-parser-HR25V5AH.js → flowchart-parser-LY5GGQL2.js} +4 -4
  107. package/dist/{flowchart-renderer-FY63GDRH.js → flowchart-renderer-RIJ5FZKO.js} +6 -6
  108. package/dist/highlight.js +1 -0
  109. package/dist/index.js +49 -49
  110. package/dist/{layout-PKGNLY6P.js → layout-5ILNODTP.js} +4 -4
  111. package/dist/{layout-O4PR46GN.js → layout-EM4DLMAX.js} +3 -3
  112. package/dist/{layout-BWHNERBW.js → layout-RV2T2YTT.js} +4 -4
  113. package/dist/{layout-43A4YMAH.js → layout-UJ62RQQ3.js} +3 -3
  114. package/dist/{layout-4URV4OXF.js → layout-VUZ3MLOI.js} +4 -4
  115. package/dist/{layout-U5OVRUOK.js → layout-ZAGUFT2G.js} +4 -4
  116. package/dist/{parser-XS7DL63K.js → parser-2GMHFSTS.js} +4 -4
  117. package/dist/{parser-23MYMNF6.js → parser-3AOMUX5D.js} +4 -4
  118. package/dist/{parser-XTSWP4N3.js → parser-3KQONLXZ.js} +3 -3
  119. package/dist/{parser-X5RGCC3C.js → parser-4DLU4SNG.js} +3 -3
  120. package/dist/{parser-AN4SUBQ6.js → parser-4KFJKLP2.js} +3 -3
  121. package/dist/{parser-W2LEO5QM.js → parser-5XFGK5C5.js} +4 -4
  122. package/dist/{parser-PDPZ2I6C.js → parser-6FUESG4N.js} +4 -4
  123. package/dist/{parser-GPZYL6ZE.js → parser-B2XQNHZM.js} +3 -3
  124. package/dist/{parser-W3QZBUOF.js → parser-CJNP7RKR.js} +4 -4
  125. package/dist/{parser-BTTFGJGI.js → parser-E3OHNNTH.js} +4 -4
  126. package/dist/{parser-A665TNOV.js → parser-EQ4I3TSH.js} +5 -5
  127. package/dist/{parser-2FNHLEBN.js → parser-F4ZKDGUZ.js} +3 -3
  128. package/dist/{parser-PCALQIW2.js → parser-GCVSRQPY.js} +4 -4
  129. package/dist/{parser-3JDQL7QF.js → parser-H4ZUNLX4.js} +3 -3
  130. package/dist/{parser-CAAFD3HB.js → parser-JYIZEKAS.js} +4 -4
  131. package/dist/{parser-SQMOEVG4.js → parser-L7RXUKYN.js} +4 -4
  132. package/dist/{parser-DIQ2E5MR.js → parser-L7T7FY3H.js} +4 -4
  133. package/dist/{parser-SQFNO6XG.js → parser-LUOINP6H.js} +4 -4
  134. package/dist/{parser-XGUJ7SMG.js → parser-LV7PQBUG.js} +4 -4
  135. package/dist/{parser-EDXD6ZGJ.js → parser-ML3LVNDV.js} +4 -4
  136. package/dist/{parser-DBOJKLDF.js → parser-PR3OR3LO.js} +5 -5
  137. package/dist/{parser-MDYNA6JL.js → parser-QOIZGW7I.js} +4 -4
  138. package/dist/{parser-BCQBK2XB.js → parser-RDBXEVI4.js} +4 -4
  139. package/dist/{parser-5RY6ID5M.js → parser-TA5TYZNL.js} +5 -5
  140. package/dist/{parser-6YBYIFS2.js → parser-UTR5WE4O.js} +4 -4
  141. package/dist/{parser-COBTDQPC.js → parser-WCFG3DZA.js} +3 -3
  142. package/dist/{parser-2FZ4BDEW.js → parser-WMJEPZDC.js} +4 -4
  143. package/dist/{parser-VQX2LVUJ.js → parser-WQNT7T2P.js} +3 -3
  144. package/dist/{parser-TATBFGQ2.js → parser-WWRRG2DV.js} +4 -4
  145. package/dist/{parser-BC2TAVB3.js → parser-XVSDFO56.js} +3 -3
  146. package/dist/{parser-5CAGM3ED.js → parser-YWQCC33R.js} +4 -4
  147. package/dist/{parser-VJEHPDOO.js → parser-ZT3PU2HT.js} +4 -4
  148. package/dist/{parser-WQCSMLUI.js → parser-ZXQZZK6W.js} +3 -3
  149. package/dist/pert.d.ts +4 -33
  150. package/dist/{renderer-MCWAHNQG.js → renderer-3FB56573.js} +5 -5
  151. package/dist/{renderer-2E2Z5N66.js → renderer-4EWGZLJ6.js} +4 -4
  152. package/dist/{renderer-J2N5YBFP.js → renderer-4PNVGHVA.js} +5 -5
  153. package/dist/{renderer-S42JPAZO.js → renderer-5W3HWIUL.js} +6 -6
  154. package/dist/{renderer-DU6D3S6K.js → renderer-73QHYZ2Q.js} +8 -8
  155. package/dist/{renderer-V7476J5G.js → renderer-A2YWSBPY.js} +9 -9
  156. package/dist/{renderer-VG4C23TY.js → renderer-BUEFD2IF.js} +5 -5
  157. package/dist/{renderer-XNLRQWM6.js → renderer-CGOPX4HW.js} +9 -10
  158. package/dist/{renderer-ODDULMVE.js → renderer-CO5O5VR5.js} +6 -6
  159. package/dist/{renderer-SW5YUK6H.js → renderer-D7N7PPB7.js} +5 -5
  160. package/dist/{renderer-KJNTNI22.js → renderer-DKW273R7.js} +7 -7
  161. package/dist/{renderer-6U6YW4HX.js → renderer-F24V3RD3.js} +7 -7
  162. package/dist/{renderer-EAQNSDTC.js → renderer-FGGDZZFQ.js} +8 -8
  163. package/dist/{renderer-HZCYBOAB.js → renderer-FUJNSC5X.js} +4 -4
  164. package/dist/{renderer-XL54ZE4H.js → renderer-GF6S5ZX6.js} +8 -8
  165. package/dist/{renderer-NXOSBZPO.js → renderer-GJDVPXI3.js} +9 -9
  166. package/dist/{renderer-YX6S3U4L.js → renderer-JMJ7Q5OC.js} +7 -7
  167. package/dist/{renderer-WG6CUDWI.js → renderer-KMOGGMM7.js} +9 -9
  168. package/dist/{renderer-AKZECRNK.js → renderer-LBNVKVO3.js} +9 -9
  169. package/dist/{renderer-BUMIZJIY.js → renderer-MUW4G2N6.js} +10 -10
  170. package/dist/{renderer-IMZKZ6TV.js → renderer-PIEPRK6M.js} +8 -8
  171. package/dist/{renderer-4HGNWJRC.js → renderer-PKRKLOYR.js} +7 -7
  172. package/dist/{renderer-YIJYYZZE.js → renderer-PR3KLNST.js} +7 -7
  173. package/dist/{renderer-SCIHPARI.js → renderer-QAMOXOZ2.js} +3 -3
  174. package/dist/{renderer-MJCSBYAR.js → renderer-RUHC6D3B.js} +7 -7
  175. package/dist/{renderer-2DIH3YW6.js → renderer-UUP6OX6F.js} +7 -7
  176. package/dist/renderer-UYYBJ7OB.js +76 -0
  177. package/dist/{renderer-BY5AAKV7.js → renderer-UYZSP7MF.js} +7 -7
  178. package/dist/{renderer-GQUJVPVA.js → renderer-WDSBFDQ2.js} +8 -8
  179. package/dist/{renderer-TBWE67FB.js → renderer-XBL6CLN2.js} +7 -7
  180. package/dist/{renderer-R7Q72DM4.js → renderer-ZAJ5353N.js} +4 -4
  181. package/dist/{renderer-radial-ZZAAPDSY.js → renderer-radial-MZP3SVTZ.js} +6 -6
  182. package/dist/{state-parser-4DJ67MNV.js → state-parser-TPA67IXM.js} +5 -5
  183. package/dist/{state-renderer-IABX3URA.js → state-renderer-454ADT7E.js} +9 -9
  184. package/docs/language-reference.md +7 -6
  185. package/package.json +2 -2
  186. package/dist/dgmo-router-AE6FUBV3.js +0 -89
  187. package/dist/renderer-LKZZID6J.js +0 -76
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  analyzePert
3
- } from "./chunk-2PU5XWLA.js";
3
+ } from "./chunk-3SQJZMPO.js";
4
4
  import {
5
5
  computeNodeSizing,
6
6
  layoutPert
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  INLINE_HEADER_PAD,
21
21
  layoutInlineHeader
22
- } from "./chunk-YJMWEZOB.js";
22
+ } from "./chunk-MG3DE3VO.js";
23
23
  import {
24
24
  serializeSvg
25
25
  } from "./chunk-RU2HHHYA.js";
@@ -27,16 +27,15 @@ import {
27
27
  CAPTION_BOX_PADDING_X,
28
28
  CAPTION_BOX_PADDING_Y,
29
29
  CAPTION_FONT_SIZE,
30
- CAPTION_FONT_WEIGHT,
31
30
  CAPTION_LINE_HEIGHT,
32
31
  CAPTION_TOP_GAP,
33
32
  TITLE_FONT_SIZE,
34
33
  TITLE_FONT_WEIGHT,
35
34
  TITLE_Y
36
- } from "./chunk-A4GOY3PE.js";
35
+ } from "./chunk-DEW62ON3.js";
37
36
  import {
38
37
  renderIntegratedLegend
39
- } from "./chunk-O7ZKDUDX.js";
38
+ } from "./chunk-QT5UMFPE.js";
40
39
  import {
41
40
  getLegendExtent
42
41
  } from "./chunk-4SXHMFFP.js";
@@ -53,7 +52,7 @@ import {
53
52
  } from "./chunk-MTGGOCND.js";
54
53
  import {
55
54
  parsePert
56
- } from "./chunk-NE7JHZCQ.js";
55
+ } from "./chunk-RWFMOVHG.js";
57
56
  import {
58
57
  addCalendarDays,
59
58
  formatDuration,
@@ -64,7 +63,7 @@ import {
64
63
  import {
65
64
  resolveActiveTagGroup,
66
65
  resolveTagColor
67
- } from "./chunk-4FKEI4MF.js";
66
+ } from "./chunk-76LHNLGX.js";
68
67
  import {
69
68
  contrastText,
70
69
  mix,
@@ -169,25 +168,14 @@ function renderPert(container, resolved, layout, palette, isDark, options = {})
169
168
  const effectiveTitle = options.title;
170
169
  const effectiveSubtitle = options.subtitle ?? null;
171
170
  const titleHeight = effectiveTitle ? 80 : effectiveSubtitle ? 50 : 0;
172
- const anchorAnnotation = anchorAnnotationText(resolved);
173
171
  const collapsedSet = new Set(options.collapsedGroupIds ?? []);
174
- const captionRows = resolved.error !== null ? null : resolved.summaryRows;
175
- const captionBullets = captionRows !== null && captionRows.length > 0 ? bulletizeCaption(captionRows) : [];
176
- if (anchorAnnotation) {
177
- captionBullets.push({
178
- text: anchorAnnotation,
179
- level: 0,
180
- italic: true
181
- });
182
- }
183
- const analysisLayer = computeAnalysisLayer(resolved, captionBullets, {
184
- showSummary: options.showSummary ?? true,
172
+ const analysisLayer = computeAnalysisLayer(resolved, {
185
173
  showTornado: options.showTornado ?? false,
186
174
  showScurve: options.showScurve ?? false,
187
175
  showFieldLegend: options.showFieldLegend ?? false
188
176
  });
189
177
  const standaloneFieldLegendWidthForExport = layout.width;
190
- const analysisBlockHeight = analysisLayer.analysisHasContent ? CAPTION_TOP_GAP + analysisLayer.analysisRowHeight : 0;
178
+ const analysisBlockHeightAt = (contentWidth) => analysisLayer.analysisHasContent ? CAPTION_TOP_GAP + analysisContentHeightAt(analysisLayer, contentWidth) : 0;
191
179
  const fieldLegendBlockHeight = analysisLayer.fieldLegendStandalone ? CAPTION_TOP_GAP + fieldLegendHeightFor(standaloneFieldLegendWidthForExport) : 0;
192
180
  const showLegend = options.showLegend ?? true;
193
181
  const tagLegendActive = resolveActiveTagGroup(
@@ -200,7 +188,7 @@ function renderPert(container, resolved, layout, palette, isDark, options = {})
200
188
  const naturalChartWidth = layout.width + DIAGRAM_PADDING * 2;
201
189
  const minAnalysisRowW = analysisLayer.analysisHasContent ? analysisLayer.minContentWidth + 2 * DIAGRAM_PADDING : 0;
202
190
  const naturalWidth = Math.max(naturalChartWidth, minAnalysisRowW);
203
- const naturalHeight = layout.height + DIAGRAM_PADDING * 2 + titleHeight + legendBlockHeight + analysisBlockHeight + fieldLegendBlockHeight;
191
+ const naturalHeight = layout.height + DIAGRAM_PADDING * 2 + titleHeight + legendBlockHeight + analysisBlockHeightAt(naturalWidth - DIAGRAM_PADDING * 2) + fieldLegendBlockHeight;
204
192
  const exportWidth = Math.max(
205
193
  options.exportDims?.width ?? naturalWidth,
206
194
  naturalWidth
@@ -236,7 +224,7 @@ function renderPert(container, resolved, layout, palette, isDark, options = {})
236
224
  const sPinIconW = ctx.structural(PIN_ICON_W);
237
225
  const sPinIconH = ctx.structural(PIN_ICON_H);
238
226
  const scaledWidth = layout.width + sDiagramPad * 2;
239
- const scaledHeight = layout.height + sDiagramPad * 2 + sTitleHeight + sLegendBlockHeight + analysisBlockHeight + fieldLegendBlockHeight;
227
+ const scaledHeight = layout.height + sDiagramPad * 2 + sTitleHeight + sLegendBlockHeight + analysisBlockHeightAt(scaledWidth - sDiagramPad * 2) + fieldLegendBlockHeight;
240
228
  const svgW = ctx.isBelowFloor ? exportWidth : scaledWidth;
241
229
  const svgH = ctx.isBelowFloor ? exportHeight : scaledHeight;
242
230
  const inlineRequested = resolved.options.legendInline === true && showTagLegend;
@@ -340,7 +328,6 @@ function renderPert(container, resolved, layout, palette, isDark, options = {})
340
328
  palette,
341
329
  isDark,
342
330
  analysisLayer,
343
- captionBullets,
344
331
  sDiagramPad,
345
332
  offsetY + layout.height,
346
333
  svgW - 2 * sDiagramPad
@@ -358,16 +345,9 @@ function renderPertForExport(content, theme, palette, now) {
358
345
  const hasTitle = !!parsed.title && !resolved.options.noTitle;
359
346
  const hasSubtitle = resolved.projectSubtitle !== null;
360
347
  const titleHeight = hasTitle ? 80 : hasSubtitle ? 50 : 0;
361
- const captionBullets = resolved.summaryRows !== null && resolved.summaryRows.length > 0 ? bulletizeCaption(resolved.summaryRows) : [];
362
- const anchorNote = anchorAnnotationText(resolved);
363
- if (anchorNote) {
364
- captionBullets.push({ text: anchorNote, level: 0, italic: true });
365
- }
366
- const captionBoxHeight = captionBullets.length > 0 ? captionBullets.length * CAPTION_LINE_HEIGHT + 2 * CAPTION_BOX_PADDING_Y + CAPTION_HEADER_BAND_HEIGHT : 0;
367
- const captionBlockHeight = captionBullets.length > 0 ? CAPTION_TOP_GAP + captionBoxHeight : 0;
368
348
  const legendBlockHeight = resolved.tagGroups.length > 0 ? LEGEND_TOP_GAP + LEGEND_PILL_HEIGHT + LEGEND_BOTTOM_GAP : 0;
369
349
  const exportWidth = layout.width + DIAGRAM_PADDING * 2;
370
- const exportHeight = layout.height + DIAGRAM_PADDING * 2 + titleHeight + legendBlockHeight + captionBlockHeight;
350
+ const exportHeight = layout.height + DIAGRAM_PADDING * 2 + titleHeight + legendBlockHeight;
371
351
  const container = document.createElement("div");
372
352
  container.style.width = `${exportWidth}px`;
373
353
  container.style.height = `${exportHeight}px`;
@@ -392,25 +372,17 @@ function renderPertForExport(content, theme, palette, now) {
392
372
  document.body.removeChild(container);
393
373
  }
394
374
  }
395
- function computeAnalysisLayer(resolved, captionBullets, opts) {
396
- const summaryRendered = opts.showSummary && captionBullets.length > 0;
397
- const captionBoxHeight = summaryRendered ? captionBullets.length * CAPTION_LINE_HEIGHT + 2 * CAPTION_BOX_PADDING_Y + CAPTION_HEADER_BAND_HEIGHT : 0;
375
+ function computeAnalysisLayer(resolved, opts) {
398
376
  let tornadoRows = opts.showTornado ? buildTornadoRows(resolved) : [];
399
377
  const showTornado = tornadoRows.length > 0;
400
378
  let tornadoBoxHeight = showTornado ? tornadoBoxHeightFor(tornadoRows) : 0;
401
379
  const scurveData = opts.showScurve ? buildScurveData(resolved) : null;
402
380
  const showScurve = scurveData !== null;
403
381
  const scurveBoxHeight = showScurve ? SCURVE_BOX_HEIGHT : 0;
404
- const fieldLegendInAnalysisRow = opts.showFieldLegend && (summaryRendered || showTornado || showScurve);
405
- const col1Width = summaryRendered ? Math.max(
406
- SUMMARY_MIN_W,
407
- Math.min(SUMMARY_MAX_W, captionNaturalWidth(captionBullets))
408
- ) : fieldLegendInAnalysisRow ? SUMMARY_MAX_W : 0;
409
- const fieldLegendCol1Height = fieldLegendInAnalysisRow ? fieldLegendHeightFor(col1Width) : 0;
410
- const col1Items = [];
411
- if (summaryRendered) col1Items.push(captionBoxHeight);
412
- if (fieldLegendInAnalysisRow) col1Items.push(fieldLegendCol1Height);
413
- const col1Height = col1Items.length ? col1Items.reduce((a, b) => a + b, 0) + (col1Items.length - 1) * COL1_VSTACK_GAP : 0;
382
+ const fieldLegendInAnalysisRow = opts.showFieldLegend && (showTornado || showScurve);
383
+ const col1Width = fieldLegendInAnalysisRow ? FIELD_LEGEND_COL1_W : 0;
384
+ const col1Height = fieldLegendInAnalysisRow ? fieldLegendHeightFor(col1Width) : 0;
385
+ const fieldLegendCol1Height = col1Height;
414
386
  let analysisRowHeight = Math.max(
415
387
  col1Height,
416
388
  scurveBoxHeight,
@@ -433,11 +405,11 @@ function computeAnalysisLayer(resolved, captionBullets, opts) {
433
405
  analysisCharts.push({ kind: "tornado", contentHeight: tornadoBoxHeight });
434
406
  if (showScurve)
435
407
  analysisCharts.push({ kind: "scurve", contentHeight: scurveBoxHeight });
436
- const analysisHasContent = summaryRendered || analysisCharts.length > 0 || fieldLegendInAnalysisRow;
408
+ const analysisHasContent = analysisCharts.length > 0 || fieldLegendInAnalysisRow;
437
409
  const fieldLegendStandalone = opts.showFieldLegend && !fieldLegendInAnalysisRow;
438
410
  let minContentWidth = 0;
439
411
  if (analysisHasContent) {
440
- const col1Used = summaryRendered || fieldLegendInAnalysisRow;
412
+ const col1Used = fieldLegendInAnalysisRow;
441
413
  if (col1Used) minContentWidth += col1Width;
442
414
  for (const w of analysisCharts) {
443
415
  minContentWidth += w.kind === "tornado" ? TORNADO_MIN_W : SCURVE_MIN_W;
@@ -446,7 +418,6 @@ function computeAnalysisLayer(resolved, captionBullets, opts) {
446
418
  if (colCount > 1) minContentWidth += (colCount - 1) * ANALYSIS_GAP;
447
419
  }
448
420
  return {
449
- summaryRendered,
450
421
  showTornado,
451
422
  showScurve,
452
423
  fieldLegendInAnalysisRow,
@@ -455,7 +426,6 @@ function computeAnalysisLayer(resolved, captionBullets, opts) {
455
426
  tornadoRows,
456
427
  scurveData,
457
428
  analysisCharts,
458
- captionBoxHeight,
459
429
  fieldLegendCol1Height,
460
430
  tornadoBoxHeight,
461
431
  scurveBoxHeight,
@@ -469,9 +439,11 @@ function analysisLayerHeightAt(state, availableWidth) {
469
439
  if (!state.analysisHasContent) {
470
440
  return state.fieldLegendStandalone ? CAPTION_TOP_GAP + fieldLegendHeightFor(availableWidth) : 0;
471
441
  }
472
- if (availableWidth >= state.minContentWidth) {
473
- return CAPTION_TOP_GAP + state.analysisRowHeight;
474
- }
442
+ return CAPTION_TOP_GAP + analysisContentHeightAt(state, availableWidth);
443
+ }
444
+ function analysisContentHeightAt(state, availableWidth) {
445
+ if (!state.analysisHasContent) return 0;
446
+ if (availableWidth >= state.minContentWidth) return state.analysisRowHeight;
475
447
  const rows = packRows(state, availableWidth);
476
448
  let total = 0;
477
449
  rows.forEach((row, i) => {
@@ -485,9 +457,9 @@ function analysisLayerHeightAt(state, availableWidth) {
485
457
  total += rowHeight;
486
458
  if (i < rows.length - 1) total += ANALYSIS_GAP;
487
459
  });
488
- return CAPTION_TOP_GAP + total;
460
+ return total;
489
461
  }
490
- function paintAnalysisLayer(svg, resolved, palette, isDark, state, captionBullets, x, y, availableWidth) {
462
+ function paintAnalysisLayer(svg, resolved, palette, isDark, state, x, y, availableWidth) {
491
463
  if (!state.analysisHasContent) {
492
464
  if (!state.fieldLegendStandalone) return 0;
493
465
  const bandY = y + CAPTION_TOP_GAP;
@@ -509,7 +481,6 @@ function paintAnalysisLayer(svg, resolved, palette, isDark, state, captionBullet
509
481
  palette,
510
482
  isDark,
511
483
  state,
512
- captionBullets,
513
484
  x,
514
485
  y,
515
486
  availableWidth
@@ -521,15 +492,14 @@ function paintAnalysisLayer(svg, resolved, palette, isDark, state, captionBullet
521
492
  palette,
522
493
  isDark,
523
494
  state,
524
- captionBullets,
525
495
  x,
526
496
  y,
527
497
  availableWidth
528
498
  );
529
499
  }
530
- function paintAnalysisRowMode(svg, resolved, palette, isDark, state, captionBullets, x, y, availableWidth) {
500
+ function paintAnalysisRowMode(svg, resolved, palette, isDark, state, x, y, availableWidth) {
531
501
  const bandY = y + CAPTION_TOP_GAP;
532
- const col1Used = state.summaryRendered || state.fieldLegendInAnalysisRow;
502
+ const col1Used = state.fieldLegendInAnalysisRow;
533
503
  const colCount = (col1Used ? 1 : 0) + state.analysisCharts.length;
534
504
  const nGaps = Math.max(0, colCount - 1);
535
505
  const usableWidth = availableWidth - nGaps * ANALYSIS_GAP;
@@ -550,35 +520,18 @@ function paintAnalysisRowMode(svg, resolved, palette, isDark, state, captionBull
550
520
  fillMode: resolved.options.fillMode
551
521
  });
552
522
  } else {
553
- const scurveTitle = !state.summaryRendered && captionBullets.length > 0 ? (
554
- // In-bounds by length check.
555
- captionBullets[0].text
556
- ) : void 0;
557
523
  renderScurveBlock(svg, state.scurveData, {
558
524
  ...args,
559
- unit: resolved.options.timeUnit,
560
- ...scurveTitle !== void 0 && { title: scurveTitle }
525
+ unit: resolved.options.timeUnit
561
526
  });
562
527
  }
563
528
  cursorX += chartWidth + ANALYSIS_GAP;
564
529
  }
565
530
  if (col1Used) {
566
- let stackY = bandY;
567
- if (state.summaryRendered) {
568
- renderCaptionBlock(svg, captionBullets, {
569
- x: cursorX,
570
- y: stackY,
571
- width: state.col1Width,
572
- height: state.captionBoxHeight,
573
- palette,
574
- isDark
575
- });
576
- stackY += state.captionBoxHeight + COL1_VSTACK_GAP;
577
- }
578
531
  if (state.fieldLegendInAnalysisRow) {
579
532
  renderFieldLegendBlock(svg, {
580
533
  x: cursorX,
581
- y: stackY,
534
+ y: bandY,
582
535
  width: state.col1Width,
583
536
  height: state.fieldLegendCol1Height,
584
537
  palette,
@@ -588,7 +541,6 @@ function paintAnalysisRowMode(svg, resolved, palette, isDark, state, captionBull
588
541
  }
589
542
  return CAPTION_TOP_GAP + state.analysisRowHeight;
590
543
  }
591
- var FIELD_LEGEND_MIN_W = 220;
592
544
  function packRows(state, availableWidth) {
593
545
  const rows = [];
594
546
  const charts = state.analysisCharts;
@@ -608,23 +560,7 @@ function packRows(state, availableWidth) {
608
560
  } else if (charts.length === 1) {
609
561
  rows.push([{ kind: charts[0].kind, paintWidth: availableWidth }]);
610
562
  }
611
- const hasSummary = state.summaryRendered;
612
- const hasField = state.fieldLegendInAnalysisRow;
613
- if (hasSummary && hasField) {
614
- const summaryW = state.col1Width;
615
- const fieldW = availableWidth - summaryW - ANALYSIS_GAP;
616
- if (fieldW >= FIELD_LEGEND_MIN_W) {
617
- rows.push([
618
- { kind: "summary", paintWidth: summaryW },
619
- { kind: "field", paintWidth: fieldW }
620
- ]);
621
- } else {
622
- rows.push([{ kind: "summary", paintWidth: summaryW }]);
623
- rows.push([{ kind: "field", paintWidth: availableWidth }]);
624
- }
625
- } else if (hasSummary) {
626
- rows.push([{ kind: "summary", paintWidth: state.col1Width }]);
627
- } else if (hasField) {
563
+ if (state.fieldLegendInAnalysisRow) {
628
564
  rows.push([{ kind: "field", paintWidth: availableWidth }]);
629
565
  }
630
566
  return rows;
@@ -635,13 +571,11 @@ function itemContentHeight(state, kind, paintWidth) {
635
571
  return state.tornadoBoxHeight;
636
572
  case "scurve":
637
573
  return state.scurveBoxHeight;
638
- case "summary":
639
- return state.captionBoxHeight;
640
574
  case "field":
641
575
  return fieldLegendHeightFor(paintWidth);
642
576
  }
643
577
  }
644
- function paintAnalysisStackMode(svg, resolved, palette, isDark, state, captionBullets, x, y, availableWidth) {
578
+ function paintAnalysisStackMode(svg, resolved, palette, isDark, state, x, y, availableWidth) {
645
579
  const rows = packRows(state, availableWidth);
646
580
  let cursorY = y + CAPTION_TOP_GAP;
647
581
  rows.forEach((row, rowIndex) => {
@@ -672,21 +606,12 @@ function paintAnalysisStackMode(svg, resolved, palette, isDark, state, captionBu
672
606
  fillMode: resolved.options.fillMode
673
607
  });
674
608
  break;
675
- case "scurve": {
676
- const scurveTitle = !state.summaryRendered && captionBullets.length > 0 ? (
677
- // In-bounds by length check.
678
- captionBullets[0].text
679
- ) : void 0;
609
+ case "scurve":
680
610
  renderScurveBlock(svg, state.scurveData, {
681
611
  ...args,
682
- unit: resolved.options.timeUnit,
683
- ...scurveTitle !== void 0 && { title: scurveTitle }
612
+ unit: resolved.options.timeUnit
684
613
  });
685
614
  break;
686
- }
687
- case "summary":
688
- renderCaptionBlock(svg, captionBullets, args);
689
- break;
690
615
  case "field":
691
616
  renderFieldLegendBlock(svg, args);
692
617
  break;
@@ -699,14 +624,7 @@ function paintAnalysisStackMode(svg, resolved, palette, isDark, state, captionBu
699
624
  return cursorY - y;
700
625
  }
701
626
  function measurePertAnalysisBlock(resolved, width, options) {
702
- const captionRows = resolved.error !== null ? null : resolved.summaryRows;
703
- const captionBullets = captionRows !== null && captionRows.length > 0 ? bulletizeCaption(captionRows) : [];
704
- const anchorAnnotation = anchorAnnotationText(resolved);
705
- if (anchorAnnotation) {
706
- captionBullets.push({ text: anchorAnnotation, level: 0, italic: true });
707
- }
708
- const state = computeAnalysisLayer(resolved, captionBullets, {
709
- showSummary: options.showSummary ?? true,
627
+ const state = computeAnalysisLayer(resolved, {
710
628
  showTornado: options.showTornado ?? false,
711
629
  showScurve: options.showScurve ?? false,
712
630
  showFieldLegend: options.showFieldLegend ?? false
@@ -715,7 +633,6 @@ function measurePertAnalysisBlock(resolved, width, options) {
715
633
  return { width: 0, height: 0 };
716
634
  }
717
635
  const itemMinW = Math.max(
718
- state.summaryRendered ? SUMMARY_MIN_W : 0,
719
636
  state.showTornado ? TORNADO_MIN_W : 0,
720
637
  state.showScurve ? SCURVE_MIN_W : 0,
721
638
  0
@@ -725,21 +642,13 @@ function measurePertAnalysisBlock(resolved, width, options) {
725
642
  }
726
643
  function renderPertAnalysisBlock(container, resolved, palette, isDark, options) {
727
644
  d3Selection.select(container).selectAll(":not([data-d3-tooltip])").remove();
728
- const captionRows = resolved.error !== null ? null : resolved.summaryRows;
729
- const captionBullets = captionRows !== null && captionRows.length > 0 ? bulletizeCaption(captionRows) : [];
730
- const anchorAnnotation = anchorAnnotationText(resolved);
731
- if (anchorAnnotation) {
732
- captionBullets.push({ text: anchorAnnotation, level: 0, italic: true });
733
- }
734
- const state = computeAnalysisLayer(resolved, captionBullets, {
735
- showSummary: options.showSummary ?? true,
645
+ const state = computeAnalysisLayer(resolved, {
736
646
  showTornado: options.showTornado ?? false,
737
647
  showScurve: options.showScurve ?? false,
738
648
  showFieldLegend: options.showFieldLegend ?? false
739
649
  });
740
650
  if (!state.analysisHasContent && !state.fieldLegendStandalone) return;
741
651
  const itemMinW = Math.max(
742
- state.summaryRendered ? SUMMARY_MIN_W : 0,
743
652
  state.showTornado ? TORNADO_MIN_W : 0,
744
653
  state.showScurve ? SCURVE_MIN_W : 0,
745
654
  // Field labels has no hard min — it wraps to whatever width it gets.
@@ -749,17 +658,7 @@ function renderPertAnalysisBlock(container, resolved, palette, isDark, options)
749
658
  const totalHeight = analysisLayerHeightAt(state, width);
750
659
  if (totalHeight <= 0 || width <= 0) return;
751
660
  const svg = d3Selection.select(container).append("svg").attr("width", width).attr("height", totalHeight).attr("viewBox", `0 0 ${width} ${totalHeight}`).attr("preserveAspectRatio", "xMidYMin meet").style("font-family", FONT_FAMILY).style("overflow", "visible");
752
- paintAnalysisLayer(
753
- svg,
754
- resolved,
755
- palette,
756
- isDark,
757
- state,
758
- captionBullets,
759
- 0,
760
- 0,
761
- width
762
- );
661
+ paintAnalysisLayer(svg, resolved, palette, isDark, state, 0, 0, width);
763
662
  }
764
663
  function buildArrowheads(defs, palette, arrowW = ARROWHEAD_W, arrowH = ARROWHEAD_H) {
765
664
  const mk = (id, fill) => {
@@ -1306,48 +1205,14 @@ function computeAnchorPinSet(resolved) {
1306
1205
  }
1307
1206
  return pinned;
1308
1207
  }
1309
- function anchorAnnotationText(resolved) {
1310
- const anchor = resolved.options.anchor;
1311
- if (anchor === null) return null;
1312
- const today = resolved.options.today;
1313
- if (anchor.kind === "forward") {
1314
- return `Forward from start-date ${anchor.date}`;
1315
- }
1316
- const asOf = today ? ` (as of ${today})` : "";
1317
- if (resolved.projectStart) {
1318
- return `Backward-anchored from end-date ${anchor.date}${asOf}`;
1319
- }
1320
- return `Backward-anchored from end-date ${anchor.date}${asOf} \u2014 upstream activities still need estimates`;
1321
- }
1322
- function bulletizeCaption(rows) {
1323
- return rows.map((row) => {
1324
- const out = { text: row.text, level: row.level };
1325
- if (row.italic) out.italic = true;
1326
- if (row.isPast) out.isPast = true;
1327
- return out;
1328
- });
1329
- }
1330
- var SUB_BULLET_INDENT = 20;
1331
1208
  var CAPTION_HEADER_BAND_HEIGHT = CAPTION_LINE_HEIGHT + 8;
1332
- function captionNaturalWidth(bullets) {
1333
- const charW = CAPTION_FONT_SIZE * 0.55;
1334
- let max = "Summary".length * charW;
1335
- for (const b of bullets) {
1336
- const indent = b.level === 1 ? SUB_BULLET_INDENT : 0;
1337
- const w = indent + `\u2022 ${b.text}`.length * charW;
1338
- if (w > max) max = w;
1339
- }
1340
- return Math.ceil(max + 2 * CAPTION_BOX_PADDING_X);
1341
- }
1342
1209
  var TORNADO_TOP_N = 10;
1343
1210
  var TORNADO_ROW_HEIGHT = 26;
1344
1211
  var TORNADO_NAME_COL_W = 160;
1345
1212
  var TORNADO_BAR_FONT_SIZE = 13;
1346
1213
  var TORNADO_BAR_HEIGHT = 16;
1347
- var SUMMARY_MIN_W = 260;
1348
- var SUMMARY_MAX_W = 420;
1214
+ var FIELD_LEGEND_COL1_W = 420;
1349
1215
  var ANALYSIS_GAP = 16;
1350
- var COL1_VSTACK_GAP = 8;
1351
1216
  var TORNADO_MIN_W = 340;
1352
1217
  var SCURVE_MIN_W = 320;
1353
1218
  var SCURVE_BOX_HEIGHT = 220;
@@ -1356,27 +1221,6 @@ var SCURVE_PLOT_PADDING_RIGHT = 16;
1356
1221
  var SCURVE_PLOT_PADDING_BOTTOM = 44;
1357
1222
  var SCURVE_TICK_FONT_SIZE = 13;
1358
1223
  var SCURVE_PERCENTILE_RADIUS = 4;
1359
- function renderCaptionBlock(svg, bullets, args) {
1360
- const { x, y, width, height, palette, isDark } = args;
1361
- const { fill, stroke: chromeStroke } = analysisBlockChrome(palette, isDark);
1362
- const labelColor = contrastText(
1363
- fill,
1364
- palette.textOnFillLight,
1365
- palette.textOnFillDark
1366
- );
1367
- const block = svg.append("g").attr("class", "pert-caption-block").attr("data-pert-caption", "");
1368
- block.append("rect").attr("class", "pert-caption-rect").attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("rx", NODE_RADIUS).attr("ry", NODE_RADIUS).attr("fill", fill).attr("stroke", chromeStroke).attr("stroke-width", NODE_STROKE_WIDTH);
1369
- block.append("text").attr("class", "pert-caption-header").attr("x", x + width / 2).attr("y", y + CAPTION_BOX_PADDING_Y + CAPTION_FONT_SIZE).attr("text-anchor", "middle").attr("fill", labelColor).attr("font-size", CAPTION_FONT_SIZE).attr("font-weight", "700").text("Summary");
1370
- const textX = x + CAPTION_BOX_PADDING_X;
1371
- const firstBaselineY = y + CAPTION_BOX_PADDING_Y + CAPTION_HEADER_BAND_HEIGHT + CAPTION_FONT_SIZE;
1372
- const text = block.append("text").attr("class", "pert-caption").attr("x", textX).attr("y", firstBaselineY).attr("text-anchor", "start").attr("fill", labelColor).attr("font-size", CAPTION_FONT_SIZE).attr("font-weight", CAPTION_FONT_WEIGHT);
1373
- bullets.forEach((bullet, i) => {
1374
- const indent = bullet.level === 1 ? SUB_BULLET_INDENT : 0;
1375
- const tspan = text.append("tspan").attr("x", textX + indent).text(`\u2022 ${bullet.text}`);
1376
- if (bullet.italic) tspan.attr("font-style", "italic");
1377
- if (i > 0) tspan.attr("dy", CAPTION_LINE_HEIGHT);
1378
- });
1379
- }
1380
1224
  function renderTagLegendRow(svg, resolved, palette, isDark, args) {
1381
1225
  if (resolved.tagGroups.length === 0) return;
1382
1226
  const { x, y, width, activeGroup, exportMode, inline } = args;
@@ -1630,24 +1474,22 @@ function buildScurveData(resolved) {
1630
1474
  samples,
1631
1475
  p16Days: bandLeft,
1632
1476
  p84Days: bandRight,
1633
- // Percentile dots/date-labels — `projectRounded` matches the
1634
- // analyzer's `roundConservative` (Math.ceil of the duration), so
1635
- // each dot's date label is byte-identical to the caption's
1636
- // "P{X} latest-safe start: <date>" row.
1477
+ // Percentile dots/date-labels — `projectRounded` ceils the
1478
+ // duration, so each dot's date label is the conservative reading
1479
+ // of its trial rather than a rounded-down one.
1637
1480
  p50Days: projectRounded(mc.p50),
1638
1481
  p80Days: projectRounded(mc.p80),
1639
1482
  p95Days: projectRounded(mc.p95),
1640
1483
  xMinDays,
1641
1484
  xMaxDays,
1642
1485
  referenceLines,
1643
- framingNote: anchorAnnotationText(resolved),
1644
1486
  anchorDate: resolved.projectStart,
1645
1487
  deadlineDays,
1646
1488
  deadlineDate
1647
1489
  };
1648
1490
  }
1649
1491
  function renderScurveBlock(svg, data, args) {
1650
- const { x, y, width, height, palette, isDark, unit, title } = args;
1492
+ const { x, y, width, height, palette, isDark, unit } = args;
1651
1493
  const { fill, stroke: chromeStroke } = analysisBlockChrome(palette, isDark);
1652
1494
  const labelColor = contrastText(
1653
1495
  fill,
@@ -1656,16 +1498,11 @@ function renderScurveBlock(svg, data, args) {
1656
1498
  );
1657
1499
  const block = svg.append("g").attr("class", "pert-scurve-block").attr("data-pert-scurve", "");
1658
1500
  block.append("rect").attr("class", "pert-scurve-rect").attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("rx", NODE_RADIUS).attr("ry", NODE_RADIUS).attr("fill", fill).attr("stroke", chromeStroke).attr("stroke-width", NODE_STROKE_WIDTH);
1659
- const hasTitle = typeof title === "string" && title.length > 0;
1660
- if (hasTitle) {
1661
- const titleText = title.replace(/\.$/, "");
1662
- block.append("text").attr("class", "pert-scurve-header").attr("x", x + width / 2).attr("y", y + CAPTION_BOX_PADDING_Y + CAPTION_FONT_SIZE).attr("text-anchor", "middle").attr("fill", labelColor).attr("font-size", CAPTION_FONT_SIZE).attr("font-weight", "700").text(titleText);
1663
- }
1664
1501
  const SCURVE_DEADLINE_LABEL_HEIGHT = 16;
1665
1502
  const hasDeadline = data.deadlineDays !== null;
1666
1503
  const plotLeft = x + SCURVE_PLOT_PADDING_X;
1667
1504
  const plotRight = x + width - SCURVE_PLOT_PADDING_RIGHT;
1668
- const plotTop = y + CAPTION_BOX_PADDING_Y + (hasTitle ? CAPTION_HEADER_BAND_HEIGHT : 0) + (hasDeadline ? SCURVE_DEADLINE_LABEL_HEIGHT : 0);
1505
+ const plotTop = y + CAPTION_BOX_PADDING_Y + (hasDeadline ? SCURVE_DEADLINE_LABEL_HEIGHT : 0);
1669
1506
  const isAnchored = data.anchorDate !== null;
1670
1507
  const plotBottom = y + height - SCURVE_PLOT_PADDING_BOTTOM;
1671
1508
  const plotW = plotRight - plotLeft;
@@ -1871,4 +1708,4 @@ export {
1871
1708
  measurePertAnalysisBlock,
1872
1709
  renderPertAnalysisBlock
1873
1710
  };
1874
- //# sourceMappingURL=chunk-PFZDLHHG.js.map
1711
+ //# sourceMappingURL=chunk-32MOGTKT.js.map
@@ -9,13 +9,13 @@ import {
9
9
  tagAttrKey,
10
10
  validateTagGroupNames,
11
11
  validateTagValues
12
- } from "./chunk-4FKEI4MF.js";
12
+ } from "./chunk-76LHNLGX.js";
13
13
  import {
14
14
  extractColor,
15
15
  fillModeFromToken,
16
16
  measureIndent,
17
17
  parseFirstLine
18
- } from "./chunk-MK55PZVB.js";
18
+ } from "./chunk-M5OOAP65.js";
19
19
  import {
20
20
  formatDgmoError,
21
21
  makeDgmoError,
@@ -342,4 +342,4 @@ function parseBlockTail(tail, aliasMap) {
342
342
  export {
343
343
  parseBlock
344
344
  };
345
- //# sourceMappingURL=chunk-NQJ7DDUT.js.map
345
+ //# sourceMappingURL=chunk-3H4PDNP4.js.map
@@ -16,18 +16,18 @@ import {
16
16
  } from "./chunk-FJ57274M.js";
17
17
  import {
18
18
  formatDateLabel
19
- } from "./chunk-A34AXXBO.js";
19
+ } from "./chunk-YVDBBWEP.js";
20
20
  import {
21
21
  layoutInlineHeader
22
- } from "./chunk-YJMWEZOB.js";
22
+ } from "./chunk-MG3DE3VO.js";
23
23
  import {
24
24
  TITLE_FONT_SIZE,
25
25
  TITLE_FONT_WEIGHT,
26
26
  TITLE_Y
27
- } from "./chunk-A4GOY3PE.js";
27
+ } from "./chunk-DEW62ON3.js";
28
28
  import {
29
29
  renderIntegratedLegend
30
- } from "./chunk-O7ZKDUDX.js";
30
+ } from "./chunk-QT5UMFPE.js";
31
31
  import {
32
32
  getLegendExtent
33
33
  } from "./chunk-4SXHMFFP.js";
@@ -40,11 +40,11 @@ import {
40
40
  } from "./chunk-MTGGOCND.js";
41
41
  import {
42
42
  parseTimelineDate
43
- } from "./chunk-VQEW7XMN.js";
43
+ } from "./chunk-UCZBRGJN.js";
44
44
  import {
45
45
  resolveActiveTagGroup,
46
46
  resolveTagColor
47
- } from "./chunk-4FKEI4MF.js";
47
+ } from "./chunk-76LHNLGX.js";
48
48
  import {
49
49
  contrastText,
50
50
  getSeriesColors,
@@ -1161,4 +1161,4 @@ export {
1161
1161
  focusEventLine,
1162
1162
  renderEventLineForExport
1163
1163
  };
1164
- //# sourceMappingURL=chunk-K7P4SCB3.js.map
1164
+ //# sourceMappingURL=chunk-3LJNQ6LR.js.map
@@ -9,7 +9,7 @@ import {
9
9
  stripDefaultModifier,
10
10
  tagAttrKey,
11
11
  validateTagGroupNames
12
- } from "./chunk-4FKEI4MF.js";
12
+ } from "./chunk-76LHNLGX.js";
13
13
  import {
14
14
  AliasRegistry,
15
15
  KANBAN_REGISTRY,
@@ -22,7 +22,7 @@ import {
22
22
  splitNameAndMeta,
23
23
  warnUnknownMetaKeys,
24
24
  withTagAliases
25
- } from "./chunk-MK55PZVB.js";
25
+ } from "./chunk-M5OOAP65.js";
26
26
  import {
27
27
  resolveColorWithDiagnostic
28
28
  } from "./chunk-XOGQY4EC.js";
@@ -400,4 +400,4 @@ function parseCardLine(trimmed, lineNumber, counter, metaAliasMap, _palette, dia
400
400
  export {
401
401
  parseKanban
402
402
  };
403
- //# sourceMappingURL=chunk-7VMUKH2Z.js.map
403
+ //# sourceMappingURL=chunk-3SP6G4LN.js.map