@hatiolab/figure-model 0.1.92 → 0.1.94

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 (320) hide show
  1. package/CHANGELOG.md +12 -12
  2. package/README.md +25 -25
  3. package/dist/{v3-asset-types.d.ts → asset-types.d.ts} +73 -67
  4. package/dist/asset-types.d.ts.map +1 -0
  5. package/dist/asset-types.js +2 -0
  6. package/dist/asset-types.js.map +1 -0
  7. package/dist/asset.d.ts +20 -0
  8. package/dist/asset.d.ts.map +1 -0
  9. package/dist/{v3-asset.js → asset.js} +49 -28
  10. package/dist/asset.js.map +1 -0
  11. package/dist/{v3-authoring-actions.d.ts → authoring-actions.d.ts} +77 -66
  12. package/dist/authoring-actions.d.ts.map +1 -0
  13. package/dist/{v3-authoring-actions.js → authoring-actions.js} +129 -104
  14. package/dist/authoring-actions.js.map +1 -0
  15. package/dist/{v3-authoring-session.d.ts → authoring-session.d.ts} +23 -21
  16. package/dist/authoring-session.d.ts.map +1 -0
  17. package/dist/{v3-authoring-session.js → authoring-session.js} +4 -4
  18. package/dist/authoring-session.js.map +1 -0
  19. package/dist/capabilities.d.ts +3 -0
  20. package/dist/capabilities.d.ts.map +1 -0
  21. package/dist/{v3-capabilities.js → capabilities.js} +8 -8
  22. package/dist/capabilities.js.map +1 -0
  23. package/dist/clip-keeping.d.ts +30 -0
  24. package/dist/clip-keeping.d.ts.map +1 -0
  25. package/dist/clip-keeping.js +77 -0
  26. package/dist/clip-keeping.js.map +1 -0
  27. package/dist/command-preview.d.ts +125 -0
  28. package/dist/command-preview.d.ts.map +1 -0
  29. package/dist/command-preview.js +246 -0
  30. package/dist/command-preview.js.map +1 -0
  31. package/dist/contract.d.ts +7 -0
  32. package/dist/contract.d.ts.map +1 -0
  33. package/dist/contract.js +12 -0
  34. package/dist/contract.js.map +1 -0
  35. package/dist/{v3-cost.d.ts → cost.d.ts} +5 -5
  36. package/dist/cost.d.ts.map +1 -0
  37. package/dist/{v3-cost.js → cost.js} +11 -11
  38. package/dist/cost.js.map +1 -0
  39. package/dist/{v3-create.d.ts → create.d.ts} +8 -8
  40. package/dist/{v3-create.d.ts.map → create.d.ts.map} +1 -1
  41. package/dist/{v3-create.js → create.js} +26 -26
  42. package/dist/create.js.map +1 -0
  43. package/dist/document.d.ts +5 -0
  44. package/dist/document.d.ts.map +1 -0
  45. package/dist/document.js +31 -0
  46. package/dist/document.js.map +1 -0
  47. package/dist/{v3-driver.d.ts → driver.d.ts} +10 -10
  48. package/dist/driver.d.ts.map +1 -0
  49. package/dist/{v3-driver.js → driver.js} +10 -10
  50. package/dist/driver.js.map +1 -0
  51. package/dist/{v3-editor-workspace.d.ts → editor-workspace.d.ts} +99 -73
  52. package/dist/editor-workspace.d.ts.map +1 -0
  53. package/dist/{v3-editor-workspace.js → editor-workspace.js} +48 -32
  54. package/dist/editor-workspace.js.map +1 -0
  55. package/dist/{v3-examples.d.ts → examples.d.ts} +5 -5
  56. package/dist/examples.d.ts.map +1 -0
  57. package/dist/{v3-examples.js → examples.js} +11 -11
  58. package/dist/examples.js.map +1 -0
  59. package/dist/{v3-follow.d.ts → follow.d.ts} +5 -5
  60. package/dist/follow.d.ts.map +1 -0
  61. package/dist/{v3-follow.js → follow.js} +2 -2
  62. package/dist/follow.js.map +1 -0
  63. package/dist/{v3-gate.d.ts → gate.d.ts} +36 -28
  64. package/dist/gate.d.ts.map +1 -0
  65. package/dist/{v3-gate.js → gate.js} +54 -48
  66. package/dist/gate.js.map +1 -0
  67. package/dist/{v3-graph-types.d.ts → graph-types.d.ts} +33 -33
  68. package/dist/graph-types.d.ts.map +1 -0
  69. package/dist/graph-types.js +2 -0
  70. package/dist/graph-types.js.map +1 -0
  71. package/dist/{v3-graph.d.ts → graph.d.ts} +14 -14
  72. package/dist/graph.d.ts.map +1 -0
  73. package/dist/{v3-graph.js → graph.js} +16 -16
  74. package/dist/graph.js.map +1 -0
  75. package/dist/index.d.ts +39 -33
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +39 -33
  78. package/dist/index.js.map +1 -1
  79. package/dist/{v3-instance-size.d.ts → instance-size.d.ts} +14 -14
  80. package/dist/instance-size.d.ts.map +1 -0
  81. package/dist/{v3-instance-size.js → instance-size.js} +13 -13
  82. package/dist/instance-size.js.map +1 -0
  83. package/dist/json.d.ts +12 -0
  84. package/dist/json.d.ts.map +1 -0
  85. package/dist/{v3-json.js → json.js} +13 -13
  86. package/dist/json.js.map +1 -0
  87. package/dist/kernel-version.d.ts +8 -0
  88. package/dist/kernel-version.d.ts.map +1 -0
  89. package/dist/{v3-kernel-version.js → kernel-version.js} +4 -4
  90. package/dist/kernel-version.js.map +1 -0
  91. package/dist/{v3-part-edit.d.ts → part-edit.d.ts} +12 -11
  92. package/dist/part-edit.d.ts.map +1 -0
  93. package/dist/{v3-part-edit.js → part-edit.js} +84 -68
  94. package/dist/part-edit.js.map +1 -0
  95. package/dist/proposal.d.ts +55 -0
  96. package/dist/proposal.d.ts.map +1 -0
  97. package/dist/{v3-proposal.js → proposal.js} +29 -21
  98. package/dist/proposal.js.map +1 -0
  99. package/dist/{v3-public-inputs.d.ts → public-inputs.d.ts} +4 -4
  100. package/dist/public-inputs.d.ts.map +1 -0
  101. package/dist/{v3-public-inputs.js → public-inputs.js} +3 -3
  102. package/dist/public-inputs.js.map +1 -0
  103. package/dist/recipe-build.d.ts +27 -0
  104. package/dist/recipe-build.d.ts.map +1 -0
  105. package/dist/{v3-recipe-build.js → recipe-build.js} +9 -9
  106. package/dist/recipe-build.js.map +1 -0
  107. package/dist/recipe-from-parts.d.ts +8 -0
  108. package/dist/recipe-from-parts.d.ts.map +1 -0
  109. package/dist/{v3-recipe-from-parts.js → recipe-from-parts.js} +9 -9
  110. package/dist/recipe-from-parts.js.map +1 -0
  111. package/dist/{v3-recipe.d.ts → recipe.d.ts} +25 -25
  112. package/dist/recipe.d.ts.map +1 -0
  113. package/dist/{v3-recipe.js → recipe.js} +30 -30
  114. package/dist/recipe.js.map +1 -0
  115. package/dist/release-contract.d.ts +19 -0
  116. package/dist/release-contract.d.ts.map +1 -0
  117. package/dist/{v3-release-contract.js → release-contract.js} +8 -7
  118. package/dist/release-contract.js.map +1 -0
  119. package/dist/{v3-render-batches.d.ts → render-batches.d.ts} +8 -8
  120. package/dist/render-batches.d.ts.map +1 -0
  121. package/dist/{v3-render-batches.js → render-batches.js} +4 -4
  122. package/dist/render-batches.js.map +1 -0
  123. package/dist/resize-plan.d.ts +61 -0
  124. package/dist/resize-plan.d.ts.map +1 -0
  125. package/dist/resize-plan.js +189 -0
  126. package/dist/resize-plan.js.map +1 -0
  127. package/dist/room.d.ts +53 -0
  128. package/dist/room.d.ts.map +1 -0
  129. package/dist/room.js +90 -0
  130. package/dist/room.js.map +1 -0
  131. package/dist/{v3-score.d.ts → score.d.ts} +19 -19
  132. package/dist/score.d.ts.map +1 -0
  133. package/dist/{v3-score.js → score.js} +32 -32
  134. package/dist/score.js.map +1 -0
  135. package/dist/shape-provider.d.ts +37 -0
  136. package/dist/shape-provider.d.ts.map +1 -0
  137. package/dist/shape-provider.js +69 -0
  138. package/dist/shape-provider.js.map +1 -0
  139. package/dist/{v3-shape-sampling.d.ts → shape-sampling.d.ts} +4 -4
  140. package/dist/shape-sampling.d.ts.map +1 -0
  141. package/dist/{v3-shape-sampling.js → shape-sampling.js} +3 -3
  142. package/dist/shape-sampling.js.map +1 -0
  143. package/dist/size-edit.d.ts +38 -0
  144. package/dist/size-edit.d.ts.map +1 -0
  145. package/dist/size-edit.js +178 -0
  146. package/dist/size-edit.js.map +1 -0
  147. package/dist/{v3-surface.d.ts → surface.d.ts} +5 -5
  148. package/dist/surface.d.ts.map +1 -0
  149. package/dist/{v3-surface.js → surface.js} +7 -7
  150. package/dist/surface.js.map +1 -0
  151. package/dist/{v3-words.d.ts → words.d.ts} +3 -3
  152. package/dist/words.d.ts.map +1 -0
  153. package/dist/{v3-words.js → words.js} +3 -3
  154. package/dist/words.js.map +1 -0
  155. package/docs/{assembly-constraints-v3.md → assembly-constraints.md} +1 -1
  156. package/docs/{v3-asset-persistence.md → asset-persistence.md} +8 -8
  157. package/docs/{v3-authoring-transactions.md → authoring-transactions.md} +2 -2
  158. package/docs/{v3-capability-bindings.md → capability-bindings.md} +8 -8
  159. package/docs/{v3-common-kernel-experiment.md → common-kernel-experiment.md} +4 -4
  160. package/docs/{v3-core-semantics.md → core-semantics.md} +5 -5
  161. package/docs/{v3-cutover.md → cutover.md} +4 -4
  162. package/docs/{v3-design.md → design.md} +11 -11
  163. package/docs/{v3-document-contract.md → document-contract.md} +9 -9
  164. package/docs/{v3-dryroom-profile-validation.md → dryroom-profile-validation.md} +4 -4
  165. package/docs/{v3-editor-integration.md → editor-integration.md} +6 -6
  166. package/docs/{v3-full-conveyor-validation.md → full-conveyor-validation.md} +4 -4
  167. package/docs/{v3-full-dryroom-validation.md → full-dryroom-validation.md} +4 -4
  168. package/docs/{v3-full-forklift-validation.md → full-forklift-validation.md} +5 -5
  169. package/docs/{v3-full-robot-validation.md → full-robot-validation.md} +4 -4
  170. package/docs/{v3-layout-system.md → layout-system.md} +4 -4
  171. package/docs/{v3-legacy-risk-audit-2026-09-23.md → legacy-risk-audit-2026-09-23.md} +5 -5
  172. package/docs/{v3-minimal-model.md → minimal-model.md} +6 -6
  173. package/docs/{v3-motion-contract.md → motion-contract.md} +3 -3
  174. package/docs/{v3-openusd-review.md → openusd-review.md} +8 -8
  175. package/docs/{v3-operator-contracts.md → operator-contracts.md} +6 -6
  176. package/docs/{v3-payload-collision-validation.md → payload-collision-validation.md} +4 -4
  177. package/docs/{v3-payload-contact-validation.md → payload-contact-validation.md} +5 -5
  178. package/docs/prototypes/README.md +10 -10
  179. package/docs/prototypes/{v3-asset-samples.mjs → asset-samples.mjs} +6 -6
  180. package/docs/prototypes/{v3-asset-store.mjs → asset-store.mjs} +3 -3
  181. package/docs/prototypes/{v3-asset-store.test.mjs → asset-store.test.mjs} +6 -6
  182. package/docs/prototypes/asset.mjs +1 -0
  183. package/docs/prototypes/{v3-asset.schema.json → asset.schema.json} +2 -2
  184. package/docs/prototypes/{v3-asset.test.mjs → asset.test.mjs} +10 -10
  185. package/docs/prototypes/authoring-session.mjs +1 -0
  186. package/docs/prototypes/{v3-authoring-session.test.mjs → authoring-session.test.mjs} +6 -6
  187. package/docs/prototypes/capability-plan.mjs +1 -0
  188. package/docs/prototypes/{v3-capability-plan.test.mjs → capability-plan.test.mjs} +5 -5
  189. package/docs/prototypes/{v3-capability-samples.mjs → capability-samples.mjs} +2 -2
  190. package/docs/prototypes/document.mjs +2 -0
  191. package/docs/prototypes/{v3-document.schema.json → document.schema.json} +1 -1
  192. package/docs/prototypes/{v3-document.test.mjs → document.test.mjs} +7 -7
  193. package/docs/prototypes/{v3-dryroom-mesh.mjs → dryroom-mesh.mjs} +1 -1
  194. package/docs/prototypes/{v3-dryroom-mesh.test.mjs → dryroom-mesh.test.mjs} +1 -1
  195. package/docs/prototypes/{v3-editor-browser.mjs → editor-browser.mjs} +13 -13
  196. package/docs/prototypes/editor-workspace.mjs +1 -0
  197. package/docs/prototypes/{v3-editor-workspace.test.mjs → editor-workspace.test.mjs} +3 -3
  198. package/docs/prototypes/{v3-feature-pattern.test.mjs → feature-pattern.test.mjs} +1 -1
  199. package/docs/prototypes/{v3-full-conveyor.mjs → full-conveyor.mjs} +2 -2
  200. package/docs/prototypes/{v3-full-conveyor.test.mjs → full-conveyor.test.mjs} +3 -3
  201. package/docs/prototypes/{v3-full-dryroom.mjs → full-dryroom.mjs} +2 -2
  202. package/docs/prototypes/{v3-full-dryroom.test.mjs → full-dryroom.test.mjs} +3 -3
  203. package/docs/prototypes/{v3-full-forklift.mjs → full-forklift.mjs} +2 -2
  204. package/docs/prototypes/{v3-full-forklift.test.mjs → full-forklift.test.mjs} +3 -3
  205. package/docs/prototypes/{v3-full-robot.mjs → full-robot.mjs} +2 -2
  206. package/docs/prototypes/{v3-full-robot.test.mjs → full-robot.test.mjs} +4 -4
  207. package/docs/prototypes/{v3-kernel.test.mjs → kernel.test.mjs} +1 -1
  208. package/docs/prototypes/{v3-layout.test.mjs → layout.test.mjs} +1 -1
  209. package/docs/prototypes/{v3-more-samples.test.mjs → more-samples.test.mjs} +2 -2
  210. package/docs/prototypes/{v3-payload-collision.mjs → payload-collision.mjs} +2 -2
  211. package/docs/prototypes/{v3-payload-collision.test.mjs → payload-collision.test.mjs} +3 -3
  212. package/docs/prototypes/{v3-payload-fit.mjs → payload-fit.mjs} +2 -2
  213. package/docs/prototypes/{v3-payload-fit.test.mjs → payload-fit.test.mjs} +4 -4
  214. package/docs/prototypes/render-full-dryroom.mjs +12 -12
  215. package/docs/prototypes/{v3-repeated-binding.mjs → repeated-binding.mjs} +1 -1
  216. package/docs/prototypes/{v3-repeated-binding.test.mjs → repeated-binding.test.mjs} +6 -6
  217. package/docs/prototypes/{v3-runtime-browser.mjs → runtime-browser.mjs} +26 -26
  218. package/docs/prototypes/{v3-samples.test.mjs → samples.test.mjs} +1 -1
  219. package/docs/prototypes/{v3-spatial-plan.test.mjs → spatial-plan.test.mjs} +1 -1
  220. package/docs/prototypes/typed-plan.mjs +3 -0
  221. package/docs/prototypes/{v3-typed-plan.test.mjs → typed-plan.test.mjs} +1 -1
  222. package/docs/prototypes/{v3-typed-repeat.test.mjs → typed-repeat.test.mjs} +2 -2
  223. package/docs/{v3-repeated-binding-validation.md → repeated-binding-validation.md} +4 -4
  224. package/docs/{v3-research-review.md → research-review.md} +2 -2
  225. package/docs/{v3-review-2026-09-22.md → review-2026-09-22.md} +10 -10
  226. package/docs/{v3-runtime-extraction.md → runtime-extraction.md} +16 -16
  227. package/docs/{v3-sample-validation-expanded.md → sample-validation-expanded.md} +5 -5
  228. package/docs/{v3-sample-validation.md → sample-validation.md} +3 -3
  229. package/docs/{v3-shape-dimension-contract.md → shape-dimension-contract.md} +12 -12
  230. package/docs/{v3-shapeassembly-reproduction.md → shapeassembly-reproduction.md} +4 -4
  231. package/docs/{v3-spatial-contracts.md → spatial-contracts.md} +5 -5
  232. package/docs/status.md +12 -0
  233. package/docs/{v3-storage-integration.md → storage-integration.md} +5 -5
  234. package/docs/{v3-typed-repeat-contracts.md → typed-repeat-contracts.md} +3 -3
  235. package/package.json +3 -3
  236. package/dist/v3-asset-types.d.ts.map +0 -1
  237. package/dist/v3-asset-types.js +0 -2
  238. package/dist/v3-asset-types.js.map +0 -1
  239. package/dist/v3-asset.d.ts +0 -8
  240. package/dist/v3-asset.d.ts.map +0 -1
  241. package/dist/v3-asset.js.map +0 -1
  242. package/dist/v3-authoring-actions.d.ts.map +0 -1
  243. package/dist/v3-authoring-actions.js.map +0 -1
  244. package/dist/v3-authoring-session.d.ts.map +0 -1
  245. package/dist/v3-authoring-session.js.map +0 -1
  246. package/dist/v3-capabilities.d.ts +0 -3
  247. package/dist/v3-capabilities.d.ts.map +0 -1
  248. package/dist/v3-capabilities.js.map +0 -1
  249. package/dist/v3-contract.d.ts +0 -7
  250. package/dist/v3-contract.d.ts.map +0 -1
  251. package/dist/v3-contract.js +0 -12
  252. package/dist/v3-contract.js.map +0 -1
  253. package/dist/v3-cost.d.ts.map +0 -1
  254. package/dist/v3-cost.js.map +0 -1
  255. package/dist/v3-create.js.map +0 -1
  256. package/dist/v3-document.d.ts +0 -5
  257. package/dist/v3-document.d.ts.map +0 -1
  258. package/dist/v3-document.js +0 -31
  259. package/dist/v3-document.js.map +0 -1
  260. package/dist/v3-driver.d.ts.map +0 -1
  261. package/dist/v3-driver.js.map +0 -1
  262. package/dist/v3-editor-workspace.d.ts.map +0 -1
  263. package/dist/v3-editor-workspace.js.map +0 -1
  264. package/dist/v3-examples.d.ts.map +0 -1
  265. package/dist/v3-examples.js.map +0 -1
  266. package/dist/v3-follow.d.ts.map +0 -1
  267. package/dist/v3-follow.js.map +0 -1
  268. package/dist/v3-gate.d.ts.map +0 -1
  269. package/dist/v3-gate.js.map +0 -1
  270. package/dist/v3-graph-types.d.ts.map +0 -1
  271. package/dist/v3-graph-types.js +0 -2
  272. package/dist/v3-graph-types.js.map +0 -1
  273. package/dist/v3-graph.d.ts.map +0 -1
  274. package/dist/v3-graph.js.map +0 -1
  275. package/dist/v3-instance-size.d.ts.map +0 -1
  276. package/dist/v3-instance-size.js.map +0 -1
  277. package/dist/v3-json.d.ts +0 -12
  278. package/dist/v3-json.d.ts.map +0 -1
  279. package/dist/v3-json.js.map +0 -1
  280. package/dist/v3-kernel-version.d.ts +0 -8
  281. package/dist/v3-kernel-version.d.ts.map +0 -1
  282. package/dist/v3-kernel-version.js.map +0 -1
  283. package/dist/v3-part-edit.d.ts.map +0 -1
  284. package/dist/v3-part-edit.js.map +0 -1
  285. package/dist/v3-proposal.d.ts +0 -42
  286. package/dist/v3-proposal.d.ts.map +0 -1
  287. package/dist/v3-proposal.js.map +0 -1
  288. package/dist/v3-public-inputs.d.ts.map +0 -1
  289. package/dist/v3-public-inputs.js.map +0 -1
  290. package/dist/v3-recipe-build.d.ts +0 -27
  291. package/dist/v3-recipe-build.d.ts.map +0 -1
  292. package/dist/v3-recipe-build.js.map +0 -1
  293. package/dist/v3-recipe-from-parts.d.ts +0 -8
  294. package/dist/v3-recipe-from-parts.d.ts.map +0 -1
  295. package/dist/v3-recipe-from-parts.js.map +0 -1
  296. package/dist/v3-recipe.d.ts.map +0 -1
  297. package/dist/v3-recipe.js.map +0 -1
  298. package/dist/v3-release-contract.d.ts +0 -19
  299. package/dist/v3-release-contract.d.ts.map +0 -1
  300. package/dist/v3-release-contract.js.map +0 -1
  301. package/dist/v3-render-batches.d.ts.map +0 -1
  302. package/dist/v3-render-batches.js.map +0 -1
  303. package/dist/v3-score.d.ts.map +0 -1
  304. package/dist/v3-score.js.map +0 -1
  305. package/dist/v3-shape-sampling.d.ts.map +0 -1
  306. package/dist/v3-shape-sampling.js.map +0 -1
  307. package/dist/v3-surface.d.ts.map +0 -1
  308. package/dist/v3-surface.js.map +0 -1
  309. package/dist/v3-words.d.ts.map +0 -1
  310. package/dist/v3-words.js.map +0 -1
  311. package/docs/prototypes/v3-asset.mjs +0 -1
  312. package/docs/prototypes/v3-authoring-session.mjs +0 -1
  313. package/docs/prototypes/v3-capability-plan.mjs +0 -1
  314. package/docs/prototypes/v3-document.mjs +0 -2
  315. package/docs/prototypes/v3-editor-workspace.mjs +0 -1
  316. package/docs/prototypes/v3-typed-plan.mjs +0 -3
  317. package/docs/v3-status.md +0 -50
  318. /package/docs/prototypes/{v3-kernel.mjs → kernel.mjs} +0 -0
  319. /package/docs/prototypes/{v3-linear-comparison.py → linear-comparison.py} +0 -0
  320. /package/docs/prototypes/{v3-semantics.test.mjs → semantics.test.mjs} +0 -0
@@ -5,22 +5,22 @@
5
5
  * open. The cases are data, not code: a recipe adds to the proposal grammar only three placeholders (`{id}`, `{target}`,
6
6
  * `{<param>}`), a number as a one-parameter linear form (`{ param, times?, plus? }`) and one condition per step
7
7
  * (`when: { param, is }`, or `{ param, in: [..] }` for any of several values). There is no expression language. Applied, it is resolved into a proposal and handed to
8
- * `applyV3Proposal`: the first step the kernel refuses stops it, with the kernel's own sentence. Inserted, it is ordinary
8
+ * `applyFigureProposal`: the first step the kernel refuses stops it, with the kernel's own sentence. Inserted, it is ordinary
9
9
  * parts -- nothing ties them back to the recipe.
10
10
  */
11
- import { V3ContractError } from "./v3-contract.js";
12
- import { applyV3Proposal } from "./v3-proposal.js";
13
- import { addV3Box, createV3Asset } from "./v3-create.js";
14
- import { applyV3Authoring } from "./v3-authoring-actions.js";
15
- import { inspectV3Asset } from "./v3-gate.js";
11
+ import { FigureContractError } from "./contract.js";
12
+ import { applyFigureProposal } from "./proposal.js";
13
+ import { addFigureBox, createFigureAsset } from "./create.js";
14
+ import { applyFigureAuthoring } from "./authoring-actions.js";
15
+ import { inspectFigureAsset } from "./gate.js";
16
16
  const KINDS = ['face', 'ratio', 'mm', 'choice', 'flag'];
17
17
  const NAME = /^[a-z][a-z0-9-]*$/;
18
18
  const fail = (path, message) => {
19
- throw new V3ContractError('RECIPE_SCHEMA', path, message);
19
+ throw new FigureContractError('RECIPE_SCHEMA', path, message);
20
20
  };
21
21
  const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
22
22
  /** A recipe as stored, checked for its own form: its parameters, its steps' `when`, its placeholders' names. */
23
- export function parseV3Recipe(value) {
23
+ export function parseFigureRecipe(value) {
24
24
  if (!isObject(value))
25
25
  return fail('recipe', 'a recipe is an object');
26
26
  const r = value;
@@ -78,7 +78,7 @@ export function parseV3Recipe(value) {
78
78
  return r;
79
79
  }
80
80
  /** Whether a step's `when` holds for these values: its one value (`is`), or any of several (`in`). */
81
- export function holdsV3When(when, values) {
81
+ export function holdsFigureWhen(when, values) {
82
82
  if (!when)
83
83
  return true;
84
84
  const w = when;
@@ -122,7 +122,7 @@ function walk(v, path, onString, onLinear) {
122
122
  }
123
123
  }
124
124
  /** The name a recipe's parts take in this figure: the recipe's name and the first number no part or input uses. */
125
- export function v3RecipeIdFor(asset, recipe) {
125
+ export function figureRecipeIdFor(asset, recipe) {
126
126
  const taken = [...asset.appearance.map(a => a.target), ...asset.document.model.inputs.map(i => i.id), ...(asset.joints ?? []).map(j => j.id)];
127
127
  for (let n = 1;; n++) {
128
128
  const id = `${recipe.name}-${n}`;
@@ -135,7 +135,7 @@ export function v3RecipeIdFor(asset, recipe) {
135
135
  * the steps whose `when` does not hold left out, and the placeholders and linear forms resolved. A string that is only
136
136
  * `{<param>}` takes the value itself (a number stays a number); inside a longer string it is written in.
137
137
  */
138
- export function resolveV3Recipe(recipe, use) {
138
+ export function resolveFigureRecipe(recipe, use) {
139
139
  const values = {};
140
140
  for (const p of recipe.params) {
141
141
  const v = use.values && Object.hasOwn(use.values, p.name) ? use.values[p.name] : p.default;
@@ -166,7 +166,7 @@ export function resolveV3Recipe(recipe, use) {
166
166
  };
167
167
  return recipe.steps
168
168
  .filter(step => {
169
- return holdsV3When(step.when, values);
169
+ return holdsFigureWhen(step.when, values);
170
170
  })
171
171
  .map(step => {
172
172
  const { when: _when, ...rest } = step;
@@ -174,33 +174,33 @@ export function resolveV3Recipe(recipe, use) {
174
174
  });
175
175
  }
176
176
  /** A recipe put into a figure: resolved, then applied as one proposal (ADR-0094). The parts it made are named `id`. */
177
- export function applyV3Recipe(asset, recipe, use = {}) {
178
- const checked = parseV3Recipe(recipe);
177
+ export function applyFigureRecipe(asset, recipe, use = {}) {
178
+ const checked = parseFigureRecipe(recipe);
179
179
  if (use.target && !asset.appearance.some(a => a.target === use.target))
180
- throw new V3ContractError('TARGET_ABSENT', 'target', `${use.target} is not a part`);
181
- const id = v3RecipeIdFor(asset, checked);
182
- return { asset: applyV3Proposal(asset, resolveV3Recipe(checked, { id, ...use })), id };
180
+ throw new FigureContractError('TARGET_ABSENT', 'target', `${use.target} is not a part`);
181
+ const id = figureRecipeIdFor(asset, checked);
182
+ return { asset: applyFigureProposal(asset, resolveFigureRecipe(checked, { id, ...use })), id };
183
183
  }
184
184
  /** The room a recipe is tried in when it is saved: a 4 x 3 x 6 m box on the floor that follows the figure's size. */
185
- export function v3RecipeTestRoom() {
186
- let asset = addV3Box(createV3Asset('Recipe check'), { id: 'room', size: { x: 4000, y: 3000, z: 6000 }, position: { x: 0, y: 1500, z: 0 } });
187
- asset = applyV3Authoring(asset, { kind: 'attach', part: 'room', face: 'bottom', to: { plane: 'mounting-plane' } });
188
- return { asset: applyV3Authoring(asset, { kind: 'follow-size', part: 'room' }), target: 'room' };
185
+ export function figureRecipeTestRoom() {
186
+ let asset = addFigureBox(createFigureAsset('Recipe check'), { id: 'room', size: { x: 4000, y: 3000, z: 6000 }, position: { x: 0, y: 1500, z: 0 } });
187
+ asset = applyFigureAuthoring(asset, { kind: 'attach', part: 'room', face: 'bottom', to: { plane: 'mounting-plane' } });
188
+ return { asset: applyFigureAuthoring(asset, { kind: 'follow-size', part: 'room' }), target: 'room' };
189
189
  }
190
190
  /**
191
191
  * A recipe's test (ADR-0095): parsed, put into the test room with its defaults, and the result, with its room declared,
192
192
  * passing the release gate. Throws the kernel's refusal, or `RECIPE_GATE` with the gate's findings.
193
193
  */
194
- export function checkV3Recipe(value) {
195
- const recipe = parseV3Recipe(value);
196
- const room = v3RecipeTestRoom();
197
- const { asset } = applyV3Recipe(room.asset, recipe, recipe.target === 'part' ? { target: room.target } : {});
198
- const findings = inspectV3Asset(applyV3Proposal(asset, [{ kind: 'fit-room', placement: 'floor' }])).violations;
194
+ export function checkFigureRecipe(value) {
195
+ const recipe = parseFigureRecipe(value);
196
+ const room = figureRecipeTestRoom();
197
+ const { asset } = applyFigureRecipe(room.asset, recipe, recipe.target === 'part' ? { target: room.target } : {});
198
+ const findings = inspectFigureAsset(applyFigureProposal(asset, [{ kind: 'fit-room', placement: 'floor' }])).violations;
199
199
  if (findings.length)
200
- throw new V3ContractError('RECIPE_GATE', recipe.name, findings.map(f => `${f.code}: ${f.detail}`).join('; '));
200
+ throw new FigureContractError('RECIPE_GATE', recipe.name, findings.map(f => `${f.code}: ${f.detail}`).join('; '));
201
201
  return recipe;
202
202
  }
203
- export function describeV3Recipe(recipe) {
203
+ export function describeFigureRecipe(recipe) {
204
204
  const choosers = recipe.params.filter(p => p.kind === 'choice' || p.kind === 'flag');
205
205
  /* Every combination of the choices: a handful, as a recipe has few. */
206
206
  let combos = [{}];
@@ -209,7 +209,7 @@ export function describeV3Recipe(recipe) {
209
209
  combos = combos.flatMap(c => values.map(v => ({ ...c, [p.name]: v })));
210
210
  }
211
211
  const holds = (step, values) => {
212
- return holdsV3When(step.when, values);
212
+ return holdsFigureWhen(step.when, values);
213
213
  };
214
214
  const counts = combos.map(values => recipe.steps.filter(s => s.kind === 'add-part' && holds(s, values)).length);
215
215
  const moves = [];
@@ -239,4 +239,4 @@ export function describeV3Recipe(recipe) {
239
239
  ];
240
240
  return { parts: { min: Math.min(...counts), max: Math.max(...counts) }, moves, controls, shownByControl, rows };
241
241
  }
242
- //# sourceMappingURL=v3-recipe.js.map
242
+ //# sourceMappingURL=recipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../src/recipe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAA2B,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AA+B9C,MAAM,KAAK,GAAqC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AACzF,MAAM,IAAI,GAAG,mBAAmB,CAAA;AAEhC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAS,EAAE;IACpD,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAC/D,CAAC,CAAA;AACD,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAEhH,gHAAgH;AAChH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,KAA8B,CAAA;IACxC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAA;IAC9G,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;QAAE,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;IAC/H,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;QAAE,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;IACtF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAA;IACpE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,CAAC,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAA;QACzB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAA;QACxG,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC,CAAA;QACzG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7E,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QACzC,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,CAAU;YAC5C,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;gBAAE,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG,KAAK,wBAAwB,CAAC,CAAA;IAChL,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;QAAE,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;IACjF,CAAC,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAA;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAA;QACjG,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,IAA+B,CAAA;YAC9C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC5J,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,+DAA+D,CAAC,CAAA;YACrF,MAAM,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAE,CAAA;YAClD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,0CAA0C,CAAC,CAAA;QACtI,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YAC9B,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBAAE,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAK,CAAC;oBAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,sBAAsB,CAAC,CAAA;QACtK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;YAC3G,MAAM,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAE,CAAA;YAClD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,2CAA2C,CAAC,CAAA;QAC5H,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,IAAI,CAAC,OAAO,EAAE,2CAA2C,CAAC,CAAA;IACrI,OAAO,CAAiB,CAAA;AAC1B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,MAAyC;IACtF,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,CAAC,GAAG,IAA2E,CAAA;IACrF,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;AAChF,CAAC;AAED,qEAAqE;AACrE,SAAS,UAAU,CAAC,CAAoB,EAAE,CAAU,EAAE,IAAY;IAChE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,CAAA;QAChE,OAAM;IACR,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAA;QACrF,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAK,CAAY,GAAG,CAAC,CAAC,GAAG;YAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9F,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAK,CAAY,GAAG,CAAC,CAAC,GAAG;YAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QAC7F,OAAM;IACR,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAA;IAC7F,IAAI,CAAC,CAAC,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAsB,CAAC;QAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,OAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC9G,CAAC;AAED,oFAAoF;AACpF,MAAM,QAAQ,GAAG,CAAC,CAA0B,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC,CAAA;AAE1I,SAAS,IAAI,CAAC,CAAU,EAAE,IAAY,EAAE,QAA2C,EAAE,QAA4D;IAC/I,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;SACvC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;SACvF,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,QAAQ,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;;YAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,MAAM;oBAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC5G,CAAC;AACH,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,MAAkC;IACtF,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7I,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAA;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAAE,OAAO,EAAE,CAAA;IAC/F,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB,EAAE,GAAgF;IACxI,MAAM,MAAM,GAAsC,EAAE,CAAA;IACpD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QAC1F,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAE,CAAA;IACrB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,IAAI,0BAA0B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACvK,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,+BAA+B,CAAC,CAAA;IAC1G,MAAM,KAAK,GAAsC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACzH,MAAM,OAAO,GAAG,CAAC,CAAU,EAAW,EAAE;QACtC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC/C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;YAClC,OAAO,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAQ,MAAM,CAAC,CAAC,CAAC,KAAe,CAAY,GAAG,CAAE,CAAC,CAAC,KAA4B,IAAI,CAAC,CAAC,GAAG,CAAE,CAAC,CAAC,IAA2B,IAAI,CAAC,CAAC,CAAA;YAC9I,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/E,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC,CAAA;IACD,OAAO,MAAM,CAAC,KAAK;SAChB,MAAM,CAAC,IAAI,CAAC,EAAE;QACb,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC,CAAC;SACD,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QACrC,OAAO,OAAO,CAAC,IAAI,CAAuB,CAAA;IAC5C,CAAC,CAAC,CAAA;AACN,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,MAAoB,EAAE,MAAuE,EAAE;IACnJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACzC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,gBAAgB,CAAC,CAAA;IAC/J,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5C,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAA;AAChG,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,oBAAoB;IAClC,IAAI,KAAK,GAAG,YAAY,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACnJ,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAA;IACtH,OAAO,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACtG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAA;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAChH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAwB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAC5I,IAAI,QAAQ,CAAC,MAAM;QAAE,MAAM,IAAI,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACtI,OAAO,MAAM,CAAA;AACf,CAAC;AAgBD,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IACpF,uEAAuE;IACvE,IAAI,MAAM,GAA6C,CAAC,EAAE,CAAC,CAAA;IAC3D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAwB,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAClG,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,IAA6B,EAAE,MAAyC,EAAE,EAAE;QACzF,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC/G,MAAM,KAAK,GAAqC,EAAE,CAAA;IAClD,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,SAAQ;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAkH,CAAA;QACjI,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAAE,SAAQ;QACxF,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAQ;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACnI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAK,CAA6B,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,CAAC,CAAA;IACnK,iGAAiG;IACjG,MAAM,IAAI,GAAG;QACX,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC;YAChF,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAK,CAAC,CAAC,KAA8B,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,KAAqC,CAAC,KAAK,CAAC,IAAI,CAAC;SAC9J,CAAC;KACH,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;AACjH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { FigureAsset } from './asset-types.ts';
2
+ export type FigureContractChangeCode = 'placement-changed' | 'size-inputs-gone' | 'size-inputs-added' | 'size-range-narrowed' | 'authored-size-changed' | 'state-input-gone' | 'state-unit-changed' | 'state-range-narrowed' | 'state-input-added' | 'clip-gone' | 'clip-added' | 'binding-gone' | 'binding-role-changed' | 'binding-capacity-reduced' | 'binding-accepts-narrowed' | 'binding-added' | 'capability-gone' | 'capability-added';
3
+ export interface FigureContractChange {
4
+ code: FigureContractChangeCode;
5
+ /** True refuses the release. */
6
+ blocking: boolean;
7
+ /** The input id, clip name, binding id or capability name. Absent for the figure as a whole. */
8
+ subject?: string;
9
+ /** What was measured, for the sentence the service makes. */
10
+ values: Record<string, string | number>;
11
+ /** English, for logs and as the fallback sentence. */
12
+ detail: string;
13
+ }
14
+ /**
15
+ * The previous release against this one. Both must be assets that parse; the caller checks the new one first and
16
+ * the previous one passed when it was released. An empty list means placed instances are untouched.
17
+ */
18
+ export declare function figureContractChanges(before: FigureAsset, after: FigureAsset): FigureContractChange[];
19
+ //# sourceMappingURL=release-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-contract.d.ts","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,kBAAkB,CAAA;AAgC7E,MAAM,MAAM,wBAAwB,GAChC,mBAAmB,GACnB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,uBAAuB,GACvB,kBAAkB,GAClB,oBAAoB,GACpB,sBAAsB,GACtB,mBAAmB,GACnB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,sBAAsB,GACtB,0BAA0B,GAC1B,0BAA0B,GAC1B,eAAe,GACf,iBAAiB,GACjB,kBAAkB,CAAA;AAEtB,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,wBAAwB,CAAA;IAC9B,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IACvC,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAA;CACf;AAuBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,oBAAoB,EAAE,CAqJrG"}
@@ -1,7 +1,8 @@
1
- import { V3_SIZE_INPUTS } from "./v3-words.js";
1
+ import { FIGURE_SIZE_INPUTS } from "./words.js";
2
+ import { figurePlacementOf } from "./asset.js";
2
3
  const stateInputs = (asset) => new Map(asset.document.model.inputs.filter(i => i.role === 'state').map(i => [i.id, i]));
3
4
  const sizeInputs = (asset) => {
4
- const ids = Object.values(V3_SIZE_INPUTS);
5
+ const ids = Object.values(FIGURE_SIZE_INPUTS);
5
6
  const found = asset.document.model.inputs.filter(i => ids.includes(i.id));
6
7
  const allStored = ids.every(id => typeof asset.designInputs[id] === 'number');
7
8
  return found.length === ids.length && allStored ? new Map(found.map(i => [i.id, i])) : null;
@@ -18,12 +19,12 @@ const range = (i) => `${i.min}…${i.max} ${i.unit}`;
18
19
  * The previous release against this one. Both must be assets that parse; the caller checks the new one first and
19
20
  * the previous one passed when it was released. An empty list means placed instances are untouched.
20
21
  */
21
- export function v3ContractChanges(before, after) {
22
+ export function figureContractChanges(before, after) {
22
23
  const changes = [];
23
24
  const push = (change) => changes.push(change);
24
25
  /* ── placement ─────────────────────────────────────────────────────────── */
25
- const wasPlacement = before.occupancy?.placement ?? 'floor';
26
- const nowPlacement = after.occupancy?.placement ?? 'floor';
26
+ const wasPlacement = figurePlacementOf(before);
27
+ const nowPlacement = figurePlacementOf(after);
27
28
  if (wasPlacement !== nowPlacement) {
28
29
  push({
29
30
  code: 'placement-changed',
@@ -59,7 +60,7 @@ export function v3ContractChanges(before, after) {
59
60
  });
60
61
  }
61
62
  }
62
- const authored = (a) => Object.values(V3_SIZE_INPUTS).map(id => a.designInputs[id]);
63
+ const authored = (a) => Object.values(FIGURE_SIZE_INPUTS).map(id => a.designInputs[id]);
63
64
  const [bx, by, bz] = authored(before);
64
65
  const [ax, ay, az] = authored(after);
65
66
  if (bx !== ax || by !== ay || bz !== az) {
@@ -176,4 +177,4 @@ function acceptsDropped(was, now) {
176
177
  return [];
177
178
  return was.accepts.filter(type => !now.accepts.includes(type));
178
179
  }
179
- //# sourceMappingURL=v3-release-contract.js.map
180
+ //# sourceMappingURL=release-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-contract.js","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AA6D9C,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAE,EAAE,CACzC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,CAAC,CAAA;AAEnG,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAwC,EAAE;IAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAA;IAC7E,OAAO,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACtG,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,KAAkB,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACvF,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,CAAC,CAAA;AACrH,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;AAE/F,4EAA4E;AAC5E,SAAS,QAAQ,CAAC,GAAqB,EAAE,GAAqB;IAC5D,OAAO,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA;AAC/C,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAmB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AAEpE;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB,EAAE,KAAkB;IAC3E,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,MAAM,IAAI,GAAG,CAAC,MAA4B,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAEnE,8EAA8E;IAC9E,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC7C,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;YACrD,MAAM,EAAE,sBAAsB,YAAY,MAAM,YAAY,EAAE;SAC/D,CAAC,CAAA;IACJ,CAAC;IAED,8EAA8E;IAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,uDAAuD;SAChE,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,iDAAiD,EAAE,CAAC,CAAA;IAC7H,CAAC;SAAM,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;YAC5B,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,IAAI,EAAE,qBAAqB;oBAC3B,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;oBACjD,MAAM,EAAE,GAAG,EAAE,oBAAoB,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;iBAC9D,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAc,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAE,CAAC,CAAA;QACrG,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;gBACnE,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;aACvE,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IACnC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAA;YACpH,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,EAAE,oBAAoB;gBAC1B,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;gBACjD,MAAM,EAAE,eAAe,EAAE,kBAAkB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE;aACpE,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;gBACrD,MAAM,EAAE,eAAe,EAAE,oBAAoB,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;aAC1E,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAA;IAC9I,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,IAAI,UAAU,EAAE,CAAC,CAAA;IACvI,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAA;IACxI,CAAC;IAED,8EAA8E;IAC9E,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IACrC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAA;YACxH,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;gBAC7D,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE;aAChE,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,EAAE,0BAA0B;gBAChC,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACrE,MAAM,EAAE,WAAW,EAAE,sBAAsB,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,QAAQ,EAAE;aAC5E,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACxC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,EAAE,0BAA0B;gBAChC,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrD,MAAM,EAAE,WAAW,EAAE,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAChE,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;IAC/J,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACtC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,cAAc,IAAI,UAAU,EAAE,CAAC,CAAA;IACnJ,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,cAAc,IAAI,SAAS,EAAE,CAAC,CAAA;IACpJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,mHAAmH;AACnH,SAAS,cAAc,CAAC,GAA6B,EAAE,GAA6B;IAClF,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACzD,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;AAChE,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { V3AssetGeometry } from './v3-asset-types.ts';
2
- export interface V3RenderBatch {
1
+ import type { FigureAssetGeometry } from './asset-types.ts';
2
+ export interface FigureRenderBatch {
3
3
  /** Stays the same while the copies' shape and look do: a renderer keeps its instanced mesh by it. */
4
4
  key: string;
5
5
  /** The member the copies copy (the row's part, or a part it carries). */
@@ -8,17 +8,17 @@ export interface V3RenderBatch {
8
8
  ids: string[];
9
9
  }
10
10
  /** Why copies of one member are drawn one by one. */
11
- export type V3UnbatchedReason = 'one-copy' | 'copies-differ';
12
- export interface V3RenderPlan {
13
- batches: V3RenderBatch[];
11
+ export type FigureUnbatchedReason = 'one-copy' | 'copies-differ';
12
+ export interface FigureRenderPlan {
13
+ batches: FigureRenderBatch[];
14
14
  /** Bodies drawn one by one: a part not in a row, or a copy that could not join a batch. */
15
15
  alone: string[];
16
16
  /** The members whose copies are drawn one by one, and why. */
17
17
  unbatched: Array<{
18
18
  member: string;
19
19
  ids: string[];
20
- reason: V3UnbatchedReason;
20
+ reason: FigureUnbatchedReason;
21
21
  }>;
22
22
  }
23
- export declare function v3RenderBatchesOf(geometry: readonly V3AssetGeometry[]): V3RenderPlan;
24
- //# sourceMappingURL=v3-render-batches.d.ts.map
23
+ export declare function figureRenderBatchesOf(geometry: readonly FigureAssetGeometry[]): FigureRenderPlan;
24
+ //# sourceMappingURL=render-batches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-batches.d.ts","sourceRoot":"","sources":["../src/render-batches.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAG3D,MAAM,WAAW,iBAAiB;IAChC,qGAAqG;IACrG,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,wGAAwG;IACxG,GAAG,EAAE,MAAM,EAAE,CAAA;CACd;AAED,qDAAqD;AACrD,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,eAAe,CAAA;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,2FAA2F;IAC3F,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,8DAA8D;IAC9D,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,qBAAqB,CAAA;KAAE,CAAC,CAAA;CACnF;AAMD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,gBAAgB,CAiChG"}
@@ -1,10 +1,10 @@
1
1
  /*
2
2
  * Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
- import { v3MaterialKeyOf } from "./v3-score.js";
4
+ import { figureMaterialKeyOf } from "./score.js";
5
5
  /** What must be equal for two copies to be one draw: the shape as drawn and the look. */
6
- const signatureOf = (body) => JSON.stringify([body.shape.provider, body.shape.dimensions, body.segments ?? null, v3MaterialKeyOf(body), body.visible !== false]);
7
- export function v3RenderBatchesOf(geometry) {
6
+ const signatureOf = (body) => JSON.stringify([body.shape.provider, body.shape.dimensions, body.segments ?? null, figureMaterialKeyOf(body), body.visible !== false]);
7
+ export function figureRenderBatchesOf(geometry) {
8
8
  const alone = [];
9
9
  const members = new Map();
10
10
  for (const body of geometry) {
@@ -38,4 +38,4 @@ export function v3RenderBatchesOf(geometry) {
38
38
  }
39
39
  return { batches, alone, unbatched };
40
40
  }
41
- //# sourceMappingURL=v3-render-batches.js.map
41
+ //# sourceMappingURL=render-batches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-batches.js","sourceRoot":"","sources":["../src/render-batches.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAsBhD,yFAAyF;AACzF,MAAM,WAAW,GAAG,CAAC,IAA+F,EAAU,EAAE,CAC9H,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAA;AAExI,MAAM,UAAU,qBAAqB,CAAC,QAAwC;IAC5E,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,QAA6B,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;YAAE,SAAQ;QAC/B,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QAChF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,MAAM,OAAO,GAAwB,EAAE,CAAA;IACvC,MAAM,SAAS,GAAkC,EAAE,CAAA;IACnD,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;YACnC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9E,CAAC;QACD,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;gBAC5D,SAAQ;YACV,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;YAClB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AACtC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { FigureAsset, FigurePlacement } from './asset-types.ts';
2
+ import type { FigureAuthoringAction, FigureFace } from './authoring-actions.ts';
3
+ import { type Axis } from './words.ts';
4
+ export interface FigureResizeRequest {
5
+ part: string;
6
+ /** The measures to follow; every one the shape can edit on its own when left out. */
7
+ axes?: Axis[];
8
+ /**
9
+ * For a part whose kept face is not on the plane: `keep` its distance -- above the floor, or reaching through it on
10
+ * purpose -- or bring the face onto the `plane`. Left out, a part off the plane is not planned: the author chooses,
11
+ * with the distance in hand (designer 2026-09-27: 「바닥에 붙여」 reads as touching; a gap may be meant, and so may a part
12
+ * reaching through).
13
+ */
14
+ gap?: 'keep' | 'plane';
15
+ /** The author's "and replace how its position is worked out": for a position read from their own value or an expression. */
16
+ replacePosition?: boolean;
17
+ }
18
+ export type FigureResizeRefusalCode = 'TARGET_ABSENT' | 'HELD' | 'TURNED' | 'UNIFORM_POLICY' | 'SHAPE_EDIT' | 'DIMENSION_RULE' | 'POSITION_RULE' | 'GAP_CHOICE' | 'NO_FACE' | 'COMMAND_REFUSED';
19
+ export interface FigureResizePlan {
20
+ part: string;
21
+ mode: FigurePlacement;
22
+ /** The face the placement keeps, or none for a centre placement: it keeps the position the author gave. */
23
+ face?: FigureFace;
24
+ /** The commands, in order, to apply as one proposal. Empty when refused. */
25
+ steps: FigureAuthoringAction[];
26
+ /** What stays as the author set it: a measure already following the size, a position field. */
27
+ keeps: string[];
28
+ /** Inputs the plan replaces by the relation it makes: the position field along the plane's normal, and the turn fields. */
29
+ replaces: string[];
30
+ /** Where the part moves at its drawn size, when the author chose to bring it onto the plane. Empty otherwise. */
31
+ moves: Array<{
32
+ axis: Axis;
33
+ from: number;
34
+ to: number;
35
+ }>;
36
+ /**
37
+ * Fields the part stops reading that the declared room still reads: the room was declared from them, and it does not
38
+ * follow the part's new rule until it is declared again. The plan does not widen it (ADR-0097 §6); it says so.
39
+ */
40
+ roomReads: string[];
41
+ refusal?: {
42
+ code: FigureResizeRefusalCode;
43
+ reason: string;
44
+ /** The request field that would let the plan go ahead, when there is one. */
45
+ choice?: 'gap' | 'replacePosition';
46
+ /**
47
+ * The axis it is about, and for GAP_CHOICE the distance of the kept face from the plane: positive standing off it,
48
+ * negative reaching through it. For the screen's own words.
49
+ */
50
+ axis?: Axis;
51
+ mm?: number;
52
+ };
53
+ }
54
+ /** The face each placement keeps, and the axis the plane faces along. The ceiling and the floor are Y = 0, a wall Z = 0. */
55
+ export declare const KEPT_FACE: Record<FigurePlacement, {
56
+ face: FigureFace;
57
+ normal: Axis;
58
+ outward: 1 | -1;
59
+ } | undefined>;
60
+ export declare function planFigureResize(asset: FigureAsset, request: FigureResizeRequest): FigureResizePlan;
61
+ //# sourceMappingURL=resize-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-plan.d.ts","sourceRoot":"","sources":["../src/resize-plan.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAuB,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAQpG,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,qFAAqF;IACrF,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IACb;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,4HAA4H;IAC5H,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,MAAM,uBAAuB,GAC/B,eAAe,GACf,MAAM,GACN,QAAQ,GACR,gBAAgB,GAChB,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,SAAS,GACT,iBAAiB,CAAA;AAErB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,eAAe,CAAA;IACrB,2GAA2G;IAC3G,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,4EAA4E;IAC5E,KAAK,EAAE,qBAAqB,EAAE,CAAA;IAC9B,+FAA+F;IAC/F,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,2HAA2H;IAC3H,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,iHAAiH;IACjH,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtD;;;OAGG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,uBAAuB,CAAA;QAC7B,MAAM,EAAE,MAAM,CAAA;QACd,6EAA6E;QAC7E,MAAM,CAAC,EAAE,KAAK,GAAG,iBAAiB,CAAA;QAClC;;;WAGG;QACH,IAAI,CAAC,EAAE,IAAI,CAAA;QACX,EAAE,CAAC,EAAE,MAAM,CAAA;KACZ,CAAA;CACF;AAID,4HAA4H;AAC5H,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;CAAE,GAAG,SAAS,CAK9G,CAAA;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAqInG"}
@@ -0,0 +1,189 @@
1
+ import { applyFigureAuthoring } from "./authoring-actions.js";
2
+ import { figurePlacementOf, upgradeFigurePlacement } from "./asset.js";
3
+ import { compileFigureGraph } from "./graph.js";
4
+ import { figurePartsExtentOf } from "./gate.js";
5
+ import { defaultInstanceSizeRange, foldInstanceSizeRange, figureInstanceSizeLimitsOf, FIGURE_INSTANCE_SIZE_INPUTS } from "./instance-size.js";
6
+ import { figureFollowOf } from "./follow.js";
7
+ import { figureShapeProviderOf, figureFollowableAxesOf } from "./shape-provider.js";
8
+ import { AXES } from "./words.js";
9
+ /** The face each placement keeps, and the axis the plane faces along. The ceiling and the floor are Y = 0, a wall Z = 0. */
10
+ export const KEPT_FACE = {
11
+ floor: { face: 'bottom', normal: 'y', outward: 1 },
12
+ ceiling: { face: 'top', normal: 'y', outward: -1 },
13
+ wall: { face: 'back', normal: 'z', outward: 1 },
14
+ center: undefined
15
+ };
16
+ const round6 = (v) => Math.round(v * 1e6) / 1e6;
17
+ export function planFigureResize(asset, request) {
18
+ asset = upgradeFigurePlacement(asset);
19
+ const mode = figurePlacementOf(asset);
20
+ const kept = KEPT_FACE[mode];
21
+ const plan = { part: request.part, mode, ...(kept ? { face: kept.face } : {}), steps: [], keeps: [], replaces: [], moves: [], roomReads: [] };
22
+ const refuse = (code, reason, choice, about = {}) => ({
23
+ ...plan,
24
+ steps: [],
25
+ keeps: [],
26
+ replaces: [],
27
+ moves: [],
28
+ roomReads: [],
29
+ refusal: { code, reason, ...(choice ? { choice } : {}), ...about }
30
+ });
31
+ const m = asset.document.model;
32
+ const node = (id) => m.nodes.find((n) => n.id === id);
33
+ const part = request.part;
34
+ const place = node(part);
35
+ if (!place || (place.op !== 'place@1' && place.op !== 'member@1'))
36
+ return refuse('TARGET_ABSENT', `${part} is not a part`);
37
+ if (place.op === 'member@1')
38
+ return refuse('HELD', `${part} is a copy in a row; its row places it`);
39
+ const shape = m.nodes.find((n) => Object.values(n.outputs ?? {}).includes(place.args[0]));
40
+ const pose = node(`${part}.pose`);
41
+ if (!shape || pose?.op !== 'rigid@1')
42
+ return refuse('TARGET_ABSENT', `${part} has no shape and pose this plan can read`);
43
+ /* What the author set stays theirs: a joint, a fastening, a figure that grows by one ratio. */
44
+ const joint = (asset.joints ?? []).find((j) => j.body1?.part === part);
45
+ if (joint)
46
+ return refuse('HELD', `${part} is fastened (${joint.id}); edit that joint to change how it stands`);
47
+ if (node(`${part}.chain`) || node(`${part}.seat.rigid`))
48
+ return refuse('HELD', `${part} is fastened; edit its fastening to change how it stands`);
49
+ if (asset.sizing === 'uniform')
50
+ return refuse('UNIFORM_POLICY', 'this figure grows by one ratio; change that policy before giving a part its own size rule');
51
+ const values = compileFigureGraph(m).evaluate({ ...asset.designInputs, ...asset.stateDefaults }).values;
52
+ const input = (ref) => m.inputs.find((i) => i.id === ref);
53
+ const constant = (ref) => m.constants.find((c) => c.id === ref);
54
+ const turn = pose.args.slice(3, 6).map(ref => (constant(ref) ? constant(ref).value : input(ref)?.role === 'design' ? asset.designInputs[ref] : undefined));
55
+ if (turn.some(t => t !== 0))
56
+ return refuse('TURNED', `${part} is turned (${turn.map((t, i) => `${AXES[i].toUpperCase()} ${t ?? '?'}°`).join(', ')}); this plan does not turn or fix a turn`);
57
+ /* The measures: what the shape can edit, each read back as it is worked out now. */
58
+ const provider = figureShapeProviderOf(shape.op);
59
+ const editable = figureFollowableAxesOf(shape.op);
60
+ const axes = request.axes ?? editable;
61
+ if (!axes.length)
62
+ return refuse('SHAPE_EDIT', `${part} is a ${shape.op}; following the figure's size is not offered for it`);
63
+ for (const axis of axes) {
64
+ if (!editable.includes(axis))
65
+ return refuse('SHAPE_EDIT', `${part} is a ${shape.op}; following the figure's size along ${axis} is not offered for it`);
66
+ const edit = provider.edit[axis];
67
+ /*
68
+ Linking reads a shape's measure along X, Y and Z at its first three arguments. Shapes whose measure is elsewhere or
69
+ moves with another (an elliptic cylinder's length, a frustum's two ends) are not linked by this plan yet.
70
+ */
71
+ if (edit.arg !== AXES.indexOf(axis) || edit.with?.length)
72
+ return refuse('SHAPE_EDIT', `${part} is a ${shape.op}; following the size along ${axis} is not supported for it yet`);
73
+ }
74
+ const link = [];
75
+ const stopsReading = [];
76
+ for (const axis of axes) {
77
+ const now = figureFollowOf(asset, part, axis);
78
+ if (now.of === 'own') {
79
+ link.push(axis);
80
+ const was = node(`${part}.dimension.${axis}`)?.args?.[0] ?? shape.args[AXES.indexOf(axis)];
81
+ if (input(was))
82
+ stopsReading.push(was);
83
+ }
84
+ else if (now.of === 'instance' && now.axis === axis)
85
+ plan.keeps.push(`${part}.${axis} follows size.${axis}`);
86
+ else
87
+ return refuse('DIMENSION_RULE', `${part}'s ${axis} follows ${now.of === 'input' ? now.input : now.of === 'part' ? `${now.part}'s ${now.axis}` : now.of === 'instance' ? `size.${now.axis}` : 'a rule of its own'}; edit that rule itself to change it`);
88
+ }
89
+ /* The fastening: the kept face at the gap it has now, and the place across the plane as the author set it. */
90
+ let fasten;
91
+ if (kept) {
92
+ const face = provider?.faces[kept.face];
93
+ if (!face || face.axis !== kept.normal)
94
+ return refuse('NO_FACE', `${part} is a ${shape.op}; it has no flat ${kept.face} face to keep on the ${mode === 'wall' ? 'wall' : mode}`);
95
+ const at = (axis) => values[pose.args[AXES.indexOf(axis)]];
96
+ const plane = face.plane.reduce((sum, p) => sum + p.k * values[shape.args[p.arg]], 0);
97
+ /* How far the face stands out of the plane: a bottom above the floor, a top below the ceiling, a back off the wall. */
98
+ let gap = round6(kept.outward * (at(kept.normal) + plane));
99
+ /* Touching, it is fastened as it is. Off the plane or through it, the author says which: both are meant sometimes. */
100
+ if (gap !== 0) {
101
+ if (request.gap === undefined)
102
+ return refuse('GAP_CHOICE', `${part}'s ${kept.face} is ${gap > 0 ? `${gap} mm off` : `${-gap} mm through`} the ${mode}; keep that distance, or bring it onto the plane`, 'gap', { axis: kept.normal, mm: gap });
103
+ if (request.gap === 'plane') {
104
+ plan.moves.push({ axis: kept.normal, from: round6(at(kept.normal)), to: round6(at(kept.normal) - kept.outward * gap) });
105
+ gap = 0;
106
+ }
107
+ else if (request.gap !== 'keep')
108
+ return refuse('COMMAND_REFUSED', `${String(request.gap)} is neither keep nor plane`);
109
+ }
110
+ const normalRef = pose.args[AXES.indexOf(kept.normal)];
111
+ const ownField = (ref) => ref.startsWith(`${part}.`) && input(ref)?.role === 'design';
112
+ if (!constant(normalRef) && !ownField(normalRef) && !request.replacePosition)
113
+ return refuse('POSITION_RULE', `${part}'s ${kept.normal} position is worked out from ${input(normalRef) ? normalRef : 'an expression'}; keeping its ${kept.face} on the plane replaces that`, 'replacePosition', { axis: kept.normal });
114
+ if (input(normalRef))
115
+ plan.replaces.push(normalRef);
116
+ const align = {};
117
+ for (const axis of AXES.filter(a => a !== kept.normal)) {
118
+ const ref = pose.args[AXES.indexOf(axis)];
119
+ if (constant(ref))
120
+ align[axis] = { mm: constant(ref).value };
121
+ else if (input(ref)?.role === 'design') {
122
+ align[axis] = { mm: { from: { of: 'input', input: ref } } };
123
+ plan.keeps.push(ref);
124
+ }
125
+ else if (request.replacePosition)
126
+ align[axis] = { mm: round6(at(axis)) };
127
+ else
128
+ return refuse('POSITION_RULE', `${part}'s ${axis} position is worked out from an expression; fastening it would fix it at ${round6(at(axis))}`, 'replacePosition', { axis });
129
+ }
130
+ /*
131
+ A fastened part's turn is its joint record's (ADR-0093): its own turn fields give way to it, at the turn they hold
132
+ now -- nothing turns, but the fields go, and the plan says so before it is applied (browser check 2026-09-27).
133
+ */
134
+ for (const ref of pose.args.slice(3, 6))
135
+ if (input(ref))
136
+ plan.replaces.push(ref);
137
+ fasten = { kind: 'attach', part, face: kept.face, to: { plane: 'mounting-plane' }, ...(gap ? { gap } : {}), align };
138
+ }
139
+ else
140
+ plan.keeps.push(...pose.args.slice(0, 3).filter(ref => input(ref)));
141
+ /* Worked out on a copy, in the order the commands need: a size to follow, the measures, then the face. */
142
+ let candidate = asset;
143
+ const step = (s) => {
144
+ candidate = applyFigureAuthoring(candidate, s);
145
+ plan.steps.push(s);
146
+ };
147
+ try {
148
+ const declared = AXES.filter(axis => asset.document.model.inputs.some((i) => i.id === FIGURE_INSTANCE_SIZE_INPUTS[axis]));
149
+ if (link.length && declared.length < 3) {
150
+ const at = figurePartsExtentOf(asset);
151
+ const start = defaultInstanceSizeRange(at);
152
+ const range = foldInstanceSizeRange(start, figureInstanceSizeLimitsOf(asset, start)).range;
153
+ step({ kind: 'declare-instance-size', at, range, replace: declared.length > 0 });
154
+ }
155
+ for (const axis of link) {
156
+ const measure = values[shape.args[AXES.indexOf(axis)]];
157
+ const size = candidate.designInputs[FIGURE_INSTANCE_SIZE_INPUTS[axis]];
158
+ step({ kind: 'link-dimension', part, axis, source: { of: 'instance', axis }, times: measure / size, narrowRange: true });
159
+ }
160
+ if (fasten)
161
+ step(fasten);
162
+ plan.roomReads = [...stopsReading, ...plan.replaces].filter(roomReading(candidate));
163
+ }
164
+ catch (e) {
165
+ const error = e;
166
+ return refuse('COMMAND_REFUSED', `${error.code ?? ''} ${String(error.message ?? e)}`.trim());
167
+ }
168
+ return plan;
169
+ }
170
+ /** Whether the declared room is worked out from a value: the room's bounds, followed back through the graph. */
171
+ function roomReading(asset) {
172
+ const m = asset.document.model;
173
+ const bounds = asset.occupancy?.bounds;
174
+ const read = new Set();
175
+ const walk = (ref) => {
176
+ if (read.has(ref))
177
+ return;
178
+ read.add(ref);
179
+ const writer = m.nodes.find((n) => Object.values(n.outputs ?? {}).includes(ref));
180
+ for (const arg of writer?.args ?? [])
181
+ walk(arg);
182
+ };
183
+ for (const axis of AXES)
184
+ if (bounds?.[axis])
185
+ for (const end of ['min', 'max'])
186
+ walk(bounds[axis][end]);
187
+ return ref => read.has(ref);
188
+ }
189
+ //# sourceMappingURL=resize-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-plan.js","sourceRoot":"","sources":["../src/resize-plan.ts"],"names":[],"mappings":"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"}