@diagrammo/dgmo 0.46.0 → 0.48.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.
- package/dist/advanced.d.ts +3 -855
- package/dist/advanced.js +541 -70107
- package/dist/analyzer-UYKBXAKR.js +15 -0
- package/dist/auto.js +1 -1
- package/dist/auto.mjs +1 -1
- package/dist/block.js +83 -69417
- package/dist/calculator-LDYQCDDY.js +11 -0
- package/dist/charts-d3-QOZHKTCT.js +25 -0
- package/dist/chunk-2DXMZRWJ.js +800 -0
- package/dist/chunk-2LACINWN.js +786 -0
- package/dist/chunk-33LCUH4H.js +893 -0
- package/dist/chunk-3CIOJ5YJ.js +35 -0
- package/dist/chunk-3HDBAXF5.js +86 -0
- package/dist/chunk-3JLKYGBQ.js +290 -0
- package/dist/chunk-3MQQNXPD.js +415 -0
- package/dist/chunk-3R5POCTZ.js +967 -0
- package/dist/chunk-3SMGIJDD.js +112 -0
- package/dist/chunk-44CM72SQ.js +409 -0
- package/dist/chunk-4GRI7MEB.js +1604 -0
- package/dist/chunk-4OHACBGX.js +606 -0
- package/dist/chunk-5DH3KYFH.js +21 -0
- package/dist/chunk-5MLYVTYM.js +76 -0
- package/dist/chunk-5QXL4NYS.js +553 -0
- package/dist/chunk-5WRI5ZAA.js +31 -0
- package/dist/chunk-6EK55ART.js +117 -0
- package/dist/chunk-6FZYCKXB.js +2065 -0
- package/dist/chunk-6HO5ZTXK.js +277 -0
- package/dist/chunk-6KFWC4CO.js +7 -0
- package/dist/chunk-6MTWIQVO.js +121 -0
- package/dist/chunk-6NYWYNBI.js +329 -0
- package/dist/chunk-6SM5NJQH.js +620 -0
- package/dist/chunk-725LDASD.js +422 -0
- package/dist/chunk-76OWZ3BA.js +130 -0
- package/{src/block/parser.ts → dist/chunk-7JEGTRLD.js} +100 -189
- package/dist/chunk-A44USUV7.js +923 -0
- package/dist/chunk-A4GOY3PE.js +25 -0
- package/dist/chunk-A4VFQH5G.js +251 -0
- package/dist/chunk-AELOBFW5.js +375 -0
- package/dist/chunk-AN2MOO5T.js +522 -0
- package/dist/chunk-BMR4CIEO.js +41 -0
- package/dist/chunk-BS7SV7C3.js +51 -0
- package/dist/chunk-BUPDIHML.js +613 -0
- package/dist/chunk-BUVJFRPY.js +887 -0
- package/dist/chunk-C3Z4DX3V.js +112 -0
- package/dist/chunk-CI2G3OEB.js +1818 -0
- package/dist/chunk-CKNVO24D.js +54 -0
- package/dist/chunk-CUVHQHZ7.js +391 -0
- package/dist/chunk-CXK4DZH3.js +114 -0
- package/dist/{editor.cjs → chunk-DKEPS5LH.js} +14 -225
- package/dist/chunk-DU7W62N5.js +487 -0
- package/dist/chunk-DZAQBW35.js +751 -0
- package/dist/chunk-EB6FPQUP.js +316 -0
- package/dist/chunk-EMS2SK26.js +376 -0
- package/dist/chunk-ERLBPDGU.js +510 -0
- package/dist/chunk-EVCVDTXE.js +732 -0
- package/dist/chunk-FCIIHT24.js +384 -0
- package/dist/chunk-FFUN5D66.js +97 -0
- package/dist/chunk-FITOLXSX.js +714 -0
- package/dist/chunk-FMDSF3OV.js +68 -0
- package/dist/chunk-FNB3PNGF.js +410 -0
- package/dist/chunk-G2H74XJZ.js +2104 -0
- package/dist/chunk-GMR5MFHJ.js +339 -0
- package/dist/chunk-H6PI3KJT.js +305 -0
- package/dist/chunk-I46X5VUA.js +59 -0
- package/dist/chunk-I5IGB56C.js +255 -0
- package/dist/chunk-IH6ZMVQ5.js +3950 -0
- package/dist/chunk-IJZFN3HM.js +463 -0
- package/dist/chunk-IPWPWM6R.js +3079 -0
- package/dist/chunk-IYULMRBE.js +23 -0
- package/dist/chunk-IZMRON6C.js +167 -0
- package/dist/chunk-J5FIXQRT.js +813 -0
- package/dist/chunk-JED6ZDEE.js +73 -0
- package/dist/chunk-JEUJOX5X.js +136 -0
- package/dist/chunk-JM4LEPY3.js +436 -0
- package/dist/chunk-L3UHP6TD.js +101 -0
- package/dist/chunk-L66GEFB6.js +524 -0
- package/dist/chunk-LIOHW36Z.js +469 -0
- package/dist/chunk-LP7EC4MI.js +16 -0
- package/dist/chunk-MITI6NOL.js +548 -0
- package/dist/chunk-MO5YHHMQ.js +168 -0
- package/dist/chunk-MZSBFAPJ.js +885 -0
- package/dist/chunk-NNAAJVBU.js +9 -0
- package/dist/chunk-NOTA6TEI.js +47 -0
- package/dist/chunk-NURGB5Z4.js +335 -0
- package/dist/chunk-NX4EQS3U.js +1062 -0
- package/dist/chunk-NXMESY4J.js +1 -0
- package/dist/chunk-OJR3MQYV.js +1458 -0
- package/dist/chunk-OURHMODR.js +454 -0
- package/dist/chunk-P235SVAH.js +1057 -0
- package/dist/chunk-P4RH4OSP.js +1038 -0
- package/dist/chunk-P6T66CCZ.js +226 -0
- package/dist/chunk-PBAHEPLQ.js +223 -0
- package/dist/chunk-PBHE5UG6.js +1530 -0
- package/dist/chunk-PDKUANDZ.js +35 -0
- package/dist/chunk-PWIHZ6NJ.js +296 -0
- package/{src/c4/layout.ts → dist/chunk-QEBUY5NY.js} +384 -1140
- package/dist/chunk-QLCCJEJI.js +253 -0
- package/dist/chunk-QOOUC2J5.js +52 -0
- package/dist/chunk-QYTPPDAO.js +402 -0
- package/dist/chunk-R3XI2VC7.js +801 -0
- package/dist/chunk-RCERWOJR.js +154 -0
- package/dist/chunk-RJE5JTVK.js +362 -0
- package/dist/chunk-RTLBSQ3G.js +1155 -0
- package/dist/chunk-RUNNI6VE.js +448 -0
- package/dist/chunk-RVMRZAPB.js +354 -0
- package/dist/chunk-RYEGFMUO.js +955 -0
- package/dist/chunk-RZCF2VVM.js +528 -0
- package/dist/chunk-SML67VPV.js +1025 -0
- package/dist/chunk-SQ7IY53Q.js +44 -0
- package/dist/chunk-SQAG3UXH.js +161 -0
- package/dist/chunk-SRTU6HMQ.js +1851 -0
- package/dist/chunk-T2OE3YQB.js +550 -0
- package/dist/chunk-T3UBLACL.js +299 -0
- package/dist/chunk-TLVIHFRO.js +296 -0
- package/dist/chunk-TYS6CSS5.js +52 -0
- package/dist/chunk-U6EQI3U6.js +130 -0
- package/dist/chunk-UJ4FJLBF.js +86 -0
- package/dist/chunk-ULOEATBZ.js +347 -0
- package/dist/chunk-UNCCZ3NU.js +127 -0
- package/dist/chunk-USZW2HHU.js +197 -0
- package/dist/chunk-UWN33VNX.js +1610 -0
- package/dist/chunk-UZ7EZW3B.js +40 -0
- package/dist/chunk-VOKGH627.js +37 -0
- package/dist/chunk-WBRZJOEC.js +204 -0
- package/dist/chunk-WCSOJFU3.js +380 -0
- package/dist/chunk-WCT3NYCV.js +160 -0
- package/dist/chunk-WVAJFAIA.js +529 -0
- package/dist/chunk-X5LCYCL5.js +394 -0
- package/dist/chunk-XAKEUMEJ.js +1256 -0
- package/dist/chunk-Y2ZE3MSG.js +590 -0
- package/dist/chunk-Y3J7VR52.js +646 -0
- package/dist/chunk-Y5QGVTVC.js +33 -0
- package/dist/chunk-YAA6IID3.js +548 -0
- package/dist/chunk-YGJTDXVR.js +692 -0
- package/{src/utils/time-ticks.ts → dist/chunk-YRYKTYMQ.js} +45 -112
- package/dist/chunk-YYVTBZZC.js +61 -0
- package/dist/chunk-Z5CGSFJB.js +647 -0
- package/{src/gantt/calculator.ts → dist/chunk-Z72XRXD4.js} +236 -428
- package/dist/chunk-ZGR7ULFJ.js +978 -0
- package/dist/chunk-ZJEL4H2R.js +851 -0
- package/dist/chunk-ZO27FGJS.js +554 -0
- package/dist/collapse-CLPJD2RL.js +11 -0
- package/dist/collapse-SLINJQW6.js +9 -0
- package/dist/collapse-ZWUFFCK2.js +9 -0
- package/dist/compute-G55RG53N.js +8 -0
- package/dist/dgmo-router-DZCIDUO5.js +73 -0
- package/dist/dimensions-J3FHIMJ6.js +22 -0
- package/dist/element.js +1 -1
- package/dist/element.mjs +1 -1
- package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
- package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
- package/dist/index.d.ts +3 -469
- package/dist/index.js +137 -69685
- package/dist/layout-46N4JJYK.js +17 -0
- package/dist/layout-5RA6QWR6.js +26 -0
- package/dist/layout-5T6RH5M6.js +14 -0
- package/dist/layout-7QXCNOVS.js +13 -0
- package/dist/layout-EE6GE46Y.js +17 -0
- package/dist/layout-G23F7LDH.js +9 -0
- package/dist/layout-HRBZPFCN.js +23 -0
- package/dist/layout-HWDSRX5E.js +20 -0
- package/dist/layout-HYZPWAK5.js +18 -0
- package/dist/layout-N76NR4ZO.js +19 -0
- package/dist/layout-OB3RI63S.js +14 -0
- package/dist/layout-S2QBYSK2.js +15 -0
- package/dist/layout-UM5F4DJB.js +15 -0
- package/dist/layout-search-OYV77HHS.js +1655 -0
- package/dist/load-data-EHDDZ5ZS.js +8 -0
- package/dist/palettes-PRJ2RI6D.js +56 -0
- package/dist/parser-2MFP2H2E.js +11 -0
- package/dist/parser-3STE62GB.js +21 -0
- package/dist/parser-4FL2CMDG.js +18 -0
- package/dist/parser-4OGOBJJ4.js +13 -0
- package/dist/parser-6BTRLKRZ.js +15 -0
- package/dist/parser-AQETEVRW.js +21 -0
- package/dist/parser-CFZD5IBL.js +12 -0
- package/dist/parser-FUSKFGZN.js +16 -0
- package/dist/parser-I6KXEYFK.js +13 -0
- package/dist/parser-IXSZZQHY.js +18 -0
- package/dist/parser-JAL2HD4I.js +13 -0
- package/dist/parser-KNSQSKQO.js +20 -0
- package/dist/parser-N5O4IHUN.js +13 -0
- package/dist/parser-NGU3ETO6.js +16 -0
- package/dist/parser-NRAI6O25.js +19 -0
- package/dist/parser-O5J4VBII.js +11 -0
- package/dist/parser-OV7NOBW6.js +21 -0
- package/dist/parser-PQ3POX45.js +23 -0
- package/dist/parser-TFZFBVWN.js +11 -0
- package/dist/parser-TRTHDFPP.js +18 -0
- package/dist/parser-VQP2UJ6W.js +11 -0
- package/dist/parser-XDVELHRK.js +13 -0
- package/dist/parser-XKRP7QKP.js +11 -0
- package/dist/parser-Y6WTBU76.js +14 -0
- package/dist/parser-ZSDPZYQP.js +12 -0
- package/dist/renderer-2XQQQ6QR.js +28 -0
- package/dist/renderer-5NDVNDAZ.js +26 -0
- package/dist/renderer-6EEZHMH4.js +26 -0
- package/dist/renderer-6W5462RB.js +43 -0
- package/dist/renderer-7MVLWWQD.js +22 -0
- package/dist/renderer-AWWAF6XD.js +33 -0
- package/dist/renderer-BYCNMBF7.js +34 -0
- package/dist/renderer-CLJHQPBJ.js +29 -0
- package/dist/renderer-GHPZMFU2.js +15 -0
- package/dist/renderer-JGBKUCZD.js +16 -0
- package/dist/renderer-KQB7UGDS.js +19 -0
- package/dist/renderer-PGX2TKVS.js +24 -0
- package/dist/renderer-QIWVHWZO.js +15 -0
- package/dist/renderer-RPOA5YPZ.js +35 -0
- package/dist/renderer-SMIBCRVB.js +24 -0
- package/dist/renderer-T7YKC5VP.js +28 -0
- package/dist/renderer-TOCOVLHS.js +37 -0
- package/dist/renderer-UWA5XS74.js +39 -0
- package/dist/renderer-VACVQYML.js +25 -0
- package/dist/renderer-W4M6QLIJ.js +37 -0
- package/dist/renderer-WZRREQ2P.js +23 -0
- package/dist/renderer-YY2OSF6E.js +27 -0
- package/dist/renderer-Z7I3W2PP.js +24 -0
- package/dist/renderer-ZGNTUWC4.js +22 -0
- package/dist/renderer-ZTR3DER3.js +19 -0
- package/dist/renderer-radial-C32GPJQ7.js +21 -0
- package/dist/resolver-NOAA7ID7.js +13 -0
- package/dist/state-collapse-HCGD6IVJ.js +8 -0
- package/dist/state-parser-Z2V23ATR.js +18 -0
- package/dist/state-renderer-RFYHSP4K.js +34 -0
- package/dist/themes-1-CuKpeH.d.ts +908 -0
- package/package.json +19 -70
- package/dist/advanced.cjs +0 -71648
- package/dist/advanced.d.cts +0 -6571
- package/dist/auto.cjs +0 -70648
- package/dist/auto.d.cts +0 -54
- package/dist/block.cjs +0 -70208
- package/dist/block.d.cts +0 -115
- package/dist/editor.d.cts +0 -26
- package/dist/element.cjs +0 -70530
- package/dist/element.d.cts +0 -62
- package/dist/highlight.cjs +0 -852
- package/dist/highlight.d.cts +0 -49
- package/dist/index.cjs +0 -70491
- package/dist/index.d.cts +0 -626
- package/dist/pert.cjs +0 -325
- package/dist/pert.d.cts +0 -559
- package/src/advanced.ts +0 -873
- package/src/arc/parser.ts +0 -15
- package/src/arc/renderer.ts +0 -633
- package/src/auto/index.ts +0 -621
- package/src/auto/shared.ts +0 -370
- package/src/auto/styles.ts +0 -73
- package/src/block/layout.ts +0 -198
- package/src/block/renderer.ts +0 -484
- package/src/block/types.ts +0 -67
- package/src/boxes-and-lines/collapse.ts +0 -96
- package/src/boxes-and-lines/focus.ts +0 -257
- package/src/boxes-and-lines/label-placement.ts +0 -339
- package/src/boxes-and-lines/layout-grouped.ts +0 -912
- package/src/boxes-and-lines/layout-layered.ts +0 -722
- package/src/boxes-and-lines/layout-search.ts +0 -1678
- package/src/boxes-and-lines/layout.ts +0 -398
- package/src/boxes-and-lines/parser.ts +0 -1181
- package/src/boxes-and-lines/renderer.ts +0 -1465
- package/src/boxes-and-lines/types.ts +0 -66
- package/src/c4/parser.ts +0 -1158
- package/src/c4/renderer.ts +0 -2008
- package/src/c4/types.ts +0 -89
- package/src/chart-type-registry.ts +0 -529
- package/src/chart-types.ts +0 -225
- package/src/chart.ts +0 -685
- package/src/charts-d3/bar.ts +0 -338
- package/src/charts-d3/chord.ts +0 -140
- package/src/charts-d3/function.ts +0 -147
- package/src/charts-d3/funnel.ts +0 -104
- package/src/charts-d3/heatmap.ts +0 -145
- package/src/charts-d3/index.ts +0 -337
- package/src/charts-d3/interactions.ts +0 -477
- package/src/charts-d3/line.ts +0 -344
- package/src/charts-d3/mount.ts +0 -151
- package/src/charts-d3/pie.ts +0 -117
- package/src/charts-d3/polar.ts +0 -89
- package/src/charts-d3/radar.ts +0 -0
- package/src/charts-d3/sankey.ts +0 -0
- package/src/charts-d3/scatter.ts +0 -185
- package/src/charts-d3/shared.ts +0 -208
- package/src/class/layout.ts +0 -326
- package/src/class/parser.ts +0 -635
- package/src/class/renderer.ts +0 -793
- package/src/class/types.ts +0 -58
- package/src/cli-banner.ts +0 -106
- package/src/cli.ts +0 -1080
- package/src/colors-diagnostics.ts +0 -35
- package/src/colors.ts +0 -379
- package/src/completion-types.ts +0 -27
- package/src/completion.ts +0 -2668
- package/src/cycle/layout.ts +0 -1026
- package/src/cycle/parser.ts +0 -387
- package/src/cycle/renderer.ts +0 -653
- package/src/cycle/types.ts +0 -101
- package/src/d3.ts +0 -1434
- package/src/data-chart-parser.ts +0 -1007
- package/src/dgmo-router.ts +0 -296
- package/src/diagnostics-registry.ts +0 -108
- package/src/diagnostics.ts +0 -0
- package/src/dimensions.ts +0 -20
- package/src/directives-registry.ts +0 -396
- package/src/editor/dgmo.grammar +0 -76
- package/src/editor/dgmo.grammar.d.ts +0 -2
- package/src/editor/dgmo.grammar.js +0 -18
- package/src/editor/dgmo.grammar.terms.d.ts +0 -5
- package/src/editor/dgmo.grammar.terms.js +0 -35
- package/src/editor/highlight-api.ts +0 -596
- package/src/editor/highlight.ts +0 -36
- package/src/editor/index.ts +0 -27
- package/src/editor/keywords.ts +0 -128
- package/src/editor/tokens.ts +0 -30
- package/src/element/index.ts +0 -432
- package/src/embed/css.ts +0 -312
- package/src/embed/escape.ts +0 -15
- package/src/embed/index.ts +0 -280
- package/src/er/classify.ts +0 -228
- package/src/er/layout.ts +0 -530
- package/src/er/parser.ts +0 -750
- package/src/er/renderer.ts +0 -725
- package/src/er/types.ts +0 -52
- package/src/error-card.ts +0 -269
- package/src/event-line/diagnostics.ts +0 -117
- package/src/event-line/parser.ts +0 -643
- package/src/event-line/renderer.ts +0 -1742
- package/src/event-line/types.ts +0 -74
- package/src/fonts.ts +0 -3
- package/src/gantt/parser.ts +0 -1641
- package/src/gantt/renderer.ts +0 -3787
- package/src/gantt/resolver.ts +0 -172
- package/src/gantt/types.ts +0 -206
- package/src/graph/diagnostics.ts +0 -64
- package/src/graph/edge-spline.ts +0 -29
- package/src/graph/flowchart-parser.ts +0 -759
- package/src/graph/flowchart-renderer.ts +0 -817
- package/src/graph/layout.ts +0 -472
- package/src/graph/notes.ts +0 -21
- package/src/graph/state-collapse.ts +0 -78
- package/src/graph/state-parser.ts +0 -574
- package/src/graph/state-renderer.ts +0 -653
- package/src/graph/types.ts +0 -65
- package/src/index.ts +0 -261
- package/src/infra/compute.ts +0 -1385
- package/src/infra/layout.ts +0 -888
- package/src/infra/parser.ts +0 -1234
- package/src/infra/renderer.ts +0 -2534
- package/src/infra/roles.ts +0 -75
- package/src/infra/types.ts +0 -216
- package/src/infra/validation.ts +0 -201
- package/src/journey-map/layout.ts +0 -490
- package/src/journey-map/parser.ts +0 -557
- package/src/journey-map/renderer.ts +0 -1580
- package/src/journey-map/types.ts +0 -47
- package/src/kanban/mutations.ts +0 -175
- package/src/kanban/parser.ts +0 -509
- package/src/kanban/renderer.ts +0 -1449
- package/src/kanban/types.ts +0 -39
- package/src/label-layout.ts +0 -368
- package/src/map/colorize.ts +0 -54
- package/src/map/completion.ts +0 -316
- package/src/map/context-labels.ts +0 -609
- package/src/map/data/PROVENANCE.json +0 -1
- package/src/map/data/README.md +0 -40
- package/src/map/data/airport-collisions.json +0 -1
- package/src/map/data/airports.json +0 -1
- package/src/map/data/gazetteer.json +0 -1
- package/src/map/data/lakes.json +0 -1
- package/src/map/data/mountain-ranges.json +0 -1
- package/src/map/data/na-lakes.json +0 -1
- package/src/map/data/na-land.json +0 -1
- package/src/map/data/region-names.json +0 -1
- package/src/map/data/rivers.json +0 -1
- package/src/map/data/types.ts +0 -121
- package/src/map/data/us-states.json +0 -1
- package/src/map/data/water-bodies.json +0 -1
- package/src/map/data/world-coarse.json +0 -1
- package/src/map/data/world-detail.json +0 -1
- package/src/map/diagnostics.ts +0 -134
- package/src/map/dimensions.ts +0 -150
- package/src/map/geo-query.ts +0 -295
- package/src/map/geo.ts +0 -438
- package/src/map/invert.ts +0 -111
- package/src/map/layout.ts +0 -5069
- package/src/map/legend-band.ts +0 -127
- package/src/map/load-data.ts +0 -186
- package/src/map/parser.ts +0 -783
- package/src/map/renderer.ts +0 -1445
- package/src/map/resolved-types.ts +0 -160
- package/src/map/resolver.ts +0 -1146
- package/src/map/types.ts +0 -194
- package/src/mindmap/collapse.ts +0 -67
- package/src/mindmap/layout.ts +0 -649
- package/src/mindmap/parser.ts +0 -430
- package/src/mindmap/renderer.ts +0 -637
- package/src/mindmap/text-wrap.ts +0 -218
- package/src/mindmap/types.ts +0 -56
- package/src/org/collapse.ts +0 -151
- package/src/org/layout.ts +0 -1262
- package/src/org/parser.ts +0 -519
- package/src/org/renderer.ts +0 -866
- package/src/org/resolver.ts +0 -636
- package/src/palettes/atlas.ts +0 -77
- package/src/palettes/blueprint.ts +0 -73
- package/src/palettes/catppuccin.ts +0 -84
- package/src/palettes/color-utils.ts +0 -443
- package/src/palettes/index.ts +0 -67
- package/src/palettes/nord.ts +0 -67
- package/src/palettes/registry.ts +0 -114
- package/src/palettes/slate.ts +0 -73
- package/src/palettes/tidewater.ts +0 -73
- package/src/palettes/tokyo-night.ts +0 -86
- package/src/palettes/types.ts +0 -88
- package/src/pert/analyzer.ts +0 -1183
- package/src/pert/diagnostics.ts +0 -110
- package/src/pert/index.ts +0 -43
- package/src/pert/internal.ts +0 -252
- package/src/pert/layout.ts +0 -971
- package/src/pert/monte-carlo.ts +0 -446
- package/src/pert/parser.ts +0 -1606
- package/src/pert/renderer.ts +0 -4009
- package/src/pert/share-normalize.ts +0 -62
- package/src/pert/types.ts +0 -604
- package/src/pyramid/parser.ts +0 -185
- package/src/pyramid/renderer.ts +0 -768
- package/src/pyramid/types.ts +0 -28
- package/src/quadrant/parser.ts +0 -18
- package/src/quadrant/renderer.ts +0 -638
- package/src/raci/diagnostics.ts +0 -213
- package/src/raci/index.ts +0 -23
- package/src/raci/mutations.ts +0 -321
- package/src/raci/parser.ts +0 -699
- package/src/raci/renderer.ts +0 -1627
- package/src/raci/types.ts +0 -82
- package/src/raci/variants.ts +0 -320
- package/src/render.ts +0 -268
- package/src/ring/parser.ts +0 -212
- package/src/ring/renderer.ts +0 -490
- package/src/ring/types.ts +0 -27
- package/src/sequence/collapse.ts +0 -174
- package/src/sequence/parser.ts +0 -1596
- package/src/sequence/participant-inference.ts +0 -152
- package/src/sequence/renderer.ts +0 -3168
- package/src/sequence/tag-resolution.ts +0 -164
- package/src/sharing.ts +0 -211
- package/src/sitemap/collapse.ts +0 -100
- package/src/sitemap/layout.ts +0 -925
- package/src/sitemap/parser.ts +0 -755
- package/src/sitemap/renderer.ts +0 -828
- package/src/sitemap/types.ts +0 -42
- package/src/slope/parser.ts +0 -18
- package/src/slope/renderer.ts +0 -378
- package/src/swimlane/diagnostics.ts +0 -94
- package/src/swimlane/layout.ts +0 -597
- package/src/swimlane/parser.ts +0 -613
- package/src/swimlane/renderer.ts +0 -681
- package/src/swimlane/types.ts +0 -151
- package/src/tech-radar/interactive.ts +0 -1129
- package/src/tech-radar/layout.ts +0 -197
- package/src/tech-radar/parser.ts +0 -436
- package/src/tech-radar/renderer.ts +0 -1239
- package/src/tech-radar/shared.ts +0 -151
- package/src/tech-radar/types.ts +0 -86
- package/src/themes.ts +0 -22
- package/src/timeline/parser.ts +0 -472
- package/src/timeline/renderer.ts +0 -3024
- package/src/timeline/types.ts +0 -33
- package/src/timeline/viz-parser.ts +0 -21
- package/src/treemap/diagnostics.ts +0 -62
- package/src/treemap/layout-radial.ts +0 -233
- package/src/treemap/layout.ts +0 -189
- package/src/treemap/parser.ts +0 -463
- package/src/treemap/renderer-radial.ts +0 -438
- package/src/treemap/renderer.ts +0 -572
- package/src/treemap/treemap-shared.ts +0 -309
- package/src/treemap/types.ts +0 -60
- package/src/utils/arrow-markers.ts +0 -51
- package/src/utils/arrows-diagnostics.ts +0 -62
- package/src/utils/arrows.ts +0 -227
- package/src/utils/brand.ts +0 -61
- package/src/utils/card.ts +0 -183
- package/src/utils/collapse-engine/tree-edges.ts +0 -115
- package/src/utils/collapse-engine/tree.ts +0 -117
- package/src/utils/d3-helpers.ts +0 -219
- package/src/utils/d3-types.ts +0 -9
- package/src/utils/description-helpers.ts +0 -38
- package/src/utils/duration.ts +0 -312
- package/src/utils/export-container.ts +0 -41
- package/src/utils/expr-eval.ts +0 -27
- package/src/utils/fit-canvas.ts +0 -64
- package/src/utils/hover-styles.ts +0 -673
- package/src/utils/inline-markdown.ts +0 -96
- package/src/utils/legend-constants.ts +0 -48
- package/src/utils/legend-d3.ts +0 -618
- package/src/utils/legend-integration.ts +0 -107
- package/src/utils/legend-layout.ts +0 -776
- package/src/utils/legend-svg.ts +0 -214
- package/src/utils/legend-types.ts +0 -272
- package/src/utils/name-normalize.ts +0 -163
- package/src/utils/note-box/constants.ts +0 -25
- package/src/utils/note-box/index.ts +0 -11
- package/src/utils/note-box/metrics.ts +0 -90
- package/src/utils/note-box/svg.ts +0 -331
- package/src/utils/notes/bounds.ts +0 -30
- package/src/utils/notes/build.ts +0 -131
- package/src/utils/notes/index.ts +0 -18
- package/src/utils/notes/model.ts +0 -19
- package/src/utils/notes/parse.ts +0 -131
- package/src/utils/notes/place.ts +0 -177
- package/src/utils/notes/resolve.ts +0 -88
- package/src/utils/number-format.ts +0 -36
- package/src/utils/parsing.ts +0 -953
- package/src/utils/reserved-key-registry.ts +0 -239
- package/src/utils/safe-href.ts +0 -38
- package/src/utils/scaling.ts +0 -97
- package/src/utils/svg-embed.ts +0 -251
- package/src/utils/tag-groups.ts +0 -607
- package/src/utils/text-measure.ts +0 -122
- package/src/utils/title-constants.ts +0 -24
- package/src/utils/visual-conventions.ts +0 -61
- package/src/utils/wrapped-desc.ts +0 -87
- package/src/venn/parser.ts +0 -18
- package/src/venn/renderer.ts +0 -1047
- package/src/version-control/diagnostics.ts +0 -67
- package/src/version-control/parser.ts +0 -544
- package/src/version-control/renderer.ts +0 -724
- package/src/version-control/types.ts +0 -100
- package/src/visualizations/parse.ts +0 -1560
- package/src/visualizations/types.ts +0 -262
- package/src/wireframe/layout.ts +0 -479
- package/src/wireframe/parser.ts +0 -1114
- package/src/wireframe/renderer.ts +0 -1318
- package/src/wireframe/types.ts +0 -110
- package/src/wordcloud/parser.ts +0 -18
- package/src/wordcloud/renderer.ts +0 -357
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
import type { PaletteColors } from '../palettes';
|
|
2
|
-
import { mix, shapeFill } from '../palettes/color-utils';
|
|
3
|
-
import { measureText, wrapTextToWidth } from '../utils/text-measure';
|
|
4
|
-
import type {
|
|
5
|
-
ParsedJourneyMap,
|
|
6
|
-
JourneyMapPhase,
|
|
7
|
-
JourneyMapStep,
|
|
8
|
-
} from './types';
|
|
9
|
-
|
|
10
|
-
// ============================================================
|
|
11
|
-
// Layout Types
|
|
12
|
-
// ============================================================
|
|
13
|
-
|
|
14
|
-
export interface CurvePoint {
|
|
15
|
-
x: number;
|
|
16
|
-
y: number;
|
|
17
|
-
score: number;
|
|
18
|
-
emotionLabel?: string;
|
|
19
|
-
stepIndex: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface StepLayout {
|
|
23
|
-
x: number;
|
|
24
|
-
y: number;
|
|
25
|
-
width: number;
|
|
26
|
-
height: number;
|
|
27
|
-
step: JourneyMapStep;
|
|
28
|
-
color: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
interface PhaseLayout {
|
|
32
|
-
x: number;
|
|
33
|
-
y: number;
|
|
34
|
-
width: number;
|
|
35
|
-
height: number;
|
|
36
|
-
phase: JourneyMapPhase;
|
|
37
|
-
headerColor: string;
|
|
38
|
-
stepLayouts: StepLayout[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface JourneyMapLayout {
|
|
42
|
-
phases: PhaseLayout[];
|
|
43
|
-
flatStepLayouts: StepLayout[];
|
|
44
|
-
curvePoints: CurvePoint[];
|
|
45
|
-
totalWidth: number;
|
|
46
|
-
totalHeight: number;
|
|
47
|
-
curveAreaTop: number;
|
|
48
|
-
curveAreaBottom: number;
|
|
49
|
-
cardAreaTop: number;
|
|
50
|
-
personaHeight: number;
|
|
51
|
-
titleHeight: number;
|
|
52
|
-
/** Whether any step has thought annotations */
|
|
53
|
-
hasThoughts: boolean;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// ============================================================
|
|
57
|
-
// Constants
|
|
58
|
-
// ============================================================
|
|
59
|
-
|
|
60
|
-
const PADDING = 24;
|
|
61
|
-
const TITLE_HEIGHT = 36;
|
|
62
|
-
const PERSONA_HEIGHT = 48;
|
|
63
|
-
// Must match renderer.ts persona panel width
|
|
64
|
-
const PERSONA_PANEL_WIDTH = 280;
|
|
65
|
-
const HEADER_GAP = 24;
|
|
66
|
-
const CURVE_AREA_HEIGHT = 260;
|
|
67
|
-
const CARD_GAP = 8;
|
|
68
|
-
const STEP_CARD_WIDTH = 190;
|
|
69
|
-
const CARD_HEADER_HEIGHT = 24;
|
|
70
|
-
const CARD_META_LINE_HEIGHT = 14;
|
|
71
|
-
const PHASE_HEADER_HEIGHT = 36;
|
|
72
|
-
const CARD_PADDING_X = 10;
|
|
73
|
-
const CARD_PADDING_Y = 6;
|
|
74
|
-
const ANNO_ICON_SIZE = 10;
|
|
75
|
-
const ANNO_ICON_GAP = 4;
|
|
76
|
-
export const TAG_STRIP_HEIGHT = 18;
|
|
77
|
-
const PHASE_GAP = 16;
|
|
78
|
-
const COLUMN_PADDING = 12;
|
|
79
|
-
const FACE_ICON_SIZE = 20;
|
|
80
|
-
// Extra room reserved below the curve band for emotion captions (which hang
|
|
81
|
-
// beneath the lowest face) so they clear the phase header bar.
|
|
82
|
-
const EMOTION_CAPTION_BAND = 18;
|
|
83
|
-
|
|
84
|
-
// ============================================================
|
|
85
|
-
// Score-to-color
|
|
86
|
-
// ============================================================
|
|
87
|
-
|
|
88
|
-
export function scoreToColor(score: number, palette: PaletteColors): string {
|
|
89
|
-
// Diverging red → amber → green ramp (RAG). A straight red→green sRGB lerp
|
|
90
|
-
// muddies the midrange into olive/brown; routing through yellow at score 3
|
|
91
|
-
// keeps the negative/neutral faces clean amber instead.
|
|
92
|
-
const s = Math.max(1, Math.min(5, score));
|
|
93
|
-
const { red, yellow, green } = palette.colors;
|
|
94
|
-
return s <= 3
|
|
95
|
-
? mix(yellow, red, ((s - 1) / 2) * 100) // 1→red, 3→yellow
|
|
96
|
-
: mix(green, yellow, ((s - 3) / 2) * 100); // 3→yellow, 5→green
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Vertical headroom reserved at the top of the curve area (px). Keep faces
|
|
100
|
-
// off the very edge while still using the full height.
|
|
101
|
-
const CURVE_TOP_RESERVE = 20;
|
|
102
|
-
|
|
103
|
-
// Map an emotion score (1-5) to a y coordinate within the curve area. Shared
|
|
104
|
-
// by the curve points and the grid lines so both stay on the same scale.
|
|
105
|
-
export function scoreToCurveY(score: number, curveAreaBottom: number): number {
|
|
106
|
-
return (
|
|
107
|
-
curveAreaBottom -
|
|
108
|
-
((score - 1) / 4) * (CURVE_AREA_HEIGHT - CURVE_TOP_RESERVE) -
|
|
109
|
-
10
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// ============================================================
|
|
114
|
-
// Layout Engine
|
|
115
|
-
// ============================================================
|
|
116
|
-
|
|
117
|
-
export function layoutJourneyMap(
|
|
118
|
-
parsed: ParsedJourneyMap,
|
|
119
|
-
palette: PaletteColors,
|
|
120
|
-
options?: {
|
|
121
|
-
exportDims?: { width: number; height: number };
|
|
122
|
-
collapsedPhases?: Set<string>;
|
|
123
|
-
isDark?: boolean;
|
|
124
|
-
}
|
|
125
|
-
): JourneyMapLayout {
|
|
126
|
-
const isDark = options?.isDark ?? false;
|
|
127
|
-
const hasTitle = !!parsed.title && parsed.options['no-title'] !== 'on';
|
|
128
|
-
const hasPersona = !!parsed.persona;
|
|
129
|
-
const hasPhases = parsed.phases.length > 0;
|
|
130
|
-
|
|
131
|
-
const titleHeight = hasTitle ? TITLE_HEIGHT : 0;
|
|
132
|
-
const personaHeight = hasPersona ? PERSONA_HEIGHT : 0;
|
|
133
|
-
|
|
134
|
-
// Thought bubbles render as overlays on hover — no reserved vertical space
|
|
135
|
-
const allStepsForThoughts = hasPhases
|
|
136
|
-
? parsed.phases.flatMap((p) => p.steps)
|
|
137
|
-
: parsed.steps;
|
|
138
|
-
const hasThoughts = allStepsForThoughts.some((s) =>
|
|
139
|
-
s.annotations.some((a) => a.type === 'thought')
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
// Emotion captions render below their face. The score-1 face sits at the very
|
|
143
|
-
// bottom of the curve band, so without reserved room its caption collides with
|
|
144
|
-
// the phase header bar just below. Reserve a caption band in the curve→card gap
|
|
145
|
-
// whenever any scored step carries an emotion label.
|
|
146
|
-
const hasEmotions = allStepsForThoughts.some(
|
|
147
|
-
(s) => s.score !== undefined && s.emotionLabel !== undefined
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
// Reserve top headroom so an expanded thought bubble — which always pops
|
|
151
|
-
// ABOVE its face — clears the title + persona band, even when it hangs above
|
|
152
|
-
// the highest (score-5) face. Mirrors the renderer's bubble metrics.
|
|
153
|
-
const baseTop = PADDING + titleHeight + personaHeight;
|
|
154
|
-
let topHeadroom = 0;
|
|
155
|
-
if (hasThoughts) {
|
|
156
|
-
const THOUGHT_MAX_W = 200;
|
|
157
|
-
const THOUGHT_FONT = 11;
|
|
158
|
-
const THOUGHT_LINE_H = 14;
|
|
159
|
-
const THOUGHT_PAD_Y = 6;
|
|
160
|
-
const THOUGHT_GAP = 10;
|
|
161
|
-
const FACE_HOVER_R = (14 + 1) * 1.5; // (FACE_RADIUS + 1) * FACE_HOVER_SCALE
|
|
162
|
-
const PERSONA_DESC_FONT = 10; // FONT_SIZE_META in the renderer
|
|
163
|
-
const PERSONA_SILHOUETTE = 60;
|
|
164
|
-
const BUBBLE_MARGIN = 16;
|
|
165
|
-
|
|
166
|
-
// Tallest thought bubble + the highest face that carries a thought.
|
|
167
|
-
let maxBubbleH = 0;
|
|
168
|
-
let topThoughtScore = 1;
|
|
169
|
-
for (const s of allStepsForThoughts) {
|
|
170
|
-
const thoughts = s.annotations.filter((a) => a.type === 'thought');
|
|
171
|
-
if (thoughts.length === 0) continue;
|
|
172
|
-
const text = thoughts.map((t) => t.text).join(' • ');
|
|
173
|
-
const lineCount = wrapTextToWidth(
|
|
174
|
-
text,
|
|
175
|
-
THOUGHT_FONT,
|
|
176
|
-
THOUGHT_MAX_W
|
|
177
|
-
).length;
|
|
178
|
-
maxBubbleH = Math.max(
|
|
179
|
-
maxBubbleH,
|
|
180
|
-
lineCount * THOUGHT_LINE_H + THOUGHT_PAD_Y * 2
|
|
181
|
-
);
|
|
182
|
-
if (s.score !== undefined) {
|
|
183
|
-
topThoughtScore = Math.max(topThoughtScore, s.score);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Actual persona card height — the PERSONA_HEIGHT reservation underestimates
|
|
188
|
-
// a multi-line description, so measure it for an honest band bottom.
|
|
189
|
-
let personaActualH = personaHeight;
|
|
190
|
-
if (hasPersona && parsed.persona?.description) {
|
|
191
|
-
const textAreaWidth =
|
|
192
|
-
PERSONA_PANEL_WIDTH - PERSONA_SILHOUETTE - CARD_PADDING_X;
|
|
193
|
-
const descLineCount = wrapTextToWidth(
|
|
194
|
-
parsed.persona.description,
|
|
195
|
-
PERSONA_DESC_FONT,
|
|
196
|
-
textAreaWidth
|
|
197
|
-
).length;
|
|
198
|
-
personaActualH = CARD_HEADER_HEIGHT + descLineCount * 14 + 8;
|
|
199
|
-
}
|
|
200
|
-
const topBandBottom = PADDING + Math.max(titleHeight, personaActualH);
|
|
201
|
-
|
|
202
|
-
// Where the highest thought-bearing face would sit with zero headroom, and
|
|
203
|
-
// where its bubble's top edge would land. Shift down by any shortfall.
|
|
204
|
-
const faceY0 = scoreToCurveY(topThoughtScore, baseTop + CURVE_AREA_HEIGHT);
|
|
205
|
-
const bubbleTop0 = faceY0 - FACE_HOVER_R - THOUGHT_GAP - maxBubbleH;
|
|
206
|
-
topHeadroom = Math.max(0, topBandBottom + BUBBLE_MARGIN - bubbleTop0);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const curveAreaTop = baseTop + topHeadroom;
|
|
210
|
-
const curveAreaBottom = curveAreaTop + CURVE_AREA_HEIGHT;
|
|
211
|
-
const cardAreaTop =
|
|
212
|
-
curveAreaBottom + PADDING + (hasEmotions ? EMOTION_CAPTION_BAND : 0);
|
|
213
|
-
|
|
214
|
-
const allSteps = hasPhases
|
|
215
|
-
? parsed.phases.flatMap((p) => p.steps)
|
|
216
|
-
: parsed.steps;
|
|
217
|
-
|
|
218
|
-
// Compute step card heights based on content (matches kanban card sizing).
|
|
219
|
-
// Line counts route through the same `wrapTextToWidth` the renderer uses,
|
|
220
|
-
// at the same font sizes, so reserved height always matches rendered text.
|
|
221
|
-
const annoIconIndent = ANNO_ICON_SIZE + ANNO_ICON_GAP;
|
|
222
|
-
const annoTextW = STEP_CARD_WIDTH - CARD_PADDING_X * 2 - annoIconIndent;
|
|
223
|
-
const descTextWidth = STEP_CARD_WIDTH - CARD_PADDING_X * 2;
|
|
224
|
-
const FONT_SIZE_META = 10; // renderer FONT_SIZE_META (desc/anno)
|
|
225
|
-
const FONT_SIZE_STEP = 12; // renderer FONT_SIZE_STEP (title)
|
|
226
|
-
|
|
227
|
-
const titleTextWidth = STEP_CARD_WIDTH - CARD_PADDING_X * 2;
|
|
228
|
-
const TITLE_LINE_HEIGHT = 16;
|
|
229
|
-
|
|
230
|
-
const stepHeights = allSteps.map((step) => {
|
|
231
|
-
const titleLines = wrapTextToWidth(
|
|
232
|
-
step.title,
|
|
233
|
-
FONT_SIZE_STEP,
|
|
234
|
-
titleTextWidth
|
|
235
|
-
).length;
|
|
236
|
-
let h = CARD_PADDING_Y + titleLines * TITLE_LINE_HEIGHT + CARD_PADDING_Y;
|
|
237
|
-
const cardAnnos = step.annotations;
|
|
238
|
-
let contentLines = 0;
|
|
239
|
-
// Description may wrap
|
|
240
|
-
if (step.description) {
|
|
241
|
-
contentLines += wrapTextToWidth(
|
|
242
|
-
step.description,
|
|
243
|
-
FONT_SIZE_META,
|
|
244
|
-
descTextWidth
|
|
245
|
-
).length;
|
|
246
|
-
}
|
|
247
|
-
// Annotations: all lines indented past icon
|
|
248
|
-
for (const anno of cardAnnos) {
|
|
249
|
-
contentLines += wrapTextToWidth(
|
|
250
|
-
anno.text,
|
|
251
|
-
FONT_SIZE_META,
|
|
252
|
-
annoTextW
|
|
253
|
-
).length;
|
|
254
|
-
}
|
|
255
|
-
if (contentLines > 0) {
|
|
256
|
-
h += contentLines * CARD_META_LINE_HEIGHT + 4; // 4px bottom padding
|
|
257
|
-
}
|
|
258
|
-
return h;
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
const minCardHeight = CARD_HEADER_HEIGHT + CARD_META_LINE_HEIGHT;
|
|
262
|
-
const maxCardHeight = Math.max(minCardHeight, ...stepHeights);
|
|
263
|
-
|
|
264
|
-
// Check if any step has tags — if so, reserve space for the tag strip above cards
|
|
265
|
-
const hasTags = allSteps.some((s) => Object.keys(s.tags).length > 0);
|
|
266
|
-
const tagStripOffset = hasTags ? TAG_STRIP_HEIGHT + 6 : 0;
|
|
267
|
-
|
|
268
|
-
// Layout phases or flat steps
|
|
269
|
-
const phaseLayouts: PhaseLayout[] = [];
|
|
270
|
-
const flatStepLayouts: StepLayout[] = [];
|
|
271
|
-
const curvePoints: CurvePoint[] = [];
|
|
272
|
-
|
|
273
|
-
let globalStepIndex = 0;
|
|
274
|
-
|
|
275
|
-
const collapsed = options?.collapsedPhases ?? new Set<string>();
|
|
276
|
-
|
|
277
|
-
if (hasPhases) {
|
|
278
|
-
let phaseX = PADDING;
|
|
279
|
-
|
|
280
|
-
for (const phase of parsed.phases) {
|
|
281
|
-
const isCollapsed = collapsed.has(phase.name);
|
|
282
|
-
const stepCount = Math.max(phase.steps.length, 1);
|
|
283
|
-
const phaseWidth = isCollapsed
|
|
284
|
-
? STEP_CARD_WIDTH + COLUMN_PADDING * 2
|
|
285
|
-
: stepCount * STEP_CARD_WIDTH +
|
|
286
|
-
(stepCount - 1) * CARD_GAP +
|
|
287
|
-
COLUMN_PADDING * 2;
|
|
288
|
-
|
|
289
|
-
const stepLayouts: StepLayout[] = [];
|
|
290
|
-
|
|
291
|
-
if (!isCollapsed) {
|
|
292
|
-
let stepX = phaseX + COLUMN_PADDING;
|
|
293
|
-
|
|
294
|
-
for (let si = 0; si < phase.steps.length; si++) {
|
|
295
|
-
// In-bounds by loop guard.
|
|
296
|
-
const step = phase.steps[si]!;
|
|
297
|
-
const color =
|
|
298
|
-
step.score !== undefined
|
|
299
|
-
? scoreToColor(step.score, palette)
|
|
300
|
-
: palette.surface;
|
|
301
|
-
|
|
302
|
-
const sl: StepLayout = {
|
|
303
|
-
x: stepX,
|
|
304
|
-
y: cardAreaTop + PHASE_HEADER_HEIGHT + CARD_GAP + tagStripOffset,
|
|
305
|
-
width: STEP_CARD_WIDTH,
|
|
306
|
-
height: maxCardHeight,
|
|
307
|
-
step,
|
|
308
|
-
color,
|
|
309
|
-
};
|
|
310
|
-
stepLayouts.push(sl);
|
|
311
|
-
|
|
312
|
-
// Curve point
|
|
313
|
-
if (step.score !== undefined) {
|
|
314
|
-
const curveX = stepX + STEP_CARD_WIDTH / 2;
|
|
315
|
-
const curveY = scoreToCurveY(step.score, curveAreaBottom);
|
|
316
|
-
curvePoints.push({
|
|
317
|
-
x: curveX,
|
|
318
|
-
y: curveY,
|
|
319
|
-
score: step.score,
|
|
320
|
-
...(step.emotionLabel !== undefined && {
|
|
321
|
-
emotionLabel: step.emotionLabel,
|
|
322
|
-
}),
|
|
323
|
-
stepIndex: globalStepIndex,
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
stepX += STEP_CARD_WIDTH + CARD_GAP;
|
|
328
|
-
globalStepIndex++;
|
|
329
|
-
}
|
|
330
|
-
} else {
|
|
331
|
-
// Collapsed: spread curve points across the compressed column width
|
|
332
|
-
const stepCount = phase.steps.length;
|
|
333
|
-
const padX = COLUMN_PADDING + FACE_ICON_SIZE;
|
|
334
|
-
const availW = phaseWidth - padX * 2;
|
|
335
|
-
for (let si = 0; si < stepCount; si++) {
|
|
336
|
-
// In-bounds by loop guard.
|
|
337
|
-
const step = phase.steps[si]!;
|
|
338
|
-
if (step.score !== undefined) {
|
|
339
|
-
const curveX =
|
|
340
|
-
stepCount === 1
|
|
341
|
-
? phaseX + phaseWidth / 2
|
|
342
|
-
: phaseX + padX + (si / (stepCount - 1)) * availW;
|
|
343
|
-
const curveY = scoreToCurveY(step.score, curveAreaBottom);
|
|
344
|
-
curvePoints.push({
|
|
345
|
-
x: curveX,
|
|
346
|
-
y: curveY,
|
|
347
|
-
score: step.score,
|
|
348
|
-
...(step.emotionLabel !== undefined && {
|
|
349
|
-
emotionLabel: step.emotionLabel,
|
|
350
|
-
}),
|
|
351
|
-
stepIndex: globalStepIndex,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
globalStepIndex++;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Phase header color from average score
|
|
359
|
-
const scoredSteps = phase.steps.filter((s) => s.score !== undefined);
|
|
360
|
-
const avgScore =
|
|
361
|
-
scoredSteps.length > 0
|
|
362
|
-
? scoredSteps.reduce((sum, s) => sum + s.score!, 0) /
|
|
363
|
-
scoredSteps.length
|
|
364
|
-
: 3;
|
|
365
|
-
const headerColor = shapeFill(
|
|
366
|
-
palette,
|
|
367
|
-
scoreToColor(avgScore, palette),
|
|
368
|
-
isDark,
|
|
369
|
-
{ solid: parsed.options['solid-fill'] === 'on' }
|
|
370
|
-
);
|
|
371
|
-
|
|
372
|
-
const COLLAPSED_CARD_H = 26;
|
|
373
|
-
const COLLAPSED_GAP = 6;
|
|
374
|
-
const phaseHeight = isCollapsed
|
|
375
|
-
? PHASE_HEADER_HEIGHT +
|
|
376
|
-
CARD_GAP +
|
|
377
|
-
phase.steps.length * (COLLAPSED_CARD_H + COLLAPSED_GAP) +
|
|
378
|
-
CARD_GAP
|
|
379
|
-
: PHASE_HEADER_HEIGHT +
|
|
380
|
-
CARD_GAP +
|
|
381
|
-
tagStripOffset +
|
|
382
|
-
maxCardHeight +
|
|
383
|
-
CARD_GAP;
|
|
384
|
-
|
|
385
|
-
phaseLayouts.push({
|
|
386
|
-
x: phaseX,
|
|
387
|
-
y: cardAreaTop,
|
|
388
|
-
width: phaseWidth,
|
|
389
|
-
height: phaseHeight,
|
|
390
|
-
phase,
|
|
391
|
-
headerColor,
|
|
392
|
-
stepLayouts,
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
phaseX += phaseWidth + PHASE_GAP;
|
|
396
|
-
}
|
|
397
|
-
} else {
|
|
398
|
-
// Flat mode
|
|
399
|
-
let stepX = PADDING;
|
|
400
|
-
|
|
401
|
-
for (let si = 0; si < parsed.steps.length; si++) {
|
|
402
|
-
// In-bounds by loop guard.
|
|
403
|
-
const step = parsed.steps[si]!;
|
|
404
|
-
const color =
|
|
405
|
-
step.score !== undefined
|
|
406
|
-
? scoreToColor(step.score, palette)
|
|
407
|
-
: palette.surface;
|
|
408
|
-
|
|
409
|
-
flatStepLayouts.push({
|
|
410
|
-
x: stepX,
|
|
411
|
-
y: cardAreaTop + CARD_GAP + tagStripOffset,
|
|
412
|
-
width: STEP_CARD_WIDTH,
|
|
413
|
-
height: maxCardHeight,
|
|
414
|
-
step,
|
|
415
|
-
color,
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
if (step.score !== undefined) {
|
|
419
|
-
const curveX = stepX + STEP_CARD_WIDTH / 2;
|
|
420
|
-
const curveY = scoreToCurveY(step.score, curveAreaBottom);
|
|
421
|
-
curvePoints.push({
|
|
422
|
-
x: curveX,
|
|
423
|
-
y: curveY,
|
|
424
|
-
score: step.score,
|
|
425
|
-
...(step.emotionLabel !== undefined && {
|
|
426
|
-
emotionLabel: step.emotionLabel,
|
|
427
|
-
}),
|
|
428
|
-
stepIndex: si,
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
stepX += STEP_CARD_WIDTH + CARD_GAP;
|
|
433
|
-
globalStepIndex++;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// Compute total dimensions
|
|
438
|
-
// In-bounds by length checks below.
|
|
439
|
-
const rightEdge = hasPhases
|
|
440
|
-
? phaseLayouts.length > 0
|
|
441
|
-
? phaseLayouts[phaseLayouts.length - 1]!.x +
|
|
442
|
-
phaseLayouts[phaseLayouts.length - 1]!.width +
|
|
443
|
-
PADDING
|
|
444
|
-
: PADDING * 2
|
|
445
|
-
: flatStepLayouts.length > 0
|
|
446
|
-
? flatStepLayouts[flatStepLayouts.length - 1]!.x +
|
|
447
|
-
STEP_CARD_WIDTH +
|
|
448
|
-
PADDING
|
|
449
|
-
: PADDING * 2;
|
|
450
|
-
|
|
451
|
-
const bottomEdge = hasPhases
|
|
452
|
-
? phaseLayouts.length > 0
|
|
453
|
-
? phaseLayouts[0]!.y + phaseLayouts[0]!.height + PADDING + 40
|
|
454
|
-
: cardAreaTop + PADDING
|
|
455
|
-
: cardAreaTop + CARD_GAP + tagStripOffset + maxCardHeight + PADDING + 40;
|
|
456
|
-
|
|
457
|
-
// Reserve enough horizontal space so the title text and the persona card
|
|
458
|
-
// don't collapse into each other when the diagram has few steps. Without
|
|
459
|
-
// this, a single-step journey produces a totalWidth that's narrower than
|
|
460
|
-
// the title + persona row, and the persona panel overlaps the title.
|
|
461
|
-
const headerTitleWidth = hasTitle
|
|
462
|
-
? measureText(parsed.title!, 18) // FONT_SIZE_TITLE (18px bold)
|
|
463
|
-
: 0;
|
|
464
|
-
const personaPanelWidth = parsed.persona ? PERSONA_PANEL_WIDTH : 0;
|
|
465
|
-
const headerWidth =
|
|
466
|
-
hasTitle && parsed.persona
|
|
467
|
-
? PADDING + headerTitleWidth + HEADER_GAP + personaPanelWidth + PADDING
|
|
468
|
-
: Math.max(
|
|
469
|
-
PADDING + headerTitleWidth + PADDING,
|
|
470
|
-
PADDING + personaPanelWidth + PADDING
|
|
471
|
-
);
|
|
472
|
-
|
|
473
|
-
// Add space for score legend at bottom
|
|
474
|
-
const totalWidth = Math.max(rightEdge, 400, headerWidth);
|
|
475
|
-
const totalHeight = bottomEdge;
|
|
476
|
-
|
|
477
|
-
return {
|
|
478
|
-
phases: phaseLayouts,
|
|
479
|
-
flatStepLayouts,
|
|
480
|
-
curvePoints,
|
|
481
|
-
totalWidth,
|
|
482
|
-
totalHeight,
|
|
483
|
-
curveAreaTop,
|
|
484
|
-
curveAreaBottom,
|
|
485
|
-
cardAreaTop,
|
|
486
|
-
personaHeight,
|
|
487
|
-
titleHeight,
|
|
488
|
-
hasThoughts,
|
|
489
|
-
};
|
|
490
|
-
}
|