schematex 0.9.2 → 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 +42 -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-OED2jUVj.d.ts → api-1xoGiseb.d.cts} +2 -2
  12. package/dist/{api-BDMaX1cT.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-HILYXWGJ.cjs → chunk-35NGXDT2.cjs} +12 -12
  18. package/dist/{chunk-HILYXWGJ.cjs.map → chunk-35NGXDT2.cjs.map} +1 -1
  19. package/dist/{chunk-HJA7MIMV.js → chunk-3J4DZPZC.js} +3 -3
  20. package/dist/{chunk-HJA7MIMV.js.map → chunk-3J4DZPZC.js.map} +1 -1
  21. package/dist/{chunk-IQLZUCWI.js → chunk-3PH2MQGN.js} +3 -3
  22. package/dist/{chunk-IQLZUCWI.js.map → chunk-3PH2MQGN.js.map} +1 -1
  23. package/dist/{chunk-VZVREOTM.js → chunk-3WX24RCH.js} +3 -3
  24. package/dist/{chunk-VZVREOTM.js.map → chunk-3WX24RCH.js.map} +1 -1
  25. package/dist/{chunk-XA6XIAMN.cjs → chunk-4AC6I7KJ.cjs} +4 -4
  26. package/dist/{chunk-XA6XIAMN.cjs.map → chunk-4AC6I7KJ.cjs.map} +1 -1
  27. package/dist/{chunk-TYEQC7PV.js → chunk-4MRVJI7G.js} +166 -5
  28. package/dist/chunk-4MRVJI7G.js.map +1 -0
  29. package/dist/{chunk-6BJKQULN.cjs → chunk-4OC3CTGE.cjs} +4 -4
  30. package/dist/{chunk-6BJKQULN.cjs.map → chunk-4OC3CTGE.cjs.map} +1 -1
  31. package/dist/{chunk-4MGALM2C.cjs → chunk-5ZQRHDMQ.cjs} +4 -4
  32. package/dist/{chunk-4MGALM2C.cjs.map → chunk-5ZQRHDMQ.cjs.map} +1 -1
  33. package/dist/{chunk-PSQGLE6U.cjs → chunk-627GHE2N.cjs} +5 -5
  34. package/dist/{chunk-PSQGLE6U.cjs.map → chunk-627GHE2N.cjs.map} +1 -1
  35. package/dist/{chunk-56DSMSXK.js → chunk-64LABNTF.js} +3 -3
  36. package/dist/{chunk-56DSMSXK.js.map → chunk-64LABNTF.js.map} +1 -1
  37. package/dist/{chunk-GYTU7L4L.cjs → chunk-6QZQTASC.cjs} +12 -12
  38. package/dist/{chunk-GYTU7L4L.cjs.map → chunk-6QZQTASC.cjs.map} +1 -1
  39. package/dist/{chunk-MYVY55DO.cjs → chunk-6ZD7TCWO.cjs} +15 -15
  40. package/dist/{chunk-MYVY55DO.cjs.map → chunk-6ZD7TCWO.cjs.map} +1 -1
  41. package/dist/{chunk-7Z2GDS4G.js → chunk-AXMBXAEA.js} +3 -3
  42. package/dist/{chunk-7Z2GDS4G.js.map → chunk-AXMBXAEA.js.map} +1 -1
  43. package/dist/{chunk-VY4JOTM2.js → chunk-B4CMWA6Y.js} +3 -3
  44. package/dist/{chunk-VY4JOTM2.js.map → chunk-B4CMWA6Y.js.map} +1 -1
  45. package/dist/{chunk-2ASZMLC3.cjs → chunk-C4Y24X3U.cjs} +4 -4
  46. package/dist/{chunk-2ASZMLC3.cjs.map → chunk-C4Y24X3U.cjs.map} +1 -1
  47. package/dist/{chunk-NT6VVMLW.cjs → chunk-ENUM7GMZ.cjs} +168 -4
  48. package/dist/chunk-ENUM7GMZ.cjs.map +1 -0
  49. package/dist/{chunk-VYAUTNHC.cjs → chunk-GAQ36VFD.cjs} +4 -4
  50. package/dist/{chunk-VYAUTNHC.cjs.map → chunk-GAQ36VFD.cjs.map} +1 -1
  51. package/dist/{chunk-NTQBNBBP.cjs → chunk-GTCAJPQR.cjs} +4307 -282
  52. package/dist/chunk-GTCAJPQR.cjs.map +1 -0
  53. package/dist/{chunk-KR7PPCC4.js → chunk-GYYYULBL.js} +3 -3
  54. package/dist/{chunk-KR7PPCC4.js.map → chunk-GYYYULBL.js.map} +1 -1
  55. package/dist/{chunk-WFVRUUJW.cjs → chunk-INVLJYAE.cjs} +4 -4
  56. package/dist/{chunk-WFVRUUJW.cjs.map → chunk-INVLJYAE.cjs.map} +1 -1
  57. package/dist/{chunk-2A5HJFOX.cjs → chunk-ITI3STJ6.cjs} +4 -4
  58. package/dist/{chunk-2A5HJFOX.cjs.map → chunk-ITI3STJ6.cjs.map} +1 -1
  59. package/dist/{chunk-TMAOPJCT.js → chunk-JEMAOC2D.js} +3 -3
  60. package/dist/{chunk-TMAOPJCT.js.map → chunk-JEMAOC2D.js.map} +1 -1
  61. package/dist/{chunk-2RFFCZ3I.js → chunk-M26ORU4P.js} +3 -3
  62. package/dist/{chunk-2RFFCZ3I.js.map → chunk-M26ORU4P.js.map} +1 -1
  63. package/dist/{chunk-CURAZVOH.js → chunk-NIYB6CHH.js} +728 -4
  64. package/dist/chunk-NIYB6CHH.js.map +1 -0
  65. package/dist/{chunk-JR6JNQEZ.js → chunk-NKYR4PAS.js} +3 -3
  66. package/dist/{chunk-JR6JNQEZ.js.map → chunk-NKYR4PAS.js.map} +1 -1
  67. package/dist/{chunk-MUE45N2A.cjs → chunk-OJ3P4IC4.cjs} +4 -4
  68. package/dist/{chunk-MUE45N2A.cjs.map → chunk-OJ3P4IC4.cjs.map} +1 -1
  69. package/dist/{chunk-VMUNKEB2.js → chunk-PFZKW3HE.js} +3 -3
  70. package/dist/{chunk-VMUNKEB2.js.map → chunk-PFZKW3HE.js.map} +1 -1
  71. package/dist/{chunk-MERU76LW.js → chunk-RDYACU2G.js} +3 -3
  72. package/dist/{chunk-MERU76LW.js.map → chunk-RDYACU2G.js.map} +1 -1
  73. package/dist/{chunk-TWTUIUNK.js → chunk-SXOAAQNY.js} +3 -3
  74. package/dist/{chunk-TWTUIUNK.js.map → chunk-SXOAAQNY.js.map} +1 -1
  75. package/dist/{chunk-3DSNGR26.cjs → chunk-TX3YWZZX.cjs} +730 -6
  76. package/dist/chunk-TX3YWZZX.cjs.map +1 -0
  77. package/dist/{chunk-TP7LQ5PF.js → chunk-UFXDAIDD.js} +4126 -102
  78. package/dist/chunk-UFXDAIDD.js.map +1 -0
  79. package/dist/{chunk-7JJQEECD.cjs → chunk-VY6UZYYL.cjs} +15 -15
  80. package/dist/{chunk-7JJQEECD.cjs.map → chunk-VY6UZYYL.cjs.map} +1 -1
  81. package/dist/{chunk-V3JTVTPY.cjs → chunk-VYQXB2RC.cjs} +12 -12
  82. package/dist/{chunk-V3JTVTPY.cjs.map → chunk-VYQXB2RC.cjs.map} +1 -1
  83. package/dist/{chunk-L2NY4XEY.cjs → chunk-WJXLF42K.cjs} +4 -4
  84. package/dist/{chunk-L2NY4XEY.cjs.map → chunk-WJXLF42K.cjs.map} +1 -1
  85. package/dist/{chunk-VWIKDJNV.js → chunk-XCCXG6RR.js} +3 -3
  86. package/dist/{chunk-VWIKDJNV.js.map → chunk-XCCXG6RR.js.map} +1 -1
  87. package/dist/{chunk-7SVB3XA7.js → chunk-ZCHGIWJK.js} +3 -3
  88. package/dist/{chunk-7SVB3XA7.js.map → chunk-ZCHGIWJK.js.map} +1 -1
  89. package/dist/{diagnostics-hObcaaFC.d.ts → diagnostics-CDwnQ65n.d.cts} +1 -1
  90. package/dist/{diagnostics-hObcaaFC.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-Cq8y1aaa.d.ts → index-CYSH3_ca.d.ts} +1 -1
  154. package/dist/{index-BiXWjQht.d.cts → index-DNOoLmYX.d.cts} +1 -1
  155. package/dist/index.cjs +111 -85
  156. package/dist/index.cjs.map +1 -1
  157. package/dist/index.d.cts +4 -4
  158. package/dist/index.d.ts +4 -4
  159. package/dist/index.js +48 -22
  160. package/dist/index.js.map +1 -1
  161. package/dist/react.cjs +18 -18
  162. package/dist/react.d.cts +2 -2
  163. package/dist/react.d.ts +2 -2
  164. package/dist/react.js +17 -17
  165. package/dist/{tools-BbTuTWs_.d.ts → tools-BhTti-oG.d.ts} +3 -3
  166. package/dist/{tools-D5dkAqNy.d.cts → tools-CbYmQ3hH.d.cts} +3 -3
  167. package/package.json +1 -1
  168. package/dist/chunk-3DSNGR26.cjs.map +0 -1
  169. package/dist/chunk-CURAZVOH.js.map +0 -1
  170. package/dist/chunk-NT6VVMLW.cjs.map +0 -1
  171. package/dist/chunk-NTQBNBBP.cjs.map +0 -1
  172. package/dist/chunk-TP7LQ5PF.js.map +0 -1
  173. package/dist/chunk-TYEQC7PV.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { parseResult, renderResult } from './chunk-TP7LQ5PF.js';
1
+ import { parseResult, renderResult } from './chunk-UFXDAIDD.js';
2
2
 
3
3
  // src/ai/registry.ts
4
4
  var DIAGRAM_REGISTRY = [
@@ -564,6 +564,67 @@ var DIAGRAM_REGISTRY = [
564
564
  "fabrication",
565
565
  "weld dimensions"
566
566
  ]
567
+ },
568
+ {
569
+ type: "floorplan",
570
+ name: "Floor plan",
571
+ tagline: "2D architectural floor plans & space layouts \u2014 poch\xE9 walls with automatic shared-wall merging, door swing arcs, windows, and an auto-seating furniture catalog with collision validation.",
572
+ useWhen: "Use for any measurable room/space layout: apartments and small homes, classroom seating arrangements, wedding/event floor plans, small shops and offices. Declare rooms with real dimensions (`room living at 0,0 size 5.2x4.2`, `unit m|ft`), chain placement with right-of/below, hang doors/windows on walls (`door between A B at 50%`), and place furniture room-relative \u2014 individually or as `grid`/`row`/`arc` arrays (27-desk classroom, 15 banquet rounds). L/T/U-shaped rooms via `extend`, stairs (straight/L/U/spiral with UP arrow + cut-plane break line), bifold/sliding/pocket doors, casement/sliding/bay windows, north compass. The engine merges shared walls, computes room areas and dimension lines, auto-seats tables, and validates room overlap, non-adjacent doors, and furniture collisions (chair-ring envelopes included). Not for photorealistic renders or CAD construction documents.",
573
+ cluster: "architecture",
574
+ standard: "Ramsey & Sleeper Architectural Graphic Standards \xB7 US National CAD Standard v6 \xB7 banquet-industry capacity conventions; see 48-FLOORPLAN-STANDARD.md",
575
+ syntaxKey: "floorplan",
576
+ aliases: [
577
+ "Floor plan",
578
+ "floorplan",
579
+ "room layout",
580
+ "space plan",
581
+ "seating chart",
582
+ "classroom layout",
583
+ "event layout",
584
+ "\u5E73\u9762\u56FE",
585
+ "\u6237\u578B\u56FE"
586
+ ],
587
+ keywords: [
588
+ "floor plan",
589
+ "architecture",
590
+ "interior layout",
591
+ "room dimensions",
592
+ "seating arrangement",
593
+ "wedding reception layout",
594
+ "classroom seating",
595
+ "furniture placement",
596
+ "space planning"
597
+ ]
598
+ },
599
+ {
600
+ type: "playbook",
601
+ name: "Sports playbook",
602
+ 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.",
603
+ 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.',
604
+ cluster: "sports",
605
+ 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",
606
+ syntaxKey: "playbook",
607
+ aliases: [
608
+ "Sports playbook",
609
+ "playbook",
610
+ "football play",
611
+ "X and O diagram",
612
+ "basketball play",
613
+ "soccer tactics",
614
+ "\u6218\u672F\u677F",
615
+ "\u6218\u672F\u56FE"
616
+ ],
617
+ keywords: [
618
+ "playbook",
619
+ "football play",
620
+ "X's and O's",
621
+ "basketball play",
622
+ "pick and roll",
623
+ "soccer formation",
624
+ "tactics board",
625
+ "route tree",
626
+ "coaching diagram"
627
+ ]
567
628
  }
568
629
  ];
569
630
  var DIAGRAM_SINCE = {
@@ -625,7 +686,11 @@ var DIAGRAM_SINCE = {
625
686
  idef0: "0.8.0",
626
687
  threatmodel: "0.8.0",
627
688
  // 0.8.1 — welding symbols (AWS A2.4 / ISO 2553)
628
- welding: "0.8.1"
689
+ welding: "0.8.1",
690
+ // 0.9.3
691
+ floorplan: "0.9.3",
692
+ // 0.9.4 — multi-sport playbook (football X&O / basketball / soccer)
693
+ playbook: "0.9.4"
629
694
  };
630
695
  function getDiagramSince(type) {
631
696
  const resolved = resolveDiagramType(type);
@@ -1536,6 +1601,335 @@ If the LED doesn't light up, three things to check, in order: LED polarity (the
1536
1601
  "dsl": 'fishbone "Fishbone diagram \u2014 Website traffic drop"\n\neffect "Traffic decline"\n\ncategory content "Content"\ncategory tech "Technical"\ncategory links "Backlinks"\ncategory ux "UX"\ncategory competition "Competition"\ncategory algo "Algorithm"\n\ncontent : "Publishing frequency down"\ncontent : "Content too generic"\ncontent : "Keyword gaps"\ncontent : "Low-quality AI content"\n\ntech : "Core Web Vitals failing"\ntech : "Crawl coverage drop"\ntech : "Crawler blocked by WAF"\ntech : "Missing structured data"\n\nlinks : "High-quality backlinks lost"\nlinks : "High ratio of low-quality links"\nlinks : "Referring domain growth stalled"\nlinks : "Low anchor text diversity"\n\nux : "Bounce rate rising"\nux : "Poor mobile experience"\nux : "Slow above-fold load"\nux : "Excessive popup ads"\n\ncompetition : "New competitors entering"\ncompetition : "AI tools replacing search"\ncompetition : "Weakening brand recall"\ncompetition : "Competitors publishing faster"\n\nalgo : "Core Update penalty"\nalgo : "Weak E-E-A-T signals"\nalgo : "AI Overviews / SGE cutoff"\nalgo : "Search intent drift"',
1537
1602
  "notes": '## Scenario\n\nAn ops lead runs a growth post-mortem after a 30% organic traffic drop. The Ishikawa (fishbone) diagram structures the team\'s brainstorm into six standard causal categories, preventing the meeting from fixating on the most vocal hypothesis while ignoring systemic causes. The completed diagram becomes the project brief for the remediation sprint.\n\n## Annotation key\n\n- `effect "..."` \u2014 the problem statement, placed at the fish\'s head (right side)\n- `category id "Label"` \u2014 defines a major causal branch (a "bone"); use a short `id` to assign causes\n- `id : "cause text"` \u2014 assigns a cause string to the named category branch\n- Each category renders as a diagonal rib pointing toward the effect\n- Sub-causes (second-order) can be added by nesting if the DSL supports it\n\n## How to read\n\nThe effect (traffic decline) sits at the right. Six causal ribs branch from the spine: Content, Technical, Backlinks, UX, Competition, and Algorithm. Each rib lists four specific hypotheses. In a workshop, the team votes on each cause, color-codes high-confidence ones, and converts the highest-priority items into action items. The diagram serves as both a brainstorming artifact and a living post-mortem document.'
1538
1603
  },
1604
+ {
1605
+ "slug": "floorplan-banquet-hall",
1606
+ "diagram": "floorplan",
1607
+ "title": "Hotel grand ballroom \u2014 120 guests",
1608
+ "description": "A banquet hall the venue can execute: twelve 60\u2033 rounds auto-seated at ten covers each, a stage, a hatched dance floor, a DJ booth, a buffet line, and a bar \u2014 all collision-checked.",
1609
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1610
+ "tags": [
1611
+ "floorplan",
1612
+ "banquet",
1613
+ "event",
1614
+ "hospitality",
1615
+ "ballroom",
1616
+ "wedding"
1617
+ ],
1618
+ "complexity": 3,
1619
+ "featured": false,
1620
+ "dsl": 'floorplan "Grand Ballroom \u2014 120 Guests" unit m\nroom hall "Grand Ballroom" at 0,0 size 26x18 nolabel\ndoor hall south at 20% width 1.8 type double\ndoor hall south at 80% width 1.8 type double\nfurniture stage "Stage" in hall at 9,0.3 size 8x2.2\nfurniture dance-floor "Dance Floor" in hall at 10.5,3.4 size 5x5\nfurniture dj-booth in hall at 12,8.8 size 1.4x1\nfurniture bar "Bar" in hall at 22.4,0.4 size 3x1\nfurniture counter "Buffet" in hall at 1,16.8 size 8x0.7\ngrid round-table-10 in hall rows 3 cols 2 count 6 area 2.6,4.8 7.6,14.6 itemsize 2.6x2.6\ngrid round-table-10 in hall rows 3 cols 2 count 6 area 18.4,4.8 23.4,14.6 itemsize 2.6x2.6',
1621
+ "notes": "## What this shows\n\nTwelve `round-table-10` come from two `grid` statements \u2014 each table auto-seats ten chairs on its circumference, and the chair-ring envelope keeps the service aisles honest: pull two tables together and the validator reports the overlap in metres.\n\nThe hero pieces \u2014 `stage`, the hatched `dance-floor` underlay, `dj-booth`, `bar`, and a `counter` doubling as the buffet line \u2014 are placed individually, while the dual `door \u2026 south type double` gives the room its two egress points."
1622
+ },
1623
+ {
1624
+ "slug": "floorplan-bistro-cafe",
1625
+ "diagram": "floorplan",
1626
+ "title": "Bistro caf\xE9 \u2014 dining, bar, kitchen",
1627
+ "description": "A small-business commercial plan: bar with stool row, six auto-seated 4-tops, rotated booth tables, commercial kitchen line, and a restroom pair including an accessible WC.",
1628
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1629
+ "tags": [
1630
+ "floorplan",
1631
+ "restaurant",
1632
+ "cafe",
1633
+ "commercial",
1634
+ "bar"
1635
+ ],
1636
+ "complexity": 3,
1637
+ "featured": false,
1638
+ "dsl": 'floorplan "Bistro Caf\xE9 \u2014 Dining \xB7 Bar \xB7 Kitchen" unit m\nroom dining "Dining Hall" at 0,0 size 9.5x9 nolabel\nroom kitchen "Kitchen" right-of dining size 4.5x5.4\nroom wchall "" at 9.5,5.4 size 4.5x1.1 nolabel\nroom wc1 "WC" at 9.5,6.5 size 2.2x2.5\nroom wc2 "Accessible WC" at 11.7,6.5 size 2.3x2.5\n\ndoor dining south at 25% width 1.8 type double\ndoor between dining kitchen at 30%\nopening between dining wchall at 50% width 0.9\ndoor between kitchen wchall at 80% width 0.8\ndoor between wchall wc1 at 25%\ndoor between wchall wc2 at 75%\n\nwindow dining west at 25% width 2.2\nwindow dining west at 65% width 2.2\nwindow dining north at 70% width 2.0\nwindow kitchen north at 50% width 1.5 type sliding\nwindow kitchen east at 30% width 1.2\n\nfurniture bar "Bar" in dining at 0.4,0.3 size 4.5x0.7\nrow bar-stool in dining cols 5 area 0.8,1.45 4.3,1.45\nfurniture podium "Host" in dining at 0.7,8.2\ngrid round-table-4 in dining rows 2 cols 3 area 1.6,3.3 6.4,5.9 itemsize 1.9x1.9\nfurniture dining-table "Booth" in dining at 7.8,2.2 size 1.6x0.9 rotate 90\nfurniture dining-table "Booth" in dining at 7.8,4.8 size 1.6x0.9 rotate 90\nfurniture cocktail-table in dining at 5.8,0.8\nfurniture cocktail-table in dining at 7.2,0.8\nfurniture plant in dining at 8.9,8.3\nfurniture plant in dining at 5.0,8.4\n\nfurniture counter in kitchen at 0.15,0.12 size 4.2x0.65\nfurniture wall-cabinet in kitchen at 0.15,0.12 size 4.2x0.35\nfurniture kitchen-sink in kitchen at 0.7,0.15\nfurniture dishwasher in kitchen at 1.5,0.15\nfurniture stove in kitchen at 2.2,0.13\nfurniture range-hood in kitchen at 2.1,0.1 size 0.8x0.55\nfurniture fridge in kitchen at 3.6,1.2 size 0.85x0.8\nfurniture island "Prep" in kitchen at 0.8,3.5 size 2.6x0.9\n\nfurniture toilet in wc1 at 0.2,0.2\nfurniture sink in wc1 at 1.5,0.2\n\nfurniture toilet in wc2 at 0.25,0.2\nfurniture urinal in wc2 at 1.5,0.12\nfurniture sink in wc2 at 1.7,1.95',
1639
+ "notes": "## What this shows\n\nThe booth tables are `dining-table \u2026 rotate 90` \u2014 their auto-seated chairs rotate with them, and the collision check uses the rotated envelopes (separating-axis test), so the validator stays accurate at any angle.\n\nThe kitchen shows the commercial line conventions: counter run with dashed wall cabinets over it, range hood over the stove, and a prep island. The restroom pair places a urinal and keeps fixtures clear of the door swings."
1640
+ },
1641
+ {
1642
+ "slug": "floorplan-cinema-auditorium",
1643
+ "diagram": "floorplan",
1644
+ "title": "Cinema auditorium \u2014 96 seats",
1645
+ "description": "A movie-theatre layout: two banks of theatre row-chairs (exactly 96 countable seats) with a centre aisle, a full-width screen, and dual egress \u2014 the capacity-planning view a venue actually signs off.",
1646
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1647
+ "tags": [
1648
+ "floorplan",
1649
+ "cinema",
1650
+ "theatre",
1651
+ "seating",
1652
+ "venue",
1653
+ "auditorium"
1654
+ ],
1655
+ "complexity": 2,
1656
+ "featured": false,
1657
+ "dsl": 'floorplan "Cinema Auditorium \u2014 96 Seats" unit m\nroom house "Auditorium" at 0,0 size 16x12 nolabel\ndoor house south at 10% width 1.6\ndoor house south at 90% width 1.6\nfurniture stage "Screen" in house at 1,0.4 size 14x0.5\ngrid row-chairs in house rows 8 cols 1 count 8 area 4.25,2.6 4.25,9.8 itemsize 3.5x0.5\ngrid row-chairs in house rows 8 cols 1 count 8 area 11.75,2.6 11.75,9.8 itemsize 3.5x0.5',
1658
+ "notes": "## What this shows\n\nEach `row-chairs` strip fills its width with chairs at a 0.55 m theatre pitch, so a 3.5 m strip is six seats; eight rows in two banks make exactly 96. Change `itemsize` width and the seat count follows \u2014 the engine never leaves a phantom seat the box can't hold.\n\nThe centre aisle is just the gap between the two banks' `area` centre-lines; the `stage` stands in for the screen wall, and the two narrow `door \u2026 south` openings are the mandated exits."
1659
+ },
1660
+ {
1661
+ "slug": "floorplan-classroom-27-desks",
1662
+ "diagram": "floorplan",
1663
+ "title": "5th-grade classroom \u2014 27 desks",
1664
+ "description": "The #1 floor-plan request class: a 32\u2032\xD726\u2032 classroom seating chart with a 5\xD76 desk grid truncated row-major to exactly 27 students, in feet-and-inches.",
1665
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1666
+ "tags": [
1667
+ "floorplan",
1668
+ "classroom",
1669
+ "seating-chart",
1670
+ "education",
1671
+ "grid"
1672
+ ],
1673
+ "complexity": 2,
1674
+ "featured": false,
1675
+ "dsl": 'floorplan "5th Grade Classroom \u2014 27 Desks" unit ft\nroom class "Classroom" at 0,0 size 32x26 nolabel\ndoor class east at 12% width 3 hinge right\nwindow class west at 15% width 5\nwindow class west at 45% width 5\nwindow class west at 75% width 5\nfurniture whiteboard in class at 10,0.4 size 14x0.4\nfurniture desk "Teacher" in class at 2,1.5 size 5x2.5\ngrid desk-chair in class rows 5 cols 6 count 27 area 5,7 25,23 itemsize 2x2.5\nfurniture counter "Cubbies" in class at 6,24.4 size 10x1.2\nfurniture counter "Supplies" in class at 19,24.4 size 8x1.2\nfurniture plant in class at 1.2,22.8 size 1.6x1.6\nfurniture rug "Reading Corner" in class at 26.6,7 size 4.6x8',
1676
+ "notes": "## What this shows\n\n`grid desk-chair \u2026 count 27` places a 5\xD76 grid and drops the last row's tail \u2014 exactly how a real 27-student room fills. The `area` corners are item centers, so respacing the whole room is a two-number edit.\n\n`unit ft` makes every number feet: the dimension strings render as 32\u2032/26\u2032 and the (suppressed) room area would be in sq ft. Cubbies and supply counters use the underlay convention so back-row desks may legitimately touch them."
1677
+ },
1678
+ {
1679
+ "slug": "floorplan-computer-lab",
1680
+ "diagram": "floorplan",
1681
+ "title": "Computer lab \u2014 24 stations",
1682
+ "description": "An ICT classroom: a 6\xD74 grid of desk-chair workstations truncated to exactly 24 seats, an instructor desk, and a wall whiteboard \u2014 the seating chart a school IT coordinator hands to facilities.",
1683
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1684
+ "tags": [
1685
+ "floorplan",
1686
+ "classroom",
1687
+ "computer-lab",
1688
+ "education",
1689
+ "seating"
1690
+ ],
1691
+ "complexity": 2,
1692
+ "featured": false,
1693
+ "dsl": 'floorplan "Computer Lab \u2014 24 Stations" unit m\nroom lab "Computer Lab" at 0,0 size 12x8 nolabel\ndoor lab south at 12% width 1.6\nwindow lab east at 50% width 4 type sliding\nfurniture whiteboard in lab at 4,0.2 size 4x0.3\nfurniture desk "Instructor" in lab at 0.4,0.9 size 1.6x0.8\ngrid desk-chair in lab rows 4 cols 6 count 24 area 1.4,3.1 10.6,7.3 itemsize 1.4x1.2',
1694
+ "notes": "## What this shows\n\nA single `grid desk-chair` lays out the lab: six columns, four rows, `count 24` truncating row-major so the last cells are dropped cleanly rather than overflowing. Each `desk-chair` draws a desk with its chair tucked in front.\n\nThe `whiteboard` sits flush to the front wall as a thin solid bar, the instructor `desk` anchors the corner, and `window \u2026 east type sliding` brings daylight down one side \u2014 every piece checked to stay inside the room."
1695
+ },
1696
+ {
1697
+ "slug": "floorplan-family-home",
1698
+ "diagram": "floorplan",
1699
+ "title": "Four-bedroom family home \u2014 160 m\xB2",
1700
+ "description": "A 12-room single-story home exercising the full engine: two L-shaped rooms via extend, stairs with break line, bay window, kitchen island with stools, bifold laundry closet, and 40+ furniture items.",
1701
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1702
+ "tags": [
1703
+ "floorplan",
1704
+ "residential",
1705
+ "house",
1706
+ "l-shaped",
1707
+ "stairs",
1708
+ "extend"
1709
+ ],
1710
+ "complexity": 3,
1711
+ "featured": true,
1712
+ "dsl": 'floorplan "Four-Bedroom Family Home \u2014 160 m\xB2" unit m\nnorth\nroom living "Living Room" at 0,0 size 6x4.6\nextend living at 0,4.6 size 2x2.6\nroom kitchen "Kitchen" right-of living size 4.2x4.6\nroom dining "Dining" right-of kitchen size 3.6x4.6\nroom hall "Hall" at 2,4.6 size 9.5x2.6 nolabel\nroom bath "Bath" at 11.5,4.6 size 2.3x2.6\nroom master "Master Bedroom" at 0,7.2 size 4.3x4.4\nroom wic "WIC" at 4.3,7.2 size 1.8x2.0\nroom ensuite "En-suite" at 4.3,9.2 size 1.8x2.4\nroom laundry "Laundry" at 6.1,7.2 size 1.9x2.0\nroom bed2 "Bedroom 2" at 8.0,7.2 size 2.5x4.4\nextend bed2 at 6.1,9.2 size 1.9x2.4\nroom bed3 "Bedroom 3" at 10.5,7.2 size 3.3x4.4\n\ndoor living west at 88% width 1.0\nopening between living kitchen at 45% width 1.8\nopening between kitchen dining at 50% width 1.5\nopening between living hall at 70% width 1.6\ndoor between hall bath at 40%\ndoor between hall master at 75%\ndoor between master wic at 50% type sliding\ndoor between master ensuite at 50%\ndoor between hall laundry at 50% type bifold width 1.2\ndoor between hall bed2 at 50%\ndoor between hall bed3 at 30%\n\nwindow living north at 70% width 2.2 type bay\nwindow living west at 30% width 1.6\nwindow kitchen north at 50% width 1.8 type sliding\nwindow dining north at 50% width 1.8 type sliding\nwindow dining east at 40% width 1.6\nwindow bath east at 50% width 0.7 type casement\nwindow master west at 50% width 1.6\nwindow master south at 40% width 1.8\nwindow ensuite south at 50% width 0.8\nwindow bed2 south at 60% width 1.6\nwindow bed3 south at 50% width 1.8\nwindow bed3 east at 40% width 1.4\n\nfurniture fireplace in living at 0.8,0.06 size 1.5x0.45\nfurniture sectional in living at 0.4,1.2 size 2.8x2.0\nfurniture rug in living at 0.5,0.9 size 3.8x2.8\nfurniture coffee-table in living at 3.2,1.7\nfurniture piano in living at 4.3,0.7 rotate 180\nfurniture tv-stand in living at 2.4,4.05\nfurniture tv in living at 2.55,4.18 size 1.3x0.12\nfurniture ceiling-fan in living at 2.5,2.2\nfurniture plant in living at 0.25,4.8\nfurniture side-table in living at 1.3,4.75\n\nfurniture counter in kitchen at 0.15,0.12 size 3.9x0.65\nfurniture wall-cabinet in kitchen at 0.15,0.12 size 3.9x0.35\nfurniture kitchen-sink in kitchen at 0.8,0.15\nfurniture dishwasher in kitchen at 1.6,0.15\nfurniture stove in kitchen at 2.6,0.13\nfurniture range-hood in kitchen at 2.5,0.1 size 0.8x0.55\nfurniture fridge in kitchen at 3.4,1.0 size 0.8x0.75\nfurniture island in kitchen at 1.0,2.2 size 2.2x0.9\nfurniture bar-stool in kitchen at 1.3,3.25\nfurniture bar-stool in kitchen at 2.0,3.25\nfurniture bar-stool in kitchen at 2.7,3.25\n\nfurniture dining-table in dining at 0.7,1.5 size 2.2x1.0\nfurniture bookcase "Cabinet" in dining at 0.3,0.12 size 1.5x0.35\nfurniture plant in dining at 3.0,0.3\n\nfurniture stairs in hall at 0.15,0.1 size 1.0x2.4\n\nfurniture toilet in bath at 0.25,0.15\nfurniture vanity in bath at 0.85,0.15 size 1.3x0.5\nfurniture bathtub in bath at 0.2,0.9 size 0.75x1.6\n\nfurniture bed-king in master at 0.9,1.1\nfurniture nightstand in master at 0.35,1.3\nfurniture nightstand in master at 2.95,1.3\nfurniture dresser in master at 3.7,1.0 size 0.5x1.4\nfurniture armchair in master at 3.3,3.4\nfurniture ceiling-fan in master at 2.0,2.6\n\nfurniture wardrobe in wic at 0.12,0.15 size 0.55x1.7\nfurniture wardrobe in wic at 1.15,0.15 size 0.55x1.7\n\nfurniture toilet in ensuite at 0.2,0.2\nfurniture sink in ensuite at 1.1,0.2\nfurniture shower in ensuite at 0.75,1.4 size 0.95x0.9\n\nfurniture washer in laundry at 0.15,0.2\nfurniture dryer in laundry at 0.85,0.2\nfurniture counter in laundry at 0.15,1.4 size 1.6x0.5\n\nfurniture bed-double in bed2 at 2.0,1.6 size 1.5x2.0\nfurniture wardrobe in bed2 at 3.85,0.15 size 0.5x1.6\nfurniture desk in bed2 at 0.2,2.6 size 1.2x0.6\n\nfurniture bed-double in bed3 at 0.9,1.0 size 1.6x2.0\nfurniture nightstand in bed3 at 0.3,1.1\nfurniture wardrobe in bed3 at 2.7,0.15 size 0.5x1.8\nfurniture bookshelf in bed3 at 0.3,3.9 size 1.2x0.35',
1713
+ "notes": "## What this shows\n\nThe living room grows a foyer with `extend living at 0,4.6 size 2x2.6` and bedroom 2 grows a desk nook \u2014 both render as true L-shapes with merged walls and a single summed area, exactly how professionals measure L-rooms. The hall stairs draw the UP arrow and the 45\xB0 cut-plane break line per drafting convention.\n\nEverything overhead or load-bearing uses its standard depiction: dashed wall cabinets and range hood (above the cut plane), dashed ceiling fans, bay-window projection, and a north compass in the dimension band."
1714
+ },
1715
+ {
1716
+ "slug": "floorplan-fitness-gym",
1717
+ "diagram": "floorplan",
1718
+ "title": "Fitness center \u2014 equipment zones",
1719
+ "description": "A gym floor: a cardio row of treadmills, a free-weights zone with benches and power racks, a mirrored yoga studio of mats, and a locker room \u2014 the equipment plan a gym operator hands the installer.",
1720
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1721
+ "tags": [
1722
+ "floorplan",
1723
+ "gym",
1724
+ "fitness",
1725
+ "commercial",
1726
+ "equipment"
1727
+ ],
1728
+ "complexity": 3,
1729
+ "featured": false,
1730
+ "dsl": 'floorplan "Fitness Center" unit m\nroom gym "Gym Floor" at 0,0 size 14x10 nolabel\nroom studio "Yoga Studio" right-of gym size 6x6\nroom locker "Locker Room" right-of gym below studio size 6x4\ndoor gym south at 12% width 1.8 type double\ndoor between gym studio at 30%\ndoor between gym locker at 50%\ngrid treadmill in gym rows 1 cols 5 count 5 area 1.2,1.1 12.8,1.1 itemsize 0.9x2\ngrid weight-bench in gym rows 1 cols 4 count 4 area 2,5.5 8,5.5 itemsize 0.6x1.8\ngrid power-rack in gym rows 1 cols 2 count 2 area 10.5,5.5 12.5,5.5 itemsize 1.4x1.4\nfurniture plant in gym at 0.4,8.6\ngrid yoga-mat in studio rows 2 cols 3 count 6 area 1,1.5 5,4.5 itemsize 0.6x1.8\nfurniture lockers in locker at 0.2,0.3 size 5.6x0.45\nfurniture lockers in locker at 0.2,3.3 size 5.6x0.45',
1731
+ "notes": "## What this shows\n\n`treadmill`, `weight-bench`, `power-rack`, and `yoga-mat` are the gym symbol set. Three `grid` statements zone the main floor \u2014 a cardio row along the north wall, a free-weights bank, and two power racks \u2014 while the benches' and racks' loaded-barbell envelopes reserve the lifting clearance.\n\nThe mirrored studio is a `grid yoga-mat` (an underlay, like a rug, so nothing collides with it), and the locker room runs two banks of `lockers` \u2014 each zone chained off the main floor with `right-of`/`below`."
1732
+ },
1733
+ {
1734
+ "slug": "floorplan-garden-ceremony",
1735
+ "diagram": "floorplan",
1736
+ "title": "Garden ceremony \u2014 semi-circle seating",
1737
+ "description": "Outdoor ceremony seating: four concentric chair arcs facing the arch (104 chairs), placed with one arc statement per row.",
1738
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1739
+ "tags": [
1740
+ "floorplan",
1741
+ "wedding",
1742
+ "ceremony",
1743
+ "semicircle",
1744
+ "outdoor"
1745
+ ],
1746
+ "complexity": 2,
1747
+ "featured": false,
1748
+ "dsl": 'floorplan "Garden Ceremony \u2014 Semi-Circle Seating (104 Chairs)" unit m\nroom lawn "Ceremony Lawn" at 0,0 size 20x13 nolabel\nfurniture stage "Arch" in lawn at 8.5,0.8 size 3x1.4\nfurniture podium in lawn at 6.6,1.2\narc chair in lawn count 20 center 10,2.2 radius 4 from 20 to 160\narc chair in lawn count 24 center 10,2.2 radius 5 from 20 to 160\narc chair in lawn count 28 center 10,2.2 radius 6 from 20 to 160\narc chair in lawn count 32 center 10,2.2 radius 7 from 20 to 160',
1749
+ "notes": "## What this shows\n\nEach row is one `arc chair` statement \u2014 count, center, radius, and the 20\xB0\u2013160\xB0 sweep \u2014 with every chair rotated to face the center. Capacity changes are a `count` edit; the validator's oriented-box collision test keeps adjacent chairs honest even though they're all rotated differently.\n\nThis is the \"Semi-Circle Wedding Seating\" request class verbatim: the input arrives as a chair count and a focal point, which is exactly what the arc primitive takes."
1750
+ },
1751
+ {
1752
+ "slug": "floorplan-hair-salon",
1753
+ "diagram": "floorplan",
1754
+ "title": "Hair salon & spa",
1755
+ "description": "A salon floor: four styling stations, a manicure row, a wash area with two shampoo bowls, reception and a waiting sofa, plus a restroom \u2014 the layout a salon owner plans before the lease build.",
1756
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1757
+ "tags": [
1758
+ "floorplan",
1759
+ "salon",
1760
+ "spa",
1761
+ "beauty",
1762
+ "commercial"
1763
+ ],
1764
+ "complexity": 3,
1765
+ "featured": false,
1766
+ "dsl": 'floorplan "Hair Salon & Spa" unit m\nroom salon "Salon Floor" at 0,0 size 11x7\nroom wash "Wash Area" right-of salon size 4x4\nroom rest "Restroom" right-of salon below wash size 4x3\ndoor salon south at 15% width 1.8 type double\ndoor between salon wash at 40%\ndoor between salon rest at 50%\nwindow salon south at 60% width 3\nfurniture counter "Reception" in salon at 0.3,0.3 size 2.5x0.7\nfurniture sofa "Waiting" in salon at 0.3,1.7\nfurniture plant in salon at 0.3,6.0\ngrid salon-chair in salon rows 1 cols 4 count 4 area 3.6,1.0 9.6,1.0 itemsize 0.8x1.4\ngrid manicure-table in salon rows 1 cols 3 count 3 area 4,5.4 9,5.4 itemsize 1x0.5\nfurniture shampoo-bowl in wash at 0.4,0.3 size 0.9x1.5\nfurniture shampoo-bowl in wash at 1.6,0.3 size 0.9x1.5\nfurniture salon-chair in wash at 2.9,2.2 size 0.8x1.4\nfurniture toilet in rest at 0.2,0.15\nfurniture sink in rest at 1.3,0.15',
1767
+ "notes": "## What this shows\n\n`salon-chair` (a styling station with its mirror), `shampoo-bowl` (a backwash unit), and `manicure-table` (a table with two facing chairs) are the salon symbol set. Four stations come from one `grid` along the front, a three-seat manicure row from another.\n\nThe wash area off the main floor pairs two shampoo bowls; reception, a waiting `sofa`, and a `plant` fill the entry \u2014 and the manicure tables' chair envelopes keep the aisle between the rows clear."
1768
+ },
1769
+ {
1770
+ "slug": "floorplan-kindergarten",
1771
+ "diagram": "floorplan",
1772
+ "title": "Kindergarten activity room",
1773
+ "description": "An early-education layout: kidney teaching table with an arc of chairs, three round group tables, circle-time rug, nap cribs, play kitchen, and cubbies + lockers along the south wall.",
1774
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1775
+ "tags": [
1776
+ "floorplan",
1777
+ "kindergarten",
1778
+ "classroom",
1779
+ "education",
1780
+ "daycare"
1781
+ ],
1782
+ "complexity": 2,
1783
+ "featured": false,
1784
+ "dsl": 'floorplan "Sunshine Kindergarten \u2014 Activity Room" unit m\nroom class "Activity Room" at 0,0 size 11x8 nolabel\ndoor class south at 12% width 1.0\ndoor class east at 55% width 0.9 swing in\nwindow class west at 20% width 1.8\nwindow class west at 55% width 1.8\nwindow class north at 60% width 2.0\nwindow class north at 85% width 1.5\n\nfurniture whiteboard in class at 1.2,0.06 size 2.4x0.12\nfurniture kidney-table "Ms. Lee" in class at 1.0,1.2\narc chair in class count 4 center 1.9,1.9 radius 1.35 from 35 to 145\ngrid round-table-4 in class rows 1 cols 3 area 4.6,2.6 9.2,2.6 itemsize 2.1x2.1\nfurniture counter "Play Kitchen" in class at 4.4,0.15 size 1.8x0.55\nfurniture desk "Teacher" in class at 9.3,0.25 size 1.3x0.65\nfurniture rug "Circle Time" in class at 0.5,4.6 size 3.4x2.8\nfurniture bookcase "Library" in class at 0.15,3.6 size 1.3x0.35\nfurniture crib in class at 9.2,5.0\nfurniture crib in class at 10.1,5.0\nfurniture counter "Cubbies" in class at 3.2,7.35 size 4.5x0.55\nfurniture lockers in class at 8.2,7.4 size 2.4x0.45\nfurniture ceiling-fan in class at 5.5,4.0\nfurniture plant in class at 0.25,0.2',
1785
+ "notes": "## What this shows\n\nThe chair arc around the kidney table is one statement \u2014 `arc chair \u2026 from 35 to 145` \u2014 with each chair rotated to face the center. The kidney table itself is the standard early-ed reading-group shape.\n\nZoning reads at a glance: wet play along the north counter, group tables mid-room, the rug-marked circle-time corner (an underlay, so furniture could sit on it), and the nap corner with cribs kept clear of the east door swing."
1786
+ },
1787
+ {
1788
+ "slug": "floorplan-lecture-hall",
1789
+ "diagram": "floorplan",
1790
+ "title": "Community lecture hall \u2014 96 seats",
1791
+ "description": "Theater-style seating: twelve row-chair strips in two banks with a center aisle (exactly 96 countable seats), stage, podium, smartboard, and double egress doors.",
1792
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1793
+ "tags": [
1794
+ "floorplan",
1795
+ "lecture-hall",
1796
+ "theater-seating",
1797
+ "capacity",
1798
+ "event"
1799
+ ],
1800
+ "complexity": 2,
1801
+ "featured": false,
1802
+ "dsl": 'floorplan "Community Lecture Hall \u2014 96 Seats" unit m\nroom hall "Lecture Hall" at 0,0 size 14x11 nolabel\ndoor hall south at 10% width 1.8 type double\ndoor hall south at 90% width 1.8 type double\ndoor hall east at 12% width 1.0 swing in\nwindow hall west at 25% width 2.2\nwindow hall west at 65% width 2.2\nfurniture stage "Stage" in hall at 4.2,0.4 size 5.6x1.6\nfurniture podium in hall at 3.2,0.9\nfurniture smartboard in hall at 5.2,0.06 size 3.6x0.12\ngrid row-chairs in hall rows 6 cols 2 area 3.2,3.2 10.8,8.8 itemsize 4.4x0.5',
1803
+ "notes": "## What this shows\n\n`grid row-chairs rows 6 cols 2` lays out both seating banks in one statement; each strip auto-places chairs at the 0.55 m theater pitch, so the plan's seat count (8 per strip \xD7 12 = 96) is structural, not decorative \u2014 count the chair elements in the SVG.\n\nThe two double doors at the rear and the side door give code-style egress, and the aisle width is just the gap between the grid's `area` columns \u2014 widen it by editing one x-coordinate."
1804
+ },
1805
+ {
1806
+ "slug": "floorplan-open-plan-office",
1807
+ "diagram": "floorplan",
1808
+ "title": "Open-plan office \u2014 18 workstations",
1809
+ "description": "A coworking floor: three rows of six L-desk workstations, a conference room and a break area off the open floor, lockers and filing, with double egress and sliding clerestory windows.",
1810
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1811
+ "tags": [
1812
+ "floorplan",
1813
+ "office",
1814
+ "coworking",
1815
+ "workspace",
1816
+ "commercial",
1817
+ "desks"
1818
+ ],
1819
+ "complexity": 3,
1820
+ "featured": false,
1821
+ "dsl": 'floorplan "Open-Plan Office \u2014 18 Workstations" unit m\nroom work "Open Workspace" at 0,0 size 16x10\nroom meet "Conference Room" right-of work size 5x5\nroom break "Break Area" right-of work below meet size 5x5\ndoor work south at 50% width 1.8 type double\ndoor between work meet at 30%\ndoor between work break at 30%\nwindow work north at 25% width 2 type sliding\nwindow work north at 75% width 2 type sliding\ngrid desk-l in work rows 3 cols 6 count 18 area 1.8,1.8 14.2,8.2 itemsize 1.6x1.6\nfurniture lockers in work at 0.2,9.4 size 3x0.45\nfurniture filing-cabinet in work at 14.6,9.2\nfurniture conference-table in meet at 0.9,1.5 size 3.2x1.6\nfurniture smartboard in meet at 0.06,1.5 size 0.12x1.6\nfurniture counter in break at 0.2,0.2 size 4.4x0.6\nfurniture fridge in break at 0.2,1.2\nfurniture round-table-4 in break at 1.7,2.4',
1822
+ "notes": "## What this shows\n\nEighteen corner workstations come from one `grid desk-l` \u2014 each L-desk draws its own task chair, and the grid's `area` corners are the centres of the first and last desk, so the 2.5 m column pitch leaves a clear circulation lane between rows.\n\nTwo service rooms hang off the open floor with `right-of`/`below` chaining; the `conference-table` and `round-table-4` auto-seat their edges, and the validator guarantees nothing \u2014 locker run, filing, fridge \u2014 strays past a wall or into a desk."
1823
+ },
1824
+ {
1825
+ "slug": "floorplan-residential-site-plan",
1826
+ "diagram": "floorplan",
1827
+ "title": "Residential site plan \u2014 60 \xD7 100 ft lot",
1828
+ "description": "A plot plan in feet: front and back yards, the house footprint, and a driveway tiled as non-overlapping zones, with two parked cars, four trees, and a patio table \u2014 the site view a permit needs.",
1829
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1830
+ "tags": [
1831
+ "floorplan",
1832
+ "site-plan",
1833
+ "plot-plan",
1834
+ "residential",
1835
+ "landscape",
1836
+ "parking"
1837
+ ],
1838
+ "complexity": 3,
1839
+ "featured": false,
1840
+ "dsl": 'floorplan "Residential Lot \u2014 60 \xD7 100 ft" unit ft\nroom front "Front Yard" at 0,0 size 60x34 fill #eef7e6 nolabel\nroom house "Residence" below front size 38x46\nroom drive "Driveway" right-of house size 22x46 fill #ededed\nroom yard "Back Yard" at 0,80 size 60x20 fill #eef7e6 nolabel\ndoor house north at 50% width 3.5\ndoor between house drive at 50% width 9 type double\nfurniture tree in front at 7,18 size 8x8\nfurniture tree in front at 45,18 size 8x8\nfurniture car in drive at 3,5 size 7x15\nfurniture car in drive at 12,5 size 7x15\nfurniture tree in yard at 6,7 size 9x9\nfurniture tree in yard at 45,7 size 9x9\nfurniture round-table-4 in yard at 26,7 size 6x6',
1841
+ "notes": "## What this shows\n\nA site plan has no nested rooms \u2014 the lot is **tiled** by non-overlapping zones (`front`, `house`, `drive`, `yard`) that share edges, exactly as the engine models adjacency. The `Residence` footprint stays an empty hatched box, the way a permit set shows the building outline.\n\n`tree` and `car` are sized for the outdoors \u2014 trees in feet across the yards, two cars filling the driveway stalls \u2014 and `door between house drive` resolves the garage opening onto the shared wall. The engine prints the exterior dimension string in feet-and-inches."
1842
+ },
1843
+ {
1844
+ "slug": "floorplan-retail-boutique",
1845
+ "diagram": "floorplan",
1846
+ "title": "Retail boutique \u2014 sales floor",
1847
+ "description": "A small-shop plan: gondola shelving in a grid, a window display, a checkout, round garment racks, a stockroom, and a fitting-room bank \u2014 the layout a retailer plans before the build-out.",
1848
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1849
+ "tags": [
1850
+ "floorplan",
1851
+ "retail",
1852
+ "store",
1853
+ "commercial",
1854
+ "boutique"
1855
+ ],
1856
+ "complexity": 3,
1857
+ "featured": false,
1858
+ "dsl": 'floorplan "Boutique \u2014 Retail Floor" unit m\nroom shop "Sales Floor" at 0,0 size 12x9\nroom stock "Stockroom" right-of shop size 4x5\nroom fit "Fitting" right-of shop below stock size 4x4\ndoor shop south at 15% width 1.8 type double\ndoor between shop stock at 50%\ndoor between shop fit at 50%\nwindow shop south at 55% width 3\nfurniture counter "Window Display" in shop at 0.3,0.2 size 4x0.6\nfurniture checkout in shop at 0.4,7.6 size 2x0.7\ngrid shelving in shop rows 2 cols 3 count 6 area 2.4,2.6 9.6,5.2 itemsize 1.8x0.6\nfurniture clothing-rack in shop at 1.2,6.3\nfurniture clothing-rack in shop at 10.2,6.3\nfurniture shelving in stock at 0.2,0.3 size 3.6x0.6\nfurniture shelving in stock at 0.2,2.6 size 3.6x0.6\nfurniture sofa in fit at 1.2,0.2 size 1.6x0.6\ngrid fitting-room in fit rows 1 cols 3 count 3 area 0.7,2.2 3.3,2.2 itemsize 1.1x1.1',
1859
+ "notes": "## What this shows\n\n`shelving` (gondola runs), `checkout`, `clothing-rack`, and `fitting-room` are the retail symbol set. The sales-floor gondolas come from one `grid`, leaving 1.5 m aisles, while two free-standing round racks bracket the floor.\n\nThe stockroom and fitting area chain off the sales floor with `right-of`/`below`; the three changing booths sit in a `grid fitting-room` with a waiting `sofa` opposite \u2014 and the collision check keeps the aisles walkable."
1860
+ },
1861
+ {
1862
+ "slug": "floorplan-studio-office",
1863
+ "diagram": "floorplan",
1864
+ "title": "Studio office \u2014 6 workstations",
1865
+ "description": "A small-office plan: L-desk workstations in a grid, auto-seated conference table, lobby with elevator and double entry, sliding windows, lockers and filing.",
1866
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1867
+ "tags": [
1868
+ "floorplan",
1869
+ "office",
1870
+ "workspace",
1871
+ "commercial",
1872
+ "desks"
1873
+ ],
1874
+ "complexity": 2,
1875
+ "featured": false,
1876
+ "dsl": 'floorplan "Studio Office \u2014 6 Workstations" unit m\nroom open "Open Workspace" at 0,0 size 10x7\nroom meet "Meeting Room" right-of open size 4x4\nroom lobby "Lobby" at 10,4 size 4x3\ndoor between open meet at 30%\nopening between open lobby at 50% width 1.8\ndoor lobby south at 60% width 1.8 type double\ndoor between meet lobby at 25%\nwindow open north at 15% width 2 type sliding\nwindow open north at 50% width 2 type sliding\nwindow open north at 85% width 2 type sliding\nwindow meet north at 50% width 2\nwindow meet east at 50% width 1.6\ngrid desk-l in open rows 2 cols 3 area 1.6,1.4 7.4,5 itemsize 1.6x1.6\nfurniture filing-cabinet in open at 0.15,6.3\nfurniture lockers in open at 5,6.45 size 2.4x0.45\nfurniture plant in open at 9.4,0.3\nfurniture conference-table in meet at 0.8,1.2 size 2.4x1.2\nfurniture smartboard in meet at 0.06,1.2 size 0.12x1.6\nfurniture sofa in lobby at 0.9,0.3\nfurniture elevator in lobby at 0.2,1.7 size 1.2x1.1\nfurniture plant in lobby at 3.3,0.3',
1877
+ "notes": "## What this shows\n\nSix corner workstations come from one `grid desk-l` statement; each L-desk draws its task chair in the corner. The meeting room's `conference-table` seats both long edges automatically at one chair per 0.65 m.\n\nThe lobby composes vertical-circulation symbols (elevator), a double entry door, and furniture \u2014 and the validator keeps everything honest: nudge the sofa into the elevator and it reports the overlap in meters."
1878
+ },
1879
+ {
1880
+ "slug": "floorplan-two-bed-apartment",
1881
+ "diagram": "floorplan",
1882
+ "title": "Two-bedroom apartment \u2014 68 m\xB2",
1883
+ "description": "A fully furnished residential plan: 7 rooms chained with relative placement, interior doors resolved onto shared walls automatically, auto-computed room areas, and exterior dimension strings.",
1884
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1885
+ "tags": [
1886
+ "floorplan",
1887
+ "residential",
1888
+ "apartment",
1889
+ "furniture",
1890
+ "dimensions"
1891
+ ],
1892
+ "complexity": 2,
1893
+ "featured": true,
1894
+ "dsl": 'floorplan "Two-Bedroom Apartment \u2014 68 m\xB2" unit m\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\nroom bath "Bathroom" right-of bed1 size 2.0x2.6\nroom bed2 "Bedroom 2" below hall size 3.4x3.0\nroom closet "WIC" right-of bed2 size 1.8x3.0\ndoor hall west at 50% width 1.0 swing in\nopening between living hall at 50% width 1.4\nopening between living kitchen at 35% width 1.2\ndoor between hall bed1 at 50% hinge right\ndoor between bed1 bath at 30%\ndoor between hall bed2 at 25%\ndoor between bed2 closet at 50% type bifold\nwindow living north at 30% width 1.8\nwindow living north at 75% width 1.2\nwindow kitchen north at 50% width 1.5\nwindow kitchen east at 50% width 1.4 type sliding\nwindow bed1 south at 55% width 1.4\nwindow bed2 south at 50% width 1.6\nwindow bed2 west at 50% width 1.2\nfurniture sofa in living at 0.25,2.9\nfurniture coffee-table in living at 1.0,1.9\nfurniture tv in living at 1.2,0.15\nfurniture armchair in living at 3.9,2.8\nfurniture plant in living at 4.5,0.3\nfurniture rug in living at 0.9,1.5\nfurniture counter in kitchen at 0.15,0.15 size 2.6x0.6\nfurniture kitchen-sink in kitchen at 0.6,0.18\nfurniture stove in kitchen at 2.25,0.15\nfurniture fridge in kitchen at 2.15,3.3\nfurniture dining-table in kitchen at 0.5,1.7 size 1.5x0.9\nfurniture bed-double in bed1 at 0.9,0.35 size 1.5x2.0\nfurniture wardrobe in bed1 at 0.1,0.1 size 0.6x2.3\nfurniture toilet in bath at 0.2,0.15\nfurniture sink in bath at 1.3,0.15\nfurniture shower in bath at 1.0,1.55\nfurniture bed-double in bed2 at 0.9,0.5 size 1.6x2.0\nfurniture wardrobe in closet at 0.1,0.2 size 0.6x2.6',
1895
+ "notes": "## What this shows\n\nThe whole apartment is placed with `right-of` / `below` chaining from one `at 0,0` anchor \u2014 adjacent rooms share an edge exactly, so their walls merge into a single poch\xE9 band. Every interior door uses `door between A B`, which finds the shared wall segment and positions along the overlap; no wall coordinates appear anywhere in the source.\n\nRoom areas (and the 68 m\xB2 total in the SVG `<desc>`) are computed from the geometry, never typed. The kitchen shows the underlay convention: the sink and stove sit *inside* the counter run without triggering collision warnings, while a misplaced wardrobe would be flagged with the overlap in meters."
1896
+ },
1897
+ {
1898
+ "slug": "floorplan-warehouse",
1899
+ "diagram": "floorplan",
1900
+ "title": "Distribution warehouse \u2014 racking & docks",
1901
+ "description": "An industrial layout: sixteen pallet-rack bays in aisled rows, two loading docks with a forklift in the pick aisle, and a shipping office annex \u2014 the warehouse plan a 3PL hands the fit-out crew.",
1902
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1903
+ "tags": [
1904
+ "floorplan",
1905
+ "warehouse",
1906
+ "logistics",
1907
+ "industrial",
1908
+ "racking"
1909
+ ],
1910
+ "complexity": 3,
1911
+ "featured": false,
1912
+ "dsl": 'floorplan "Distribution Warehouse" unit m\nroom floor "Warehouse" at 0,0 size 30x18 nolabel\nroom office "Shipping Office" below floor size 8x4\ndoor floor south at 45% width 3\ndoor floor south at 70% width 3\ndoor between floor office at 50%\nfurniture loading-dock in floor at 11,16.6 size 3x0.6\nfurniture loading-dock in floor at 19,16.6 size 3x0.6\ngrid pallet-rack in floor rows 4 cols 4 count 16 area 3,2.5 27,12.5 itemsize 2.7x1.1\nfurniture forklift in floor at 14.4,13.6\nfurniture desk in office at 0.4,0.4 size 1.6x0.8\nfurniture filing-cabinet in office at 6.9,0.4',
1913
+ "notes": "## What this shows\n\nSixteen `pallet-rack` bays come from one `grid`, the wide column pitch opening the cross-aisles a forklift needs \u2014 and a `forklift` parked in the pick aisle proves the clearance is real, not assumed.\n\nTwo `loading-dock` symbols sit on the rear wall above their exterior doors, and a `Shipping Office` annex hangs off the south wall via `below` \u2014 an L-shaped building footprint the engine dimensions on the outside."
1914
+ },
1915
+ {
1916
+ "slug": "floorplan-wedding-reception",
1917
+ "diagram": "floorplan",
1918
+ "title": "Wedding reception \u2014 120 guests",
1919
+ "description": "Banquet layout at industry defaults: fifteen 60\u2033 rounds auto-seated with 8 chairs each, head table seating one side, hatched dance floor, and service-aisle spacing that passes collision validation.",
1920
+ "standard": "Architectural Graphic Standards \xB7 US NCS v6",
1921
+ "tags": [
1922
+ "floorplan",
1923
+ "wedding",
1924
+ "event",
1925
+ "banquet",
1926
+ "seating"
1927
+ ],
1928
+ "complexity": 3,
1929
+ "featured": false,
1930
+ "dsl": 'floorplan "Wedding Reception \u2014 120 Guests" unit m\nroom hall "Grand Ballroom" at 0,0 size 24x16 nolabel\ndoor hall south at 15% width 1.8\ndoor hall south at 85% width 1.8\nopening hall west at 50% width 2.4\nfurniture head-table "Head Table" in hall at 9,0.7 size 6x0.9\nfurniture dance-floor "Dance Floor" in hall at 9.5,3 size 5x5\ngrid round-table-8 in hall rows 3 cols 2 count 6 area 2.8,4.2 7,10.9 itemsize 2.3x2.3\ngrid round-table-8 in hall rows 3 cols 2 count 6 area 17,4.2 21.2,10.9 itemsize 2.3x2.3\nrow round-table-8 in hall cols 3 area 8.8,13.4 15.2,13.4 itemsize 2.3x2.3\nfurniture counter "Cake" in hall at 21.6,1 size 1.8x0.7\nfurniture counter "Gifts" in hall at 0.6,1 size 1.8x0.7\nfurniture dj-booth in hall at 16.2,0.8\nfurniture bar in hall at 4.8,14.9 size 3x0.7',
1931
+ "notes": "## What this shows\n\nEach `round-table-8` draws its 8 chairs on the circumference (60\u2033 top per banquet-industry convention), so 15 tables = 120 covers, countable in the SVG. The two grids and one row place all fifteen tables in three statements.\n\nThe collision validator checks **chair-ring envelopes**, not table discs \u2014 squeeze the grid `area` by a meter and it names the exact pair of tables that now conflict and by how much. The head table seats one side only, facing the room."
1932
+ },
1539
1933
  {
1540
1934
  "slug": "flowchart-cicd-pipeline",
1541
1935
  "diagram": "flowchart",
@@ -2764,6 +3158,261 @@ If the LED doesn't light up, three things to check, in order: LED polarity (the
2764
3158
 
2765
3159
  **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.`
2766
3160
  },
3161
+ {
3162
+ "slug": "playbook-basketball-backdoor",
3163
+ "diagram": "playbook",
3164
+ "title": "Backdoor Cut",
3165
+ "description": "When the defender overplays the passing lane, cut behind him to the rim.",
3166
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3167
+ "tags": [
3168
+ "basketball",
3169
+ "backdoor",
3170
+ "cutting",
3171
+ "Princeton"
3172
+ ],
3173
+ "complexity": 1,
3174
+ "featured": false,
3175
+ "dsl": 'playbook "Backdoor Cut" sport basketball\nset 5-out\ncut 3 rim\npass 1 to 4,6',
3176
+ "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."
3177
+ },
3178
+ {
3179
+ "slug": "playbook-basketball-floppy",
3180
+ "diagram": "playbook",
3181
+ "title": "Floppy Action",
3182
+ "description": "A shooter chooses a single or double screen off the baseline to get open on the wing.",
3183
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3184
+ "tags": [
3185
+ "basketball",
3186
+ "floppy",
3187
+ "off-ball-screens",
3188
+ "shooting"
3189
+ ],
3190
+ "complexity": 3,
3191
+ "featured": false,
3192
+ "dsl": 'playbook "Floppy Action" sport basketball\nset 1-4-low\nscreen 4 2\nscreen 5 3\ncut 2 lwing\npass 1 2',
3193
+ "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`."
3194
+ },
3195
+ {
3196
+ "slug": "playbook-basketball-give-and-go",
3197
+ "diagram": "playbook",
3198
+ "title": "Give & Go",
3199
+ "description": "The oldest play in basketball \u2014 pass, cut to the basket, get it back.",
3200
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3201
+ "tags": [
3202
+ "basketball",
3203
+ "give-and-go",
3204
+ "cutting",
3205
+ "fundamentals"
3206
+ ],
3207
+ "complexity": 1,
3208
+ "featured": false,
3209
+ "dsl": 'playbook "Give & Go" sport basketball\nset 5-out\npass 1 2\ncut 1 rim\npass 2 1',
3210
+ "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."
3211
+ },
3212
+ {
3213
+ "slug": "playbook-basketball-horns",
3214
+ "diagram": "playbook",
3215
+ "title": "Horns Twist",
3216
+ "description": "A two-big set at the elbows that creates a ball screen with a re-screen counter.",
3217
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3218
+ "tags": [
3219
+ "basketball",
3220
+ "horns",
3221
+ "ball-screen",
3222
+ "set-play"
3223
+ ],
3224
+ "complexity": 3,
3225
+ "featured": false,
3226
+ "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',
3227
+ "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`)."
3228
+ },
3229
+ {
3230
+ "slug": "playbook-basketball-pick-and-roll",
3231
+ "diagram": "playbook",
3232
+ "title": "Spread Pick & Roll",
3233
+ "description": "The defining action of modern basketball \u2014 a ball screen with four shooters spacing the floor.",
3234
+ "standard": "FIBA/NBA half-court markings \xB7 coaching legend",
3235
+ "tags": [
3236
+ "basketball",
3237
+ "pick-and-roll",
3238
+ "spacing",
3239
+ "half-court"
3240
+ ],
3241
+ "complexity": 2,
3242
+ "featured": true,
3243
+ "dsl": 'playbook "Spread Pick & Roll" sport basketball\nset spread-pnr\nscreen 5 1\ndribble 1 to 11,17\ncut 5 rim\npass 1 2',
3244
+ "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."
3245
+ },
3246
+ {
3247
+ "slug": "playbook-football-four-verticals",
3248
+ "diagram": "playbook",
3249
+ "title": "Four Verticals (vs Cover 2)",
3250
+ "description": "The Air Raid staple \u2014 four receivers run vertical, stretching a two-deep shell until a seam opens.",
3251
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3252
+ "tags": [
3253
+ "football",
3254
+ "passing",
3255
+ "air-raid",
3256
+ "cover-2"
3257
+ ],
3258
+ "complexity": 2,
3259
+ "featured": true,
3260
+ "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',
3261
+ "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."
3262
+ },
3263
+ {
3264
+ "slug": "playbook-football-mesh",
3265
+ "diagram": "playbook",
3266
+ "title": "Mesh Concept",
3267
+ "description": "Two shallow crossers rub underneath while a corner route clears the top \u2014 the classic man-and-zone beater.",
3268
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3269
+ "tags": [
3270
+ "football",
3271
+ "passing",
3272
+ "mesh",
3273
+ "crossers"
3274
+ ],
3275
+ "complexity": 3,
3276
+ "featured": false,
3277
+ "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',
3278
+ "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."
3279
+ },
3280
+ {
3281
+ "slug": "playbook-football-power-o",
3282
+ "diagram": "playbook",
3283
+ "title": "Power O",
3284
+ "description": "The most-installed gap run in football \u2014 backside guard pulls to lead through the hole.",
3285
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3286
+ "tags": [
3287
+ "football",
3288
+ "run",
3289
+ "power",
3290
+ "gap-scheme"
3291
+ ],
3292
+ "complexity": 3,
3293
+ "featured": false,
3294
+ "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',
3295
+ "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."
3296
+ },
3297
+ {
3298
+ "slug": "playbook-football-red-zone-fade",
3299
+ "diagram": "playbook",
3300
+ "title": "Red Zone \u2014 Play-Action Fade",
3301
+ "description": "A goal-line play-action shot showing the end zone, goal line, and goalposts.",
3302
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3303
+ "tags": [
3304
+ "football",
3305
+ "red-zone",
3306
+ "play-action",
3307
+ "fade"
3308
+ ],
3309
+ "complexity": 2,
3310
+ "featured": false,
3311
+ "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',
3312
+ "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`."
3313
+ },
3314
+ {
3315
+ "slug": "playbook-football-smash",
3316
+ "diagram": "playbook",
3317
+ "title": "Smash Concept",
3318
+ "description": "A corner-over-hitch high-low that puts the cornerback in a bind \u2014 the textbook Cover 2 beater.",
3319
+ "standard": "AFCA X&O convention \xB7 NFL/NCAA Rule 1 field",
3320
+ "tags": [
3321
+ "football",
3322
+ "passing",
3323
+ "smash",
3324
+ "cover-2"
3325
+ ],
3326
+ "complexity": 2,
3327
+ "featured": false,
3328
+ "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',
3329
+ "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`."
3330
+ },
3331
+ {
3332
+ "slug": "playbook-soccer-4-3-3-shape",
3333
+ "diagram": "playbook",
3334
+ "title": "4-3-3 Team Shape",
3335
+ "description": "The default possession shape \u2014 a back four, a midfield three, and a front three.",
3336
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3337
+ "tags": [
3338
+ "soccer",
3339
+ "formation",
3340
+ "4-3-3",
3341
+ "shape"
3342
+ ],
3343
+ "complexity": 1,
3344
+ "featured": true,
3345
+ "dsl": 'playbook "4-3-3 Team Shape" sport soccer\nformation 4-3-3',
3346
+ "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."
3347
+ },
3348
+ {
3349
+ "slug": "playbook-soccer-build-up",
3350
+ "diagram": "playbook",
3351
+ "title": "Build-Up From the Back",
3352
+ "description": "Playing out of the defensive third \u2014 split the centre-backs, invite pressure, pass through the lines.",
3353
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3354
+ "tags": [
3355
+ "soccer",
3356
+ "build-up",
3357
+ "possession",
3358
+ "passing"
3359
+ ],
3360
+ "complexity": 2,
3361
+ "featured": false,
3362
+ "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',
3363
+ "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."
3364
+ },
3365
+ {
3366
+ "slug": "playbook-soccer-counter-attack",
3367
+ "diagram": "playbook",
3368
+ "title": "Counter-Attack",
3369
+ "description": "Win it in midfield and go \u2014 a vertical pass, a driving carry, and three forwards sprinting in behind.",
3370
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3371
+ "tags": [
3372
+ "soccer",
3373
+ "counter-attack",
3374
+ "transition",
3375
+ "through-ball"
3376
+ ],
3377
+ "complexity": 3,
3378
+ "featured": false,
3379
+ "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',
3380
+ "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."
3381
+ },
3382
+ {
3383
+ "slug": "playbook-soccer-high-press",
3384
+ "diagram": "playbook",
3385
+ "title": "High Press 4-3-3",
3386
+ "description": "Coordinated forward pressure \u2014 the front three and a midfielder hunt the ball in the opponent's half.",
3387
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3388
+ "tags": [
3389
+ "soccer",
3390
+ "high-press",
3391
+ "gegenpress",
3392
+ "defending"
3393
+ ],
3394
+ "complexity": 2,
3395
+ "featured": false,
3396
+ "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',
3397
+ "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."
3398
+ },
3399
+ {
3400
+ "slug": "playbook-soccer-overlap",
3401
+ "diagram": "playbook",
3402
+ "title": "Overlap & Cross",
3403
+ "description": "The full-back overlaps the winger to get to the byline and deliver a cross into the box.",
3404
+ "standard": "IFAB Laws of the Game, Law 1 (pitch)",
3405
+ "tags": [
3406
+ "soccer",
3407
+ "overlap",
3408
+ "cross",
3409
+ "wide-play"
3410
+ ],
3411
+ "complexity": 3,
3412
+ "featured": false,
3413
+ "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',
3414
+ "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."
3415
+ },
2767
3416
  {
2768
3417
  "slug": "prisma-dual-pipeline",
2769
3418
  "diagram": "prisma",
@@ -3727,6 +4376,14 @@ var SYNTAX = {
3727
4376
  "welding": {
3728
4377
  "title": "Welding symbol diagram",
3729
4378
  "content": '## 1. Your first weld\n\nThe smallest useful callout: a header, one joint, one arrow-side weld.\n\n```\nwelding "Bracket"\njoint "bracket to plate" {\n arrow: fillet size=8\n}\n```\n\nThree rules cover most usage:\n\n1. Start with `welding`, optionally `standard: aws | iso-a | iso-b` (default `aws`) and a quoted title.\n2. Each joint is a `joint "label" { \u2026 }` block. Put a weld on `arrow:` (arrow side) and/or `other:` (other side).\n3. A weld spec is a type followed by `key=value` dimensions \u2014 `fillet size=8`, `vgroove angle=60 root=3`.\n\n---\n\n## 2. Sides \u2014 arrow, other, both\n\nA joint is welded on the arrow side, the other side, or both.\n\n```\njoint "double fillet" {\n both: fillet size=6 # same weld on both sides\n}\njoint "asymmetric" {\n arrow: fillet size=8 # arrow side only\n other: vgroove angle=60 # different weld on the other side\n}\n```\n\n- **AWS** (default): the arrow-side glyph draws **below** the reference line, the other-side glyph **above**.\n- **ISO-A** (`standard: iso-a`): a **dashed companion line** appears; the arrow-side weld attaches to the solid line, the other-side weld to the dashed line. A symmetric `both:` weld suppresses the dashed line.\n\n---\n\n## 3. Weld types\n\n| Type | Glyph | Type | Glyph |\n|---|---|---|---|\n| `fillet` | triangle | `plug` / `slot` | rectangle |\n| `square` | parallel verticals | `spot` | circle on the line |\n| `vgroove` | V | `seam` | circle + line |\n| `bevel` | half-V | `back` / `backing` | semicircle |\n| `ugroove` | U | `surfacing` | build-up bumps |\n| `jgroove` | half-U | `edge` | tall verticals |\n| `flarev` / `flarebevel` | curved groove | | |\n\nAliases: `v`\u2192`vgroove`, `u`\u2192`ugroove`, `j`\u2192`jgroove`, `flare-v`\u2192`flarev`.\n\n---\n\n## 4. Dimensions\n\nDimensions read along the reference line in fixed slots.\n\n```\njoint "groove" {\n arrow: vgroove angle=60 root=3 throat=12 len=50 pitch=150\n}\n```\n\n| Key | Slot | Meaning |\n|---|---|---|\n| `size=` | left of symbol | fillet leg / groove depth / plug diameter |\n| `throat=` | left, in parentheses | effective throat `(E)` |\n| `len=` | right of symbol | weld length |\n| `pitch=` | right (with `len`) | intermittent centre-to-centre pitch \u2192 `len-pitch` |\n| `count=` | right (ISO) | number of increments \u2192 `count\xD7len (pitch)` |\n| `angle=` | at the opening | groove included angle (groove types only) |\n| `root=` | between symbol and line | root opening / gap |\n| `contour=` | above the symbol | `flush` (bar), `convex`, `concave` (arc) |\n| `finish=` | above the contour | finish method letter `G`/`M`/`C`/`R`/`H`/`U` |\n\n---\n\n## 5. Supplementary symbols\n\n```\njoint "post base" {\n arrow: fillet size=10\n around # weld-all-around \u2014 open circle at the junction\n field # field / site weld \u2014 filled flag pointing to the tail\n tail: "GTAW; WPS-12" # process / spec / NDE method\n}\n```\n\n```\nwelding\njoint "butt weld" {\n arrow: vgroove angle=60 root=3 throat=12\n other: backing\n tail: "SMAW; E7018"\n}\n```\n\n---'
4379
+ },
4380
+ "floorplan": {
4381
+ "title": "Floor plan",
4382
+ "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'
4383
+ },
4384
+ "playbook": {
4385
+ "title": "Sports playbook",
4386
+ "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.'
3730
4387
  }
3731
4388
  };
3732
4389
 
@@ -5224,6 +5881,73 @@ var PROFILES = {
5224
5881
  "'angle= only applies to groove welds' -> drop `angle=`, or change the type to a groove such as `vgroove`.",
5225
5882
  "'pitch= needs a length=' -> add `len=N` alongside `pitch=N` on the same weldspec."
5226
5883
  ]
5884
+ },
5885
+ floorplan: {
5886
+ type: "floorplan",
5887
+ header: 'floorplan "Title" [unit m|ft]',
5888
+ mode: "explicit dimensions + relative room placement; furniture room-relative from each room's top-left",
5889
+ keywords: 'room id "Label" at x,y | right-of/left-of/above/below ref [offset n] [align start|center|end] size WxH [fill #hex] [nolabel] \xB7 extend <room> at x,y | right-of ref size WxH (L/T/U rooms) \xB7 north [deg] \xB7 door <room> north|south|east|west | between A B at N% [width n] [hinge left|right] [swing in|out] [type single|double|sliding|pocket|bifold] \xB7 window <wallref> at N% [width n] [type fixed|sliding|casement|bay] \xB7 opening <wallref|between A B> at N% [width n] \xB7 furniture <type> in room at x,y [size WxH] [rotate deg] ["label"] \xB7 grid|row <type> in room rows R cols C [count N] area x1,y1 x2,y2 [itemsize WxH] \xB7 arc <type> in room count N center x,y radius r from deg to deg \xB7 types: bed-double/single/queen/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 counter wall-cabinet island kitchen-sink stove range-hood fridge dishwasher bar-stool toilet sink vanity bidet urinal bathtub shower washer dryer stairs stairs-l stairs-u spiral-stairs elevator column desk-chair desk desk-l chair whiteboard smartboard bookcase cubbies filing-cabinet lockers kidney-table round-table-4/6/8/10 conference-table banquet-table head-table stage dance-floor bar dj-booth cocktail-table podium row-chairs shelving checkout clothing-rack fitting-room pallet-rack loading-dock forklift salon-chair shampoo-bowl manicure-table treadmill weight-bench power-rack yoga-mat tree car',
5890
+ forms: [
5891
+ 'floorplan "Two-Bedroom Apartment" unit m',
5892
+ 'room living "Living Room" at 0,0 size 5.2x4.2',
5893
+ 'room kitchen "Kitchen" right-of living size 3.0x4.2',
5894
+ "door between living kitchen at 35% width 1.2",
5895
+ "window living north at 30% width 1.8",
5896
+ "furniture sofa in living at 0.25,2.9",
5897
+ "grid desk-chair in class rows 5 cols 6 count 27 area 5,8 25,24 itemsize 2x2.5"
5898
+ ],
5899
+ prefer: [
5900
+ "Declare rooms with explicit `size WxH` and chain placement with right-of/below \u2014 rooms sharing an edge merge into one wall automatically.",
5901
+ "Use `door between A B` for interior doors (the engine finds the shared wall); use `door <room> <side>` only for exterior walls.",
5902
+ "Furniture `at x,y` is relative to its room's interior top-left corner, in the plan unit.",
5903
+ "Use `grid`/`row`/`arc` for repeated items (desks, banquet tables, ceremony chairs) instead of many `furniture` lines; `count` truncates row-major.",
5904
+ "Round tables auto-seat their chairs (round-table-8 = 8 chairs); dining/banquet/conference tables auto-seat both long edges; leave chair clearance \u2265 0.5 m around tables.",
5905
+ "For L/T/U-shaped rooms, declare the main rectangle then `extend <room> at x,y size WxH` \u2014 the extension must share an edge; the engine merges walls and sums the area.",
5906
+ 'Stairs are furniture: `furniture stairs in hall at x,y` (also stairs-l, stairs-u, spiral-stairs) \u2014 they draw treads, the UP arrow, and the cut-plane break line automatically; label "DN" for a descending run.',
5907
+ "Commercial & site symbols: retail uses shelving/checkout/clothing-rack/fitting-room; warehouse uses pallet-rack/loading-dock/forklift; salon uses salon-chair/shampoo-bowl/manicure-table; gym uses treadmill/weight-bench/power-rack/yoga-mat; `tree` and `car` are sized for site plans, landscaping, and parking stalls."
5908
+ ],
5909
+ avoid: [
5910
+ "Don't overlap room rectangles \u2014 adjacency means edges touch exactly (right-of/below guarantee this).",
5911
+ "Don't place a `door between` rooms that share no edge; the engine rejects it with the measured gap.",
5912
+ "Don't position furniture in absolute plan coordinates \u2014 coordinates are room-relative."
5913
+ ],
5914
+ repair: [
5915
+ "'rooms \u2026 overlap by \u2026' -> move the second room with right-of/below placement or shrink its size.",
5916
+ "'rooms share no wall' -> make the rooms adjacent (sizes summing to a shared edge) or hang the door on a wall side instead.",
5917
+ "'extends \u2026 outside room' -> reduce the furniture x,y or size; coordinates start at the room's top-left interior corner.",
5918
+ "'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."
5919
+ ]
5920
+ },
5921
+ playbook: {
5922
+ type: "playbook",
5923
+ header: 'playbook "Play Name" [sport football]',
5924
+ mode: "formation preset + named routes off the route tree; coordinates in yards (x lateral from ball, y depth off LOS)",
5925
+ 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',
5926
+ forms: [
5927
+ 'playbook "Slant-Flat" sport football',
5928
+ "field down 1 distance 10 los 35 hash nfl",
5929
+ "formation trips-right",
5930
+ "defense cover-2",
5931
+ "route Z slant",
5932
+ "route H flat",
5933
+ "route X slant",
5934
+ "run RB dive right"
5935
+ ],
5936
+ prefer: [
5937
+ "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.",
5938
+ "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.",
5939
+ "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.",
5940
+ "Add `defense cover-2` (or 4-3 / cover-3 \u2026) to drop in 11 defenders + coverage zone bubbles automatically.",
5941
+ "Use `field down 1 distance 10 los 35` for the down-and-distance banner; `hash nfl|college` sets the hash-mark width."
5942
+ ],
5943
+ avoid: [
5944
+ "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.",
5945
+ "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)."
5946
+ ],
5947
+ repair: [
5948
+ "'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.",
5949
+ "'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."
5950
+ ]
5227
5951
  }
5228
5952
  };
5229
5953
  function getGenerationProfile(type) {
@@ -5388,5 +6112,5 @@ function matchRepair(repairs, message) {
5388
6112
  }
5389
6113
 
5390
6114
  export { DIAGRAM_REGISTRY, DIAGRAM_SINCE, getAllDiagramTypes, getDiagramMeta, getDiagramSince, getExamples, getSyntax, listDiagrams, renderDsl, resolveDiagramType, validateDsl };
5391
- //# sourceMappingURL=chunk-CURAZVOH.js.map
5392
- //# sourceMappingURL=chunk-CURAZVOH.js.map
6115
+ //# sourceMappingURL=chunk-NIYB6CHH.js.map
6116
+ //# sourceMappingURL=chunk-NIYB6CHH.js.map