schematex 0.9.11 → 0.9.13

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 (151) hide show
  1. package/dist/ai/ai-sdk.cjs +17 -16
  2. package/dist/ai/ai-sdk.cjs.map +1 -1
  3. package/dist/ai/ai-sdk.d.cts +3 -3
  4. package/dist/ai/ai-sdk.d.ts +3 -3
  5. package/dist/ai/ai-sdk.js +12 -11
  6. package/dist/ai/ai-sdk.js.map +1 -1
  7. package/dist/ai/index.cjs +26 -25
  8. package/dist/ai/index.cjs.map +1 -1
  9. package/dist/ai/index.d.cts +4 -4
  10. package/dist/ai/index.d.ts +4 -4
  11. package/dist/ai/index.js +13 -12
  12. package/dist/ai/index.js.map +1 -1
  13. package/dist/{api-DAiP83-P.d.ts → api-C9ufsgIb.d.ts} +2 -2
  14. package/dist/{api-DecITB-t.d.cts → api-DAUFeETp.d.cts} +2 -2
  15. package/dist/browser.cjs +18 -17
  16. package/dist/browser.cjs.map +1 -1
  17. package/dist/browser.d.cts +3 -3
  18. package/dist/browser.d.ts +3 -3
  19. package/dist/browser.js +12 -11
  20. package/dist/browser.js.map +1 -1
  21. package/dist/{chunk-HEGDKO2E.cjs → chunk-24YHD4YI.cjs} +3 -2
  22. package/dist/chunk-24YHD4YI.cjs.map +1 -0
  23. package/dist/{chunk-NP7N3DZG.js → chunk-2ZHP4TXP.js} +3 -3
  24. package/dist/{chunk-NP7N3DZG.js.map → chunk-2ZHP4TXP.js.map} +1 -1
  25. package/dist/{chunk-32LOZTNP.js → chunk-37WDY4G4.js} +3 -2
  26. package/dist/chunk-37WDY4G4.js.map +1 -0
  27. package/dist/{chunk-3KRL2EGN.cjs → chunk-3TGOOZ36.cjs} +13 -6
  28. package/dist/chunk-3TGOOZ36.cjs.map +1 -0
  29. package/dist/{chunk-WTGABYFK.js → chunk-6GVFKOSH.js} +3 -3
  30. package/dist/chunk-6GVFKOSH.js.map +1 -0
  31. package/dist/{chunk-2KTQ75LN.js → chunk-6KRSBSNT.js} +12 -7
  32. package/dist/chunk-6KRSBSNT.js.map +1 -0
  33. package/dist/{chunk-246OJILS.cjs → chunk-7DQXFTA7.cjs} +4 -4
  34. package/dist/{chunk-246OJILS.cjs.map → chunk-7DQXFTA7.cjs.map} +1 -1
  35. package/dist/{chunk-YFPDZVB7.cjs → chunk-AQENURKO.cjs} +4 -4
  36. package/dist/{chunk-YFPDZVB7.cjs.map → chunk-AQENURKO.cjs.map} +1 -1
  37. package/dist/{chunk-YN7EBTWB.cjs → chunk-AWUUGDN4.cjs} +4 -4
  38. package/dist/chunk-AWUUGDN4.cjs.map +1 -0
  39. package/dist/{chunk-ZRFKIERV.js → chunk-BGFKTJBZ.js} +3 -3
  40. package/dist/{chunk-ZRFKIERV.js.map → chunk-BGFKTJBZ.js.map} +1 -1
  41. package/dist/{chunk-F5RYWDWO.cjs → chunk-CYBBBBMZ.cjs} +4 -4
  42. package/dist/{chunk-F5RYWDWO.cjs.map → chunk-CYBBBBMZ.cjs.map} +1 -1
  43. package/dist/{chunk-QC2RICQ4.cjs → chunk-F3JYKM6M.cjs} +4 -4
  44. package/dist/{chunk-QC2RICQ4.cjs.map → chunk-F3JYKM6M.cjs.map} +1 -1
  45. package/dist/{chunk-4QBC4475.js → chunk-GHMSKPYN.js} +192 -3
  46. package/dist/chunk-GHMSKPYN.js.map +1 -0
  47. package/dist/{chunk-NB7MFQCZ.js → chunk-HZTHSNUN.js} +3 -3
  48. package/dist/{chunk-NB7MFQCZ.js.map → chunk-HZTHSNUN.js.map} +1 -1
  49. package/dist/{chunk-W4UVDMUC.js → chunk-I7UYVCKH.js} +3 -3
  50. package/dist/{chunk-W4UVDMUC.js.map → chunk-I7UYVCKH.js.map} +1 -1
  51. package/dist/chunk-IBZKIMT5.cjs +826 -0
  52. package/dist/chunk-IBZKIMT5.cjs.map +1 -0
  53. package/dist/{chunk-HIWJMJJB.js → chunk-ITNCO3MZ.js} +3 -3
  54. package/dist/{chunk-HIWJMJJB.js.map → chunk-ITNCO3MZ.js.map} +1 -1
  55. package/dist/{chunk-5YTFNOKY.cjs → chunk-KTAEPUAE.cjs} +13159 -13154
  56. package/dist/chunk-KTAEPUAE.cjs.map +1 -0
  57. package/dist/{chunk-AETIGJXP.js → chunk-KWY52MLQ.js} +3 -3
  58. package/dist/{chunk-AETIGJXP.js.map → chunk-KWY52MLQ.js.map} +1 -1
  59. package/dist/chunk-PGMKMIGM.js +818 -0
  60. package/dist/chunk-PGMKMIGM.js.map +1 -0
  61. package/dist/{chunk-DLXDR2E7.cjs → chunk-TIHHISCK.cjs} +4 -4
  62. package/dist/{chunk-DLXDR2E7.cjs.map → chunk-TIHHISCK.cjs.map} +1 -1
  63. package/dist/{chunk-GTCGATOL.cjs → chunk-US4QZ7J7.cjs} +4 -4
  64. package/dist/{chunk-GTCGATOL.cjs.map → chunk-US4QZ7J7.cjs.map} +1 -1
  65. package/dist/{chunk-RU3N57OB.js → chunk-WPNMVV3U.js} +13148 -13145
  66. package/dist/chunk-WPNMVV3U.js.map +1 -0
  67. package/dist/{chunk-6ZTPWE22.cjs → chunk-XJ5MTQLJ.cjs} +194 -5
  68. package/dist/chunk-XJ5MTQLJ.cjs.map +1 -0
  69. package/dist/{diagnostics-Bps9pzlF.d.ts → diagnostics-DSxLohjY.d.cts} +1 -1
  70. package/dist/{diagnostics-Bps9pzlF.d.cts → diagnostics-DSxLohjY.d.ts} +1 -1
  71. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  72. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  73. package/dist/diagrams/circuit/index.cjs +8 -8
  74. package/dist/diagrams/circuit/index.d.cts +1 -1
  75. package/dist/diagrams/circuit/index.d.ts +1 -1
  76. package/dist/diagrams/circuit/index.js +1 -1
  77. package/dist/diagrams/ecomap/index.cjs +7 -7
  78. package/dist/diagrams/ecomap/index.d.cts +1 -1
  79. package/dist/diagrams/ecomap/index.d.ts +1 -1
  80. package/dist/diagrams/ecomap/index.js +2 -2
  81. package/dist/diagrams/entity/index.d.cts +1 -1
  82. package/dist/diagrams/entity/index.d.ts +1 -1
  83. package/dist/diagrams/fishbone/index.cjs +8 -8
  84. package/dist/diagrams/fishbone/index.d.cts +1 -1
  85. package/dist/diagrams/fishbone/index.d.ts +1 -1
  86. package/dist/diagrams/fishbone/index.js +2 -2
  87. package/dist/diagrams/flowchart/index.cjs +8 -8
  88. package/dist/diagrams/flowchart/index.d.cts +2 -2
  89. package/dist/diagrams/flowchart/index.d.ts +2 -2
  90. package/dist/diagrams/flowchart/index.js +2 -2
  91. package/dist/diagrams/genogram/index.cjs +9 -9
  92. package/dist/diagrams/genogram/index.d.cts +1 -1
  93. package/dist/diagrams/genogram/index.d.ts +1 -1
  94. package/dist/diagrams/genogram/index.js +2 -2
  95. package/dist/diagrams/ladder/index.cjs +6 -6
  96. package/dist/diagrams/ladder/index.d.cts +1 -1
  97. package/dist/diagrams/ladder/index.d.ts +1 -1
  98. package/dist/diagrams/ladder/index.js +2 -2
  99. package/dist/diagrams/logic/index.d.cts +1 -1
  100. package/dist/diagrams/logic/index.d.ts +1 -1
  101. package/dist/diagrams/orgchart/index.d.cts +1 -1
  102. package/dist/diagrams/orgchart/index.d.ts +1 -1
  103. package/dist/diagrams/pedigree/index.cjs +7 -7
  104. package/dist/diagrams/pedigree/index.d.cts +1 -1
  105. package/dist/diagrams/pedigree/index.d.ts +1 -1
  106. package/dist/diagrams/pedigree/index.js +2 -2
  107. package/dist/diagrams/phylo/index.d.cts +1 -1
  108. package/dist/diagrams/phylo/index.d.ts +1 -1
  109. package/dist/diagrams/siteplan/index.cjs +38 -0
  110. package/dist/diagrams/siteplan/index.cjs.map +1 -0
  111. package/dist/diagrams/siteplan/index.d.cts +122 -0
  112. package/dist/diagrams/siteplan/index.d.ts +122 -0
  113. package/dist/diagrams/siteplan/index.js +5 -0
  114. package/dist/diagrams/siteplan/index.js.map +1 -0
  115. package/dist/diagrams/sld/index.cjs +8 -8
  116. package/dist/diagrams/sld/index.d.cts +1 -1
  117. package/dist/diagrams/sld/index.d.ts +1 -1
  118. package/dist/diagrams/sld/index.js +2 -2
  119. package/dist/diagrams/sociogram/index.d.cts +1 -1
  120. package/dist/diagrams/sociogram/index.d.ts +1 -1
  121. package/dist/diagrams/timing/index.d.cts +1 -1
  122. package/dist/diagrams/timing/index.d.ts +1 -1
  123. package/dist/diagrams/venn/index.d.cts +1 -1
  124. package/dist/diagrams/venn/index.d.ts +1 -1
  125. package/dist/{index-fvBAmlv7.d.cts → index-CDDfbChc.d.cts} +1 -1
  126. package/dist/{index-F6MCisQe.d.ts → index-CZa2pU0T.d.ts} +1 -1
  127. package/dist/index.cjs +71 -58
  128. package/dist/index.cjs.map +1 -1
  129. package/dist/index.d.cts +10 -5
  130. package/dist/index.d.ts +10 -5
  131. package/dist/index.js +15 -14
  132. package/dist/index.js.map +1 -1
  133. package/dist/react.cjs +12 -11
  134. package/dist/react.cjs.map +1 -1
  135. package/dist/react.d.cts +2 -2
  136. package/dist/react.d.ts +2 -2
  137. package/dist/react.js +11 -10
  138. package/dist/react.js.map +1 -1
  139. package/dist/{tools-vyVK2DHa.d.cts → tools-Bvw6dwIR.d.cts} +2 -2
  140. package/dist/{tools-CdzIw2Az.d.ts → tools-DtuvE-K4.d.ts} +2 -2
  141. package/package.json +6 -1
  142. package/dist/chunk-2KTQ75LN.js.map +0 -1
  143. package/dist/chunk-32LOZTNP.js.map +0 -1
  144. package/dist/chunk-3KRL2EGN.cjs.map +0 -1
  145. package/dist/chunk-4QBC4475.js.map +0 -1
  146. package/dist/chunk-5YTFNOKY.cjs.map +0 -1
  147. package/dist/chunk-6ZTPWE22.cjs.map +0 -1
  148. package/dist/chunk-HEGDKO2E.cjs.map +0 -1
  149. package/dist/chunk-RU3N57OB.js.map +0 -1
  150. package/dist/chunk-WTGABYFK.js.map +0 -1
  151. package/dist/chunk-YN7EBTWB.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { parseResult, renderResult } from './chunk-RU3N57OB.js';
1
+ import { parseResult, renderResult } from './chunk-WPNMVV3U.js';
2
2
 
3
3
  // src/ai/registry.ts
4
4
  var DIAGRAM_REGISTRY = [
@@ -687,6 +687,41 @@ var DIAGRAM_REGISTRY = [
687
687
  "space planning"
688
688
  ]
689
689
  },
690
+ {
691
+ type: "siteplan",
692
+ name: "Site plan",
693
+ tagline: "Presentation-grade parcel, road, and property layout diagrams \u2014 irregular lot boundaries, building footprints, driveways, setbacks, easements, frontage, trees, parking, dimensions, callouts, north arrow, and scale bar.",
694
+ useWhen: 'Use for listing/proposal site sketches and early planning diagrams focused on the land around a property: parcel or lot boundary, road frontage, driveway/walkway, building footprints, setbacks, easements, utility/fence/frontage lines, trees/cars/pins, dimensions, callouts, north arrow, scale bar, and legend. Header `siteplan "Title" unit ft|m`. Use `parcel ... points`, `structure ... points`, `road ... from/to width`, `driveway ... points width`, `setback/easement/fence/frontage ... from/to`, `tree/car ... at`, `dim ... from/to`, and `callout ... at/to`. Not for survey-grade bearings, CAD, permit-ready drawings, grading/drainage engineering, or 3D walkthroughs. Use `floorplan` for interior rooms/walls/furniture.',
695
+ cluster: "architecture",
696
+ standard: "Planning/zoning site-plan convention \xB7 ALTA/NSPS survey drawing vocabulary \xB7 real-estate plot-plan/listing sketch conventions; see 52-SITEPLAN-STANDARD.md",
697
+ syntaxKey: "siteplan",
698
+ aliases: [
699
+ "Site plan",
700
+ "siteplan",
701
+ "plot plan",
702
+ "plotplan",
703
+ "parcel map",
704
+ "parcelmap",
705
+ "property map",
706
+ "lot plan",
707
+ "\u5730\u5757\u56FE",
708
+ "\u57FA\u5730\u914D\u7F6E\u56FE",
709
+ "\u5730\u7C4D\u793A\u610F\u56FE"
710
+ ],
711
+ keywords: [
712
+ "site plan",
713
+ "plot plan",
714
+ "parcel boundary",
715
+ "lot boundary",
716
+ "property line",
717
+ "road frontage",
718
+ "setback",
719
+ "easement",
720
+ "driveway",
721
+ "building footprint",
722
+ "real estate listing"
723
+ ]
724
+ },
690
725
  {
691
726
  type: "playbook",
692
727
  name: "Sports playbook",
@@ -780,6 +815,7 @@ var DIAGRAM_SINCE = {
780
815
  welding: "0.8.1",
781
816
  // 0.9.3
782
817
  floorplan: "0.9.3",
818
+ siteplan: "0.9.12",
783
819
  // 0.9.4 — multi-sport playbook (football X&O / basketball / soccer)
784
820
  playbook: "0.9.4",
785
821
  // 0.9.5 — reliability block diagram (IEC 61078)
@@ -3971,6 +4007,118 @@ A textbook fly-by-wire architecture, the kind certified under ARP4761: **2-out-o
3971
4007
  "dsl": 'sfc "Order routing"\n\nvar ProductOrdered: bool\nvar IsExpressShipping: bool\nvar IsStandardShipping: bool\nvar Shipped: bool\n\nstep S0 [initial]\n\nstep S_Pick\n N PickFromBin\n\nalt from: S_Pick:\n branch [priority: 1]:\n transition: IsExpressShipping\n step S_Express\n N PrepExpressBox\n transition: TRUE\n branch [priority: 2]:\n transition: IsStandardShipping\n step S_Standard\n N PrepStandardBox\n transition: TRUE\nmerge_to: S_Ship\n\nstep S_Ship\n N CarrierPickup\n\ntransition from: S0 to: S_Pick: ProductOrdered\ntransition from: S_Ship to: S0: Shipped',
3972
4008
  "notes": "A modern fulfillment center handles both express (next-day) and standard (3\u20135 day) shipping on the same physical line, with the same picking robots and the same carrier-pickup conveyor. The only divergence is the boxing step: express boxes are different sizes, use rigid corrugate, and get extra tracking labels. SFC's alternative branch is the right shape for this: one step (picking) splits into two paths (express boxing OR standard boxing) and they converge back to a common end step (carrier pickup).\n\n**Single horizontal bar = alternative.** IEC 61131-3 \xA76.5.4 uses a **single horizontal line** for alternative (OR-semantic) divergence and convergence. Visually it's the simpler cousin of the double-bar simultaneous fork; semantically it's the opposite \u2014 only *one* branch fires per scan, picked by which entry transition's condition evaluates true first under the priority order.\n\n**Priority annotation matters.** Both branches have `[priority: N]` markers \u2014 express is priority 1, standard is priority 2. If both `IsExpressShipping` and `IsStandardShipping` were somehow true at the same time (a bug, but a common one in early integration), the priority forces the express path. The renderer puts a small red number near each branch entry to make the priority visible at review time.\n\n**Per-branch entry and exit transitions.** Inside each branch, there are two `transition: ...` lines \u2014 the first is the **entry transition** (fires when control reaches the divergence bar; renders between the bar and the first step in that branch), and the second is the **exit transition** (fires when the branch's last step completes; renders between that step and the convergence bar). Most exit transitions are `TRUE` (unconditional) because the *step* itself is what's gating the work \u2014 once the step completes, you want to leave the branch. The entry transitions are where the actual decision logic lives.\n\n**Why not flowchart?** A flowchart of this would render the routing as a diamond with two branches and labels on each branch. You'd lose the explicit step semantics \u2014 in flowchart, the diamond *is* the decision point and there's no notion of \"the picking step is currently active and the next step depends on shipping type.\" That distinction matters for PLC code: while the picking step is active, the picking robot is physically holding the product, and you need to know exactly when the routing decision happens (at step exit, not step entry) to coordinate the conveyor handoff. SFC's \"step active \u2192 transition \u2192 next step active\" semantics are what real PLC scan engines do; flowchart's diamond/box semantics are not.\n\n**The shared S_Ship destination.** Both branches converge to S_Ship, where `CarrierPickup` runs. This is one of the strengths of alternative-branch SFC: the post-routing step is shared infrastructure, drawn exactly once. If you moved to multiple destinations (e.g. express has its own carrier door, standard has another), you'd skip the convergence and let each branch end at its own terminal step \u2014 also a valid SFC pattern."
3973
4009
  },
4010
+ {
4011
+ "slug": "siteplan-backyard-landscape",
4012
+ "diagram": "siteplan",
4013
+ "title": "Backyard landscape sketch",
4014
+ "description": "A listing-friendly backyard plan: house and garage footprints, patio, lawn, planting beds, fence, trees, walkways, garden labels, north arrow, scale, and legend.",
4015
+ "standard": "Landscape/site-plan convention \xB7 residential marketing sketch",
4016
+ "tags": [
4017
+ "siteplan",
4018
+ "landscape-plan",
4019
+ "backyard",
4020
+ "patio",
4021
+ "garden",
4022
+ "listing"
4023
+ ],
4024
+ "complexity": 3,
4025
+ "featured": true,
4026
+ "dsl": 'siteplan "Backyard Landscape Sketch" unit ft\nparcel yard points 0,0 88,0 94,82 6,88\nfence rear from 2,82 to 92,76\nfence left from 0,0 to 6,88\nfence right from 88,0 to 94,82\nstructure house "House" points 12,10 46,10 46,34 12,34\nstructure garage "Garage" points 50,10 72,10 72,34 50,34\nlandscape lawn "Lawn" points 14,40 78,38 86,70 18,76 fill #fbfdf8\nlandscape bed1 points 4,10 10,10 12,76 6,82\nlandscape bed2 points 70,42 90,40 90,72 74,74\nparking patio points 18,34 42,34 42,50 18,50\nwalkway path points 44,34 56,48 72,60 width 5\ntree maple at 18,68 size 10\ntree t2 at 30,74 size 8\ntree t3 at 78,54 size 9\ntree t4 at 84,66 size 8\ncallout "Patio" at 28,55 to 30,42\ncallout "Kitchen garden" at 74,28 to 78,42\nnorth\nscale 20\nlegend on',
4027
+ "notes": "## What this shows\n\nThis is the high-frequency outdoor-living use case: simple parcel outline, house/garage footprint, lawn, patio, beds, trees, fence, and a couple of sales-friendly callouts. It avoids construction detail while still feeling like a recognizable site/landscape plan."
4028
+ },
4029
+ {
4030
+ "slug": "siteplan-corner-commercial",
4031
+ "diagram": "siteplan",
4032
+ "title": "Corner commercial site",
4033
+ "description": "A small commercial property sketch: corner lot with two roads, retail footprint, parking field, driveway entries, frontage line, landscape strip, trees, and callouts.",
4034
+ "standard": "Planning/zoning site-plan convention \xB7 commercial proposal sketch",
4035
+ "tags": [
4036
+ "siteplan",
4037
+ "commercial",
4038
+ "corner-lot",
4039
+ "parking",
4040
+ "road-frontage"
4041
+ ],
4042
+ "complexity": 3,
4043
+ "featured": true,
4044
+ "dsl": 'siteplan "Corner Retail Site" unit ft\nparcel lot points 0,0 150,0 150,105 0,120\nroad main "Main Street" from -20,-18 to 170,-18 width 28\nroad oak "Oak Avenue" from -16,-18 to -16,138 width 24\nfrontage mainFront from 0,0 to 150,0\nfrontage sideFront from 0,0 to 0,120\nsetback front from 10,12 to 140,12\nlandscape strip points 10,12 140,12 140,26 10,26 fill #dff0d3\nstructure retail "Retail Building" points 42,35 126,35 126,70 42,70\nparking stalls points 30,76 142,70 142,100 28,108 fill #eceff3\ndriveway entry1 from 82,0 to 82,32 width 18\ndriveway entry2 from 0,72 to 30,72 width 16\npin sign at 18,18 size 8 "Monument sign"\ntree t1 at 20,38 size 9\ntree t2 at 136,22 size 9\ntree t3 at 136,94 size 9\ncar c1 at 54,90 size 14 rotate 86\ncar c2 at 74,89 size 14 rotate 86\ncar c3 at 94,88 size 14 rotate 86\ncallout "Dual access" at 24,56 to 0,72\ndim "150 ft" from 0,-36 to 150,-36\nnorth\nscale 50\nlegend on',
4045
+ "notes": "## What this shows\n\nThis example is about selling the site relationship: corner exposure, two-road access, a retail footprint, and visible parking. `siteplan` keeps those exterior facts first instead of pretending to be an architectural floor plan."
4046
+ },
4047
+ {
4048
+ "slug": "siteplan-lifestyle-center-parking",
4049
+ "diagram": "siteplan",
4050
+ "title": "Lifestyle center parking plan",
4051
+ "description": "A retail lifestyle-center sketch: two retail rows, central pedestrian plaza, surface parking court, parking deck, entry drives, fire-lane/easement overlay, landscape islands, cars, callouts, north arrow, scale, and legend.",
4052
+ "standard": "Planning/zoning site-plan convention \xB7 commercial proposal sketch",
4053
+ "tags": [
4054
+ "siteplan",
4055
+ "lifestyle-center",
4056
+ "parking-deck",
4057
+ "retail",
4058
+ "plaza",
4059
+ "commercial"
4060
+ ],
4061
+ "complexity": 4,
4062
+ "featured": true,
4063
+ "dsl": 'siteplan "Lifestyle Center Parking Plan" unit ft\nparcel site points 0,0 260,0 276,180 28,198 -12,64\nroad market "Market Street" from -24,-20 to 286,-20 width 30\nroad pine "Pine Road" from -18,-20 to -18,210 width 24\nfrontage mainFront from 0,0 to 260,0\nfrontage sideFront from 0,0 to -12,64\nsetback frontSetback from 12,16 to 248,16\neasement fireLane "Fire lane" from 20,162 to 260,152\nstructure rowA "Retail Row A" points 40,30 214,30 214,58 40,58\nstructure rowB "Retail Row B" points 52,120 220,120 220,150 52,150\nstructure deck "Parking Deck" points 212,62 262,62 262,142 212,142\nparking surface points 32,66 206,64 204,116 34,118 fill #eceff3\nlandscape plaza points 74,72 180,72 182,112 74,112 fill #dff0d3\nlandscape island1 points 38,76 64,76 64,88 38,88 fill #dff0d3\nlandscape island2 points 38,96 64,96 64,108 38,108 fill #dff0d3\ndriveway mainEntry from 130,0 to 130,30 width 18\ndriveway crossA from 30,92 to 210,90 width 14\ndriveway deckRamp points 236,62 234,36 260,18 width 12\ndriveway sideEntry from -12,64 to 34,92 width 14\nwalkway spine points 88,58 88,72 88,112 88,120 width 6\nwalkway cross points 74,92 182,92 width 6\ntree t1 at 50,82 size 8\ntree t2 at 50,102 size 8\ntree t3 at 132,92 size 10\ntree t4 at 188,92 size 8\ntree t5 at 246,154 size 9\ncar c1 at 78,82 size 13 rotate 88\ncar c2 at 106,82 size 13 rotate 88\ncar c3 at 154,82 size 13 rotate 88\ncar c4 at 78,104 size 13 rotate 88\ncar c5 at 150,104 size 13 rotate 88\nentry plazaEntry at 130,58 size 9 "Plaza entry"\npin sign at 24,18 size 8 "Monument sign"\ncallout "Deck ramp" at 248,48 to 236,62\ncallout "Event plaza" at 164,112 to 132,92\ndim "260 ft frontage" from 0,-42 to 260,-42\nnorth\nscale 50\nlegend on',
4064
+ "notes": "## What this shows\n\nThis is the proposal-friendly version of a retail parking plan: surface parking, a structured parking option, walkable plaza, entry drives, and fire-lane/easement context. It is enough for a leasing or feasibility deck, not a stall-by-stall construction drawing."
4065
+ },
4066
+ {
4067
+ "slug": "siteplan-mall-parking-lot",
4068
+ "diagram": "siteplan",
4069
+ "title": "Mall parking lot concept",
4070
+ "description": "A commercial site-plan sketch for a mall: arterial frontage, anchor building footprint, cinema wing, surface parking fields, loop drive, entry drives, landscape islands, loading/service court, north arrow, scale, and legend.",
4071
+ "standard": "Planning/zoning site-plan convention \xB7 commercial leasing sketch",
4072
+ "tags": [
4073
+ "siteplan",
4074
+ "mall",
4075
+ "parking-lot",
4076
+ "commercial",
4077
+ "retail",
4078
+ "access"
4079
+ ],
4080
+ "complexity": 4,
4081
+ "featured": true,
4082
+ "dsl": 'siteplan "Mall Parking Lot Concept" unit ft\nparcel site points 0,0 320,0 340,220 18,236 -10,82\nroad harbor "Harbor Blvd" from -34,-24 to 366,-24 width 36\nfrontage mainFront from 0,0 to 320,0\nsetback frontSetback from 18,22 to 306,22\nstructure mall "Mall" points 82,58 250,58 250,124 224,124 224,150 104,150 104,124 82,124\nstructure cinema "Cinema" points 252,72 310,72 310,132 252,132\nparking northLot points 24,26 74,26 76,156 20,174 2,86\nparking southLot points 72,158 260,158 310,190 62,214\nparking eastLot points 314,40 328,188 264,174 266,140 322,132 322,72\ndriveway mainEntry from 160,0 to 160,58 width 22\ndriveway loop points 52,40 78,44 82,154 58,188 278,184 302,142 298,42 width 16\ndriveway eastEntry from 320,96 to 302,96 width 18\nwalkway promenade points 124,150 128,180 238,178 224,150 width 8\nlandscape island1 points 34,38 62,38 62,54 34,54 fill #dff0d3\nlandscape island2 points 36,92 64,94 66,110 38,108 fill #dff0d3\nlandscape island3 points 104,174 146,172 148,188 106,190 fill #dff0d3\nlandscape island4 points 214,174 258,176 262,192 218,190 fill #dff0d3\ntree t1 at 44,46 size 10\ntree t2 at 52,102 size 9\ntree t3 at 126,182 size 9\ntree t4 at 238,184 size 9\ncar c1 at 40,74 size 14 rotate 0\ncar c2 at 42,128 size 14 rotate 0\ncar c3 at 118,186 size 14 rotate 88\ncar c4 at 154,184 size 14 rotate 88\ncar c5 at 222,186 size 14 rotate 88\ncar c6 at 286,156 size 14 rotate 8\nentry mainDoor at 166,58 size 10 "Main entry"\npin transit at 210,-4 size 8 "Transit stop"\ncallout "Loading/service court" at 292,154 to 252,124\ndim "320 ft frontage" from 0,-46 to 320,-46\nnorth\nscale 100\nlegend on',
4083
+ "notes": "## What this shows\n\nThis is a mall-scale marketing and leasing sketch: it communicates frontage, major tenant massing, surface parking fields, access drives, pedestrian connection, and service court without pretending to be a civil parking-count drawing."
4084
+ },
4085
+ {
4086
+ "slug": "siteplan-residential-listing",
4087
+ "diagram": "siteplan",
4088
+ "title": "Residential listing site plan",
4089
+ "description": "A realtor-friendly plot sketch: irregular parcel, road frontage, house and garage footprints, driveway, front setback, utility easement, trees, car, dimension, north arrow, and scale bar.",
4090
+ "standard": "Planning/zoning site-plan convention \xB7 real-estate listing sketch",
4091
+ "tags": [
4092
+ "siteplan",
4093
+ "plot-plan",
4094
+ "real-estate",
4095
+ "listing",
4096
+ "parcel",
4097
+ "driveway"
4098
+ ],
4099
+ "complexity": 3,
4100
+ "featured": true,
4101
+ "dsl": 'siteplan "Residential Listing Site Plan" unit ft\nparcel lot points 0,0 62,0 58,96 8,104 -4,42\nroad maple "Maple Ave" from -12,-16 to 74,-16 width 22\nfrontage front from 0,0 to 62,0\nsetback frontSetback "Front setback" from 5,8 to 57,8\neasement util "Utility easement" from 48,0 to 43,96\nstructure house "Residence" points 15,28 45,28 45,64 34,64 34,78 15,78\nstructure garage "Garage" points 45,32 58,32 58,55 45,55\ndriveway drive points 52,0 52,32 width 10\nwalkway walk points 31,0 31,28 width 4\ntree oak at 9,22 size 8 "Oak"\ntree mapleTree at 12,80 size 9\ncar car1 at 52,14 size 15 rotate 0\ndim "62 ft frontage" from 0,-30 to 62,-30\ncallout "Covered patio" at 20,90 to 22,76\nnorth\nscale 20\nlegend on',
4102
+ "notes": "## What this shows\n\nThe parcel is an irregular polygon, not a room rectangle. The diagram keeps the listing-level essentials visible: road frontage, driveway, house footprint, garage, front setback, utility easement, outdoor trees, and a callout.\n\nIt is presentation-grade: clean enough for a sales sheet, intentionally not a survey or permit drawing."
4103
+ },
4104
+ {
4105
+ "slug": "siteplan-townhome-infill",
4106
+ "diagram": "siteplan",
4107
+ "title": "Townhome infill concept",
4108
+ "description": "Early development sketch: a deep parcel with internal lane, four townhome footprints, parking pads, open-space zone, trail connection, setbacks, and phase callouts.",
4109
+ "standard": "Planning/zoning site-plan convention \xB7 conceptual development sketch",
4110
+ "tags": [
4111
+ "siteplan",
4112
+ "development",
4113
+ "townhomes",
4114
+ "conceptual-planning",
4115
+ "internal-road"
4116
+ ],
4117
+ "complexity": 4,
4118
+ "featured": true,
4119
+ "dsl": 'siteplan "Townhome Infill Concept" unit ft\nparcel lot points 0,0 92,0 102,210 12,226 -8,96\nroad cedar "Cedar Road" from -18,-17 to 110,-17 width 26\nfrontage front from 0,0 to 92,0\nsetback frontSetback from 8,20 to 90,20\nsetback rearSetback from 12,204 to 98,190\neasement drainage from 78,12 to 96,194\ndriveway lane points 45,0 47,64 54,128 58,190 width 14\nstructure unit1 "Unit 1" points 12,42 38,42 38,74 12,74\nstructure unit2 "Unit 2" points 14,86 42,86 42,118 14,118\nstructure unit3 "Unit 3" points 18,132 46,132 46,164 18,164\nstructure unit4 "Unit 4" points 22,176 50,176 50,202 22,202\nparking pad1 points 56,42 78,42 78,74 56,74 fill #eceff3\nparking pad2 points 60,88 82,88 82,120 60,120 fill #eceff3\nlandscape open points 60,132 90,128 94,176 62,184 fill #dff0d3\nwalkway trail points 62,184 90,210 width 6\ntree t1 at 12,20 size 8\ntree t2 at 86,56 size 8\ntree t3 at 88,152 size 9\ntree t4 at 40,214 size 8\ncallout "Phase 1" at 0,74 to 22,58\ndim "226 ft depth" from -30,0 to -30,226\nnorth\nscale 50\nlegend on',
4120
+ "notes": "## What this shows\n\nThis is the careful boundary for developer demand: a concept sketch with parcel geometry, internal access, buildings, parking, open space, and callouts. It helps a proposal conversation without crossing into civil engineering."
4121
+ },
3974
4122
  {
3975
4123
  "slug": "sld-commercial-solar-pv",
3976
4124
  "diagram": "sld",
@@ -4731,6 +4879,10 @@ var SYNTAX = {
4731
4879
  "title": "Floor plan",
4732
4880
  "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| Restaurant / commercial kitchen | `booth` `prep-table` `range` `walk-in` `commercial-sink` `fryer` |\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**Seating charts** \u2014 name the occupants of any auto-seating table with a `seats` clause, and the engine writes each name onto its chair (in placement order: round tables clockwise from the top; rectangular tables fill the top edge left-to-right, then the bottom edge). This turns a venue floor plan into the seating chart guests actually read:\n\n```\nfurniture round-table-8 "Table 3" in hall at 11,4 seats "Alice" "Bob" "Carol" "Dave"\nfurniture head-table "Head Table" in hall at 5,0.6 size 6x0.9 seats "Bride" "Groom"\n```\n\nExtra chairs without a name stay empty; extra names past the chair count are ignored. CJK-quoted names (`seats "\u5F20\u4F1F" "\u674E\u5A1C"`) work like every other label. Names read horizontally, so keep the table unrotated for a clean chart.\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? ("seats" 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'
4733
4881
  },
4882
+ "siteplan": {
4883
+ "title": "Site plan",
4884
+ "content": '## 1. Parcel and footprints\n\nUse `parcel` for the outer lot boundary and `structure` for buildings, garages, sheds, decks, or patios:\n\n```text\nsiteplan "Listing Site Plan" unit ft\nparcel lot points 0,0 62,0 58,96 8,104 -4,42\nstructure house "Residence" points 15,28 45,28 45,64 34,64 34,78 15,78\nstructure garage "Garage" points 45,32 58,32 58,55 45,55\n```\n\nPolygons close automatically. Keep them simple and use a human-authored label when the shape is part of a sales or proposal page.\n\n## 2. Roads and paths\n\nRoads, driveways, walkways, and trails are centerline paths with a visual width:\n\n```text\nroad maple "Maple Ave" from -12,-16 to 74,-16 width 22\ndriveway drive "Driveway" points 52,0 52,32 width 10\nwalkway walk "Entry walk" points 31,0 31,28 width 4\n```\n\nUse `from x,y to x,y` for a straight segment or `points x,y x,y ...` for a bent path.\n\nDriveways render as paved aisles with edge lines. Commercial-width driveways (`width` 12+) add lane markings, and wider drive aisles (`width` 14+) add subtle directional arrows.\n\n## 3. Planning overlays\n\nLine features use standard site-plan vocabulary:\n\n```text\nfrontage front "Road frontage" from 0,0 to 62,0\nsetback frontSetback "Front setback" from 5,8 to 57,8\neasement util "Utility easement" from 48,0 to 43,96\nfence rearFence "Fence" from 8,104 to 58,96\nutility water "Water service" points 20,0 20,28\n```\n\nThese are presentation overlays. The engine draws them clearly but does not calculate zoning compliance.\n\n## 4. Markers, dimensions, and callouts\n\n```text\ntree oak at 9,22 size 8 "Oak"\ncar car1 at 52,14 size 15 rotate 0\npin sign at 10,4 size 6 "Sign"\ndim "62 ft frontage" from 0,-30 to 62,-30\ncallout "Covered patio" at 20,90 to 22,76\nnorth\nscale 20\nlegend on\n```\n\n`dim` labels are authored by you. This keeps the diagram honest: it is a listing/proposal sketch, not a legal survey.\n\n## 5. Grammar\n\n```text\nplan ::= ("siteplan"|"plotplan"|"parcelmap"|"propertymap") string? ("unit" ("ft"|"m"))? NL statement*\npolygon ::= ("parcel"|"structure"|"zone"|"landscape"|"parking") id string? "points" coord coord coord+ ("fill" color)?\npath ::= ("road"|"driveway"|"walkway"|"trail") id string? ("from" coord "to" coord | "points" coord coord+) ("width" num)?\nline ::= ("setback"|"easement"|"fence"|"utility"|"frontage"|"boundary") id string? ("from" coord "to" coord | "points" coord coord+)\nmarker ::= ("tree"|"car"|"pin"|"entry"|"hydrant"|"well") id? "at" coord ("size" num|dims)? ("rotate" num)? string?\ndim ::= ("dim"|"measure") string? "from" coord "to" coord\ncallout ::= "callout" string "at" coord "to" coord\nnorth ::= "north" num?\nscale ::= "scale" num\nlegend ::= "legend" ("on"|"off")\n```\n\n## Related examples\n\n- [Residential listing site plan](/examples#siteplan) \u2014 realtor-ready parcel, house footprint, driveway, easement, setbacks\n- [Backyard landscape sketch](/examples#siteplan) \u2014 house, patio, lawn, planting beds, trees, fence\n- [Corner commercial site](/examples#siteplan) \u2014 two-road frontage, parking, entry, retail footprint\n- [Mall parking lot concept](/examples#siteplan) \u2014 mall footprint, parking fields, loop drive, entry access, service court\n- [Lifestyle center parking plan](/examples#siteplan) \u2014 retail rows, pedestrian plaza, surface parking, parking deck\n- [Townhome infill concept](/examples#siteplan) \u2014 internal lane, phase zones, landscape/open space'
4885
+ },
4734
4886
  "playbook": {
4735
4887
  "title": "Sports playbook",
4736
4888
  "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.'
@@ -6382,6 +6534,43 @@ var PROFILES = {
6382
6534
  "'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."
6383
6535
  ]
6384
6536
  },
6537
+ siteplan: {
6538
+ type: "siteplan",
6539
+ header: 'siteplan "Title" [unit ft|m]',
6540
+ mode: "explicit coordinate site sketch: parcel/structure polygons + road/path/line features + markers/callouts",
6541
+ keywords: 'siteplan|plotplan|parcelmap|propertymap "Title" unit ft|m \xB7 parcel id "Label" points x,y x,y x,y... [fill #hex] \xB7 structure id "Label" points ... [fill #hex] \xB7 zone|landscape|parking id "Label" points ... [fill #hex] \xB7 road id "Label" from x,y to x,y | points x,y... [width n] \xB7 driveway|walkway|trail id "Label" from x,y to x,y | points x,y... [width n] \xB7 setback|easement|fence|utility|frontage|boundary id "Label" from x,y to x,y | points x,y... \xB7 tree|car|pin|entry|hydrant|well [id] at x,y [size n|WxH] [rotate deg] ["label"] \xB7 dim|measure "Label" from x,y to x,y \xB7 callout "Label" at x,y to x,y \xB7 north [deg] \xB7 scale n \xB7 legend on|off',
6542
+ forms: [
6543
+ 'siteplan "Listing Site Plan" unit ft',
6544
+ 'parcel lot "Lot 12" points 0,0 62,0 58,96 8,104 -4,42',
6545
+ 'road maple "Maple Ave" from -10,0 to 72,0 width 22',
6546
+ 'structure house "Residence" points 15,28 45,28 45,64 34,64 34,78 15,78',
6547
+ 'driveway drive "Driveway" points 52,0 52,32 width 10',
6548
+ 'setback front "Front setback" from 5,8 to 57,8',
6549
+ 'easement util "Utility easement" from 48,0 to 43,96',
6550
+ 'tree oak at 9,22 size 8 "Oak"',
6551
+ 'dim "62 ft frontage" from 0,-6 to 62,-6',
6552
+ 'callout "Covered patio" at 20,88 to 24,76',
6553
+ "north",
6554
+ "scale 20"
6555
+ ],
6556
+ prefer: [
6557
+ "Use `parcel ... points` for the outer lot boundary; this is the main difference from `floorplan`, which is room/rectangle based.",
6558
+ "Use `structure ... points` for house/garage/shed/deck/patio footprints; keep the shape as a simple closed polygon.",
6559
+ "Use `road` for public roads/right-of-way, `driveway`/`walkway` for access paths, and line roles (`setback`, `easement`, `fence`, `utility`, `frontage`) for planning overlays.",
6560
+ "Add `dim` for listing-friendly measurements and `callout` for sales/proposal annotations.",
6561
+ "Use `north`, `scale`, and `legend on` for presentation-grade deliverables."
6562
+ ],
6563
+ avoid: [
6564
+ "Don't generate survey bearings, metes-and-bounds legal descriptions, grading/drainage calculations, or permit compliance claims.",
6565
+ "Don't use `siteplan` for interior rooms, walls, doors, furniture, or seating; use `floorplan` for that.",
6566
+ "Don't use image-map/GIS expectations such as real basemap tiles or geocoding; this engine is a structured SVG sketch."
6567
+ ],
6568
+ repair: [
6569
+ "'expected at least 3 points' -> polygons need three or more `x,y` points after `points`.",
6570
+ "'expected from/to or points' -> road/path/line features need either `from x,y to x,y` or `points x,y x,y ...`.",
6571
+ "'unknown siteplan keyword' -> use parcel, structure, zone, landscape, parking, road, driveway, walkway, setback, easement, fence, utility, frontage, tree, car, pin, entry, dim, callout, north, scale, legend."
6572
+ ]
6573
+ },
6385
6574
  playbook: {
6386
6575
  type: "playbook",
6387
6576
  header: 'playbook "Play Name" [sport football]',
@@ -6576,5 +6765,5 @@ function matchRepair(repairs, message) {
6576
6765
  }
6577
6766
 
6578
6767
  export { DIAGRAM_REGISTRY, DIAGRAM_SINCE, getAllDiagramTypes, getDiagramMeta, getDiagramSince, getExamples, getSyntax, listDiagrams, renderDsl, resolveDiagramType, validateDsl };
6579
- //# sourceMappingURL=chunk-4QBC4475.js.map
6580
- //# sourceMappingURL=chunk-4QBC4475.js.map
6768
+ //# sourceMappingURL=chunk-GHMSKPYN.js.map
6769
+ //# sourceMappingURL=chunk-GHMSKPYN.js.map