@diagrammo/dgmo 0.48.2 → 0.50.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/.cursorrules +12 -3
- package/.github/copilot-instructions.md +12 -3
- package/.windsurfrules +12 -3
- package/SKILL.md +12 -3
- package/dist/advanced.d.ts +851 -1
- package/dist/advanced.js +601 -177
- package/dist/auto.css +63 -0
- package/dist/auto.js +220 -110
- package/dist/auto.mjs +45920 -33167
- package/dist/block.css +63 -0
- package/dist/block.d.ts +13 -5
- package/dist/block.js +239 -62
- package/dist/{charts-d3-QOZHKTCT.js → charts-d3-DKUD7MQE.js} +9 -8
- package/dist/{chunk-3MQQNXPD.js → chunk-2C56LEML.js} +3 -3
- package/dist/{chunk-L66GEFB6.js → chunk-2JJ2KNPI.js} +4 -4
- package/dist/{chunk-6SM5NJQH.js → chunk-2QYTMIRR.js} +4 -4
- package/dist/{chunk-RJE5JTVK.js → chunk-3G6TMNVF.js} +7 -7
- package/dist/{chunk-MO5YHHMQ.js → chunk-3LKM6FMW.js} +2 -2
- package/dist/{chunk-76OWZ3BA.js → chunk-3P2DKJCG.js} +2 -2
- package/dist/chunk-3TDRHT4J.js +1043 -0
- package/dist/chunk-3XPUDB7B.js +420 -0
- package/dist/{chunk-2LACINWN.js → chunk-3ZPC476N.js} +7 -7
- package/dist/{chunk-G2H74XJZ.js → chunk-4BMJQFNK.js} +8 -8
- package/dist/{chunk-THXCFRTU.js → chunk-4S723I74.js} +9 -9
- package/dist/{chunk-6NYWYNBI.js → chunk-4XK3FLFB.js} +3 -3
- package/dist/chunk-5JSWBPZZ.js +607 -0
- package/dist/{chunk-WCT3NYCV.js → chunk-5LWQH6QV.js} +1 -1
- package/dist/{chunk-7DTWEFUE.js → chunk-5Z736BSU.js} +8 -8
- package/dist/{chunk-ERLBPDGU.js → chunk-6BFZKBGD.js} +2 -2
- package/dist/{chunk-6HO5ZTXK.js → chunk-6IAA2QQ2.js} +2 -2
- package/dist/{chunk-H6PI3KJT.js → chunk-6IUAK7RZ.js} +2 -2
- package/dist/{chunk-RTLBSQ3G.js → chunk-6M5PJFQG.js} +3 -3
- package/dist/{chunk-Z5CGSFJB.js → chunk-6X4AKWLF.js} +4 -4
- package/dist/{chunk-OJR3MQYV.js → chunk-6ZT4U37Q.js} +291 -52
- package/dist/{chunk-5QXL4NYS.js → chunk-7G2ER4CY.js} +10 -5
- package/dist/chunk-7PQYTZMA.js +681 -0
- package/dist/{chunk-OURHMODR.js → chunk-7RB5Q6MB.js} +11 -11
- package/dist/{chunk-YAA6IID3.js → chunk-7UEMZREK.js} +2 -2
- package/dist/{chunk-AN2MOO5T.js → chunk-A3WQVFBS.js} +3 -3
- package/dist/{chunk-VOKGH627.js → chunk-AHGF2YYA.js} +13 -3
- package/dist/{chunk-CI2G3OEB.js → chunk-ASS5YYIZ.js} +12 -12
- package/dist/{chunk-TYS6CSS5.js → chunk-BCYVE3N5.js} +2 -2
- package/dist/chunk-BDXC7MDK.js +2395 -0
- package/dist/chunk-BTUTZMPT.js +482 -0
- package/dist/{chunk-YGJTDXVR.js → chunk-C4GQDB5L.js} +2 -2
- package/dist/{chunk-Y2ZE3MSG.js → chunk-C63UWAKM.js} +2 -2
- package/dist/{chunk-725LDASD.js → chunk-CLD2OKV7.js} +2 -2
- package/dist/{chunk-WBRZJOEC.js → chunk-CMCR5WBW.js} +3 -3
- package/dist/{chunk-IZMRON6C.js → chunk-CVV36CWI.js} +2 -2
- package/dist/chunk-DMJJ3CEQ.js +254 -0
- package/dist/{chunk-MZSBFAPJ.js → chunk-EJTKV7CY.js} +9 -9
- package/dist/{chunk-FITOLXSX.js → chunk-EOFPYPAU.js} +26 -2
- package/dist/{chunk-X5LCYCL5.js → chunk-ER5SCQWQ.js} +5 -5
- package/dist/{chunk-4OHACBGX.js → chunk-F2L5GCQ4.js} +2 -2
- package/dist/{chunk-FCIIHT24.js → chunk-F5UDBSJY.js} +7 -7
- package/dist/{chunk-3JLKYGBQ.js → chunk-F7BFXWNQ.js} +2 -2
- package/dist/{chunk-FANX6UJR.js → chunk-FAL7NOK3.js} +11 -11
- package/dist/{chunk-BUPDIHML.js → chunk-FB2WHOEQ.js} +4 -4
- package/dist/chunk-FL4IOQ37.js +379 -0
- package/dist/{chunk-LIOHW36Z.js → chunk-GBE54KY6.js} +6 -5
- package/dist/{chunk-RUNNI6VE.js → chunk-GL5UZ6NY.js} +3 -3
- package/dist/{chunk-4GRI7MEB.js → chunk-GPWHQ5FJ.js} +6 -6
- package/dist/chunk-GROQGHCT.js +960 -0
- package/dist/{chunk-SGZYXELT.js → chunk-H73FP42Q.js} +9 -6
- package/dist/{chunk-PBAHEPLQ.js → chunk-HGN652MU.js} +7 -6
- package/dist/{chunk-3SMGIJDD.js → chunk-HHXOONLX.js} +13 -1
- package/dist/{chunk-QOOUC2J5.js → chunk-HQCHYB5F.js} +2 -2
- package/dist/{chunk-AELOBFW5.js → chunk-I4IFRCUB.js} +3 -3
- package/dist/{chunk-GMR5MFHJ.js → chunk-I7F2A35O.js} +2 -2
- package/dist/{chunk-T2OE3YQB.js → chunk-IA3FJYWR.js} +3 -3
- package/dist/chunk-IAEC4KLA.js +492 -0
- package/dist/chunk-IVKC4GID.js +32 -0
- package/dist/{chunk-HSH73DP6.js → chunk-JFYIP7XU.js} +139 -39
- package/dist/{chunk-CKNVO24D.js → chunk-JZNMXEIV.js} +2 -2
- package/dist/chunk-KJXIHOVL.js +940 -0
- package/dist/chunk-L2ZTFHAY.js +331 -0
- package/dist/{chunk-B7JUCQUA.js → chunk-M5RXSRO2.js} +4 -4
- package/dist/{chunk-ULOEATBZ.js → chunk-NFFIKVNO.js} +106 -29
- package/dist/{chunk-PZMETGLY.js → chunk-NISQC5KW.js} +358 -122
- package/dist/chunk-O4VUFXIH.js +574 -0
- package/dist/{chunk-RVMRZAPB.js → chunk-O76UD6VJ.js} +3 -3
- package/dist/{chunk-JM4LEPY3.js → chunk-O7NUCTFU.js} +2 -2
- package/dist/{chunk-JED6ZDEE.js → chunk-O7WP4ZD4.js} +2 -2
- package/dist/{chunk-EVCVDTXE.js → chunk-OHQEMBLI.js} +3 -3
- package/dist/{chunk-ZBWMSD5N.js → chunk-ONA5KPV3.js} +4 -4
- package/dist/{chunk-Y3J7VR52.js → chunk-OTAL43EH.js} +34 -2
- package/dist/{chunk-WCSOJFU3.js → chunk-OTP5KVLO.js} +3 -3
- package/dist/{chunk-RYEGFMUO.js → chunk-PGEGPSCZ.js} +2 -2
- package/dist/{chunk-ZO27FGJS.js → chunk-PH5X4GIP.js} +2 -2
- package/dist/{chunk-ZJEL4H2R.js → chunk-PJUGRJHJ.js} +9 -9
- package/dist/{chunk-ZGR7ULFJ.js → chunk-PLZI6KPM.js} +26 -14
- package/dist/{chunk-3R5POCTZ.js → chunk-PMN3Q7RJ.js} +6 -6
- package/dist/{chunk-YGJZWZTY.js → chunk-PZFVK3IH.js} +2 -2
- package/dist/chunk-Q4V4XQWV.js +158 -0
- package/dist/chunk-QDFNCATJ.js +325 -0
- package/dist/{chunk-QEBUY5NY.js → chunk-QFQ35BTO.js} +4 -4
- package/dist/chunk-QQJUTGQH.js +135 -0
- package/dist/{chunk-PWIHZ6NJ.js → chunk-QUJGFNFN.js} +4 -4
- package/dist/{chunk-J5FIXQRT.js → chunk-R56LASIN.js} +4 -4
- package/dist/{chunk-SRTU6HMQ.js → chunk-RV26LTUU.js} +8 -8
- package/dist/chunk-RV6A2B5S.js +354 -0
- package/dist/{chunk-EB6FPQUP.js → chunk-S5GRONXL.js} +3 -3
- package/dist/{chunk-5MLYVTYM.js → chunk-SCHXJTZL.js} +2 -2
- package/dist/{chunk-T3UBLACL.js → chunk-SCQ5VPUF.js} +19 -5
- package/dist/{chunk-PBHE5UG6.js → chunk-SGFZZAUO.js} +46 -12
- package/dist/{chunk-BUVJFRPY.js → chunk-SU2VBK4L.js} +4 -4
- package/dist/{chunk-SML67VPV.js → chunk-T4BRO3Z6.js} +3 -3
- package/dist/{chunk-NURGB5Z4.js → chunk-TSA237IM.js} +2 -2
- package/dist/chunk-TWCLK2GA.js +273 -0
- package/dist/{chunk-IJZFN3HM.js → chunk-TWQUYVP3.js} +4 -4
- package/dist/{chunk-DKEPS5LH.js → chunk-U2HGPLZS.js} +36 -2
- package/dist/{chunk-B65G5DNL.js → chunk-URSQLCTR.js} +3 -3
- package/dist/{chunk-ILKORZ3H.js → chunk-UUS2GIJZ.js} +7 -7
- package/dist/{chunk-XAKEUMEJ.js → chunk-UXOSVCLJ.js} +4 -4
- package/dist/{chunk-QLCCJEJI.js → chunk-WCUHAQKB.js} +2 -2
- package/dist/{chunk-WVAJFAIA.js → chunk-WWN566I7.js} +257 -101
- package/dist/{chunk-IPWPWM6R.js → chunk-X2NMFTG3.js} +111 -10
- package/dist/{chunk-UWN33VNX.js → chunk-XCLHOZAM.js} +10 -10
- package/dist/{chunk-P235SVAH.js → chunk-XDXNDSKO.js} +2 -2
- package/dist/chunk-XHVV4NVW.js +51 -0
- package/dist/{chunk-33LCUH4H.js → chunk-XMVQ5F4M.js} +4 -4
- package/dist/{chunk-MITI6NOL.js → chunk-YA7D2N2O.js} +11 -11
- package/dist/{chunk-7JEGTRLD.js → chunk-YB3FW24O.js} +3 -3
- package/dist/chunk-YNRDWYZP.js +295 -0
- package/dist/{chunk-44CM72SQ.js → chunk-YZLMKW4T.js} +3 -3
- package/dist/chunk-Z6XJQ6KO.js +452 -0
- package/dist/cli.cjs +179 -133
- package/dist/clock.d.ts +10 -0
- package/dist/clock.js +235 -0
- package/dist/countdown.d.ts +12 -0
- package/dist/countdown.js +450 -0
- package/dist/dgmo-router-QOMFCOOV.js +84 -0
- package/dist/dimensions-P5FSX2QN.js +22 -0
- package/dist/editor.js +43 -2
- package/dist/element.js +220 -110
- package/dist/element.mjs +45920 -33167
- package/dist/{flowchart-parser-ZNSKIBVR.js → flowchart-parser-OE4WHLTF.js} +4 -4
- package/dist/{flowchart-renderer-SNDSII4D.js → flowchart-renderer-GPCSMTOR.js} +8 -8
- package/dist/highlight.d.ts +17 -1
- package/dist/highlight.js +163 -6
- package/dist/index.d.ts +5 -1
- package/dist/index.js +199 -233
- package/dist/{layout-HRBZPFCN.js → layout-34CLNICW.js} +5 -5
- package/dist/layout-46366KBT.js +10 -0
- package/dist/{layout-HWDSRX5E.js → layout-5BG6DFCU.js} +6 -6
- package/dist/layout-6RDJHS6E.js +9 -0
- package/dist/{layout-7QXCNOVS.js → layout-7H4H46CS.js} +3 -3
- package/dist/{layout-46N4JJYK.js → layout-7SKMFYHL.js} +5 -5
- package/dist/{layout-EE6GE46Y.js → layout-DC4TVXER.js} +5 -5
- package/dist/layout-FGQWRYYW.js +14 -0
- package/dist/{layout-S2QBYSK2.js → layout-NXG63LWH.js} +3 -3
- package/dist/{layout-N76NR4ZO.js → layout-PUQCB6AN.js} +7 -7
- package/dist/{layout-HYZPWAK5.js → layout-QNUQLEHU.js} +3 -3
- package/dist/{layout-UM5F4DJB.js → layout-T3OZU5QW.js} +5 -5
- package/dist/layout-TJIWF7EM.js +14 -0
- package/dist/layout-VYELEAW7.js +14 -0
- package/dist/{layout-5RA6QWR6.js → layout-WZHNDT2O.js} +6 -6
- package/dist/{layout-search-OYV77HHS.js → layout-search-QS44PI5R.js} +6 -6
- package/dist/{parser-6BTRLKRZ.js → parser-45DENHFZ.js} +4 -4
- package/dist/{parser-TFZFBVWN.js → parser-4AI5ZN5F.js} +3 -3
- package/dist/{parser-XDVELHRK.js → parser-4P36TUVD.js} +4 -4
- package/dist/{parser-ZSDPZYQP.js → parser-5AURY4A6.js} +4 -4
- package/dist/{parser-N5O4IHUN.js → parser-A2BEFMGK.js} +4 -4
- package/dist/parser-B5FVS7O6.js +11 -0
- package/dist/{parser-NGU3ETO6.js → parser-C2HF2C2E.js} +4 -4
- package/dist/parser-CSFUN3CT.js +14 -0
- package/dist/{parser-TRTHDFPP.js → parser-D3QT6GWN.js} +5 -5
- package/dist/parser-D5637H5H.js +15 -0
- package/dist/{parser-VQP2UJ6W.js → parser-DFFEDKHH.js} +3 -3
- package/dist/parser-DOKMZXVZ.js +13 -0
- package/dist/parser-FMPCVFRK.js +15 -0
- package/dist/{parser-Y6WTBU76.js → parser-HYRTF3DO.js} +3 -3
- package/dist/{parser-I6KXEYFK.js → parser-I2UIJKVQ.js} +4 -4
- package/dist/{parser-O5J4VBII.js → parser-IBWNAPY4.js} +3 -3
- package/dist/{parser-PQ3POX45.js → parser-KUQWRPIT.js} +4 -4
- package/dist/{parser-2MFP2H2E.js → parser-LWKKBNSA.js} +3 -3
- package/dist/{parser-OV7NOBW6.js → parser-O4QFCUW7.js} +5 -5
- package/dist/{parser-IXSZZQHY.js → parser-PGMQDD4G.js} +4 -4
- package/dist/{parser-3STE62GB.js → parser-Q4QKCIWQ.js} +4 -4
- package/dist/parser-QTOB4KFL.js +14 -0
- package/dist/{parser-2EWECDSA.js → parser-QYYM4QVW.js} +4 -4
- package/dist/{parser-4OGOBJJ4.js → parser-RZMQP7MM.js} +4 -4
- package/dist/parser-RZPVAQVX.js +11 -0
- package/dist/parser-SOUJOEYI.js +13 -0
- package/dist/{parser-4FL2CMDG.js → parser-UQE5OWZI.js} +5 -5
- package/dist/{parser-NRAI6O25.js → parser-WAV5JRPT.js} +4 -4
- package/dist/{parser-KNSQSKQO.js → parser-YLKYBRIT.js} +5 -5
- package/dist/{parser-XKRP7QKP.js → parser-YS7TOS2K.js} +3 -3
- package/dist/{parser-AQETEVRW.js → parser-ZSOWUBML.js} +5 -5
- package/dist/{parser-CFZD5IBL.js → parser-ZTBATMLX.js} +4 -4
- package/dist/{renderer-VACVQYML.js → renderer-35HSIDMZ.js} +8 -8
- package/dist/{renderer-5MYBMBYO.js → renderer-4ITCHBT7.js} +5 -5
- package/dist/{renderer-CLJHQPBJ.js → renderer-67NPCBIS.js} +11 -11
- package/dist/{renderer-5NDVNDAZ.js → renderer-6GHYK7DX.js} +9 -9
- package/dist/{renderer-Z7I3W2PP.js → renderer-6RNGHC5Z.js} +8 -8
- package/dist/renderer-72LGR2YF.js +14 -0
- package/dist/{renderer-KQB7UGDS.js → renderer-7RH2SI3B.js} +3 -3
- package/dist/renderer-7SWMIFMM.js +21 -0
- package/dist/renderer-BBCEFILK.js +24 -0
- package/dist/{renderer-JGBKUCZD.js → renderer-BSW7SRIZ.js} +4 -4
- package/dist/{renderer-BYCNMBF7.js → renderer-BY533UWU.js} +11 -11
- package/dist/{renderer-6W5462RB.js → renderer-BZSBPTZJ.js} +9 -9
- package/dist/{renderer-7MVLWWQD.js → renderer-CXUC4KAD.js} +9 -9
- package/dist/{renderer-QIWVHWZO.js → renderer-DAXMXIKD.js} +3 -3
- package/dist/renderer-FZUKFUNZ.js +23 -0
- package/dist/renderer-G2NLGNKF.js +17 -0
- package/dist/renderer-GO3FE3RA.js +24 -0
- package/dist/{renderer-ZGNTUWC4.js → renderer-HPGR6USK.js} +8 -8
- package/dist/{renderer-UV6MI64M.js → renderer-HVCU2C3Z.js} +3 -3
- package/dist/renderer-ICJN2SA2.js +24 -0
- package/dist/{renderer-AWWAF6XD.js → renderer-INEXO7B6.js} +10 -10
- package/dist/{renderer-YY2OSF6E.js → renderer-KDYCFRBX.js} +8 -8
- package/dist/renderer-KY4KQBTF.js +19 -0
- package/dist/{renderer-B2OMQIQG.js → renderer-LBN65V45.js} +13 -13
- package/dist/{renderer-N43WR5GV.js → renderer-MGBWOCXG.js} +10 -10
- package/dist/{renderer-PGX2TKVS.js → renderer-O4JKUGKO.js} +8 -8
- package/dist/{renderer-4JHRUBE6.js → renderer-OOGFODWP.js} +10 -10
- package/dist/{renderer-6EEZHMH4.js → renderer-Q6ZKPLS6.js} +9 -9
- package/dist/{renderer-RPOA5YPZ.js → renderer-SZQ326M5.js} +12 -12
- package/dist/{renderer-ZRNG54CW.js → renderer-TKG6LS4U.js} +11 -11
- package/dist/{renderer-W4M6QLIJ.js → renderer-TQMZGDAX.js} +13 -13
- package/dist/renderer-radial-JELMHQ24.js +21 -0
- package/dist/{resolver-NOAA7ID7.js → resolver-FHBCO3PL.js} +3 -3
- package/dist/{state-parser-Z2V23ATR.js → state-parser-3REXRK3R.js} +4 -4
- package/dist/{state-renderer-B4DQBM6M.js → state-renderer-XYLNRWXR.js} +8 -8
- package/docs/ai-integration.md +12 -3
- package/docs/language-reference.md +429 -24
- package/gallery/fixtures/body.dgmo +17 -0
- package/gallery/fixtures/bracket.dgmo +30 -0
- package/gallery/fixtures/clock.dgmo +8 -0
- package/gallery/fixtures/countdown.dgmo +3 -0
- package/gallery/fixtures/family.dgmo +23 -0
- package/gallery/fixtures/goal.dgmo +4 -0
- package/gallery/fixtures/sketch.dgmo +22 -0
- package/package.json +12 -4
- package/dist/chunk-ODZVHU3R.js +0 -153
- package/dist/dgmo-router-X35VLZLM.js +0 -73
- package/dist/dimensions-J3FHIMJ6.js +0 -22
- package/dist/layout-5T6RH5M6.js +0 -14
- package/dist/layout-G23F7LDH.js +0 -9
- package/dist/layout-OB3RI63S.js +0 -14
- package/dist/parser-JAL2HD4I.js +0 -13
- package/dist/renderer-SMIBCRVB.js +0 -24
- package/dist/renderer-radial-C32GPJQ7.js +0 -21
package/docs/ai-integration.md
CHANGED
|
@@ -61,7 +61,7 @@ To teach Claude about DGMO in a specific project without the global skill, paste
|
|
|
61
61
|
<!-- DGMO-AI-CORE:START -->
|
|
62
62
|
## DGMO AI Core
|
|
63
63
|
|
|
64
|
-
_Generated from `language-reference.md` — the anti-patterns and
|
|
64
|
+
_Generated from `language-reference.md` — the anti-patterns and 50-type index below are identical across every DGMO AI surface._
|
|
65
65
|
|
|
66
66
|
### Disambiguation — where DGMO diverges from LLM priors
|
|
67
67
|
|
|
@@ -115,7 +115,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
115
115
|
- **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.
|
|
116
116
|
- **Pick a fitting direction.** Top-to-bottom for hierarchies and processes; left-to-right for pipelines and flows (where the type supports a direction).
|
|
117
117
|
|
|
118
|
-
### Chart-type index (
|
|
118
|
+
### Chart-type index (45) — pick the type, then fetch its section
|
|
119
119
|
|
|
120
120
|
| id | when to use |
|
|
121
121
|
| -- | ----------- |
|
|
@@ -130,6 +130,8 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
130
130
|
| `sitemap` | site / app navigation structure |
|
|
131
131
|
| `mindmap` | radial hierarchy of ideas from a central topic |
|
|
132
132
|
| `org` | reporting hierarchy |
|
|
133
|
+
| `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
|
|
134
|
+
| `bracket` | single-elimination tournament bracket: winners auto-advance; seed the field for a day-0 skeleton or list results casually; two sides mirror to a championship |
|
|
133
135
|
| `kanban` | task-board columns |
|
|
134
136
|
| `gantt` | project scheduling with task dependencies and milestones |
|
|
135
137
|
| `pert` | project network with three-point estimates and critical path |
|
|
@@ -137,6 +139,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
137
139
|
| `version-control` | git / version-control branch-and-merge graph: commits, branches, merges, rebase, HEAD and remote-tracking (gitGraph-style) |
|
|
138
140
|
| `timeline` | events, eras, and date ranges |
|
|
139
141
|
| `event-line` | annotated narrative timeline — events on a line with descriptions, optionally not to scale (NOT the date-scaled `timeline`) |
|
|
142
|
+
| `body` | human anatomy figure annotated by muscle name — for medical, exercise, and educational diagrams |
|
|
140
143
|
| `journey-map` | UX flow with emotion scores, phases, annotations |
|
|
141
144
|
| `cycle` | cyclical process (PDCA, OODA, DevOps loops) |
|
|
142
145
|
| `raci` | tasks × roles responsibility matrix; variant (RACI / RASCI / DACI) is inferred from the markers used |
|
|
@@ -146,6 +149,10 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
146
149
|
| `ring` | concentric rings of nested categories |
|
|
147
150
|
| `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
|
|
148
151
|
| `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
|
|
152
|
+
| `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
|
|
153
|
+
| `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
|
|
154
|
+
| `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 |
|
|
155
|
+
| `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
|
|
149
156
|
| `map` | geographic concept map: regions, points, routes |
|
|
150
157
|
| `wireframe` | low-fidelity UI layout with panels and controls |
|
|
151
158
|
| `bar` | categorical comparisons (multi-series via `stack` / `group`) |
|
|
@@ -169,7 +176,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
169
176
|
|
|
170
177
|
### Common examples (curated, parse-clean)
|
|
171
178
|
|
|
172
|
-
_The most common types, inline so you can generate them without a fetch. For the other
|
|
179
|
+
_The most common types, inline so you can generate them without a fetch. For the other 42, get the per-type section (see below)._
|
|
173
180
|
|
|
174
181
|
#### journey-map
|
|
175
182
|
|
|
@@ -281,6 +288,8 @@ ports
|
|
|
281
288
|
```dgmo
|
|
282
289
|
class Ship Class Hierarchy
|
|
283
290
|
|
|
291
|
+
solid-fill
|
|
292
|
+
|
|
284
293
|
interface Vessel
|
|
285
294
|
+ sail(): void
|
|
286
295
|
+ anchor(): void
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
|
|
43
43
|
## 0. AI Core
|
|
44
44
|
|
|
45
|
-
The universal core: the cross-cutting anti-patterns (highest value per token) and the one-line index of all
|
|
45
|
+
The universal core: the cross-cutting anti-patterns (highest value per token) and the one-line index of all 46 chart types. The blocks below are machine-extracted (HTML-comment anchors) and embedded verbatim into every AI surface — IDE rule files, the Claude skill, the CLAUDE.md snippet — by `scripts/gen-ai-core.mjs`. Edit them here; never hand-edit a generated surface.
|
|
46
46
|
|
|
47
47
|
<!-- AI-CORE:ANTIPATTERNS start -->
|
|
48
48
|
### Disambiguation — where DGMO diverges from LLM priors
|
|
@@ -101,7 +101,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
101
101
|
<!-- AI-CORE:STYLING end -->
|
|
102
102
|
|
|
103
103
|
<!-- AI-CORE:TYPE-INDEX start -->
|
|
104
|
-
### Chart-type index (
|
|
104
|
+
### Chart-type index (45) — pick the type, then fetch its section
|
|
105
105
|
|
|
106
106
|
| id | when to use |
|
|
107
107
|
| -- | ----------- |
|
|
@@ -116,6 +116,8 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
116
116
|
| `sitemap` | site / app navigation structure |
|
|
117
117
|
| `mindmap` | radial hierarchy of ideas from a central topic |
|
|
118
118
|
| `org` | reporting hierarchy |
|
|
119
|
+
| `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
|
|
120
|
+
| `bracket` | single-elimination tournament bracket: winners auto-advance; seed the field for a day-0 skeleton or list results casually; two sides mirror to a championship |
|
|
119
121
|
| `kanban` | task-board columns |
|
|
120
122
|
| `gantt` | project scheduling with task dependencies and milestones |
|
|
121
123
|
| `pert` | project network with three-point estimates and critical path |
|
|
@@ -123,6 +125,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
123
125
|
| `version-control` | git / version-control branch-and-merge graph: commits, branches, merges, rebase, HEAD and remote-tracking (gitGraph-style) |
|
|
124
126
|
| `timeline` | events, eras, and date ranges |
|
|
125
127
|
| `event-line` | annotated narrative timeline — events on a line with descriptions, optionally not to scale (NOT the date-scaled `timeline`) |
|
|
128
|
+
| `body` | human anatomy figure annotated by muscle name — for medical, exercise, and educational diagrams |
|
|
126
129
|
| `journey-map` | UX flow with emotion scores, phases, annotations |
|
|
127
130
|
| `cycle` | cyclical process (PDCA, OODA, DevOps loops) |
|
|
128
131
|
| `raci` | tasks × roles responsibility matrix; variant (RACI / RASCI / DACI) is inferred from the markers used |
|
|
@@ -132,6 +135,10 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
|
|
|
132
135
|
| `ring` | concentric rings of nested categories |
|
|
133
136
|
| `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
|
|
134
137
|
| `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
|
|
138
|
+
| `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
|
|
139
|
+
| `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
|
|
140
|
+
| `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 |
|
|
141
|
+
| `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
|
|
135
142
|
| `map` | geographic concept map: regions, points, routes |
|
|
136
143
|
| `wireframe` | low-fidelity UI layout with panels and controls |
|
|
137
144
|
| `bar` | categorical comparisons (multi-series via `stack` / `group`) |
|
|
@@ -1710,6 +1717,51 @@ See spec §13A for full date-anchoring semantics, S-curve axes, and diagnostic c
|
|
|
1710
1717
|
|
|
1711
1718
|
---
|
|
1712
1719
|
|
|
1720
|
+
## 13AA. Family Diagrams (genealogy)
|
|
1721
|
+
|
|
1722
|
+
<!-- TYPE:family -->
|
|
1723
|
+
|
|
1724
|
+
<!-- TIPS start -->
|
|
1725
|
+
**Styling tips:** Two line shapes carry the whole tree: a **person line** (`Anne b: 1665, sex: f`) and a **union line** (`Anne + Jack m: 1701`), with children indented under the union. Declare each person **standalone** with their full metadata — per-side metadata on a union line is unsupported and re-stating a name just re-references the same person. Set `sex:` so cards color (m→blue, f→purple), but **treat the legend as the real sex channel**: blue and purple separate weakly under the 25% tint, so where color-vision matters distinguish with a `tag` group (labeled legend entries) instead. Reuse a name in a second union for remarriage (one card, two bars); a lone person with indented children is a single parent; a bare trailing `adopted` token marks an adopted child.
|
|
1726
|
+
<!-- TIPS end -->
|
|
1727
|
+
|
|
1728
|
+
### Declaration
|
|
1729
|
+
|
|
1730
|
+
```
|
|
1731
|
+
family [Title]
|
|
1732
|
+
```
|
|
1733
|
+
|
|
1734
|
+
### Unions, children, remarriage
|
|
1735
|
+
|
|
1736
|
+
A **union line** joins a couple with `+`; children are indented beneath it. Union-level metadata is only `m` (marriage year). Reuse a name to remarry; a lone person with indented children is a single parent.
|
|
1737
|
+
|
|
1738
|
+
```dgmo
|
|
1739
|
+
family The Rackham Line
|
|
1740
|
+
|
|
1741
|
+
Elizabeth Swann b: 1687, sex: f, occupation: Pirate King
|
|
1742
|
+
"Will Turner" b: 1685, sex: m
|
|
1743
|
+
|
|
1744
|
+
Elizabeth Swann + "Will Turner" m: 1729
|
|
1745
|
+
Henry Turner sex: m
|
|
1746
|
+
|
|
1747
|
+
Henry Turner + Carina Smyth m: 1751
|
|
1748
|
+
Joshamee sex: m
|
|
1749
|
+
Anna adopted, sex: f
|
|
1750
|
+
```
|
|
1751
|
+
|
|
1752
|
+
- **Person metadata** (fixed GEDCOM-flavored keys): `sex` (`m`/`f` → node color), `b`/`d` (birth/death year → a year-range row), `bp`/`dp` (birth/death place), `occupation`, `military`, `education`, `religion`, `burial`. Union-level: `m`. Unknown keys warn.
|
|
1753
|
+
- **Adoption:** a bare `adopted` token on a child line draws a dashed drop edge. A person literally named "Adopted" must be quoted.
|
|
1754
|
+
- **Divorce:** a bare `divorced` token on a union line (`A + B m: 1980 divorced`) draws a dashed marriage bar; children still attach.
|
|
1755
|
+
- **Deceased:** a person with a death year (`d:`) is auto-marked with a muted dagger (†) — derived, no syntax; add `no-daggers` to hide it.
|
|
1756
|
+
- **Children** are auto-ordered eldest→left by birth year (`b:`); undated children keep declaration order.
|
|
1757
|
+
- **Unknown/private person:** a bare `?` renders a faint, solid-bordered, name-only placeholder card; each `?` is a distinct person.
|
|
1758
|
+
- **`generations`** (option): draws a left gutter of Roman-numeral generation labels (`Gen I`, `Gen II`, …) plus subtle zebra shading behind alternating generations.
|
|
1759
|
+
- **`highlight <name>`** (directive): dims everyone outside that person's bloodline (ancestors + descendants + spouses stay lit).
|
|
1760
|
+
- **Sex → color:** `sex: m` → blue, `sex: f` → purple, unset → gray (25% tint). An explicit `tag`/inline color overrides the sex color.
|
|
1761
|
+
- The union split cuts `m:` metadata first, THEN splits ` + ` within the name region — so a `+` inside a quoted name (`"Anne + Jack"`) or a metadata value never mis-splits. Per-side `key: value` metadata on a union line is not supported — declare the person standalone.
|
|
1762
|
+
|
|
1763
|
+
---
|
|
1764
|
+
|
|
1713
1765
|
## 13B. Swimlane Diagrams
|
|
1714
1766
|
|
|
1715
1767
|
<!-- TYPE:swimlane -->
|
|
@@ -1718,38 +1770,31 @@ See spec §13A for full date-anchoring semantics, S-curve axes, and diagnostic c
|
|
|
1718
1770
|
**Styling tips:** Give each lane a color and let nodes inherit it — reach for a `tag` group only when you need a *second* dimension (e.g. risk) that deliberately breaks lane color. Echo the gateway/terminal delimiters (`<Review>`, `(Paid) success`) even though bare names also resolve — it keeps the source self-documenting. Put every edge label *inside* the arrow (`-invalid->`), never as a trailing word.
|
|
1719
1771
|
<!-- TIPS end -->
|
|
1720
1772
|
|
|
1721
|
-
Swimlane diagrams model a cross-functional process: actors/systems are **lanes**, the process flows along the flow axis (`direction LR` default, `TB` transposes), and optional `[Phase]` columns group steps into stages. Nodes are tasks (bare), exclusive gateways (`<X>`), parallel gateways (`<+ X>`), terminals (`(X)`), and subprocesses (`[[X]]`).
|
|
1773
|
+
Swimlane diagrams model a cross-functional process: actors/systems are **lanes**, the process flows along the flow axis (`direction LR` default, `TB` transposes), and optional `[Phase]` columns group steps into stages. Nodes are tasks (bare), exclusive gateways (`<X>`), parallel gateways (`<+ X>`), terminals (`(X)`), and subprocesses (`[[X]]`). A `lane` block **owns its edges** — nodes and their outgoing `->` edges are written inline, no separate flow block. A back-edge to an earlier node draws a routed loop.
|
|
1722
1774
|
|
|
1723
1775
|
```
|
|
1724
1776
|
swimlane Weekly Publishing
|
|
1725
1777
|
direction LR
|
|
1726
1778
|
|
|
1727
1779
|
lane Writer gray
|
|
1780
|
+
Draft Post -> Review
|
|
1781
|
+
Revise -> Review
|
|
1728
1782
|
lane Editor blue
|
|
1729
|
-
lane Social green
|
|
1730
|
-
|
|
1731
|
-
Writer
|
|
1732
|
-
Draft Post
|
|
1733
|
-
Revise
|
|
1734
|
-
Editor
|
|
1735
1783
|
<Review>
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1784
|
+
-changes-> Revise
|
|
1785
|
+
-ok-> Schedule
|
|
1786
|
+
Schedule -> Publish
|
|
1787
|
+
Publish -> Promote
|
|
1788
|
+
lane Social green
|
|
1739
1789
|
Promote
|
|
1740
|
-
|
|
1741
|
-
Draft Post -> <Review>
|
|
1742
|
-
<Review>
|
|
1743
|
-
-changes-> Revise -> <Review>
|
|
1744
|
-
-ok-> Schedule -> Publish -> Promote
|
|
1745
1790
|
```
|
|
1746
1791
|
|
|
1747
1792
|
### Structure
|
|
1748
1793
|
|
|
1749
|
-
- `lane <Name> [color]` declares a row (occupant-neutral; person, system, or org)
|
|
1750
|
-
- A
|
|
1751
|
-
-
|
|
1752
|
-
-
|
|
1794
|
+
- `lane <Name> [color]` declares a row (occupant-neutral; person, system, or org) **and opens its block** — the indented lines beneath are its nodes and their inline edges. The trailing color (§1.5) tints the band and is the default node fill. Lane order is first-appearance; re-opening a lane resumes it.
|
|
1795
|
+
- A node is owned by the lane where it is a **line-head** (bare node or arrow source); elsewhere the name is a reference. References may point forward. Names are **lane-scoped** — resolve own-lane-first → global-unique → ambiguous; qualify a shared name `Lane.Node`.
|
|
1796
|
+
- An unresolved target auto-creates only if **delimited** (`(…)`/`<…>`/`[[…]]`, taking the edge's lane/phase); an unresolved **bare task** is `E_SWIMLANE_UNKNOWN_NODE` (typo protection).
|
|
1797
|
+
- `[Phase]` opens a phase column (3-deep: phase ▸ `lane` block ▸ nodes). With no `[Phase]`, the diagram is 2-deep (lane ▸ nodes). A node's phase membership can only push it right, never left of its column.
|
|
1753
1798
|
|
|
1754
1799
|
### Node tokens
|
|
1755
1800
|
|
|
@@ -2170,18 +2215,18 @@ no-center-total // pie: hide the center total (shown by default when `h
|
|
|
2170
2215
|
|
|
2171
2216
|
- `no-name` — hide name (segment / point / cell / node / set)
|
|
2172
2217
|
- `no-value` — hide numeric value
|
|
2173
|
-
- `no-percent` — hide share-of-total
|
|
2218
|
+
- `no-percent` — hide the percentage (share-of-total on pie-family; stage-over-stage conversion on funnel)
|
|
2174
2219
|
|
|
2175
2220
|
Each chart honors the subset of flags that has a renderable atom on it:
|
|
2176
2221
|
|
|
2177
2222
|
- pie / polar-area: all three
|
|
2178
|
-
- funnel:
|
|
2223
|
+
- funnel: all three (`no-percent` hides the conversion %)
|
|
2179
2224
|
- bar / line / radar: `no-value`
|
|
2180
2225
|
- scatter: `no-name`
|
|
2181
2226
|
- heatmap: `no-value`
|
|
2182
2227
|
- sankey, arc, slope, quadrant, venn: name-suppression deferred — names render by default and cannot yet be hidden
|
|
2183
2228
|
|
|
2184
|
-
`no-percent` on a
|
|
2229
|
+
`no-percent` on a chart with no percent atom is silently ignored. Cartesian charts (bar, line) render values on each bar / point by default.
|
|
2185
2230
|
|
|
2186
2231
|
**Eras (line only):**
|
|
2187
2232
|
|
|
@@ -2331,6 +2376,8 @@ Signups 800
|
|
|
2331
2376
|
Purchases 200
|
|
2332
2377
|
```
|
|
2333
2378
|
|
|
2379
|
+
Each stage renders its name to the left of the band (in the band's color), its value centered inside the band (falling back beside it when the band is too narrow), and a muted stage-over-stage conversion % to the right — no leader lines. The first stage has no % (nothing to convert from). `no-percent` hides the conversion %; `no-name` / `no-value` hide the other parts.
|
|
2380
|
+
|
|
2334
2381
|
---
|
|
2335
2382
|
|
|
2336
2383
|
## 17. Visualizations
|
|
@@ -2471,6 +2518,53 @@ Group a run of events into a labeled section with a `[Name]` bracket, then **ind
|
|
|
2471
2518
|
- `no-box` — card-less style for slides: a tag-colored label, a rule, and the description below (no box / fill / border).
|
|
2472
2519
|
- `no-legend` — hide the tag legend.
|
|
2473
2520
|
|
|
2521
|
+
### 16.4C Body Diagrams
|
|
2522
|
+
|
|
2523
|
+
<!-- TYPE:body -->
|
|
2524
|
+
|
|
2525
|
+
<!-- TIPS start -->
|
|
2526
|
+
**Styling tips:** Reach for `body` when the drawing IS the human figure — colour muscle groups over a skin layer to show which parts a workout targets, where an injury sits, or how the musculature is organised. Choose the figure with `male`/`female` and `front`/`back`; each named muscle group takes a tag so the legend carries the meaning. Best for fitness, medical, exercise, and educational diagrams — not for generic part-to-whole (that's `pie`/`treemap`).
|
|
2527
|
+
<!-- TIPS end -->
|
|
2528
|
+
|
|
2529
|
+
**Figures:** male and female, front and back — four figures. `skin` form renders any figure as a plain silhouette (with head + hair) instead of the segmented muscle map. `skeletal` is reserved.
|
|
2530
|
+
|
|
2531
|
+
#### Declaration
|
|
2532
|
+
|
|
2533
|
+
```
|
|
2534
|
+
body [Title]
|
|
2535
|
+
```
|
|
2536
|
+
|
|
2537
|
+
#### Form / sex / view (bare directives)
|
|
2538
|
+
|
|
2539
|
+
Set the figure with bare directives before the parts: `muscle` (default) or `skin`; `male` (default) or `female`; `front` (default) or `back`. Each is optional. **Name both `front` and `back`** to render the two views side by side in one diagram — a part is drawn on whichever view(s) contain it (`chest` on front, `lats` on back, `deltoids`/`calves` on both).
|
|
2540
|
+
|
|
2541
|
+
#### Parts
|
|
2542
|
+
|
|
2543
|
+
A bare line is a **catalog muscle name**, in any order, with optional trailing tag metadata and an indented body note. Names accept gym shorthand or formal anatomy (`pecs` / `pectoralis-major` → `chest`; `quads` → `quadriceps`).
|
|
2544
|
+
|
|
2545
|
+
```
|
|
2546
|
+
body Push Day
|
|
2547
|
+
muscle
|
|
2548
|
+
|
|
2549
|
+
tag Effort as e
|
|
2550
|
+
Primary red
|
|
2551
|
+
Secondary orange
|
|
2552
|
+
|
|
2553
|
+
chest e: Primary
|
|
2554
|
+
Barbell bench press — 4×8
|
|
2555
|
+
deltoids e: Primary
|
|
2556
|
+
triceps e: Secondary
|
|
2557
|
+
abs e: Secondary
|
|
2558
|
+
```
|
|
2559
|
+
|
|
2560
|
+
- **Part** — a catalog name for the active figure. Front: `chest`, `deltoids`, `biceps`, `triceps`, `abs`, `obliques`, `trapezius`, `forearm`, `quadriceps`, `adductors`, `calves`, `tibialis`. Back: `lats`, `trapezius`, `rear-delts`, `triceps`, `lower-back`, `glutes`, `hamstring`, `calves`, `forearm`. Fine heads (`vastus-lateralis`, `serratus-anterior`, `biceps-femoris`, …) and gym/anatomical aliases (`pecs`/`pectoralis-major`→chest, `quads`→quadriceps, `glutes`→gluteal) both resolve. Unknown names warn.
|
|
2561
|
+
- **Tag** — trailing same-line metadata (`e: Primary`); colors the highlighted muscle, its leader, and its label.
|
|
2562
|
+
- **Note** — bare indented body line (like `pyramid`/`ring`); the first note prints beneath the muscle's gutter label.
|
|
2563
|
+
|
|
2564
|
+
#### Options
|
|
2565
|
+
|
|
2566
|
+
- `no-legend` — hide the tag legend.
|
|
2567
|
+
|
|
2474
2568
|
### 16.4B Version-Control Diagrams
|
|
2475
2569
|
|
|
2476
2570
|
<!-- TYPE:version-control -->
|
|
@@ -3528,6 +3622,317 @@ In the desktop app a block diagram is interactive: click a container header to c
|
|
|
3528
3622
|
|
|
3529
3623
|
---
|
|
3530
3624
|
|
|
3625
|
+
## 24E. Sketch Diagrams
|
|
3626
|
+
|
|
3627
|
+
<!-- TYPE:sketch -->
|
|
3628
|
+
|
|
3629
|
+
<!-- TIPS start -->
|
|
3630
|
+
**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 2 half-slots apart on one axis. Alias any shape an edge references (`as con`). Never write `size:`, colors, fonts, or a `shape:` outside the closed set (database, queue, cloud, person, document, note). In sketch, `~` dashed means secondary emphasis, NOT async. Categorize with a tag group instead of reaching for more shape kinds — 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.
|
|
3631
|
+
<!-- TIPS end -->
|
|
3632
|
+
|
|
3633
|
+
A **GUI-first constrained canvas**: uniformly-sized shapes placed freely on a snap grid, arrows between them, meaning through tags. The renderer owns all styling — authors own placement, connection, naming, and tags. Every shape has ONE universal footprint (no resizing); text always fits (shrink → smart-wrap → `…`). Pick `sketch` when the spatial arrangement is yours to decide; pick `boxes-and-lines` when topology should auto-lay-out.
|
|
3634
|
+
|
|
3635
|
+
### Declaration
|
|
3636
|
+
|
|
3637
|
+
```
|
|
3638
|
+
sketch [Title]
|
|
3639
|
+
```
|
|
3640
|
+
|
|
3641
|
+
### Example
|
|
3642
|
+
|
|
3643
|
+
```
|
|
3644
|
+
sketch Plunder Pipeline
|
|
3645
|
+
|
|
3646
|
+
tag Crew
|
|
3647
|
+
Deck
|
|
3648
|
+
Hold
|
|
3649
|
+
|
|
3650
|
+
Spyglass Feed shape: cloud, at: 0 0, crew: Deck
|
|
3651
|
+
-sightings-> con
|
|
3652
|
+
Captain's Console as con at: 2 0, crew: Deck
|
|
3653
|
+
-orders-> bq
|
|
3654
|
+
Divvy Service as dvy at: 4 0, crew: Hold
|
|
3655
|
+
|
|
3656
|
+
[Below Decks] at: 2 2, crew: Hold
|
|
3657
|
+
Booty Queue as bq shape: queue, at: 0 0
|
|
3658
|
+
~haul~> dvy
|
|
3659
|
+
Ship Ledger as ledger shape: database, at: 2 0
|
|
3660
|
+
|
|
3661
|
+
[Armory] as armory at: 0 2, collapsed
|
|
3662
|
+
Powder Store at: 0 0
|
|
3663
|
+
```
|
|
3664
|
+
|
|
3665
|
+
### Shapes
|
|
3666
|
+
|
|
3667
|
+
One top-level line = one shape — a **bare name** plus same-line `key: value` metadata. `shape:` morphs from the default rectangle: `database`, `queue`, `cloud`, `person`, `document`, `note` (rectangle is never written; unknown values warn and fall back). `note` renders as a sticky-style card with smaller left-aligned multiline text. Duplicate labels are legal **when aliased** (`Cache as c1` / `Cache as c2`); unaliased duplicates merge (standard dgmo semantics).
|
|
3668
|
+
|
|
3669
|
+
### Coordinates — `at: C R`
|
|
3670
|
+
|
|
3671
|
+
Integer **half-slot steps** (a slot = one footprint + the mandatory gap), origin-normalized; box children are relative to the box origin. `at:` is **optional** — un-positioned shapes flow-place in rows below existing content. Hand-authored overlap auto-resolves with a warning; nothing renders broken.
|
|
3672
|
+
|
|
3673
|
+
### Lines
|
|
3674
|
+
|
|
3675
|
+
Indented under the source shape, targeting an alias (or an unambiguous bare label). Six forms: `-label->` one head · `<-label->` both heads · `-label-` no heads, plus `~` dashed twins. Unlabeled headless lines are `--` / `~~`. No left-pointing arrows — write `B -> A`, never `A <- B`. A tag on the edge tail (`crew: Hold`) colors the line. Both ends must attach.
|
|
3676
|
+
|
|
3677
|
+
### Boxes
|
|
3678
|
+
|
|
3679
|
+
`[Brackets]` = a **box** (labeled group frame) — the only bracket meaning in sketch. Label mandatory; one level only (no nested boxes); taggable (frame tints, cascades to children, individual overrides); bare `collapsed` folds it to a card with the collapse-bar and edges re-target the card. Interactive fold/unfold in the app; static export renders the authored state.
|
|
3680
|
+
|
|
3681
|
+
### Node Metadata
|
|
3682
|
+
|
|
3683
|
+
| Key | Type | Default | Description |
|
|
3684
|
+
| --------- | -------------- | --------- | ----------------------------------------------- |
|
|
3685
|
+
| `shape` | closed set | rectangle | `database` / `queue` / `cloud` / `person` / `document` / `note` |
|
|
3686
|
+
| `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
|
|
3687
|
+
| `collapsed` | flag | — | Box only — start folded (collapse-bar) |
|
|
3688
|
+
| `<tag>` | declared value | untagged (neutral gray) | Tag value (cascades from box; edge tails color the line) |
|
|
3689
|
+
|
|
3690
|
+
### Directives
|
|
3691
|
+
|
|
3692
|
+
| Directive | Effect |
|
|
3693
|
+
| ------------ | ----------------------- |
|
|
3694
|
+
| `no-legend` | Hide the tag legend. |
|
|
3695
|
+
|
|
3696
|
+
### Interactivity vs export
|
|
3697
|
+
|
|
3698
|
+
In the desktop and web app a sketch opens in the **canvas editor** (the code pane hides behind a toggle); boxes fold/unfold interactively. Static SVG / PNG export renders the authored state — the same interactive-vs-export split the map, treemap, and block charts use.
|
|
3699
|
+
|
|
3700
|
+
---
|
|
3701
|
+
|
|
3702
|
+
## 24E. Goal
|
|
3703
|
+
|
|
3704
|
+
<!-- TYPE:goal -->
|
|
3705
|
+
|
|
3706
|
+
<!-- TIPS start -->
|
|
3707
|
+
**Styling tips:** A single progress-toward-a-target reading — one `now` against one `target`, answering "how close am I?". Reach for it for a KPI tile, a fundraising thermometer, a quarterly quota, or a completion percentage; there is no time axis, series, or milestones (use `line` for a trend, `countdown` for a live deadline). Put the **unit in the title** (`Marathon Fund ($)`, `Grog Barrel Fill (L)`) — there is no format/currency directive. `now` and `target` are **space-separated `key value`** directives, no colon (`now 6400` / `target 10000`); the percent is `now / target` and values auto-compact (`6.4k`, `1.2M`). Pick the face for the story with a bare flag on its own line: the default progress **bar** for a plain KPI, `thermometer` for fundraising/fill-the-tank framings, `gauge` for a speedometer/quota dial — all three read the same value pair. The fill is **auto traffic-light** by completion (`< 50%` red, `50–80%` orange, `≥ 80%` green; over-target stays green) so the color already reads the number's health — leave it unless you have reason to override with a trailing color on the title line (`goal Marathon Fund ($) green`) or `no-auto-color` (flat palette color). Over-target clamps the fill at 100% while the `%` label stays truthful (`120%`). Add a `note` — inline (`note Still waiting on three crews`) or a block header on its own line with an indented body — to caption the number with context (who's still owed, what's left); it takes simple markdown (`**bold**`, `*italic*`, `` `code` ``) and `- ` bullets. `solid-fill` for a bolder fill; `no-percent` / `no-value` / `no-title` / `no-note` to drop labels.
|
|
3708
|
+
<!-- TIPS end -->
|
|
3709
|
+
|
|
3710
|
+
A single progress-toward-a-target value: one `now` measured against one `target`, drawn in one of three static faces. No time axis, no series, no milestones — just "how close am I?". The face is a bare-flag mode directive under the title (like treemap's `radial`); all three faces consume the same value pair.
|
|
3711
|
+
|
|
3712
|
+
### Declaration
|
|
3713
|
+
|
|
3714
|
+
```
|
|
3715
|
+
goal [Title with unit]
|
|
3716
|
+
|
|
3717
|
+
[thermometer | gauge] // omit for the default progress bar
|
|
3718
|
+
now <number>
|
|
3719
|
+
target <number>
|
|
3720
|
+
```
|
|
3721
|
+
|
|
3722
|
+
### Example
|
|
3723
|
+
|
|
3724
|
+
```
|
|
3725
|
+
goal Doubloons Recovered ($)
|
|
3726
|
+
|
|
3727
|
+
thermometer
|
|
3728
|
+
|
|
3729
|
+
now 6400
|
|
3730
|
+
target 10000
|
|
3731
|
+
```
|
|
3732
|
+
|
|
3733
|
+
### Directives
|
|
3734
|
+
|
|
3735
|
+
| Directive | Effect |
|
|
3736
|
+
| ---------------------- | ------------------------------------------------------------- |
|
|
3737
|
+
| `thermometer` / `gauge`| Select the render face (bare flag; omit for the progress bar). |
|
|
3738
|
+
| `now <number>` | Current value (required; may exceed the target). |
|
|
3739
|
+
| `target <number>` | Goal value (required; must be > 0). |
|
|
3740
|
+
| `no-percent` | Hide the `%` label. |
|
|
3741
|
+
| `no-value` | Hide the raw `now / target` label. |
|
|
3742
|
+
| `solid-fill` | Full-saturation fill instead of the default 25% tint. |
|
|
3743
|
+
| `no-title` | Hide the banner title. |
|
|
3744
|
+
| `no-note` | Suppress the `note` block even if one is authored. |
|
|
3745
|
+
| `no-auto-color` | Disable the traffic-light bands; use the flat palette color. |
|
|
3746
|
+
| `note <text>` / `note` + indented body | Free-text caption beside/below the face (§ note block). |
|
|
3747
|
+
|
|
3748
|
+
### Note block
|
|
3749
|
+
|
|
3750
|
+
An optional caption. Inline (`note Still waiting on three crews`) or a block header on its own line followed by an **indented body**:
|
|
3751
|
+
|
|
3752
|
+
```
|
|
3753
|
+
goal Grog Barrel Fill (L)
|
|
3754
|
+
thermometer
|
|
3755
|
+
now 34
|
|
3756
|
+
target 50
|
|
3757
|
+
note
|
|
3758
|
+
**Great job, crew!** Still waiting on tallies from:
|
|
3759
|
+
- Seattle — first mate says "soon"
|
|
3760
|
+
- Columbus — *almost there!*
|
|
3761
|
+
```
|
|
3762
|
+
|
|
3763
|
+
The body supports inline `**bold**` / `*italic*` / `` `code` ``, `- `/`* ` bullets, and blank-line gaps. It renders in the left column for `thermometer`/`gauge` and under the bar for the default face. `no-note` hides it even when authored.
|
|
3764
|
+
|
|
3765
|
+
### Values & color
|
|
3766
|
+
|
|
3767
|
+
Values accept `_` separators (`10_000`) but not thousands commas; the unit lives in the title. Color precedence: (1) an explicit trailing color token on the title line (`goal Marathon Fund ($) green`, §1.5) always wins; (2) otherwise the **auto traffic-light** band by completion — `< 50%` red, `50–80%` orange, `≥ 80%` green (over-target stays green), which needs a `target`; (3) `no-auto-color` disables the bands and falls back to the palette series color. The fill is a 25% tint of the resolved color; `solid-fill` opts into full saturation.
|
|
3768
|
+
|
|
3769
|
+
### Semantics
|
|
3770
|
+
|
|
3771
|
+
Percent is `now / target`. Over-target clamps the fill at 100% while the `%` label shows the true value (e.g. `120%`); the gauge needle pins at max. A negative `now` clamps the fill to 0% but keeps the label truthful. A missing or ≤ 0 `target` emits an error-severity diagnostic and the chart falls back to a 0% shell; a missing `now` is treated as 0 with a warning.
|
|
3772
|
+
|
|
3773
|
+
---
|
|
3774
|
+
|
|
3775
|
+
## 24E. Countdown
|
|
3776
|
+
|
|
3777
|
+
<!-- TYPE:countdown -->
|
|
3778
|
+
|
|
3779
|
+
<!-- TIPS start -->
|
|
3780
|
+
**Styling tips:** The only dynamic chart — it ticks every second and is accurate on every load, so use it for a live "N days until X" widget, not a static report. Keep the title to the event (`Trip to Japan`); the target date renders as a caption automatically. `target` is a space-separated `key value` directive (no colon): a bare date (`2026-08-21`) counts to the viewer's local midnight, a datetime or offset is honored. Default `units days` reads best for weeks/months out; use `units full` for a launch-day `Nd HH:MM:SS` clock. Set `expired` to the celebration text (`🚀 Shipped!`); after the target passes every live surface shows it and the tick stops. On images (PNG export, `.svg` via `<img>`, GitHub camo) it can't tick and shows the whole-day count baked at export time — the correct fallback.
|
|
3781
|
+
<!-- TIPS end -->
|
|
3782
|
+
|
|
3783
|
+
The only *dynamic* dgmo chart: a single "N days until X" recomputed against the viewer's clock on every load and ticking every second on any live surface. Distinct from `goal` (static) — a countdown has no `now`/`target` pair, just one future instant. The renderer bakes a whole-day fallback number (the no-JS floor); a tiny page-level ticker overwrites it live and, in `units full`, upgrades it to `Nd HH:MM:SS`.
|
|
3784
|
+
|
|
3785
|
+
### Declaration
|
|
3786
|
+
|
|
3787
|
+
```
|
|
3788
|
+
countdown [Title]
|
|
3789
|
+
|
|
3790
|
+
target <ISO date | datetime | now>
|
|
3791
|
+
units <days | full> // default days
|
|
3792
|
+
expired <text> // default "Now!"
|
|
3793
|
+
```
|
|
3794
|
+
|
|
3795
|
+
### Example
|
|
3796
|
+
|
|
3797
|
+
```
|
|
3798
|
+
countdown Trip to Japan
|
|
3799
|
+
|
|
3800
|
+
target 2026-08-21
|
|
3801
|
+
```
|
|
3802
|
+
|
|
3803
|
+
### Directives
|
|
3804
|
+
|
|
3805
|
+
| Directive | Effect |
|
|
3806
|
+
| ----------------------- | ---------------------------------------------------------------------- |
|
|
3807
|
+
| `target <iso>` | The future instant (required). `2026-08-21`, `2026-08-21T18:00`, or with a tz offset. The literal `now` resolves at render (→ immediately expired; for testing). |
|
|
3808
|
+
| `units <days\|full>` | `days` (default) shows whole days (ceil); `full` ticks `Nd HH:MM:SS` on live surfaces. |
|
|
3809
|
+
| `expired <text>` | Shown once the target passes; the tick stops. Default `"Now!"`. |
|
|
3810
|
+
|
|
3811
|
+
### Values & color
|
|
3812
|
+
|
|
3813
|
+
A bare `YYYY-MM-DD` counts to the viewer's **local midnight**; a datetime with no offset is viewer-local; an explicit offset is honored. The trailing-token color rule (§1.5) applies to the title line (`countdown Trip to Japan blue`) and tints the figure.
|
|
3814
|
+
|
|
3815
|
+
### Semantics
|
|
3816
|
+
|
|
3817
|
+
Days mode uses `ceil` — a target later *today* reads "1 day", not "0". Full mode floors the days and shows `HH:MM:SS` for the remainder. Once the target passes, the `expired` text replaces the number and that node stops ticking (no negative counts). Live surfaces recompute from the absolute target on every load/route-change/note-open, so there is **no persisted state** and no drift; image surfaces (PNG, `.svg`-as-image, GitHub camo) show the whole-day count baked at export time.
|
|
3818
|
+
|
|
3819
|
+
---
|
|
3820
|
+
|
|
3821
|
+
## 24Eb. Clock
|
|
3822
|
+
|
|
3823
|
+
<!-- TYPE:clock -->
|
|
3824
|
+
|
|
3825
|
+
<!-- TIPS start -->
|
|
3826
|
+
**Styling tips:** A live world clock — one panel per person or place, each showing the CURRENT time in its zone and ticking every second, accurate the instant the page loads. Reach for it to answer "what time is it for the crew right now": a distributed team's local times, a single collaborator's clock, or the overlap window for scheduling a call. The first line declares the type and a title (`Crew standups`). Each entry is one line, `<place> <IANA/Zone> [as <label>]`: a human-readable place, then a real IANA zone (`Europe/London`, `America/New_York`, `America/Los_Angeles`, `Asia/Tokyo`) — never a bare offset like `GMT+1`, which doesn't track daylight saving. Use `as <label>` to name the person or role behind a zone (`New York America/New_York as Dani (NY)`); the label becomes the caption. The single-clock case is common and encouraged — one title, one entry (`clock Dani` / `New York America/New_York`). Global directives are flat, no colon: `analog` for analog dials (digital is the default face), `time-24` for a 24-hour readout (12h am/pm is the default), and optional context bands `hours 9-17` + `days mon-fri` (the window accepts `HH:MM` and am/pm, e.g. `hours 8:30-17:15`) to shade each zone's working window so out-of-hours people read at a glance. `no-sun` hides the sunrise/sundown indicator (on by default). Add `hours`/`days` only when the point is scheduling overlap; drop them for a plain "current time" widget. Zones are **colorized by default** (`color-by`, default `place` — a distinct palette accent per place); reach for a semantic mode when color should *mean* something: `color-by time` or `color-by daylight` make an at-a-glance world board read as day-vs-night (order the zones west→east so the daylight sweeps across), and `color-by work` turns a standup/team board green/amber/grey by availability — it needs `hours` set. A hand-set per-zone color (`London Europe/London as UK team purple`) is a **defined** shade that always wins over the dimension, so you can pin one zone and let the rest follow. `color-by none` goes neutral. On image surfaces (PNG, `.svg` via `<img>`, GitHub camo) it can't tick and bakes the time at export — the correct graceful fallback.
|
|
3827
|
+
<!-- TIPS end -->
|
|
3828
|
+
|
|
3829
|
+
The second *dynamic* dgmo chart (with `countdown`): a live board of world clocks recomputed against the viewer's clock every second. Flat syntax — the first line is `clock <Title>`; every other non-blank line is either a board-level directive (its first token is an option keyword) or a place row. Order-independent; no colons anywhere.
|
|
3830
|
+
|
|
3831
|
+
### Declaration
|
|
3832
|
+
|
|
3833
|
+
```
|
|
3834
|
+
clock [Title]
|
|
3835
|
+
|
|
3836
|
+
analog // analog dials; digital is the default face
|
|
3837
|
+
hours <start>-<end> // optional working window (24h, HH:MM or am/pm)
|
|
3838
|
+
days <mon-fri | mon,wed,fri> // optional working days (default mon-fri)
|
|
3839
|
+
no-sun // hide the sundown/sunrise line (on by default)
|
|
3840
|
+
time-24 // 24-hour readout (12h am/pm is the default)
|
|
3841
|
+
no-title // suppress the board title
|
|
3842
|
+
direction lr // lay the panels out in a row
|
|
3843
|
+
color-by <place|work|daylight|time|none> // zone coloring; default place
|
|
3844
|
+
|
|
3845
|
+
<place tokens…> <IANA/Zone> [as <label…>]
|
|
3846
|
+
```
|
|
3847
|
+
|
|
3848
|
+
### Example
|
|
3849
|
+
|
|
3850
|
+
```
|
|
3851
|
+
clock Crew standups
|
|
3852
|
+
hours 9-17
|
|
3853
|
+
days mon-fri
|
|
3854
|
+
|
|
3855
|
+
London Europe/London as UK team
|
|
3856
|
+
New York America/New_York as Dani (NY)
|
|
3857
|
+
Los Angeles America/Los_Angeles as West coast
|
|
3858
|
+
```
|
|
3859
|
+
|
|
3860
|
+
### Directives
|
|
3861
|
+
|
|
3862
|
+
| Directive | Effect |
|
|
3863
|
+
| ---------------------- | ---------------------------------------------------------------------- |
|
|
3864
|
+
| `analog` | Analog dials for the WHOLE board. Digital is the default face. |
|
|
3865
|
+
| `hours <start>-<end>` | Working window (e.g. `9-17`, `8:30-17:15`, or am/pm); drives the status chip, evaluated in each row's own zone. |
|
|
3866
|
+
| `days <range\|list>` | Working days: `mon-fri` or `mon,wed,fri`. Default Mon–Fri. No effect without `hours`. |
|
|
3867
|
+
| `no-sun` | Hide the sundown/sunrise line (on by default when the zone's city coordinates are known). |
|
|
3868
|
+
| `time-24` | 24-hour readout (12-hour am/pm is the default). |
|
|
3869
|
+
| `no-title` | Suppress the board title. |
|
|
3870
|
+
| `direction lr` | Lay the panels out in a row (columns) instead of stacked. |
|
|
3871
|
+
| `color-by <place\|work\|daylight\|time\|none>` | Which dimension colors the zones. Default `place`; `color-by none` goes neutral. `place` = identity accent per place; `work` = green/amber/grey by the `hours` window; `daylight` = warm sun-up / cool sun-down; `time` = local-hour dawn→night ramp (order zones west→east). A hand-set (**defined**) per-zone trailing color always wins over the dimension. |
|
|
3872
|
+
|
|
3873
|
+
### Entry grammar
|
|
3874
|
+
|
|
3875
|
+
Each place row is `<place tokens…> <IANA/Zone> [as <label…>]`. The zone is the token containing `/` (a full IANA name like `America/New_York`); text before it is the place, and `as <label>` sets the display alias (default = place). A row that is just a zone (`Asia/Tokyo`) uses the zone's city as the place.
|
|
3876
|
+
|
|
3877
|
+
### Semantics
|
|
3878
|
+
|
|
3879
|
+
Each row's time comes from `Intl.DateTimeFormat` with that row's zone, so DST is always correct. The renderer bakes the time, hands, offset, status, and sundown line at render (the no-JS floor); a tiny page-level ticker recomputes them from the baked zone/coords every second — no persisted state, no drift. Image surfaces (PNG, `.svg`-as-image, GitHub camo) show the time baked at export.
|
|
3880
|
+
|
|
3881
|
+
---
|
|
3882
|
+
|
|
3883
|
+
## 24F. Bracket
|
|
3884
|
+
|
|
3885
|
+
<!-- TYPE:bracket -->
|
|
3886
|
+
|
|
3887
|
+
<!-- TIPS start -->
|
|
3888
|
+
**Styling tips:** A single-elimination tournament bracket: winners auto-advance rightward toward a championship. Reach for it for playoff trees, knockout draws, and seeded fields. Two ways to author: seed the field for a **day-0 skeleton** (`seed 1 Team A`, `seed 2 Team B` …) and let matches fill in, or list results casually as `A beats B` / `A vs B` lines and let winners flow forward. Name the columns with `rounds` (comma-separated, e.g. `rounds Quarterfinals, Semifinals, Final`) or an indented `rounds` block with per-round colors. The two sides mirror inward to the final. Color a competitor's box outline with a `tag` group; `accent` overrides the winner highlight (default blue). `single-elim` is the default; opt-outs are `no-round` (hide column labels) and `no-legend`.
|
|
3889
|
+
<!-- TIPS end -->
|
|
3890
|
+
|
|
3891
|
+
A single-elimination tournament bracket. Winners auto-advance up a tree that builds itself from the results — a one-sided ladder for a simple pool, or two `[Side]` columns that mirror inward and meet at a championship (MLB / NBA / NCAA-style). Any `seed` line switches on **seeded mode** (day-0 skeleton); otherwise the bracket is **casual** (structure inferred from `beats` / `vs` lines).
|
|
3892
|
+
|
|
3893
|
+
### Declaration
|
|
3894
|
+
|
|
3895
|
+
```
|
|
3896
|
+
bracket [Title]
|
|
3897
|
+
rounds [Col1, Col2, ...] // optional column names, entry round → inner
|
|
3898
|
+
|
|
3899
|
+
[Side] [color] // optional — two sides mirror to a center final
|
|
3900
|
+
seed N [Competitor] // seeded mode: declare the field (day-0 skeleton)
|
|
3901
|
+
[Winner] beats [Loser] [score] // decided match — WINNER on the left, score cosmetic
|
|
3902
|
+
[A] vs [B] // pending match — no winner yet
|
|
3903
|
+
```
|
|
3904
|
+
|
|
3905
|
+
### Example
|
|
3906
|
+
|
|
3907
|
+
```
|
|
3908
|
+
bracket Grog Cup
|
|
3909
|
+
|
|
3910
|
+
Black Pearl beats Sea Serpent 5-3
|
|
3911
|
+
Salty Dog beats Kraken 4-2
|
|
3912
|
+
Black Pearl beats Salty Dog 6-5
|
|
3913
|
+
```
|
|
3914
|
+
|
|
3915
|
+
### Directives
|
|
3916
|
+
|
|
3917
|
+
| Directive | Effect |
|
|
3918
|
+
| ------------------------------ | ---------------------------------------------------------------------------- |
|
|
3919
|
+
| `rounds A, B, C` | Name the columns entry-round → inner (or an indented block with per-round `Name color`); absent → generic `Round N` / `Final`. |
|
|
3920
|
+
| `seed N [Name] [k: v]` | Declare a seeded entrant → seeded mode + day-0 skeleton (top seeds get byes); trailing `k: v` tags the team. |
|
|
3921
|
+
| `tag Group [as g]` | Tag group (block/kanban idiom) — a competitor's tag value colors its box outline; a legend renders. |
|
|
3922
|
+
| `[Side] [color]` | A bracket column (kanban idiom); two sides mirror to a center championship. |
|
|
3923
|
+
| `[Winner] beats [Loser] [score] [@ Home]` | A decided match — the left name advances; score is cosmetic; `@ Home` marks the host. Indent prose under it for commentary. |
|
|
3924
|
+
| `[A] vs [B]` | A pending, undecided match (both boxes drawn, no winner emphasis). |
|
|
3925
|
+
| `accent <color>` | Winner accent color override (default blue). Tags/sides still win per-box. |
|
|
3926
|
+
| `no-round` | Suppress the round/column labels. |
|
|
3927
|
+
| `no-legend` | Hide the tag legend (outlines still colored). |
|
|
3928
|
+
| `single-elim` / `double-elim` / `seeded` | Format flags. `double-elim` reserved — not yet supported; `seeded` forces seeded mode. |
|
|
3929
|
+
|
|
3930
|
+
### Semantics
|
|
3931
|
+
|
|
3932
|
+
The winner is always the left operand of `beats`, regardless of the score; a score that shows the winner lower emits a warning but keeps the declared winner. Reusing a name advances that competitor (same string = same entrant); a competitor whose first appearance is a later round simply never played round 1 (a bye). In seeded mode the field builds the standard single-elim skeleton (recursive 1-vs-N seeding: `3v6` / `4v5` for a six-team side, top seeds bye), every slot renders on day 0, and `beats` lines overwrite the `TBD` slots as games are played. Duplicate competitor names error (names are identifiers); `double-elim` parses but emits a "not yet supported" diagnostic.
|
|
3933
|
+
|
|
3934
|
+
---
|
|
3935
|
+
|
|
3531
3936
|
## 24A. RACI Matrices (RACI / RASCI / DACI)
|
|
3532
3937
|
|
|
3533
3938
|
<!-- TYPE:raci -->
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
body Powder Monkey Push Day
|
|
2
|
+
muscle
|
|
3
|
+
front
|
|
4
|
+
|
|
5
|
+
tag Effort as e
|
|
6
|
+
Primary red
|
|
7
|
+
Secondary orange
|
|
8
|
+
Warm-up yellow
|
|
9
|
+
|
|
10
|
+
chest e: Primary
|
|
11
|
+
Barbell bench press — 4×8
|
|
12
|
+
deltoids e: Primary
|
|
13
|
+
Overhead press — 3×10
|
|
14
|
+
triceps e: Secondary
|
|
15
|
+
Rope pushdowns — 3×12
|
|
16
|
+
abs e: Warm-up
|
|
17
|
+
Plank — 3×45s
|