schematex 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +21 -2
  2. package/README.zh-CN.md +2 -2
  3. package/dist/ai/ai-sdk.cjs +23 -23
  4. package/dist/ai/ai-sdk.d.cts +3 -3
  5. package/dist/ai/ai-sdk.d.ts +3 -3
  6. package/dist/ai/ai-sdk.js +18 -18
  7. package/dist/ai/index.cjs +32 -32
  8. package/dist/ai/index.d.cts +4 -4
  9. package/dist/ai/index.d.ts +4 -4
  10. package/dist/ai/index.js +19 -19
  11. package/dist/{api-DXOhuK3e.d.ts → api-1xoGiseb.d.cts} +2 -2
  12. package/dist/{api-B7C7qGiG.d.cts → api-CgXRSnCn.d.ts} +2 -2
  13. package/dist/browser.cjs +24 -24
  14. package/dist/browser.d.cts +3 -3
  15. package/dist/browser.d.ts +3 -3
  16. package/dist/browser.js +18 -18
  17. package/dist/{chunk-C2BNO3CI.cjs → chunk-35NGXDT2.cjs} +12 -12
  18. package/dist/{chunk-C2BNO3CI.cjs.map → chunk-35NGXDT2.cjs.map} +1 -1
  19. package/dist/{chunk-ZUK4BY55.js → chunk-3J4DZPZC.js} +3 -3
  20. package/dist/{chunk-ZUK4BY55.js.map → chunk-3J4DZPZC.js.map} +1 -1
  21. package/dist/{chunk-JEQGWH5N.js → chunk-3PH2MQGN.js} +3 -3
  22. package/dist/{chunk-JEQGWH5N.js.map → chunk-3PH2MQGN.js.map} +1 -1
  23. package/dist/{chunk-ZQECHIBI.js → chunk-3WX24RCH.js} +3 -3
  24. package/dist/{chunk-ZQECHIBI.js.map → chunk-3WX24RCH.js.map} +1 -1
  25. package/dist/{chunk-ATE7LD6I.cjs → chunk-4AC6I7KJ.cjs} +4 -4
  26. package/dist/{chunk-ATE7LD6I.cjs.map → chunk-4AC6I7KJ.cjs.map} +1 -1
  27. package/dist/{chunk-D4QZ6UDO.js → chunk-4MRVJI7G.js} +110 -3
  28. package/dist/chunk-4MRVJI7G.js.map +1 -0
  29. package/dist/{chunk-VOFND6ZQ.cjs → chunk-4OC3CTGE.cjs} +4 -4
  30. package/dist/{chunk-VOFND6ZQ.cjs.map → chunk-4OC3CTGE.cjs.map} +1 -1
  31. package/dist/{chunk-VG5LP5A4.cjs → chunk-5ZQRHDMQ.cjs} +4 -4
  32. package/dist/{chunk-VG5LP5A4.cjs.map → chunk-5ZQRHDMQ.cjs.map} +1 -1
  33. package/dist/{chunk-6W6RFZND.cjs → chunk-627GHE2N.cjs} +5 -5
  34. package/dist/{chunk-6W6RFZND.cjs.map → chunk-627GHE2N.cjs.map} +1 -1
  35. package/dist/{chunk-TDSGQT7R.js → chunk-64LABNTF.js} +3 -3
  36. package/dist/{chunk-TDSGQT7R.js.map → chunk-64LABNTF.js.map} +1 -1
  37. package/dist/{chunk-AEZVCGH4.cjs → chunk-6QZQTASC.cjs} +12 -12
  38. package/dist/{chunk-AEZVCGH4.cjs.map → chunk-6QZQTASC.cjs.map} +1 -1
  39. package/dist/{chunk-FFAJQ36U.cjs → chunk-6ZD7TCWO.cjs} +15 -15
  40. package/dist/{chunk-FFAJQ36U.cjs.map → chunk-6ZD7TCWO.cjs.map} +1 -1
  41. package/dist/{chunk-PUD7PIY5.js → chunk-AXMBXAEA.js} +3 -3
  42. package/dist/{chunk-PUD7PIY5.js.map → chunk-AXMBXAEA.js.map} +1 -1
  43. package/dist/{chunk-X3GEGVW2.js → chunk-B4CMWA6Y.js} +3 -3
  44. package/dist/{chunk-X3GEGVW2.js.map → chunk-B4CMWA6Y.js.map} +1 -1
  45. package/dist/{chunk-O6A2GJLI.cjs → chunk-C4Y24X3U.cjs} +4 -4
  46. package/dist/{chunk-O6A2GJLI.cjs.map → chunk-C4Y24X3U.cjs.map} +1 -1
  47. package/dist/{chunk-CAAMBDEN.cjs → chunk-ENUM7GMZ.cjs} +110 -2
  48. package/dist/chunk-ENUM7GMZ.cjs.map +1 -0
  49. package/dist/{chunk-IOD2EFMX.cjs → chunk-GAQ36VFD.cjs} +4 -4
  50. package/dist/{chunk-IOD2EFMX.cjs.map → chunk-GAQ36VFD.cjs.map} +1 -1
  51. package/dist/{chunk-AHSSFGDJ.cjs → chunk-GTCAJPQR.cjs} +1738 -217
  52. package/dist/chunk-GTCAJPQR.cjs.map +1 -0
  53. package/dist/{chunk-6GHXO3WQ.js → chunk-GYYYULBL.js} +3 -3
  54. package/dist/{chunk-6GHXO3WQ.js.map → chunk-GYYYULBL.js.map} +1 -1
  55. package/dist/{chunk-IU26USXA.cjs → chunk-INVLJYAE.cjs} +4 -4
  56. package/dist/{chunk-IU26USXA.cjs.map → chunk-INVLJYAE.cjs.map} +1 -1
  57. package/dist/{chunk-BXS53MLV.cjs → chunk-ITI3STJ6.cjs} +4 -4
  58. package/dist/{chunk-BXS53MLV.cjs.map → chunk-ITI3STJ6.cjs.map} +1 -1
  59. package/dist/{chunk-XAYD5NVJ.js → chunk-JEMAOC2D.js} +3 -3
  60. package/dist/{chunk-XAYD5NVJ.js.map → chunk-JEMAOC2D.js.map} +1 -1
  61. package/dist/{chunk-PZCYFT2A.js → chunk-M26ORU4P.js} +3 -3
  62. package/dist/{chunk-PZCYFT2A.js.map → chunk-M26ORU4P.js.map} +1 -1
  63. package/dist/{chunk-JCJWSW5Y.js → chunk-NIYB6CHH.js} +326 -4
  64. package/dist/chunk-NIYB6CHH.js.map +1 -0
  65. package/dist/{chunk-U4AJLMHC.js → chunk-NKYR4PAS.js} +3 -3
  66. package/dist/{chunk-U4AJLMHC.js.map → chunk-NKYR4PAS.js.map} +1 -1
  67. package/dist/{chunk-TFNH2NLJ.cjs → chunk-OJ3P4IC4.cjs} +4 -4
  68. package/dist/{chunk-TFNH2NLJ.cjs.map → chunk-OJ3P4IC4.cjs.map} +1 -1
  69. package/dist/{chunk-7P4C5DMD.js → chunk-PFZKW3HE.js} +3 -3
  70. package/dist/chunk-PFZKW3HE.js.map +1 -0
  71. package/dist/{chunk-QHZEGWE7.js → chunk-RDYACU2G.js} +3 -3
  72. package/dist/{chunk-QHZEGWE7.js.map → chunk-RDYACU2G.js.map} +1 -1
  73. package/dist/{chunk-UNLLWCQK.js → chunk-SXOAAQNY.js} +3 -3
  74. package/dist/{chunk-UNLLWCQK.js.map → chunk-SXOAAQNY.js.map} +1 -1
  75. package/dist/{chunk-LFJE64RD.cjs → chunk-TX3YWZZX.cjs} +328 -6
  76. package/dist/chunk-TX3YWZZX.cjs.map +1 -0
  77. package/dist/{chunk-BP6MLXJU.js → chunk-UFXDAIDD.js} +1552 -31
  78. package/dist/chunk-UFXDAIDD.js.map +1 -0
  79. package/dist/{chunk-MZWVJFTV.cjs → chunk-VY6UZYYL.cjs} +15 -15
  80. package/dist/{chunk-MZWVJFTV.cjs.map → chunk-VY6UZYYL.cjs.map} +1 -1
  81. package/dist/{chunk-Y4OBXYGW.cjs → chunk-VYQXB2RC.cjs} +12 -12
  82. package/dist/{chunk-Y4OBXYGW.cjs.map → chunk-VYQXB2RC.cjs.map} +1 -1
  83. package/dist/{chunk-JYAL26WQ.cjs → chunk-WJXLF42K.cjs} +4 -4
  84. package/dist/chunk-WJXLF42K.cjs.map +1 -0
  85. package/dist/{chunk-OND4N5ZZ.js → chunk-XCCXG6RR.js} +3 -3
  86. package/dist/{chunk-OND4N5ZZ.js.map → chunk-XCCXG6RR.js.map} +1 -1
  87. package/dist/{chunk-4CLAD7VZ.js → chunk-ZCHGIWJK.js} +3 -3
  88. package/dist/{chunk-4CLAD7VZ.js.map → chunk-ZCHGIWJK.js.map} +1 -1
  89. package/dist/{diagnostics-fyjWjeDa.d.ts → diagnostics-CDwnQ65n.d.cts} +1 -1
  90. package/dist/{diagnostics-fyjWjeDa.d.cts → diagnostics-CDwnQ65n.d.ts} +1 -1
  91. package/dist/diagrams/blockdiagram/index.cjs +6 -6
  92. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  93. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  94. package/dist/diagrams/blockdiagram/index.js +2 -2
  95. package/dist/diagrams/circuit/index.cjs +9 -9
  96. package/dist/diagrams/circuit/index.d.cts +1 -1
  97. package/dist/diagrams/circuit/index.d.ts +1 -1
  98. package/dist/diagrams/circuit/index.js +2 -2
  99. package/dist/diagrams/ecomap/index.cjs +7 -7
  100. package/dist/diagrams/ecomap/index.d.cts +1 -1
  101. package/dist/diagrams/ecomap/index.d.ts +1 -1
  102. package/dist/diagrams/ecomap/index.js +2 -2
  103. package/dist/diagrams/entity/index.cjs +6 -6
  104. package/dist/diagrams/entity/index.d.cts +1 -1
  105. package/dist/diagrams/entity/index.d.ts +1 -1
  106. package/dist/diagrams/entity/index.js +2 -2
  107. package/dist/diagrams/fishbone/index.cjs +8 -8
  108. package/dist/diagrams/fishbone/index.d.cts +1 -1
  109. package/dist/diagrams/fishbone/index.d.ts +1 -1
  110. package/dist/diagrams/fishbone/index.js +2 -2
  111. package/dist/diagrams/flowchart/index.cjs +8 -8
  112. package/dist/diagrams/flowchart/index.d.cts +2 -2
  113. package/dist/diagrams/flowchart/index.d.ts +2 -2
  114. package/dist/diagrams/flowchart/index.js +2 -2
  115. package/dist/diagrams/genogram/index.cjs +9 -9
  116. package/dist/diagrams/genogram/index.d.cts +1 -1
  117. package/dist/diagrams/genogram/index.d.ts +1 -1
  118. package/dist/diagrams/genogram/index.js +2 -2
  119. package/dist/diagrams/ladder/index.cjs +6 -6
  120. package/dist/diagrams/ladder/index.d.cts +1 -1
  121. package/dist/diagrams/ladder/index.d.ts +1 -1
  122. package/dist/diagrams/ladder/index.js +2 -2
  123. package/dist/diagrams/logic/index.cjs +8 -8
  124. package/dist/diagrams/logic/index.d.cts +1 -1
  125. package/dist/diagrams/logic/index.d.ts +1 -1
  126. package/dist/diagrams/logic/index.js +2 -2
  127. package/dist/diagrams/orgchart/index.cjs +8 -8
  128. package/dist/diagrams/orgchart/index.d.cts +1 -1
  129. package/dist/diagrams/orgchart/index.d.ts +1 -1
  130. package/dist/diagrams/orgchart/index.js +2 -2
  131. package/dist/diagrams/pedigree/index.cjs +7 -7
  132. package/dist/diagrams/pedigree/index.d.cts +1 -1
  133. package/dist/diagrams/pedigree/index.d.ts +1 -1
  134. package/dist/diagrams/pedigree/index.js +2 -2
  135. package/dist/diagrams/phylo/index.cjs +7 -7
  136. package/dist/diagrams/phylo/index.d.cts +1 -1
  137. package/dist/diagrams/phylo/index.d.ts +1 -1
  138. package/dist/diagrams/phylo/index.js +2 -2
  139. package/dist/diagrams/sld/index.cjs +8 -8
  140. package/dist/diagrams/sld/index.d.cts +1 -1
  141. package/dist/diagrams/sld/index.d.ts +1 -1
  142. package/dist/diagrams/sld/index.js +2 -2
  143. package/dist/diagrams/sociogram/index.cjs +6 -6
  144. package/dist/diagrams/sociogram/index.d.cts +1 -1
  145. package/dist/diagrams/sociogram/index.d.ts +1 -1
  146. package/dist/diagrams/sociogram/index.js +2 -2
  147. package/dist/diagrams/timing/index.d.cts +1 -1
  148. package/dist/diagrams/timing/index.d.ts +1 -1
  149. package/dist/diagrams/venn/index.cjs +9 -9
  150. package/dist/diagrams/venn/index.d.cts +1 -1
  151. package/dist/diagrams/venn/index.d.ts +1 -1
  152. package/dist/diagrams/venn/index.js +2 -2
  153. package/dist/{index-CFaKjWPy.d.ts → index-CYSH3_ca.d.ts} +1 -1
  154. package/dist/{index-DZNmJWGg.d.cts → index-DNOoLmYX.d.cts} +1 -1
  155. package/dist/index.cjs +86 -86
  156. package/dist/index.d.cts +4 -4
  157. package/dist/index.d.ts +4 -4
  158. package/dist/index.js +22 -22
  159. package/dist/react.cjs +18 -18
  160. package/dist/react.d.cts +2 -2
  161. package/dist/react.d.ts +2 -2
  162. package/dist/react.js +17 -17
  163. package/dist/{tools-BDNih0Mb.d.ts → tools-BhTti-oG.d.ts} +3 -3
  164. package/dist/{tools-C23t_WeN.d.cts → tools-CbYmQ3hH.d.cts} +3 -3
  165. package/package.json +1 -1
  166. package/dist/chunk-7P4C5DMD.js.map +0 -1
  167. package/dist/chunk-AHSSFGDJ.cjs.map +0 -1
  168. package/dist/chunk-BP6MLXJU.js.map +0 -1
  169. package/dist/chunk-CAAMBDEN.cjs.map +0 -1
  170. package/dist/chunk-D4QZ6UDO.js.map +0 -1
  171. package/dist/chunk-JCJWSW5Y.js.map +0 -1
  172. package/dist/chunk-JYAL26WQ.cjs.map +0 -1
  173. package/dist/chunk-LFJE64RD.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkAHSSFGDJ_cjs = require('./chunk-AHSSFGDJ.cjs');
3
+ var chunkGTCAJPQR_cjs = require('./chunk-GTCAJPQR.cjs');
4
4
 
5
5
  // src/ai/registry.ts
6
6
  var DIAGRAM_REGISTRY = [
@@ -597,6 +597,36 @@ var DIAGRAM_REGISTRY = [
597
597
  "furniture placement",
598
598
  "space planning"
599
599
  ]
600
+ },
601
+ {
602
+ type: "playbook",
603
+ name: "Sports playbook",
604
+ tagline: "Multi-sport tactics boards from one paragraph of text \u2014 American football X&O, basketball half-court sets, and soccer team shapes drawn in coaching-standard notation, each sport on its own correctly-scaled field/court/pitch.",
605
+ useWhen: 'Use to diagram a single play, set, or team shape for American football, basketball, or soccer. Header `playbook "Title" sport football|basketball|soccer`. Place players by formation (football `formation i-form|spread|trips|...`, basketball `set horns|spread-pnr|5-out|...`, soccer `formation 4-3-3|4-4-2|...`) or individually with `player`. Draw assignments with movement verbs whose line style is coaching-correct per sport: football `route X go` / `run RB power right` / `block` / `pull` / `handoff` (solid routes, arrowheads, block T-bars) on a yard-scaled field with LOS, hashes, end zone and goalposts; basketball `pass` (dashed) / `cut` (solid) / `dribble` (wavy) / `screen` (T-bar) to named landmarks (rim, elbow, wing, corner) on an NBA half-court; soccer `pass` (solid) / `run` (dashed) / `dribble` (wavy) / `shot` on an IFAB pitch. Optional `defense` overlays man/zone shells. The engine resolves formations, named routes, and landmarks, and renders each sport in its own coordinate model. Not for play-by-play game film, statistics, or league-table graphics.',
606
+ cluster: "sports",
607
+ standard: "American Football Coaches Association X&O convention \xB7 FIBA/NBA half-court markings \xB7 IFAB Laws of the Game pitch (Law 1); see 49-SPORTS-PLAYBOOK-STANDARD.md",
608
+ syntaxKey: "playbook",
609
+ aliases: [
610
+ "Sports playbook",
611
+ "playbook",
612
+ "football play",
613
+ "X and O diagram",
614
+ "basketball play",
615
+ "soccer tactics",
616
+ "\u6218\u672F\u677F",
617
+ "\u6218\u672F\u56FE"
618
+ ],
619
+ keywords: [
620
+ "playbook",
621
+ "football play",
622
+ "X's and O's",
623
+ "basketball play",
624
+ "pick and roll",
625
+ "soccer formation",
626
+ "tactics board",
627
+ "route tree",
628
+ "coaching diagram"
629
+ ]
600
630
  }
601
631
  ];
602
632
  var DIAGRAM_SINCE = {
@@ -660,7 +690,9 @@ var DIAGRAM_SINCE = {
660
690
  // 0.8.1 — welding symbols (AWS A2.4 / ISO 2553)
661
691
  welding: "0.8.1",
662
692
  // 0.9.3
663
- floorplan: "0.9.3"
693
+ floorplan: "0.9.3",
694
+ // 0.9.4 — multi-sport playbook (football X&O / basketball / soccer)
695
+ playbook: "0.9.4"
664
696
  };
665
697
  function getDiagramSince(type) {
666
698
  const resolved = resolveDiagramType(type);
@@ -3128,6 +3160,261 @@ If the LED doesn't light up, three things to check, in order: LED polarity (the
3128
3160
 
3129
3161
  **Why P&ID, not PFD.** A process flow diagram (PFD) shows the same equipment but only the major process streams, mass balances, and operating conditions. A P&ID adds every instrument, every valve, every signal line, and every utility connection \u2014 it is the engineering document used by instrument engineers to write I/O lists, by safety engineers to perform HAZOP, and by construction teams to verify field installation. The DSL lets you build this level of detail from text, making it tractable for AI-assisted first drafts and version-controlled review cycles.`
3130
3162
  },
3163
+ {
3164
+ "slug": "playbook-basketball-backdoor",
3165
+ "diagram": "playbook",
3166
+ "title": "Backdoor Cut",
3167
+ "description": "When the defender overplays the passing lane, cut behind him to the rim.",
3168
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3169
+ "tags": [
3170
+ "basketball",
3171
+ "backdoor",
3172
+ "cutting",
3173
+ "Princeton"
3174
+ ],
3175
+ "complexity": 1,
3176
+ "featured": false,
3177
+ "dsl": 'playbook "Backdoor Cut" sport basketball\nset 5-out\ncut 3 rim\npass 1 to 4,6',
3178
+ "notes": "The **backdoor** punishes a defender who denies the wing too aggressively: the wing `cut`s behind him to the `rim` and the top passes to the cutter (`pass 1 to 4,6`) for an easy finish. A staple of Princeton and motion offense."
3179
+ },
3180
+ {
3181
+ "slug": "playbook-basketball-floppy",
3182
+ "diagram": "playbook",
3183
+ "title": "Floppy Action",
3184
+ "description": "A shooter chooses a single or double screen off the baseline to get open on the wing.",
3185
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3186
+ "tags": [
3187
+ "basketball",
3188
+ "floppy",
3189
+ "off-ball-screens",
3190
+ "shooting"
3191
+ ],
3192
+ "complexity": 3,
3193
+ "featured": false,
3194
+ "dsl": 'playbook "Floppy Action" sport basketball\nset 1-4-low\nscreen 4 2\nscreen 5 3\ncut 2 lwing\npass 1 2',
3195
+ "notes": "**Floppy** starts a shooter under the basket with a single screen on one side and a double on the other. Reading the defense, the shooter curls off a screen (`screen 4 2`) up to the wing (`cut 2 lwing`) for a catch-and-shoot \u2014 `pass 1 2`."
3196
+ },
3197
+ {
3198
+ "slug": "playbook-basketball-give-and-go",
3199
+ "diagram": "playbook",
3200
+ "title": "Give & Go",
3201
+ "description": "The oldest play in basketball \u2014 pass, cut to the basket, get it back.",
3202
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3203
+ "tags": [
3204
+ "basketball",
3205
+ "give-and-go",
3206
+ "cutting",
3207
+ "fundamentals"
3208
+ ],
3209
+ "complexity": 1,
3210
+ "featured": false,
3211
+ "dsl": 'playbook "Give & Go" sport basketball\nset 5-out\npass 1 2\ncut 1 rim\npass 2 1',
3212
+ "notes": "The **give & go** is the first play every player learns: `pass` to a teammate, `cut` hard to the `rim`, and receive the return `pass` for a layup. Shown from a `5-out` alignment so the lane is empty for the cut."
3213
+ },
3214
+ {
3215
+ "slug": "playbook-basketball-horns",
3216
+ "diagram": "playbook",
3217
+ "title": "Horns Twist",
3218
+ "description": "A two-big set at the elbows that creates a ball screen with a re-screen counter.",
3219
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3220
+ "tags": [
3221
+ "basketball",
3222
+ "horns",
3223
+ "ball-screen",
3224
+ "set-play"
3225
+ ],
3226
+ "complexity": 3,
3227
+ "featured": false,
3228
+ "dsl": 'playbook "Horns Twist" sport basketball\nset horns\nscreen 5 1\ndribble 1 to 11,16\ncut 5 rim\ncut 4 to 0,26\npass 1 3',
3229
+ "notes": "**Horns** places two bigs at the elbows and two shooters in the corners. One big screens for the ball (`screen 5 1`) and rolls to the `rim` while the second pops to the top (`cut 4`), giving the ball-handler a roll-or-pop read plus a corner skip (`pass 1 3`)."
3230
+ },
3231
+ {
3232
+ "slug": "playbook-basketball-pick-and-roll",
3233
+ "diagram": "playbook",
3234
+ "title": "Spread Pick & Roll",
3235
+ "description": "The defining action of modern basketball \u2014 a ball screen with four shooters spacing the floor.",
3236
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3237
+ "tags": [
3238
+ "basketball",
3239
+ "pick-and-roll",
3240
+ "spacing",
3241
+ "half-court"
3242
+ ],
3243
+ "complexity": 2,
3244
+ "featured": true,
3245
+ "dsl": 'playbook "Spread Pick & Roll" sport basketball\nset spread-pnr\nscreen 5 1\ndribble 1 to 11,17\ncut 5 rim\npass 1 2',
3246
+ "notes": "The **pick & roll** is the most-run action in the sport. The big (`screen 5 1`) sets a ball screen, the guard `dribble`s off it, and the screener `cut`s (rolls) to the `rim`. With the other three players spaced behind the arc, help defense leaves a shooter open \u2014 `pass 1 2`. Note the basketball legend: dashed = pass, solid = cut, wavy = dribble."
3247
+ },
3248
+ {
3249
+ "slug": "playbook-football-four-verticals",
3250
+ "diagram": "playbook",
3251
+ "title": "Four Verticals (vs Cover 2)",
3252
+ "description": "The Air Raid staple \u2014 four receivers run vertical, stretching a two-deep shell until a seam opens.",
3253
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3254
+ "tags": [
3255
+ "football",
3256
+ "passing",
3257
+ "air-raid",
3258
+ "cover-2"
3259
+ ],
3260
+ "complexity": 2,
3261
+ "featured": true,
3262
+ "dsl": 'playbook "Four Verticals" sport football\nfield down 2 distance 7 los 40\nformation spread\ndefense cover-2\nroute X go\nroute H seam\nroute Y seam\nroute Z go\nroute RB flat right',
3263
+ "notes": "**Four Verticals** floods a two-deep coverage with four vertical threats: the outside receivers run `go` routes up the sidelines while the inner two bend to the `seam`, forcing the two deep safeties to choose. The back leaks to the `flat` as a checkdown. Drawn out of `spread` against `cover-2`, with each route on the football route tree."
3264
+ },
3265
+ {
3266
+ "slug": "playbook-football-mesh",
3267
+ "diagram": "playbook",
3268
+ "title": "Mesh Concept",
3269
+ "description": "Two shallow crossers rub underneath while a corner route clears the top \u2014 the classic man-and-zone beater.",
3270
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3271
+ "tags": [
3272
+ "football",
3273
+ "passing",
3274
+ "mesh",
3275
+ "crossers"
3276
+ ],
3277
+ "complexity": 3,
3278
+ "featured": false,
3279
+ "dsl": 'playbook "Mesh Concept" sport football\nfield down 1 distance 10 los 35\nformation spread\ndefense cover-3\nroute Y drag\nroute H cross\nroute Z corner 12\nroute X hitch\nroute RB flat right',
3280
+ "notes": "**Mesh** sends two receivers on shallow crossing routes (`drag` and `cross`) that brush past each other just over the ball, creating a natural rub against man coverage and a moving window against zone. The `corner` route clears the deep defender and the `hitch` plus `flat` give quick outlets."
3281
+ },
3282
+ {
3283
+ "slug": "playbook-football-power-o",
3284
+ "diagram": "playbook",
3285
+ "title": "Power O",
3286
+ "description": "The most-installed gap run in football \u2014 backside guard pulls to lead through the hole.",
3287
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3288
+ "tags": [
3289
+ "football",
3290
+ "run",
3291
+ "power",
3292
+ "gap-scheme"
3293
+ ],
3294
+ "complexity": 3,
3295
+ "featured": false,
3296
+ "dsl": 'playbook "Power O" sport football\nfield down 1 distance 10 los 35\nformation i-form right\ndefense 4-3\nhandoff QB RB\nrun RB power right\npull LG right\nblock FB DE_S\nroute Z go',
3297
+ "notes": "**Power O** is the foundational gap run: the play-side blocks down, the fullback kicks out the edge, and the backside guard (`pull LG`) wraps through the hole to lead for the back. Drawn from `i-form` against a `4-3` front with the handoff and pulling lineman shown."
3298
+ },
3299
+ {
3300
+ "slug": "playbook-football-red-zone-fade",
3301
+ "diagram": "playbook",
3302
+ "title": "Red Zone \u2014 Play-Action Fade",
3303
+ "description": "A goal-line play-action shot showing the end zone, goal line, and goalposts.",
3304
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3305
+ "tags": [
3306
+ "football",
3307
+ "red-zone",
3308
+ "play-action",
3309
+ "fade"
3310
+ ],
3311
+ "complexity": 2,
3312
+ "featured": false,
3313
+ "dsl": 'playbook "Red Zone \u2014 Play-Action Fade" sport football\nfield down 1 distance 5 los 5 goal 5 hash nfl\nformation i-form right\ndefense cover-1\nhandoff QB RB\nroute Z corner 4\nroute X slant\nroute Y out 3\nrun RB dive right',
3314
+ "notes": "Inside the 5-yard line the field changes: `goal 5` draws the end zone band, gold goal line, and goalposts. The play fakes the `dive` (`handoff` + `run`) to freeze the linebackers, then throws the back-corner `fade` with a `slant` and `out` as alternatives against `cover-1`."
3315
+ },
3316
+ {
3317
+ "slug": "playbook-football-smash",
3318
+ "diagram": "playbook",
3319
+ "title": "Smash Concept",
3320
+ "description": "A corner-over-hitch high-low that puts the cornerback in a bind \u2014 the textbook Cover 2 beater.",
3321
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3322
+ "tags": [
3323
+ "football",
3324
+ "passing",
3325
+ "smash",
3326
+ "cover-2"
3327
+ ],
3328
+ "complexity": 2,
3329
+ "featured": false,
3330
+ "dsl": 'playbook "Smash Concept" sport football\nfield down 3 distance 6 los 45\nformation trips right\ndefense cover-2\nroute Z hitch\nroute Y corner 12\nroute X slant\nroute H flat right',
3331
+ "notes": "**Smash** pairs a `hitch` underneath with a `corner` route over the top on the same side. The flat defender can cover one but not both: jump the hitch and the corner is open behind him; sink to the corner and the hitch sits down in front. Shown from `trips right` against `cover-2`."
3332
+ },
3333
+ {
3334
+ "slug": "playbook-soccer-4-3-3-shape",
3335
+ "diagram": "playbook",
3336
+ "title": "4-3-3 Team Shape",
3337
+ "description": "The default possession shape \u2014 a back four, a midfield three, and a front three.",
3338
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3339
+ "tags": [
3340
+ "soccer",
3341
+ "formation",
3342
+ "4-3-3",
3343
+ "shape"
3344
+ ],
3345
+ "complexity": 1,
3346
+ "featured": true,
3347
+ "dsl": 'playbook "4-3-3 Team Shape" sport soccer\nformation 4-3-3',
3348
+ "notes": "A formation on its own draws the **team shape**. The **4-3-3** \u2014 four defenders, three midfielders, three forwards \u2014 is the modern possession default, giving width through the wingers and a passing triangle in midfield. Players are numbered by position on a full IFAB pitch."
3349
+ },
3350
+ {
3351
+ "slug": "playbook-soccer-build-up",
3352
+ "diagram": "playbook",
3353
+ "title": "Build-Up From the Back",
3354
+ "description": "Playing out of the defensive third \u2014 split the centre-backs, invite pressure, pass through the lines.",
3355
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3356
+ "tags": [
3357
+ "soccer",
3358
+ "build-up",
3359
+ "possession",
3360
+ "passing"
3361
+ ],
3362
+ "complexity": 2,
3363
+ "featured": false,
3364
+ "dsl": 'playbook "Build-Up From the Back" sport soccer\nformation 4-3-3\npass 1 4\npass 4 2\nrun 2 to 40,10\npass 4 6\nrun 6 to 62,24',
3365
+ "notes": "**Building from the back** starts with the keeper (`pass 1 4`) and works the ball through the centre-back and full-back while the pivot drops to receive. Soccer draws passes **solid** and runs **dashed** \u2014 note the full-back's overlapping `run` and the pivot turning forward."
3366
+ },
3367
+ {
3368
+ "slug": "playbook-soccer-counter-attack",
3369
+ "diagram": "playbook",
3370
+ "title": "Counter-Attack",
3371
+ "description": "Win it in midfield and go \u2014 a vertical pass, a driving carry, and three forwards sprinting in behind.",
3372
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3373
+ "tags": [
3374
+ "soccer",
3375
+ "counter-attack",
3376
+ "transition",
3377
+ "through-ball"
3378
+ ],
3379
+ "complexity": 3,
3380
+ "featured": false,
3381
+ "dsl": 'playbook "Counter-Attack" sport soccer\nformation 4-3-3\npass 6 8\ndribble 8 to 66,28\npass 8 to 96,18\nrun 7 to 99,20\nrun 9 to 94,36\nrun 11 to 95,52',
3382
+ "notes": "On the **counter**, speed beats numbers. The pivot wins it and finds a midfielder (`pass 6 8`) who carries into space (`dribble`), then releases a `pass` through ball as all three forwards sprint in behind (`run`). The solid pass + dashed runs read instantly as a transition moment."
3383
+ },
3384
+ {
3385
+ "slug": "playbook-soccer-high-press",
3386
+ "diagram": "playbook",
3387
+ "title": "High Press 4-3-3",
3388
+ "description": "Coordinated forward pressure \u2014 the front three and a midfielder hunt the ball in the opponent's half.",
3389
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3390
+ "tags": [
3391
+ "soccer",
3392
+ "high-press",
3393
+ "gegenpress",
3394
+ "defending"
3395
+ ],
3396
+ "complexity": 2,
3397
+ "featured": false,
3398
+ "dsl": 'playbook "High Press 4-3-3" sport soccer\nformation 4-3-3\nrun 9 to 98,34\nrun 7 to 94,20\nrun 11 to 94,48\nrun 8 to 76,40',
3399
+ "notes": "A **high press** wins the ball back near the opponent's goal. The striker leads the press onto the centre-backs while the wingers curve their `run`s to cut the passing lanes to the full-backs, and a midfielder steps up to support \u2014 the coordinated forward movement that defines the gegenpress."
3400
+ },
3401
+ {
3402
+ "slug": "playbook-soccer-overlap",
3403
+ "diagram": "playbook",
3404
+ "title": "Overlap & Cross",
3405
+ "description": "The full-back overlaps the winger to get to the byline and deliver a cross into the box.",
3406
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3407
+ "tags": [
3408
+ "soccer",
3409
+ "overlap",
3410
+ "cross",
3411
+ "wide-play"
3412
+ ],
3413
+ "complexity": 3,
3414
+ "featured": false,
3415
+ "dsl": 'playbook "Overlap & Cross" sport soccer\nview half\nplayer 7 o at 75,12 label 7\nplayer 2 o at 60,15 label 2\nplayer 9 o at 88,30 label 9\nplayer 11 o at 85,52 label 11\nplayer 10 o at 80,38 label 10\ndribble 7 to 82,20\nrun 2 to 90,8\npass 7 to 90,8\npass 2 to 102,34\nrun 9 to 101,31\nrun 11 to 101,40',
3416
+ "notes": "The **overlap** combines the winger and full-back: the winger drives inside (`dribble`) to fix the defender while the full-back `run`s outside and overlaps. The release pass down the line (`pass 7 to 90,8`) sets up a byline cross to the strikers attacking the box. Drawn with `view half` and explicit players for full control."
3417
+ },
3131
3418
  {
3132
3419
  "slug": "prisma-dual-pipeline",
3133
3420
  "diagram": "prisma",
@@ -4095,6 +4382,10 @@ var SYNTAX = {
4095
4382
  "floorplan": {
4096
4383
  "title": "Floor plan",
4097
4384
  "content": '## 1. Your first floor plan\n\nA header, one room, a door, and a window:\n\n```\nfloorplan "Studio"\nroom main "Studio" at 0,0 size 4x3\ndoor main south at 20%\nwindow main north at 50%\n```\n\nThree rules cover most usage:\n\n1. Start with `floorplan`, an optional quoted title, and `unit m` (default) or `unit ft`. **All numbers are in this unit.**\n2. Rooms are rectangles: `room id "Label" at x,y size WxH`. The label and computed area render centered in the room.\n3. Openings hang on walls: a wall reference (`main south`) positions along that wall at a percentage; `between A B` finds the shared wall automatically.\n\n---\n\n## 2. Rooms and placement\n\nPlace the first room at `0,0` and chain the rest relatively \u2014 adjacent rooms share an edge exactly, and their walls merge into a single band:\n\n```\nroom living "Living Room" at 0,0 size 5.2x4.2\nroom kitchen "Kitchen" right-of living size 3.0x4.2\nroom hall "Hallway" below living size 2.0x2.6\nroom bed1 "Bedroom 1" right-of hall size 3.2x2.6\n```\n\n- `right-of` / `left-of` / `above` / `below` snap to the reference room\'s edge.\n- `align start|center|end` aligns the cross axis (default `start` = top/left edges flush); `offset n` shifts it.\n- `fill #e0f2fe` tints the floor; `nolabel` suppresses the name + area label (single-space plans like classrooms).\n- Coordinates are y-down: `at 0,0` is the top-left corner.\n\n**L/T/U-shaped rooms** use `extend` \u2014 declare the main rectangle, then grow it with edge-sharing rectangles. The walls merge along the seam, the area is summed into one number (exactly how professionals measure L-rooms), and the label centers on the largest part:\n\n```\nroom living "Living Room" at 0,0 size 5x4\nextend living at 5,2 size 2x2 # L-shape: notch at top-right\n```\n\nAn extension that doesn\'t touch the room, or overlaps it, is rejected with a quantified error. `north` (optionally `north 30` for rotated plans) adds the compass at the top right.\n\n---\n\n## 3. Doors, windows, openings\n\n```\ndoor hall west at 50% width 1.0 swing in # exterior door on a wall\ndoor between hall bed1 at 50% hinge right # interior door on the shared wall\ndoor between bed1 bath at 30% type sliding # sliding door \u2014 no arc\nopening between living kitchen at 35% width 1.2 # archway, no leaf\nwindow living north at 30% width 1.8\n```\n\n- `between A B` resolves the shared wall segment and positions at the percentage **along the overlap** \u2014 no coordinates needed. Non-adjacent rooms are rejected with the measured gap.\n- Doors default to 0.9 m wide on exterior walls, 0.8 m on `between` walls; windows default to 1.2 m.\n- `hinge left|right` picks the jamb; `swing in|out` flips the quarter-arc (default swings into the owning room \u2014 the first room named).\n- Door `type single|double|sliding|pocket|bifold`: double draws two mirrored arcs; sliding/pocket draw offset leaf lines without an arc; bifold draws the two closet-door tent peaks.\n- Window `type fixed|sliding|casement|bay`: sliding = two offset panels, casement adds the outward swing arc, bay projects a splayed trapezoid outside the wall.\n- Openings clamp to fit their wall segment (with a warning) rather than overflowing.\n\n---\n\n## 4. Furniture\n\nFurniture is placed **relative to its room\'s interior top-left corner**, with optional `size`, `rotate`, and a label:\n\n```\nfurniture sofa in living at 0.25,2.9\nfurniture desk "Teacher" in class at 2,1.5 size 5x2.5 rotate 20\nfurniture counter "Cubbies" in class at 6,24.4 size 10x1.2\n```\n\nThe catalog spans residential, commercial, and site work (sizes default to industry-standard footprints):\n\n| Cluster | Types |\n| --- | --- |\n| Residential | `bed-double` `bed-single` `bed-queen` `bed-king` `bunk-bed` `crib` `sofa` `loveseat` `sectional` `armchair` `ottoman` `coffee-table` `side-table` `tv` `tv-stand` `fireplace` `floor-lamp` `rug` `wardrobe` `dresser` `nightstand` `bookshelf` `plant` `piano` `piano-upright` `pool-table` `ceiling-fan` `dining-table` |\n| Kitchen / bath | `counter` `wall-cabinet` `kitchen-sink` `stove` `range-hood` `fridge` `dishwasher` `island` `bar-stool` `toilet` `sink` `vanity` `bidet` `urinal` `bathtub` `shower` `washer` `dryer` |\n| Classroom / office | `desk-chair` `desk` `desk-l` `chair` `whiteboard` `smartboard` `bookcase` `cubbies` `filing-cabinet` `lockers` `kidney-table` `round-table-4/6/8/10` `conference-table` |\n| Event / banquet | `banquet-table` `head-table` `stage` `dance-floor` `bar` `dj-booth` `cocktail-table` `podium` `row-chairs` |\n| Retail / warehouse | `shelving` `checkout` `clothing-rack` `fitting-room` `pallet-rack` `loading-dock` `forklift` |\n| Salon / gym | `salon-chair` `shampoo-bowl` `manicure-table` `treadmill` `weight-bench` `power-rack` `yoga-mat` |\n| Stairs / structural | `stairs` `stairs-l` `stairs-u` `spiral-stairs` `elevator` `column` |\n| Site / outdoor | `tree` `car` |\n\n**Auto-seating** is built in: `round-table-8` draws 8 chairs on its circumference (60\u2033 top; `round-table-10` uses 72\u2033), `dining-table` / `banquet-table` / `conference-table` seat both long edges at one chair per 0.65 m, `head-table` seats one side facing the room, `manicure-table` seats a client and technician chair, and `row-chairs` places a theater strip at 0.55 m pitch. `rug`, `dance-floor`, `yoga-mat`, `counter`, `island`, `wall-cabinet`, `range-hood`, and `ceiling-fan` are underlays/overheads \u2014 other furniture can overlap them without a collision warning.\n\n`tree` and `car` are sized for the outdoors (canopy disc, parking-stall footprint), so a **site plan** is just zones tiled as adjacent rooms \u2014 front yard, house footprint, driveway, back yard \u2014 with trees and parked cars placed on top.\n\n**Stairs** follow the drafting conventions: tread lines at 0.28 m (11\u2033), a direction arrow starting at the lowest tread labeled `UP` (give the item a `"DN"` label for a descending run), and the 45\xB0 zigzag break line at the imaginary 4-ft cut plane, with dashed treads beyond. `stairs` is a straight run (orient with `size`/`rotate`), `stairs-l` turns 90\xB0 over a landing, `stairs-u` switches back 180\xB0, `spiral-stairs` is a circle with radial treads and a center pole.\n\n---\n\n## 5. Arrays \u2014 grid, row, arc\n\nRepeated furniture is one statement, not thirty:\n\n```\ngrid desk-chair in class rows 5 cols 6 count 27 area 5,8 25,24 itemsize 2x2.5\nrow round-table-8 in hall cols 3 area 8.8,13.4 15.2,13.4 itemsize 2.3x2.3\narc chair in hall count 13 center 12,8 radius 5 from 200 to 340\n```\n\n- `area x1,y1 x2,y2` gives the first and last item **centers**; items spread evenly between them.\n- `count` truncates **row-major** \u2014 27 desks in a 5\xD76 grid drops the last row\'s tail, exactly like a real classroom.\n- `arc` places items on a circular arc facing the center \u2014 semicircle classrooms, ceremony seating.\n\n---\n\n## 6. Units, areas, dimension lines\n\n- `unit ft` makes every number feet; dimension lines format as `32\'` / `15\'1"` and areas as `sq ft`. Internally everything is metric (1 ft = 0.3048 m).\n- Room areas are **computed by the engine** from the declared geometry, never typed by hand.\n- Dimension lines render outside the plan with architectural slash ticks: overall width + height always, plus per-room segments along the top and left exteriors.\n\n---\n\n## 7. Validation\n\nThe engine validates what LLMs (and humans) actually get wrong, with errors that name the offending elements and a fix direction:\n\n**Errors** (block rendering, shown in an error panel):\n\n- Room overlap \u2014 `rooms "bed1" and "bath" overlap by 0.40\xD72.60 m \u2014 move "bath" right-of "bed1" or shrink size`\n- Door between non-adjacent rooms \u2014 `door between "kitchen" and "bed2": rooms share no wall (gap 2 m on x-axis)`\n- Furniture outside its room \u2014 `furniture sofa #1 extends 1.7 m outside room "c" \u2014 move it or shrink size`\n\n**Warnings** (render anyway, listed under the plan):\n\n- Furniture collision \u2014 bounding boxes including **chair-ring envelopes**, so two banquet rounds whose chairs touch get flagged even when the table tops don\'t.\n- Opening clamped to fit its wall segment.\n\n---\n\n## 8. Grammar (EBNF)\n\n```text\nplan ::= "floorplan" string? ("unit" ("m"|"ft"))? NL statement*\nstatement ::= room | extend | north | door | window | opening | furniture | array\nroom ::= "room" id string? placement "size" dims ("fill" color)? ("nolabel")?\nextend ::= "extend" id placement "size" dims\nnorth ::= "north" num?\nplacement ::= "at" coord\n | ("right-of"|"left-of"|"above"|"below") id ("offset" num)?\n ("align" ("start"|"center"|"end"))?\ndoor ::= "door" (wallref | "between" id id) "at" pct\n ("width" num)? ("hinge" ("left"|"right"))? ("swing" ("in"|"out"))?\n ("type" ("single"|"double"|"sliding"|"pocket"|"bifold"))?\nwindow ::= "window" wallref "at" pct ("width" num)?\n ("type" ("fixed"|"sliding"|"casement"|"bay"))?\nopening ::= "opening" (wallref | "between" id id) "at" pct ("width" num)?\nfurniture ::= "furniture" type ("in" id) "at" coord ("size" dims)? ("rotate" num)? string?\narray ::= ("grid"|"row"|"arc") type "in" id\n ("rows" int)? ("cols" int)? ("count" int)?\n ("area" coord coord)? ("itemsize" dims)? ("rotate" num)?\n ("center" coord)? ("radius" num)? ("from" num "to" num)?\nwallref ::= id ("north"|"south"|"east"|"west")\ncoord ::= num "," num dims ::= num "x" num pct ::= num "%"?\n```\n\nComments run from `#` to end of line. CJK quotes (`\u201C\u201D`) are accepted as ASCII quotes.\n\n---\n\n## Related examples\n\n- [Two-bedroom apartment](/examples#floorplan) \u2014 relative placement, 7 doors, full furnishing\n- [27-desk classroom](/examples#floorplan) \u2014 `grid \u2026 count` truncation, `unit ft`\n- [Wedding reception for 120](/examples#floorplan) \u2014 auto-seated banquet rounds, dance floor'
4385
+ },
4386
+ "playbook": {
4387
+ "title": "Sports playbook",
4388
+ "content": '## 1. Your first play\n\nEvery diagram starts with a header naming the **sport**, then a **formation** (which places the players), then **assignments**:\n\n```\nplaybook "Give & Go" sport basketball\nset 5-out\npass 1 2\ncut 1 rim\npass 2 1\n```\n\n`pass 1 2` draws a pass from player 1 to player 2; `cut 1 rim` sends player 1 to the rim. Basketball draws passes **dashed** and cuts **solid** \u2014 the convention on every coaching whiteboard.\n\n---\n\n## 2. The three sports\n\nPick the sport in the header (`sport football|basketball|soccer`). Each uses its real unit and the conventional coaching viewpoint:\n\n| Sport | Unit | View | Surface |\n|---|---|---|---|\n| `football` | yards | offense at the bottom attacking **up**; downfield = up | green field with yard lines, hashes, end zone |\n| `basketball` | feet | NBA **half-court**; baseline + hoop at the top | light maple hardwood |\n| `soccer` | metres | full **105 \xD7 68 m** pitch (attack toward the right); or `view half` | green pitch with IFAB markings |\n\n---\n\n## 3. Players & formations\n\nThe fastest way to place players is a **formation** (football/soccer) or **set** (basketball):\n\n- **Football** \u2014 `formation i-form | shotgun | singleback | pistol | spread | trips | empty | goal-line | wishbone` with optional strength `left`/`right`. Receivers are `X Z H Y` (Y = tight end), backs `QB RB FB`, line `LT LG C RG RT`.\n- **Basketball** \u2014 `set horns | 1-4-high | 1-4-low | box | spread-pnr | 4-out | 5-out`. Players are numbered `1`\u2013`5`.\n- **Soccer** \u2014 `formation 4-3-3 | 4-4-2 | 4-2-3-1 | 4-5-1 | 4-4-1-1 | 3-5-2 | 3-4-3`. Players are numbered `1` (GK) \u2026 `11`.\n\nFor set-pieces or free-form diagrams, place players individually and crop to a half:\n\n```\nplaybook "Overlap & Cross" sport soccer\nview half\nplayer 7 o at 75,12 label 7\nplayer 2 o at 60,15 label 2\nplayer 9 o at 88,30 label 9\nplayer 11 o at 85,52 label 11\nplayer 10 o at 80,38 label 10\ndribble 7 to 82,20\nrun 2 to 90,8\npass 7 to 90,8\npass 2 to 102,34\nrun 9 to 101,31\nrun 11 to 101,40\n```\n\n---\n\n## 4. Movement verbs & line styles\n\nThe same line style means different things in different sports \u2014 Schematex draws each sport\'s own convention, and the legend always matches:\n\n| Verb | Football | Basketball | Soccer |\n|---|---|---|---|\n| `pass` | dashed (throw) | **dashed** | **solid** |\n| `run` / `cut` | solid | **solid** (cut) | **dashed** (run) |\n| `dribble` | \u2014 | wavy | wavy |\n| `screen` / `block` | T-bar \u22A5 | T-bar \u22A5 (screen) | T-bar \u22A5 |\n| `shot` | \u2014 | solid | double line |\n\n**Note the inversion:** basketball draws a pass *dashed* and a cut *solid*; soccer draws a pass *solid* and a run *dashed*. That is how the two coaching communities actually diagram \u2014 Schematex honours each.\n\nMove targets can be a **player id**, a **landmark** name, or explicit **coordinates** (`to x,y`).\n\n---\n\n## 5. Football \u2014 routes, runs, defense\n\nPass routes use the **route tree**: `go fly streak slant flat hitch out in dig curl comeback corner post wheel cross drag seam`. Run concepts: `dive iso power counter sweep toss draw trap`. Blocking uses `block`, `pull`, and `handoff`. Set `goal N` to draw the end zone and goalposts:\n\n```\nplaybook "Red Zone \u2014 Play-Action Fade" sport football\nfield down 1 distance 5 los 5 goal 5 hash nfl\nformation i-form right\ndefense cover-1\nhandoff QB RB\nroute Z corner 4\nroute X slant\nroute Y out 3\nrun RB dive right\n```\n\n`defense cover-0/1/2/3/4/6` draws the coverage shell; `defense 4-3 | 3-4 | nickel | dime` sets the front. `hash nfl|college|none` controls the hash marks.\n\n---\n\n## 6. Basketball \u2014 sets, landmarks, screens\n\nCuts and passes target **named landmarks** \u2014 `rim elbow wing corner short-corner block slot top high-post dunker` (prefix `l`/`r` for left/right). `screen A B` draws a ball-screen (T-bar) for player B; `dribble` is a wavy line:\n\n```\nplaybook "Spread Pick & Roll" sport basketball\nset spread-pnr\nscreen 5 1\ndribble 1 to 11,17\ncut 5 rim\npass 1 2\n```\n\n`defense man` matches each defender to a man; `defense zone-2-3 | zone-3-2 | zone-1-3-1` draws a zone front.\n\n---\n\n## 7. Soccer \u2014 shapes, runs, build-up\n\nA formation alone draws the team shape. Add `pass` (solid), `run` (dashed), and `dribble` (wavy) to show a phase of play:\n\n```\nplaybook "Build-Up From the Back" sport soccer\nformation 4-3-3\npass 1 4\npass 4 2\nrun 2 to 40,10\npass 4 6\nrun 6 to 62,24\n```\n\nLandmarks include `box top-box d penalty-spot near-post far-post six-yard center`. `defense low-block | mid-block | high-press` overlays the opponent\'s shape. Soccer renders daylight-only \u2014 `theme: dark` falls back to the default pitch.\n\n---\n\n## 8. Validation\n\nThe engine rejects the mistakes models actually make and lists the valid options:\n\n- unknown `sport`, `formation` / `set`, `defense`, or named route;\n- a move referencing an undeclared player id;\n- a malformed coordinate or a missing `to` target.\n\nSofter issues (e.g. a zero-length move) render with a warning rather than failing.\n\n---\n\n## 9. Grammar (EBNF)\n\n```text\nplaybook = "playbook" string "sport" sport NL { stmt NL } ;\nsport = "football" | "basketball" | "soccer" ;\nstmt = field | formation | defense | player | move | zone | "view" view ;\nfield = "field" { "down" num | "distance" num | "los" num\n | "goal" num | "hash" hash | "view" view } ;\nformation = ( "formation" | "set" ) name [ "left" | "right" ] ;\ndefense = "defense" scheme ;\nplayer = "player" id pos "at" coord "label" text ;\nmove = route | run | pass | cut | dribble | screen\n | shot | motion | handoff | pull | block ;\nroute = "route" id namedRoute [ num ] [ "left" | "right" ] ;\nrun = "run" id ( concept [ "left" | "right" ] | "to" coord ) ;\npass = "pass" id ( id | landmark | "to" coord ) ;\ncut = "cut" id ( landmark | "to" coord ) ;\ndribble = "dribble" id "to" coord ;\nscreen = "screen" id id ;\nshot = "shot" id [ "to" coord ] ;\nzone = "zone" coord coord string ;\ncoord = num "," num ;\nview = "full" | "half" ;\nhash = "nfl" | "college" | "none" ;\n```\n\n---\n\n## Related examples\n\nFive canonical plays per sport ship as examples \u2014 Four Verticals, Mesh, Smash, Power O, and a Red-Zone fade for football; Pick & Roll, Horns, Give & Go, Floppy, and a Backdoor cut for basketball; 4-3-3 shape, Build-Up, Overlap, High Press, and Counter-Attack for soccer.'
4098
4389
  }
4099
4390
  };
4100
4391
 
@@ -5628,6 +5919,37 @@ var PROFILES = {
5628
5919
  "'extends \u2026 outside room' -> reduce the furniture x,y or size; coordinates start at the room's top-left interior corner.",
5629
5920
  "'overlaps \u2026 by \u2026 m' (warning) -> spread the grid `area` corners or reduce rows/cols; remember chair rings extend ~0.45 m beyond a table edge."
5630
5921
  ]
5922
+ },
5923
+ playbook: {
5924
+ type: "playbook",
5925
+ header: 'playbook "Play Name" [sport football]',
5926
+ mode: "formation preset + named routes off the route tree; coordinates in yards (x lateral from ball, y depth off LOS)",
5927
+ keywords: 'field down N distance M los YARD hash nfl|college|none \xB7 formation i-form|shotgun|singleback|pistol|trips-right|trips-left|spread|empty|pistol|goal-line|wishbone [left|right] \xB7 defense 4-3|3-4|nickel|dime|cover-0|cover-1|cover-2|cover-3|cover-4|cover-6 \xB7 player id pos[o|c|ol|qb|rb|wr|te|x|dl|lb|db|s] [label "L"] [at x,y] \xB7 route PLAYER NAMED [depth] [left|right] \xB7 run PLAYER CONCEPT [left|right] \xB7 block BLOCKER TARGET \xB7 pull LINEMAN left|right \xB7 handoff QB BACK \xB7 motion PLAYER left|right [yards] \xB7 zone at x,y size rxXry "label" \xB7 route tree: go/fly/streak slant flat hitch out in/dig curl comeback corner/flag post wheel cross/drag seam screen \xB7 run concepts: dive iso power counter sweep toss draw trap \xB7 players from a formation use ids QB RB FB C LG RG LT RT Y(TE) X Z H',
5928
+ forms: [
5929
+ 'playbook "Slant-Flat" sport football',
5930
+ "field down 1 distance 10 los 35 hash nfl",
5931
+ "formation trips-right",
5932
+ "defense cover-2",
5933
+ "route Z slant",
5934
+ "route H flat",
5935
+ "route X slant",
5936
+ "run RB dive right"
5937
+ ],
5938
+ prefer: [
5939
+ "Start from a `formation` preset \u2014 it places all 11 offensive players with standard ids (QB RB FB C LG RG LT RT, TE=Y, receivers X/Z/H). Then assign routes by id.",
5940
+ "Use named routes from the tree (`route Z post`, `route H out 12`) \u2014 the optional number is the stem depth in yards off the LOS; an explicit `left`/`right` overrides the natural break side.",
5941
+ "Use `run RB power right` for the ball carrier, `pull LG right` for a pulling lineman, `block FB DE_S` for a key block (T-bar drawn on the target), `handoff QB RB` for the mesh.",
5942
+ "Add `defense cover-2` (or 4-3 / cover-3 \u2026) to drop in 11 defenders + coverage zone bubbles automatically.",
5943
+ "Use `field down 1 distance 10 los 35` for the down-and-distance banner; `hash nfl|college` sets the hash-mark width."
5944
+ ],
5945
+ avoid: [
5946
+ "Don't hand-place all 22 players with `at` unless you need a non-standard look \u2014 the formation/defense presets are far less error-prone.",
5947
+ "Don't invent route names \u2014 stick to the tree (go/slant/out/in/curl/comeback/corner/post/flat/hitch/wheel/cross/seam/screen) and run concepts (dive/power/counter/sweep/toss/draw/iso/trap)."
5948
+ ],
5949
+ repair: [
5950
+ "'route on unknown player \u2026' (warning) -> the player id isn't in the formation; check the roster ids (QB RB FB C LG RG LT RT Y X Z H) or add a `player` statement.",
5951
+ "'block \u2026 on unknown target \u2026' (warning) -> the block target must be a declared defender id (e.g. DE_S, MLB) \u2014 add `defense \u2026` so the defenders exist."
5952
+ ]
5631
5953
  }
5632
5954
  };
5633
5955
  function getGenerationProfile(type) {
@@ -5714,7 +6036,7 @@ function getExamples(type, opts = {}) {
5714
6036
  function validateDsl(type, dsl) {
5715
6037
  const resolvedType = type ? resolveDiagramType(type) : void 0;
5716
6038
  const config = type ? { type: resolvedType ?? type } : void 0;
5717
- const result = chunkAHSSFGDJ_cjs.parseResult(dsl, config);
6039
+ const result = chunkGTCAJPQR_cjs.parseResult(dsl, config);
5718
6040
  if (result.ok) {
5719
6041
  return {
5720
6042
  ok: true,
@@ -5740,7 +6062,7 @@ function renderDsl(type, dsl, options = {}) {
5740
6062
  ...options,
5741
6063
  ...type ? { type: resolvedType ?? type } : {}
5742
6064
  };
5743
- const result = chunkAHSSFGDJ_cjs.renderResult(dsl, config);
6065
+ const result = chunkGTCAJPQR_cjs.renderResult(dsl, config);
5744
6066
  if (result.ok) {
5745
6067
  return {
5746
6068
  ok: true,
@@ -5802,5 +6124,5 @@ exports.listDiagrams = listDiagrams;
5802
6124
  exports.renderDsl = renderDsl;
5803
6125
  exports.resolveDiagramType = resolveDiagramType;
5804
6126
  exports.validateDsl = validateDsl;
5805
- //# sourceMappingURL=chunk-LFJE64RD.cjs.map
5806
- //# sourceMappingURL=chunk-LFJE64RD.cjs.map
6127
+ //# sourceMappingURL=chunk-TX3YWZZX.cjs.map
6128
+ //# sourceMappingURL=chunk-TX3YWZZX.cjs.map