@diagrammo/dgmo 0.89.0 → 0.91.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/README.md +1 -1
- package/dist/advanced.d.ts +589 -15
- package/dist/advanced.js +813 -211
- package/dist/block.d.ts +11 -2
- package/dist/block.js +94 -64
- package/dist/{calculator-35YVW4QO.js → calculator-3LZUWOBK.js} +2 -2
- package/dist/{chart-meta-Bev5Ebjr.d.ts → chart-meta-B_WTMP0y.d.ts} +1 -1
- package/dist/chart-meta.d.ts +2 -2
- package/dist/chart-meta.js +18 -17
- package/dist/{chart-types-Bf8C5QQW.d.ts → chart-types-V2NcgN5O.d.ts} +4 -0
- package/dist/{charts-d3-KEQSUWKP.js → charts-d3-YXD6VGZQ.js} +8 -7
- package/dist/{chunk-PMNITNPR.js → chunk-273GB7WK.js} +6 -5
- package/dist/{chunk-HAMF4F3P.js → chunk-2A4OFZ2Z.js} +5 -5
- package/dist/{chunk-K5XT7NHD.js → chunk-2AM6VA3A.js} +10 -10
- package/dist/{chunk-XJ2TBXHA.js → chunk-2UV627GG.js} +9 -9
- package/dist/{chunk-7WGCQE2E.js → chunk-2ZVLI6GQ.js} +1 -1
- package/dist/{chunk-JVZ7KFAX.js → chunk-37QQXKFV.js} +9 -10
- package/dist/{chunk-M2BCY7H3.js → chunk-3LINSNJT.js} +199 -146
- package/dist/{chunk-WPL5PFXE.js → chunk-3SLRZKLB.js} +6 -6
- package/dist/chunk-3UR4F7FE.js +14 -0
- package/dist/{chunk-ZUCXFXLD.js → chunk-3YTAOMMN.js} +2 -2
- package/dist/{chunk-NIUO2TNR.js → chunk-4HG4PYHM.js} +197 -203
- package/dist/{chunk-BOO24UMJ.js → chunk-4YO7VJTP.js} +1 -1
- package/dist/{chunk-HUNDJTTH.js → chunk-53BJIOLF.js} +1 -1
- package/dist/{chunk-LR6RRDWN.js → chunk-57L2JPP2.js} +10 -6
- package/dist/{chunk-IIOLFAGJ.js → chunk-5DIBB2QG.js} +51 -32
- package/dist/{chunk-S2WE7TVK.js → chunk-5MDQMB6A.js} +1 -1
- package/dist/{chunk-7Z2VFRP5.js → chunk-5U6DXIMV.js} +47 -24
- package/dist/{chunk-QIOYTQDZ.js → chunk-5VPWIC6T.js} +9 -9
- package/dist/{chunk-JRUEIRJB.js → chunk-634LDSN6.js} +3 -3
- package/dist/{chunk-VEPIAUSK.js → chunk-6BQSDF77.js} +1 -5
- package/dist/{chunk-LPYYZCSI.js → chunk-6NO3MNBC.js} +3 -3
- package/dist/{chunk-ITSBBQTH.js → chunk-6QEXWMBP.js} +13 -17
- package/dist/{chunk-DDPGEGHB.js → chunk-7BBRSOKS.js} +3 -3
- package/dist/{chunk-WQ6G6FFM.js → chunk-AR4QVMWG.js} +5 -2
- package/dist/{chunk-BB6QKWHZ.js → chunk-B6EUFLRP.js} +10 -10
- package/dist/{chunk-C4FRGZGX.js → chunk-CDT33RHG.js} +1 -1
- package/dist/{chunk-WP22MHH6.js → chunk-CPGKRI7H.js} +10 -13
- package/dist/{chunk-ZNNVI5SR.js → chunk-CU2PZLZP.js} +53 -31
- package/dist/{chunk-CUYHST3B.js → chunk-CVZBLHHW.js} +1 -1
- package/dist/{chunk-Y7PSAHAY.js → chunk-CXIPV2FY.js} +3 -3
- package/dist/{chunk-NRPELUB6.js → chunk-D7DXNQW5.js} +2 -2
- package/dist/{chunk-YMFQLWZ2.js → chunk-D7PP35BA.js} +1 -1
- package/dist/{chunk-RGWYZR3S.js → chunk-DLX7MEN4.js} +2 -2
- package/dist/chunk-EDPDAUBL.js +825 -0
- package/dist/{chunk-GSYZZFI5.js → chunk-EP7BT3HU.js} +2 -2
- package/dist/{chunk-ICZ7M6IZ.js → chunk-EQJ3U5EW.js} +1 -1
- package/dist/{chunk-3C2FWS2J.js → chunk-EWERNTOX.js} +1 -1
- package/dist/{chunk-XUCQVKLQ.js → chunk-F2436VRR.js} +4 -4
- package/dist/{chunk-UG2XG57E.js → chunk-F26ZPBSF.js} +3 -3
- package/dist/{chunk-UWKRPQZO.js → chunk-FJCYK4K3.js} +25 -22
- package/dist/{chunk-FKLE6QA3.js → chunk-G22UV5AF.js} +12 -12
- package/dist/{chunk-GUTZCRBT.js → chunk-G3EUQMV4.js} +4 -4
- package/dist/{chunk-SOPM5PLO.js → chunk-GCDW3WAY.js} +14 -14
- package/dist/{chunk-7UDAIP6W.js → chunk-HFG7KQOY.js} +13 -15
- package/dist/{chunk-ID2K3IHI.js → chunk-HLE5QGZJ.js} +1 -1
- package/dist/{chunk-QFHWYWQL.js → chunk-HLVGZXM5.js} +2 -2
- package/dist/{chunk-7C2RAGPT.js → chunk-HSGWR2FL.js} +16 -16
- package/dist/{chunk-P3SKSKJI.js → chunk-HWXUQCDY.js} +3 -3
- package/dist/{chunk-HTWH2XQL.js → chunk-HYV6GSXM.js} +6 -3
- package/dist/{chunk-3RYBTEF5.js → chunk-I74AQRVD.js} +6 -12
- package/dist/chunk-IHK3Y2HG.js +781 -0
- package/dist/{chunk-7KPHRTND.js → chunk-II4XJETG.js} +1 -1
- package/dist/{chunk-RXIKESRI.js → chunk-IMHNZITR.js} +2 -2
- package/dist/{chunk-TAP2NZEU.js → chunk-IMKPFW67.js} +13 -13
- package/dist/{chunk-FKZ2Y3Q5.js → chunk-IS6WFBX7.js} +3 -3
- package/dist/{chunk-47E5UTXE.js → chunk-IUBCDNT2.js} +2 -2
- package/dist/{chunk-EXKCRXPO.js → chunk-IWTUXGHN.js} +12 -12
- package/dist/{chunk-C7QRRTAW.js → chunk-J2SQNZ6D.js} +2 -2
- package/dist/{chunk-DZPHN2WN.js → chunk-JA2S7PHR.js} +14 -14
- package/dist/{chunk-DPSMX4EY.js → chunk-JJQWCI35.js} +4 -4
- package/dist/chunk-JJUDOR4I.js +110 -0
- package/dist/{chunk-LYLNMN77.js → chunk-K3BYD3WU.js} +8 -3
- package/dist/{chunk-3AQJNY65.js → chunk-KFXY5IW2.js} +149 -43
- package/dist/{chunk-J64NZ6NF.js → chunk-KSZHIAI2.js} +1 -1
- package/dist/{chunk-LCJURK7L.js → chunk-LKR4FACF.js} +2 -4
- package/dist/{chunk-PIXJL77H.js → chunk-M6J25PAZ.js} +1 -1
- package/dist/{chunk-IJ27L3R4.js → chunk-MA42PIGJ.js} +1 -1
- package/dist/{chunk-IQ6P3HDE.js → chunk-MI6SJJQU.js} +2 -2
- package/dist/{chunk-N4BBSDWI.js → chunk-MJKQ5ZYY.js} +140 -151
- package/dist/{chunk-6K7RODXG.js → chunk-MKFQ5E7J.js} +1 -1
- package/dist/{chunk-AZ24RI5L.js → chunk-MNL547RV.js} +6 -6
- package/dist/{chunk-44GP7PD5.js → chunk-MPJQMMBZ.js} +12 -0
- package/dist/{chunk-ECMA6XE2.js → chunk-N254IJM2.js} +13 -13
- package/dist/{layout-search-YKUL4VBV.js → chunk-NWPMLX2V.js} +27 -30
- package/dist/{chunk-DV2VEJCC.js → chunk-NWSPPGIE.js} +6 -6
- package/dist/{chunk-GDJW64XE.js → chunk-OYKNMFUY.js} +1 -1
- package/dist/{chunk-B3S76BZO.js → chunk-PSGSFRRE.js} +4 -4
- package/dist/{chunk-4AJKOUBO.js → chunk-PUZ63XZM.js} +13 -11
- package/dist/{chunk-UQLHKLF4.js → chunk-PZVTFQI2.js} +8 -8
- package/dist/{chunk-W7QN5BC5.js → chunk-Q3N7PI3B.js} +180 -7
- package/dist/{chunk-L5AFONQU.js → chunk-QKJ6MQXW.js} +2 -4
- package/dist/{chunk-7SX4IY6T.js → chunk-QVKTAU7P.js} +1 -1
- package/dist/{chunk-SLQT3JP3.js → chunk-R7BSF7Z7.js} +1 -1
- package/dist/{chunk-4R6OMKXB.js → chunk-RHXIUUWB.js} +5 -5
- package/dist/{chunk-MHAYUS65.js → chunk-RMTOZALT.js} +8 -5
- package/dist/{chunk-HSRQDWV7.js → chunk-ROCBGUJN.js} +8 -17
- package/dist/{chunk-44FTCIRI.js → chunk-RVTYIGWZ.js} +9 -9
- package/dist/{chunk-RU725VCJ.js → chunk-SKF7XLCM.js} +10 -35
- package/dist/{chunk-RPKBWJBB.js → chunk-SMTWQ66K.js} +6 -6
- package/dist/{chunk-3AX6MCI6.js → chunk-SPQVER4T.js} +2 -2
- package/dist/{chunk-CX6OH5WP.js → chunk-SWBHH2UW.js} +4 -4
- package/dist/{chunk-WP2RLGDI.js → chunk-TCX5PMEY.js} +1 -1
- package/dist/{chunk-7TF3QOOD.js → chunk-TIVMAITN.js} +14 -0
- package/dist/{chunk-NSR2CGV6.js → chunk-TLPY4ZBI.js} +611 -437
- package/dist/{chunk-WRCAH3UO.js → chunk-TPEYEOXA.js} +15 -15
- package/dist/{chunk-FJNXXGTR.js → chunk-UWJP4JSZ.js} +3 -3
- package/dist/{chunk-MY6GUH26.js → chunk-V3KHZQPK.js} +3 -3
- package/dist/{chunk-66YFDTT6.js → chunk-VGSSAMLA.js} +4 -4
- package/dist/{chunk-Q6SQISHT.js → chunk-VMD2CYVP.js} +311 -74
- package/dist/{chunk-MFW6P7WH.js → chunk-WNTPJZU7.js} +3 -3
- package/dist/{chunk-7W4XLIVH.js → chunk-WTE27AJT.js} +14 -14
- package/dist/{chunk-UKJLPA7R.js → chunk-X6IZP2BD.js} +1 -1
- package/dist/{chunk-2GM7N5TV.js → chunk-XLAREWBK.js} +9 -9
- package/dist/{chunk-AYOVY75O.js → chunk-XLPJJ35N.js} +4 -4
- package/dist/{chunk-NGC3IZRY.js → chunk-XQTRGKQ3.js} +4 -4
- package/dist/{chunk-WEF6MXFG.js → chunk-YZG37S7L.js} +9 -9
- package/dist/{chunk-LFKSHDVI.js → chunk-ZB2Q67NO.js} +14 -13
- package/dist/{chunk-JQ57AWDL.js → chunk-ZJ4PYTCK.js} +1 -1
- package/dist/completion-registry.d.ts +6 -0
- package/dist/completion-registry.js +62 -6
- package/dist/{compute-JAP5E2E4.js → compute-2XWFVO7K.js} +1 -1
- package/dist/{d3-B6524aaP.d.ts → d3-2S3PrXik.d.ts} +11 -0
- package/dist/dgmo-router-YHBMKTXY.js +94 -0
- package/dist/{dimensions-7MF7VSGS.js → dimensions-QMGWJQTR.js} +5 -5
- package/dist/editor.js +12 -0
- package/dist/{flowchart-parser-GG7XBLQH.js → flowchart-parser-BLJ6RA53.js} +4 -4
- package/dist/{flowchart-renderer-DZQZRL2F.js → flowchart-renderer-FXRQKXAK.js} +12 -8
- package/dist/highlight.js +12 -0
- package/dist/index.d.ts +26 -5
- package/dist/index.js +84 -57
- package/dist/{layout-5VSMZPMG.js → layout-5HCEF7VO.js} +1 -1
- package/dist/{layout-6L3BIFEZ.js → layout-6PLSBB5X.js} +3 -3
- package/dist/{layout-UIV56NUA.js → layout-B7PQRAMB.js} +1 -1
- package/dist/{layout-IGAVGDME.js → layout-CCVCLZ6S.js} +1 -1
- package/dist/{layout-PP36LUTA.js → layout-CRUAP7JG.js} +3 -3
- package/dist/{layout-Q3RYSODA.js → layout-G42FDCF3.js} +3 -3
- package/dist/{layout-EFEZ533S.js → layout-IV4H2FLB.js} +3 -3
- package/dist/{layout-4RRC7XU7.js → layout-JTNRSGOS.js} +6 -3
- package/dist/{layout-H4K54IW3.js → layout-RBLD5EGX.js} +6 -3
- package/dist/{layout-SW3XWYKC.js → layout-ROAVGBUC.js} +1 -1
- package/dist/{layout-XUW444O5.js → layout-T2DQ4M77.js} +8 -4
- package/dist/{layout-MSSHF45T.js → layout-UPQGIT3N.js} +2 -2
- package/dist/{layout-DXVAYF6W.js → layout-VRJ5YFUE.js} +2 -2
- package/dist/{layout-ZP7XYVXF.js → layout-YKGQRFDM.js} +2 -4
- package/dist/layout-search-L75YOBME.js +42 -0
- package/dist/{palettes-WZAIQTEG.js → palettes-WQHELGVQ.js} +2 -1
- package/dist/{parser-ZLKYDFI5.js → parser-2XCDVLSN.js} +3 -3
- package/dist/{parser-GZ3LVF72.js → parser-3MGA2MTM.js} +2 -2
- package/dist/{parser-NOANDFJ4.js → parser-4AR25MAS.js} +2 -2
- package/dist/{parser-GCCWMBTU.js → parser-4QNRCGU5.js} +5 -4
- package/dist/{parser-LANGKWRG.js → parser-6LMB7BQQ.js} +2 -2
- package/dist/{parser-WEVTMBJ5.js → parser-6NSQLPTS.js} +3 -3
- package/dist/{parser-KYPP2DX6.js → parser-6X4GGH2R.js} +4 -4
- package/dist/parser-AL6YL7KM.js +12 -0
- package/dist/{parser-5655XSOR.js → parser-D6YRVV75.js} +3 -3
- package/dist/{parser-NGHQQGD2.js → parser-EY3VJWBE.js} +3 -3
- package/dist/{parser-TL3JA4RI.js → parser-EYF4ZSZO.js} +3 -3
- package/dist/{parser-256EIWB2.js → parser-FDXUQ5TI.js} +2 -2
- package/dist/{parser-JOOAVBJI.js → parser-H2DJEAPG.js} +3 -3
- package/dist/{parser-AKBVJHMK.js → parser-ILWAA3QJ.js} +3 -3
- package/dist/{parser-AN3MGHRL.js → parser-KMFMNZYI.js} +3 -3
- package/dist/{parser-IMM2JJX3.js → parser-MDSVVCJP.js} +4 -4
- package/dist/{parser-OVQTTTUJ.js → parser-OFTMA36M.js} +2 -2
- package/dist/{parser-LGS65QPN.js → parser-Q3UAOLEZ.js} +2 -2
- package/dist/{parser-DGF3ZEO6.js → parser-QL4DEPVA.js} +4 -4
- package/dist/{parser-XYY5NHP4.js → parser-R6OETHWM.js} +2 -2
- package/dist/{parser-GEKPWSSK.js → parser-UEDPLM46.js} +3 -3
- package/dist/{parser-KZMALSB2.js → parser-UL6WN6W5.js} +4 -4
- package/dist/{parser-J4DVNL4W.js → parser-ULSUK36C.js} +4 -4
- package/dist/{parser-KZMJNKDW.js → parser-UY3K4ROB.js} +2 -2
- package/dist/{parser-KFYRTGTC.js → parser-UYQNNQKT.js} +4 -4
- package/dist/{parser-DHSFIUPU.js → parser-VG747VR6.js} +3 -3
- package/dist/{parser-UTXFJG4X.js → parser-VK4PNDX4.js} +3 -3
- package/dist/{parser-SA3RAJFS.js → parser-WSONWDFN.js} +2 -2
- package/dist/{parser-NPXPJHWN.js → parser-X5FQ36KJ.js} +3 -3
- package/dist/{parser-OKB64MMN.js → parser-XO5IAXMT.js} +3 -3
- package/dist/{parser-HCGXNHHL.js → parser-YVHO2NRM.js} +3 -3
- package/dist/{parser-P4TOQYNN.js → parser-YWZGIU3C.js} +3 -3
- package/dist/{parser-337TACHB.js → parser-ZFLSULFC.js} +3 -3
- package/dist/{parser-7OEE7QT6.js → parser-ZR7JAKSW.js} +2 -2
- package/dist/{renderer-CHQZES6G.js → renderer-3N64GVNM.js} +2 -2
- package/dist/{renderer-JR2XNZAH.js → renderer-43IVPARP.js} +5 -5
- package/dist/{renderer-J4OS77PK.js → renderer-4MEZYGU6.js} +3 -3
- package/dist/{renderer-IR5GGAPB.js → renderer-54GXA3UO.js} +11 -7
- package/dist/{renderer-7VQOKAII.js → renderer-7EAWN7MC.js} +6 -6
- package/dist/{renderer-QQHQY3GT.js → renderer-7SEXPBGM.js} +5 -5
- package/dist/{renderer-P4XCRNCY.js → renderer-B7B7BQM3.js} +9 -9
- package/dist/{renderer-7HOSI6JJ.js → renderer-I2LYSQBV.js} +4 -4
- package/dist/{renderer-6OQM32X3.js → renderer-IPDCAACY.js} +3 -3
- package/dist/{renderer-JRVY7HAD.js → renderer-J2LOMTBC.js} +4 -4
- package/dist/renderer-JUH6M3XF.js +46 -0
- package/dist/renderer-KY6O5JTX.js +80 -0
- package/dist/{renderer-FCXRDYSJ.js → renderer-LHTDI5RV.js} +7 -7
- package/dist/{renderer-XHEMXBQM.js → renderer-LWL3IJOF.js} +5 -5
- package/dist/{renderer-BLHN3RCY.js → renderer-MRMFYYZT.js} +2 -2
- package/dist/{renderer-DBNDLKPE.js → renderer-NCIDGJ2R.js} +7 -7
- package/dist/{renderer-3AD4NDF5.js → renderer-OPA4JJKX.js} +6 -6
- package/dist/{renderer-XFEZ5UBE.js → renderer-QMNC7TGN.js} +6 -6
- package/dist/{renderer-5GZNGZU5.js → renderer-QQNPJGAP.js} +9 -7
- package/dist/{renderer-CEIX5JPA.js → renderer-R7OYCJEA.js} +2 -2
- package/dist/{renderer-WQ654YT5.js → renderer-R7RK7FKI.js} +1 -1
- package/dist/{renderer-4JE5ORRO.js → renderer-RFP55AW7.js} +13 -10
- package/dist/{renderer-NAA7D33G.js → renderer-S3NFBJCY.js} +15 -11
- package/dist/{renderer-43ESBXVY.js → renderer-SD4ZHHAR.js} +8 -6
- package/dist/{renderer-WB75JME5.js → renderer-SE7Z5AOL.js} +6 -6
- package/dist/{renderer-YTEZK3GC.js → renderer-T2WUA7MC.js} +7 -7
- package/dist/{renderer-VYWCMRWA.js → renderer-TWKEZ3DD.js} +5 -5
- package/dist/{renderer-DCJ4AQ3N.js → renderer-U5PD72G7.js} +5 -5
- package/dist/{renderer-EAORWLVK.js → renderer-VCTKBUTR.js} +7 -7
- package/dist/{renderer-7L7J4DHO.js → renderer-VNZTWATB.js} +7 -6
- package/dist/{renderer-2ZQ6DPVD.js → renderer-YDNWK6RI.js} +2 -2
- package/dist/{renderer-VGQMJC5K.js → renderer-YDOWBIUB.js} +11 -10
- package/dist/{renderer-7MCC6GKH.js → renderer-YQPZ7O2C.js} +2 -2
- package/dist/{renderer-ZXQXRNDR.js → renderer-ZQ77CM6Y.js} +6 -6
- package/dist/{renderer-radial-NA5DVBG4.js → renderer-radial-TNNEL3YN.js} +5 -5
- package/dist/{resolver-XSXE2TRX.js → resolver-6DJLZF6Y.js} +1 -1
- package/dist/{state-parser-FE3RF6XY.js → state-parser-NIIVOU2Y.js} +4 -4
- package/dist/{state-renderer-4S2C2CHB.js → state-renderer-TVLEG32M.js} +14 -10
- package/dist/{themes-CzuBdx1T.d.ts → themes-Cm2YBcT8.d.ts} +38 -2
- package/docs/ai-integration.md +4 -3
- package/docs/language-reference.md +162 -12
- package/gallery/fixtures/sketch.dgmo +2 -2
- package/gallery/fixtures/whiteboard.dgmo +18 -0
- package/package.json +2 -1
- package/dist/chunk-6EK55ART.js +0 -116
- package/dist/chunk-HTNLLT34.js +0 -72
- package/dist/dgmo-router-7WANZOBD.js +0 -92
- package/dist/renderer-TJJGFQGT.js +0 -78
- package/dist/{chunk-3FCSOYN4.js → chunk-5P2L5QXE.js} +0 -0
- package/dist/{chunk-HJRP6PXL.js → chunk-BQVTV4LB.js} +0 -0
- package/dist/{chunk-LYRDIVSY.js → chunk-GLCMUTO5.js} +0 -0
- package/dist/{chunk-5LE2CTLS.js → chunk-NTJ5HVV6.js} +3 -3
|
@@ -98,7 +98,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
98
98
|
- **Always title it.** Every diagram gets a short title on the type-declaration line (`flowchart Checkout Flow`, `sequence Checkout`, `boxes-and-lines Service Map`) so it is self-describing — never leave the bare type keyword alone. Infer a fitting title from the request when the user gives none.
|
|
99
99
|
<!-- TITLE end -->
|
|
100
100
|
<!-- CATEGORIZE start -->
|
|
101
|
-
- **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family and sketch** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
|
|
101
|
+
- **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family and sketch** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, whiteboard, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
|
|
102
102
|
<!-- CATEGORIZE end -->
|
|
103
103
|
- **Keep labels short.** A few words per node. Move detail into notes or metadata, never a full sentence inside a label.
|
|
104
104
|
- **Let the defaults show.** Don't add `no-*` opt-outs unless the user asked to hide or disable something — they strip helpful labels, values, and color.
|
|
@@ -142,6 +142,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
142
142
|
| `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
|
|
143
143
|
| `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
|
|
144
144
|
| `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
|
|
145
|
+
| `whiteboard` | free-form infinite canvas: shapes, sticky notes, free arrows, text, images and freehand ink at pixel positions (canvas-drawn; AI writes all but ink) |
|
|
145
146
|
| `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
|
|
146
147
|
| `countdown` | live "N days until X" that ticks every second and is accurate on every load — trip dates, launches, deadlines; the only dynamic chart type |
|
|
147
148
|
| `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
|
|
@@ -384,6 +385,52 @@ One legacy form changed with this spec:
|
|
|
384
385
|
|
|
385
386
|
No code migration is required for in-arrow label character escaping — any label that was valid before remains valid, with one exception: if your label happened to contain the literal substring `->` or `~>`, the parser now rejects it with `E_ARROW_SUBSTRING_IN_LABEL`. Move those labels to the post-colon form.
|
|
386
387
|
|
|
388
|
+
### 1.10 The Palette Line
|
|
389
|
+
|
|
390
|
+
`palette` works on **every** chart type and is rare: most diagrams never carry one and take the palette of wherever they are shown. It goes at the **bottom** of the file. The line is lifted out before the chart is parsed, so it never becomes a node, task or row. Lowercase only — `Palette 70` stays a data row.
|
|
391
|
+
|
|
392
|
+
```
|
|
393
|
+
palette nord // a built-in palette, in the reader's own light/dark
|
|
394
|
+
palette nord dark // a built-in, pinned to dark (or light)
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
Built-in palettes: `atlas`, `blueprint`, `catppuccin`, `nord`, `slate`, `tidewater`, `tokyo-night`.
|
|
398
|
+
|
|
399
|
+
A palette of your own is an indented block — the same content as a desktop theme file. Each `light` / `dark` section holds the twelve role keys and a `colors` section with the eleven colour names; a block with only one section is that mode only. **Hex is allowed inside this block and nowhere else.**
|
|
400
|
+
|
|
401
|
+
```
|
|
402
|
+
palette Dracula
|
|
403
|
+
dark
|
|
404
|
+
bg #282a36
|
|
405
|
+
surface #343746
|
|
406
|
+
overlay #44475a
|
|
407
|
+
border #6272a4
|
|
408
|
+
text #f8f8f2
|
|
409
|
+
text-muted #bfbfbf
|
|
410
|
+
text-on-fill-light #f8f8f2
|
|
411
|
+
text-on-fill-dark #282a36
|
|
412
|
+
primary #bd93f9
|
|
413
|
+
secondary #8be9fd
|
|
414
|
+
accent #ff79c6
|
|
415
|
+
destructive #ff5555
|
|
416
|
+
colors
|
|
417
|
+
red #ff5555
|
|
418
|
+
orange #ffb86c
|
|
419
|
+
yellow #f1fa8c
|
|
420
|
+
green #50fa7b
|
|
421
|
+
blue #6272a4
|
|
422
|
+
purple #bd93f9
|
|
423
|
+
teal #8be9fd
|
|
424
|
+
cyan #8be9fd
|
|
425
|
+
gray #6272a4
|
|
426
|
+
black #21222c
|
|
427
|
+
white #f8f8f2
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
A block must have every key, hex only, text readable on its fills, and a name that is not a built-in. One that fails is not drawn: the diagram uses the next palette down, with a warning on the line at fault. An unknown name warns the same way.
|
|
431
|
+
|
|
432
|
+
**Who wins**, highest first: an explicit choice where the diagram is shown (a fence `palette=` attribute, `--palette` on the command line), then the file's palette, then the site's or app's own setting, then Slate. `theme` is retired — the mode word on the palette line does its job.
|
|
433
|
+
|
|
387
434
|
---
|
|
388
435
|
|
|
389
436
|
## 2. Universal Name Handling
|
|
@@ -3016,7 +3063,7 @@ Nice-to-haves p: Low collapsed
|
|
|
3016
3063
|
| `active-tag GroupName` | Sets the default active tag group. |
|
|
3017
3064
|
| `color-by-depth` | Bare flag; colour nodes by depth instead of by tag (off by default). |
|
|
3018
3065
|
|
|
3019
|
-
|
|
3066
|
+
The `palette` line applies as elsewhere (§1.10).
|
|
3020
3067
|
|
|
3021
3068
|
---
|
|
3022
3069
|
|
|
@@ -3482,7 +3529,7 @@ tag Channel as ch
|
|
|
3482
3529
|
| Directive | Effect |
|
|
3483
3530
|
| ---------------------- | ----------------------------------------------- |
|
|
3484
3531
|
| `active-tag GroupName` | Set the active tag group for step-card coloring |
|
|
3485
|
-
| `palette
|
|
3532
|
+
| `palette` | The universal palette line (§1.10) |
|
|
3486
3533
|
|
|
3487
3534
|
### Flat Mode
|
|
3488
3535
|
|
|
@@ -3864,7 +3911,7 @@ In the desktop app a block diagram is interactive: click a container header to c
|
|
|
3864
3911
|
|
|
3865
3912
|
<!-- TIPS start -->
|
|
3866
3913
|
|
|
3867
|
-
**Styling tips:** Sketch is a GUI-authored format — the desktop and web canvas editors generate this markup, so hand-writing it is the exception. If you generate it anyway: keep it SMALL (sketches read best under ~15 shapes), and either omit `at:` everywhere (shapes flow into rows) or use integer half-slot coordinates with shapes **at least 3 half-slots apart** on one axis (a footprint spans 2 half-units and the mandatory gap adds 1 more, so each shape claims a 3×3 block; 2 apart overlaps). A `[Box]` may hold another `[Box]`, to **depth 2** — a third level is refused and its shapes join the box above it. Alias any shape an edge references (`as con`). Never write `size:`, colors, fonts
|
|
3914
|
+
**Styling tips:** Sketch is a GUI-authored format — the desktop and web canvas editors generate this markup, so hand-writing it is the exception. If you generate it anyway: keep it SMALL (sketches read best under ~15 shapes), and either omit `at:` everywhere (shapes flow into rows) or use integer half-slot coordinates with shapes **at least 3 half-slots apart** on one axis (a footprint spans 2 half-units and the mandatory gap adds 1 more, so each shape claims a 3×3 block; 2 apart overlaps). A `[Box]` may hold another `[Box]`, to **depth 2** — a third level is refused and its shapes join the box above it. Alias any shape an edge references (`as con`). Never write `size:`, `shape:`, colors, or fonts — every shape is the same plain card. In sketch, `~` dashed means secondary emphasis, NOT async. Categorize with a tag group — kind-of-thing is meaning, and meaning lives in tags. Reach for `sketch` when the drawing itself is the content; reach for `boxes-and-lines` when topology should auto-lay-out.
|
|
3868
3915
|
|
|
3869
3916
|
<!-- TIPS end -->
|
|
3870
3917
|
|
|
@@ -3892,9 +3939,9 @@ Captain's Console as con at: 2 0, crew: Deck
|
|
|
3892
3939
|
Divvy Service as dvy at: 4 0, crew: Hold
|
|
3893
3940
|
|
|
3894
3941
|
[Below Decks] at: 2 2, crew: Hold
|
|
3895
|
-
Booty Queue as bq
|
|
3942
|
+
Booty Queue as bq at: 0 0
|
|
3896
3943
|
~haul~> dvy
|
|
3897
|
-
Ship Ledger as ledger
|
|
3944
|
+
Ship Ledger as ledger at: 2 0
|
|
3898
3945
|
|
|
3899
3946
|
[Armory] as armory at: 0 2, collapsed
|
|
3900
3947
|
Powder Store at: 0 0
|
|
@@ -3902,7 +3949,7 @@ Divvy Service as dvy at: 4 0, crew: Hold
|
|
|
3902
3949
|
|
|
3903
3950
|
### Shapes
|
|
3904
3951
|
|
|
3905
|
-
One top-level line = one shape — a **bare name** plus same-line `key: value` metadata.
|
|
3952
|
+
One top-level line = one shape — a **bare name** plus same-line `key: value` metadata. Every shape is the same plain card — there are no shape kinds, and a `shape:` clause is an error (`E_SKETCH_SHAPE_UNSUPPORTED`); the shape still draws, without it. Duplicate labels are legal **when aliased** (`Cache as c1` / `Cache as c2`); unaliased duplicates merge (standard dgmo semantics).
|
|
3906
3953
|
|
|
3907
3954
|
### Coordinates — `at: C R`
|
|
3908
3955
|
|
|
@@ -3920,7 +3967,6 @@ Indented under the source shape, targeting an alias (or an unambiguous bare labe
|
|
|
3920
3967
|
|
|
3921
3968
|
| Key | Type | Default | Description |
|
|
3922
3969
|
| ----------- | -------------- | ----------------------- | -------------------------------------------------------- |
|
|
3923
|
-
| `shape` | closed set | rectangle | `database` / `queue` / `person` / `document` / `note` |
|
|
3924
3970
|
| `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
|
|
3925
3971
|
| `collapsed` | flag | — | Box only — start folded (collapse-bar) |
|
|
3926
3972
|
| `<tag>` | declared value | untagged (neutral gray) | Tag value (cascades from box; edge tails color the line) |
|
|
@@ -3937,6 +3983,110 @@ In the desktop and web app a sketch opens in the **canvas editor** (the code pan
|
|
|
3937
3983
|
|
|
3938
3984
|
---
|
|
3939
3985
|
|
|
3986
|
+
## 24Ea. Whiteboard Diagrams
|
|
3987
|
+
|
|
3988
|
+
<!-- TYPE:whiteboard -->
|
|
3989
|
+
|
|
3990
|
+
**Beta — expect rough edges and syntax changes.**
|
|
3991
|
+
|
|
3992
|
+
<!-- TIPS start -->
|
|
3993
|
+
|
|
3994
|
+
**Styling tips:** Whiteboard is a canvas-first format: people draw on it, and pen strokes (`ink` lines) only ever come from drawing — never write an `ink` line. Generate the readable parts only: `rectangle`, `ellipse`, `database`, `queue` with a label, `at: X Y` (top-left, integer pixels) and `size: W H`; `arrow` with `from: X Y, to: X Y` and an optional label, or `line` the same way for a connection with no head; add `style: dashed` to an arrow or line for a tentative or optional link; `heads: both` for a two-way arrow; `bend: 40` (px, sign picks the side) to curve a link around something in its way; `text` at a point; `note` with `at: X Y` for a sticky-note comment or open question (a 160 × 99 yellow card by default; `size:` and `color:` are optional). A shape label or a note wraps to its width on its own, so never break a sentence by hand to fit; for separate lines (a heading, a list), drop the inline label and indent each line two spaces under the element line. Leave ~40px between shapes and keep boards small (under ~15 elements). Colours are palette names (red, green, blue, teal, purple, orange, yellow, cyan, gray); leave colour off for the default ink. An arrow or line end placed inside a shape or note attaches to it and is drawn to its border, so point ends at shape centres. `no-notes` hides every note when the board is shown. Reach for `whiteboard` for a loose drawing someone will scribble over; reach for `sketch` for tagged shapes on a grid, and `boxes-and-lines` when topology should auto-lay-out.
|
|
3995
|
+
|
|
3996
|
+
<!-- TIPS end -->
|
|
3997
|
+
|
|
3998
|
+
A **free-form whiteboard** on an infinite canvas: rectangles, ellipses, databases, queues, sticky notes, free arrows and lines, text, pasted images and freehand ink, each at absolute pixel positions. Shapes are clean vector outlines; only ink looks hand-made. The export is cropped to the drawing plus a margin. Element order is drawing order — later lines draw on top.
|
|
3999
|
+
|
|
4000
|
+
### Declaration
|
|
4001
|
+
|
|
4002
|
+
```
|
|
4003
|
+
whiteboard [Title]
|
|
4004
|
+
```
|
|
4005
|
+
|
|
4006
|
+
### Example
|
|
4007
|
+
|
|
4008
|
+
```
|
|
4009
|
+
whiteboard Login ideas
|
|
4010
|
+
rectangle Sign in at: 60 60, size: 180 70
|
|
4011
|
+
ellipse OAuth? at: 345 53, size: 170 84, color: blue
|
|
4012
|
+
arrow from: 150 95, to: 430 95
|
|
4013
|
+
rectangle Magic link at: 60 250, size: 180 70, color: green
|
|
4014
|
+
arrow emails a code from: 150 95, to: 150 285, color: green
|
|
4015
|
+
database Users at: 420 160, size: 140 100, color: purple
|
|
4016
|
+
queue Email jobs at: 300 380, size: 200 64, color: orange
|
|
4017
|
+
arrow from: 150 285, to: 400 412, color: orange, style: dashed
|
|
4018
|
+
line from: 60 340, to: 240 340, style: dashed
|
|
4019
|
+
text keep it to ONE screen at: 62 184
|
|
4020
|
+
text 2FA here?? at: 560 -4, color: red
|
|
4021
|
+
note ask legal about SSO at: 600 300
|
|
4022
|
+
```
|
|
4023
|
+
|
|
4024
|
+
### Elements
|
|
4025
|
+
|
|
4026
|
+
One line = one element, led by its keyword. The label is a **bare name** before the first `key:`; metadata is same-line `key: value` pairs. Quote a label that itself contains `word:` (`text "todo: ship" at: 0 0`).
|
|
4027
|
+
|
|
4028
|
+
A label can run over several lines: indent them under the element line. An inline label, when present, is the first line. This works on every labelled element — shapes, `note`, `arrow`, `line` and `text`:
|
|
4029
|
+
|
|
4030
|
+
```
|
|
4031
|
+
whiteboard
|
|
4032
|
+
rectangle at: 0 0, size: 140 60
|
|
4033
|
+
Sign in
|
|
4034
|
+
with email
|
|
4035
|
+
text at: 0 90
|
|
4036
|
+
keep it to
|
|
4037
|
+
ONE screen
|
|
4038
|
+
```
|
|
4039
|
+
|
|
4040
|
+
Body lines are literal — trimmed, but never read as metadata, quotes or comments. A blank line between two of them is an empty line of the label. `image` and `ink` take no indented lines; any are ignored with a warning.
|
|
4041
|
+
|
|
4042
|
+
A **shape** label, and a note's text, wraps to its width: each written line is kept and wraps on its own, so a long line breaks at words inside the box. Arrow, line and `text` labels never wrap — each written line is drawn as written.
|
|
4043
|
+
|
|
4044
|
+
| Line | Meaning |
|
|
4045
|
+
| -------------------------------------- | ----------------------------------------------------------------------------------- |
|
|
4046
|
+
| `rectangle <label> at: X Y, size: W H` | Box; label centred, wrapped to the box |
|
|
4047
|
+
| `ellipse <label> at: X Y, size: W H` | Ellipse inside that box |
|
|
4048
|
+
| `database <label> at: X Y, size: W H` | Upright cylinder |
|
|
4049
|
+
| `queue <label> at: X Y, size: W H` | Cylinder on its side |
|
|
4050
|
+
| `note <text> at: X Y[, size: W H]` | Sticky note: tinted card, text top-left, wrapped; default 160 × 120, yellow |
|
|
4051
|
+
| `arrow <label> from: X Y, to: X Y` | Arrow, head at `to:`; label optional, drawn at the midpoint |
|
|
4052
|
+
| `line <label> from: X Y, to: X Y` | Free line — an arrow with no head; otherwise identical |
|
|
4053
|
+
| `text <words> at: X Y` | Free text; `at:` is the top-left of its first line |
|
|
4054
|
+
| `image <ref> at: X Y, size: W H` | Picture; `<ref>` is a relative path (`board.assets/9f3c.webp`) or an `https://` URL |
|
|
4055
|
+
| `ink <colour> <width> <path>` | One freehand stroke — **canvas-written only** |
|
|
4056
|
+
|
|
4057
|
+
An `arrow` or `line` end inside a shape or a sticky note attaches to it and is drawn to its border (topmost wins; not when both ends are inside the same one).
|
|
4058
|
+
|
|
4059
|
+
The label is optional on shapes, notes, arrows and lines. `at:` is a top-left corner in canvas pixels; every number is an integer and may be negative. `size:` is width then height, each at least 1.
|
|
4060
|
+
|
|
4061
|
+
Arrows and lines take `style: dashed` for a dashed stroke. Solid is the default and is never written; `dashed` is the only value `style:` accepts.
|
|
4062
|
+
|
|
4063
|
+
An `arrow` takes `heads: both` for a head at each end. Arrows and lines take `bend: N` (whole px) to curve: the curve's middle sits `N` px to the right of travel from `from:` to `to:` (negative bends left); `0` is straight and never written. There are no elbow connectors. Shapes take `fill: solid` (filled with their colour) or `fill: outline` (hollow); the pale `tint` is the default and never written.
|
|
4064
|
+
|
|
4065
|
+
### Colours
|
|
4066
|
+
|
|
4067
|
+
`color:` takes a palette **name**: `ink` (the default, never written — the theme's text colour, near-black on light and near-white on dark), `red`, `green`, `blue`, `teal`, `purple`, `orange`, `yellow`, `cyan`, `gray`. Each takes the palette's own light or dark shade. No hex values. A `note` defaults to `yellow` instead of `ink`, and writes `color:` only when it is not yellow.
|
|
4068
|
+
|
|
4069
|
+
### Images
|
|
4070
|
+
|
|
4071
|
+
An image whose ref cannot be loaded — a local file that is not there, or a copied fence — draws a plain box at its size labelled _image not uploaded_. It is never an error.
|
|
4072
|
+
|
|
4073
|
+
### Directives
|
|
4074
|
+
|
|
4075
|
+
| Directive | Effect |
|
|
4076
|
+
| ---------- | ------------------------------------------------------ |
|
|
4077
|
+
| `no-title` | Keep the title in the source; do not draw it. |
|
|
4078
|
+
| `no-notes` | Keep the sticky notes in the source; do not draw them. |
|
|
4079
|
+
|
|
4080
|
+
### Sticky notes
|
|
4081
|
+
|
|
4082
|
+
`note` drops a sticky note: a tinted card with its text top-left, wrapped to the card. `size:` is optional (default 160 × 120) and `color:` defaults to `yellow`. An empty `note at: X Y` is valid. Notes are an overlay layer — `no-notes` hides every note, and a host can show or hide them whatever the directive says (the `showNotes` render option). A hidden note is not drawn, takes no room in the crop, and no arrow end attaches to it.
|
|
4083
|
+
|
|
4084
|
+
### Leniency
|
|
4085
|
+
|
|
4086
|
+
A malformed line is a warning and is skipped; the rest of the board renders. Only a first line that is not `whiteboard` is an error; a board with no elements is a blank canvas and is valid.
|
|
4087
|
+
|
|
4088
|
+
---
|
|
4089
|
+
|
|
3940
4090
|
## 24E. Goal
|
|
3941
4091
|
|
|
3942
4092
|
<!-- TYPE:goal -->
|
|
@@ -4295,10 +4445,10 @@ Pick destination
|
|
|
4295
4445
|
|
|
4296
4446
|
### Directives
|
|
4297
4447
|
|
|
4298
|
-
| Directive
|
|
4299
|
-
|
|
|
4300
|
-
| `roles`
|
|
4301
|
-
| `
|
|
4448
|
+
| Directive | Effect |
|
|
4449
|
+
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
4450
|
+
| `roles` | Declare column order. Inline (`roles Cap, QM, Bos`) is name-only; the indented block form supports per-role color via the trailing-token form (`Cap red`). When present, unknown roles in tasks emit `W_RACI_UNKNOWN_ROLE`. |
|
|
4451
|
+
| `active-tag` | Universal option; `palette` is the universal line (§1.10). |
|
|
4302
4452
|
|
|
4303
4453
|
### Phase metadata
|
|
4304
4454
|
|
|
@@ -13,9 +13,9 @@ Divvy Service as dvy at: 4 0, crew: Hold
|
|
|
13
13
|
-entries-> ledger
|
|
14
14
|
|
|
15
15
|
[Below Decks] at: 2 2, crew: Hold
|
|
16
|
-
Booty Queue as bq
|
|
16
|
+
Booty Queue as bq at: 0 0
|
|
17
17
|
~haul~> dvy
|
|
18
|
-
Ship Ledger as ledger
|
|
18
|
+
Ship Ledger as ledger at: 2 0
|
|
19
19
|
|
|
20
20
|
[Armory] as armory at: 0 2, collapsed
|
|
21
21
|
Powder Store at: 0 0
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
whiteboard Login ideas
|
|
2
|
+
rectangle Sign in at: 60 60, size: 180 70
|
|
3
|
+
ellipse OAuth? at: 345 53, size: 170 84, color: blue
|
|
4
|
+
arrow from: 150 95, to: 430 95, heads: both
|
|
5
|
+
rectangle Magic link at: 60 250, size: 180 70, color: green
|
|
6
|
+
arrow emails a code from: 150 95, to: 150 285, color: green
|
|
7
|
+
database Users at: 420 160, size: 140 100, color: purple, fill: solid
|
|
8
|
+
queue Email jobs at: 300 380, size: 200 64, color: orange
|
|
9
|
+
arrow from: 150 285, to: 400 412, color: orange, bend: 50
|
|
10
|
+
text keep it to ONE screen at: 62 184
|
|
11
|
+
text 2FA here?? at: 560 -4, color: red
|
|
12
|
+
note at: 560 400
|
|
13
|
+
Ask legal whether SSO needs a security review
|
|
14
|
+
- Sam
|
|
15
|
+
image login-ideas.assets/9f3c2a71.webp at: 620 200, size: 250 170
|
|
16
|
+
ink ink 2.5 AHysAxoGEgIUAyYJFAESAi4MEgIUAyYJFAESAjQOGgE
|
|
17
|
+
ink red 3 ALwKUAEKBQoNCA8IKwwxBDMDKwkRBwsJBwkBCQgNCgkkDyQHHAE4ATQIFgYaDAwKCBABCgsO
|
|
18
|
+
ink green 4 AZwE2AQYJDAWaqMBHQ
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diagrammo/dgmo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.91.0",
|
|
4
4
|
"description": "DGMO diagram markup language — parser, renderer, and color system",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Diagrammo LLC",
|
|
@@ -141,6 +141,7 @@
|
|
|
141
141
|
"d3-shape": "^3.2.0",
|
|
142
142
|
"jsdom": "^29.1.1",
|
|
143
143
|
"lz-string": "^1.5.0",
|
|
144
|
+
"perfect-freehand": "1.2.3",
|
|
144
145
|
"topojson-client": "^3.1.0"
|
|
145
146
|
},
|
|
146
147
|
"pnpm": {
|
package/dist/chunk-6EK55ART.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
NOTE_GAP
|
|
3
|
-
} from "./chunk-5DH3KYFH.js";
|
|
4
|
-
|
|
5
|
-
// src/utils/notes/place.ts
|
|
6
|
-
var NOTE_CLEAR = 14;
|
|
7
|
-
var intersects = (a, b, pad) => !(a.right + pad <= b.left || b.right + pad <= a.left || a.bottom + pad <= b.top || b.bottom + pad <= a.top);
|
|
8
|
-
function placeNotes(obstacles, requests, direction) {
|
|
9
|
-
const placements = /* @__PURE__ */ new Map();
|
|
10
|
-
const occupied = obstacles.map((p) => ({
|
|
11
|
-
left: p.x - p.width / 2,
|
|
12
|
-
top: p.y - p.height / 2,
|
|
13
|
-
right: p.x + p.width / 2,
|
|
14
|
-
bottom: p.y + p.height / 2
|
|
15
|
-
}));
|
|
16
|
-
for (const req of requests) {
|
|
17
|
-
if (req.collapsed) {
|
|
18
|
-
placements.set(req.key, {
|
|
19
|
-
collapsed: true,
|
|
20
|
-
side: "right",
|
|
21
|
-
x: 0,
|
|
22
|
-
y: 0
|
|
23
|
-
});
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
const p = req.node;
|
|
27
|
-
const cx = p.x;
|
|
28
|
-
const cy = p.y;
|
|
29
|
-
const nodeLeft = cx - p.width / 2;
|
|
30
|
-
const nodeRight = cx + p.width / 2;
|
|
31
|
-
const nodeTop = cy - p.height / 2;
|
|
32
|
-
const nodeBottom = cy + p.height / 2;
|
|
33
|
-
const { noteW, noteH } = req;
|
|
34
|
-
const rectFor = (side) => {
|
|
35
|
-
switch (side) {
|
|
36
|
-
case "right": {
|
|
37
|
-
const left = nodeRight + NOTE_GAP;
|
|
38
|
-
const top = cy - noteH / 2;
|
|
39
|
-
return { left, top, right: left + noteW, bottom: top + noteH };
|
|
40
|
-
}
|
|
41
|
-
case "left": {
|
|
42
|
-
const right = nodeLeft - NOTE_GAP;
|
|
43
|
-
const top = cy - noteH / 2;
|
|
44
|
-
return { left: right - noteW, top, right, bottom: top + noteH };
|
|
45
|
-
}
|
|
46
|
-
case "below": {
|
|
47
|
-
const left = cx - noteW / 2;
|
|
48
|
-
const top = nodeBottom + NOTE_GAP;
|
|
49
|
-
return { left, top, right: left + noteW, bottom: top + noteH };
|
|
50
|
-
}
|
|
51
|
-
case "above":
|
|
52
|
-
default: {
|
|
53
|
-
const left = cx - noteW / 2;
|
|
54
|
-
const bottom = nodeTop - NOTE_GAP;
|
|
55
|
-
return { left, top: bottom - noteH, right: left + noteW, bottom };
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
const order = direction === "LR" ? ["below", "above"] : ["right", "left"];
|
|
60
|
-
let chosen = null;
|
|
61
|
-
for (const side of order) {
|
|
62
|
-
const rect = rectFor(side);
|
|
63
|
-
if (!occupied.some((o) => intersects(rect, o, NOTE_CLEAR))) {
|
|
64
|
-
chosen = { rect, side };
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (!chosen) {
|
|
69
|
-
const side = order[0];
|
|
70
|
-
let rect = rectFor(side);
|
|
71
|
-
const axisIsY = side === "above" || side === "below";
|
|
72
|
-
const outward = side === "below" || side === "right" ? 1 : -1;
|
|
73
|
-
for (let guard = 0; guard < 50; guard++) {
|
|
74
|
-
const blockers = occupied.filter(
|
|
75
|
-
(o) => intersects(rect, o, NOTE_CLEAR)
|
|
76
|
-
);
|
|
77
|
-
if (blockers.length === 0) break;
|
|
78
|
-
if (axisIsY && outward > 0) {
|
|
79
|
-
const top = Math.max(...blockers.map((b) => b.bottom)) + NOTE_CLEAR;
|
|
80
|
-
rect = { ...rect, top, bottom: top + noteH };
|
|
81
|
-
} else if (axisIsY) {
|
|
82
|
-
const bottom = Math.min(...blockers.map((b) => b.top)) - NOTE_CLEAR;
|
|
83
|
-
rect = { ...rect, bottom, top: bottom - noteH };
|
|
84
|
-
} else if (outward > 0) {
|
|
85
|
-
const left = Math.max(...blockers.map((b) => b.right)) + NOTE_CLEAR;
|
|
86
|
-
rect = { ...rect, left, right: left + noteW };
|
|
87
|
-
} else {
|
|
88
|
-
const right = Math.min(...blockers.map((b) => b.left)) - NOTE_CLEAR;
|
|
89
|
-
rect = { ...rect, right, left: right - noteW };
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
chosen = { rect, side };
|
|
93
|
-
}
|
|
94
|
-
occupied.push(chosen.rect);
|
|
95
|
-
placements.set(req.key, {
|
|
96
|
-
collapsed: false,
|
|
97
|
-
side: chosen.side,
|
|
98
|
-
x: chosen.rect.left - p.x,
|
|
99
|
-
y: chosen.rect.top - p.y
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return placements;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// src/utils/notes/bounds.ts
|
|
106
|
-
function noteCanvasShift(minX, minY, margin = 20) {
|
|
107
|
-
return {
|
|
108
|
-
shiftX: minX < 0 ? margin - minX : 0,
|
|
109
|
-
shiftY: minY < 0 ? margin - minY : 0
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export {
|
|
114
|
-
placeNotes,
|
|
115
|
-
noteCanvasShift
|
|
116
|
-
};
|
package/dist/chunk-HTNLLT34.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
placeNotes
|
|
3
|
-
} from "./chunk-6EK55ART.js";
|
|
4
|
-
import {
|
|
5
|
-
noteBoxSize
|
|
6
|
-
} from "./chunk-RJNZHFNG.js";
|
|
7
|
-
|
|
8
|
-
// src/utils/notes/build.ts
|
|
9
|
-
function buildPlacedNotes(anchors, noteByNode, direction, collapsedNotes) {
|
|
10
|
-
const placed = /* @__PURE__ */ new Map();
|
|
11
|
-
if (noteByNode.size === 0) return placed;
|
|
12
|
-
const geoms = /* @__PURE__ */ new Map();
|
|
13
|
-
const requests = [];
|
|
14
|
-
for (const a of anchors) {
|
|
15
|
-
const note = noteByNode.get(a.id);
|
|
16
|
-
if (!note) continue;
|
|
17
|
-
const size = noteBoxSize(note.body);
|
|
18
|
-
geoms.set(a.id, {
|
|
19
|
-
noteW: size.width,
|
|
20
|
-
noteH: size.height,
|
|
21
|
-
...note.color && { color: note.color },
|
|
22
|
-
lines: size.lines,
|
|
23
|
-
lineNumber: note.lineNumber,
|
|
24
|
-
endLineNumber: note.endLineNumber
|
|
25
|
-
});
|
|
26
|
-
requests.push({
|
|
27
|
-
key: a.id,
|
|
28
|
-
node: { x: a.x, y: a.y, width: a.width, height: a.height },
|
|
29
|
-
noteW: size.width,
|
|
30
|
-
noteH: size.height,
|
|
31
|
-
collapsed: collapsedNotes?.has(note.lineNumber) ?? false
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const placements = placeNotes(
|
|
35
|
-
anchors.map((a) => ({ x: a.x, y: a.y, width: a.width, height: a.height })),
|
|
36
|
-
requests,
|
|
37
|
-
direction
|
|
38
|
-
);
|
|
39
|
-
for (const [id, g] of geoms) {
|
|
40
|
-
const p = placements.get(id);
|
|
41
|
-
placed.set(
|
|
42
|
-
id,
|
|
43
|
-
p.collapsed ? {
|
|
44
|
-
x: 0,
|
|
45
|
-
y: 0,
|
|
46
|
-
width: 0,
|
|
47
|
-
height: 0,
|
|
48
|
-
side: "right",
|
|
49
|
-
...g.color && { color: g.color },
|
|
50
|
-
lines: [],
|
|
51
|
-
lineNumber: g.lineNumber,
|
|
52
|
-
endLineNumber: g.endLineNumber,
|
|
53
|
-
collapsed: true
|
|
54
|
-
} : {
|
|
55
|
-
x: p.x,
|
|
56
|
-
y: p.y,
|
|
57
|
-
width: g.noteW,
|
|
58
|
-
height: g.noteH,
|
|
59
|
-
side: p.side,
|
|
60
|
-
...g.color && { color: g.color },
|
|
61
|
-
lines: g.lines,
|
|
62
|
-
lineNumber: g.lineNumber,
|
|
63
|
-
endLineNumber: g.endLineNumber
|
|
64
|
-
}
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
return placed;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export {
|
|
71
|
-
buildPlacedNotes
|
|
72
|
-
};
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CHART_TYPE_DESCRIPTIONS,
|
|
3
|
-
chartTypeParsers,
|
|
4
|
-
getAllChartTypes,
|
|
5
|
-
getRenderCategory,
|
|
6
|
-
isExtendedChartType,
|
|
7
|
-
knownChartTypeIds,
|
|
8
|
-
parseDgmo
|
|
9
|
-
} from "./chunk-Q6SQISHT.js";
|
|
10
|
-
import "./chunk-EOYPX6SF.js";
|
|
11
|
-
import "./chunk-WP2RLGDI.js";
|
|
12
|
-
import "./chunk-A2RUBBVT.js";
|
|
13
|
-
import "./chunk-ZUCXFXLD.js";
|
|
14
|
-
import "./chunk-47E5UTXE.js";
|
|
15
|
-
import "./chunk-7UDAIP6W.js";
|
|
16
|
-
import "./chunk-2CW5ZTNH.js";
|
|
17
|
-
import "./chunk-BDXC7MDK.js";
|
|
18
|
-
import "./chunk-WQ6G6FFM.js";
|
|
19
|
-
import "./chunk-B3S76BZO.js";
|
|
20
|
-
import "./chunk-PIXJL77H.js";
|
|
21
|
-
import "./chunk-3C2FWS2J.js";
|
|
22
|
-
import "./chunk-P3SKSKJI.js";
|
|
23
|
-
import "./chunk-MY6GUH26.js";
|
|
24
|
-
import "./chunk-XSVWUOUZ.js";
|
|
25
|
-
import "./chunk-BOO24UMJ.js";
|
|
26
|
-
import "./chunk-JQ57AWDL.js";
|
|
27
|
-
import "./chunk-WFA6IULY.js";
|
|
28
|
-
import "./chunk-3DPOIW3W.js";
|
|
29
|
-
import "./chunk-HTWH2XQL.js";
|
|
30
|
-
import "./chunk-MHAYUS65.js";
|
|
31
|
-
import "./chunk-RU725VCJ.js";
|
|
32
|
-
import "./chunk-DV2VEJCC.js";
|
|
33
|
-
import "./chunk-C7QRRTAW.js";
|
|
34
|
-
import "./chunk-FKZ2Y3Q5.js";
|
|
35
|
-
import "./chunk-QQJUTGQH.js";
|
|
36
|
-
import "./chunk-NGC3IZRY.js";
|
|
37
|
-
import "./chunk-6K7RODXG.js";
|
|
38
|
-
import "./chunk-66YFDTT6.js";
|
|
39
|
-
import "./chunk-GDJW64XE.js";
|
|
40
|
-
import "./chunk-QFHWYWQL.js";
|
|
41
|
-
import "./chunk-DPSMX4EY.js";
|
|
42
|
-
import "./chunk-GSYZZFI5.js";
|
|
43
|
-
import "./chunk-GUTZCRBT.js";
|
|
44
|
-
import "./chunk-ITSBBQTH.js";
|
|
45
|
-
import {
|
|
46
|
-
looksLikeC4,
|
|
47
|
-
looksLikeGantt,
|
|
48
|
-
parseDgmoChartType
|
|
49
|
-
} from "./chunk-K5XT7NHD.js";
|
|
50
|
-
import "./chunk-3RYBTEF5.js";
|
|
51
|
-
import "./chunk-JVZ7KFAX.js";
|
|
52
|
-
import "./chunk-2SKMEL7V.js";
|
|
53
|
-
import "./chunk-7WGCQE2E.js";
|
|
54
|
-
import "./chunk-EQW6HOP4.js";
|
|
55
|
-
import "./chunk-DAOFNU6J.js";
|
|
56
|
-
import "./chunk-NIUO2TNR.js";
|
|
57
|
-
import "./chunk-LFKSHDVI.js";
|
|
58
|
-
import "./chunk-C3Z4DX3V.js";
|
|
59
|
-
import "./chunk-JRUEIRJB.js";
|
|
60
|
-
import "./chunk-7TF3QOOD.js";
|
|
61
|
-
import "./chunk-AYOVY75O.js";
|
|
62
|
-
import "./chunk-NXMESY4J.js";
|
|
63
|
-
import "./chunk-MFW6P7WH.js";
|
|
64
|
-
import "./chunk-WPL5PFXE.js";
|
|
65
|
-
import "./chunk-J64NZ6NF.js";
|
|
66
|
-
import "./chunk-O753JUEZ.js";
|
|
67
|
-
import "./chunk-N7VMGZCU.js";
|
|
68
|
-
import "./chunk-FJNXXGTR.js";
|
|
69
|
-
import "./chunk-UG2XG57E.js";
|
|
70
|
-
import "./chunk-IYULMRBE.js";
|
|
71
|
-
import "./chunk-NOTA6TEI.js";
|
|
72
|
-
import "./chunk-HSRQDWV7.js";
|
|
73
|
-
import "./chunk-4WW3SGMH.js";
|
|
74
|
-
import "./chunk-L5AFONQU.js";
|
|
75
|
-
import "./chunk-44GP7PD5.js";
|
|
76
|
-
import "./chunk-5NU7NII2.js";
|
|
77
|
-
import "./chunk-L24LESXF.js";
|
|
78
|
-
import "./chunk-2M4IGSCY.js";
|
|
79
|
-
import "./chunk-BYU54C3S.js";
|
|
80
|
-
import "./chunk-5WRI5ZAA.js";
|
|
81
|
-
export {
|
|
82
|
-
CHART_TYPE_DESCRIPTIONS,
|
|
83
|
-
chartTypeParsers,
|
|
84
|
-
getAllChartTypes,
|
|
85
|
-
getRenderCategory,
|
|
86
|
-
isExtendedChartType,
|
|
87
|
-
knownChartTypeIds,
|
|
88
|
-
looksLikeC4,
|
|
89
|
-
looksLikeGantt,
|
|
90
|
-
parseDgmo,
|
|
91
|
-
parseDgmoChartType
|
|
92
|
-
};
|