@pixel-point/toolcraft 0.0.17 → 0.0.19

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 (503) hide show
  1. package/package.json +1 -1
  2. package/src/generate-demand-only-lifecycle.test.mjs +9 -1
  3. package/src/generate-performance-iteration-execution.test.mjs +3 -3
  4. package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
  5. package/src/generate-test-demand-only-lifecycle.mjs +34 -36
  6. package/src/generate-test-dependency-sandbox.mjs +4 -1
  7. package/src/generate-test-doc-assertions.mjs +81 -89
  8. package/src/generate-test-doc-assertions.test.mjs +44 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +77 -83
  12. package/src/generate-test-integrity-assertions.mjs +5 -2
  13. package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
  14. package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
  15. package/src/generate-test-package-assertions.mjs +4 -0
  16. package/src/generate-test-product-fixture.mjs +1 -1
  17. package/src/generate-test-product-fixture.test.mjs +35 -38
  18. package/src/generate-test-product-iteration.mjs +0 -1
  19. package/src/generate-test-product-iteration.test.mjs +17 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +178 -0
  21. package/src/generate-test-standalone-assertions.mjs +7 -13
  22. package/src/generate-test-standalone-delivery-stages.mjs +2 -86
  23. package/src/generate.test.mjs +4 -0
  24. package/src/generated-integrity-manifest.test.mjs +5 -2
  25. package/src/generated-source-policy.test.mjs +0 -4
  26. package/src/package-json.mjs +5 -0
  27. package/src/package-json.test.mjs +21 -0
  28. package/src/package-manager.mjs +2 -0
  29. package/src/package-manager.test.mjs +8 -0
  30. package/src/packaged-template-fallback-helpers.mjs +254 -0
  31. package/src/packaged-template-fallback.test.mjs +121 -46
  32. package/src/packaged-template-runtime-assertions.mjs +150 -0
  33. package/templates/runtime/contracts/component-contracts.choices.test.ts +64 -5
  34. package/templates/runtime/contracts/component-contracts.choices.ts +55 -5
  35. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  36. package/templates/runtime/contracts/component-contracts.inputs.ts +8 -7
  37. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  38. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  39. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +22 -8
  40. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  41. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +3 -0
  42. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  43. package/templates/runtime/contracts/component-contracts.runtime.ts +19 -12
  44. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  45. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  46. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  47. package/templates/runtime/contracts/decision-contracts.test.ts +35 -11
  48. package/templates/runtime/contracts/decision-contracts.ts +12 -12
  49. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  50. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  51. package/templates/runtime/export/artifact-download.ts +1 -0
  52. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  53. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  54. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  55. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  56. package/templates/runtime/export/export-background.ts +0 -19
  57. package/templates/runtime/export/export-error.ts +5 -0
  58. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  59. package/templates/runtime/export/export.test.ts +45 -42
  60. package/templates/runtime/export/image-artifact-export.ts +2 -2
  61. package/templates/runtime/export/index.ts +57 -16
  62. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  63. package/templates/runtime/export/product-export-renderer.ts +0 -41
  64. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  65. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  66. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  67. package/templates/runtime/export/svg-document.test.ts +221 -0
  68. package/templates/runtime/export/svg-document.ts +400 -0
  69. package/templates/runtime/export/svg-policy.ts +47 -0
  70. package/templates/runtime/index.ts +3 -0
  71. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  72. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +21 -1
  73. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  74. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +75 -1
  75. package/templates/runtime/react/app-shell/toolcraft-app.tsx +24 -9
  76. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  77. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  78. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +77 -1
  79. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  80. package/templates/runtime/react/canvas/canvas-shell.tsx +32 -6
  81. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  82. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  83. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  84. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  85. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  86. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  90. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  91. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  92. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +40 -1
  93. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  94. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +59 -0
  95. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  96. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  97. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +4 -6
  98. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +41 -6
  99. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  100. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  101. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +41 -10
  102. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +7 -4
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  106. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  107. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  108. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  109. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  110. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  111. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  112. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  113. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  114. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  115. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  116. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  117. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  118. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  119. package/templates/runtime/react/index.ts +4 -0
  120. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  121. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  122. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  123. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  124. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  125. package/templates/runtime/scene/scene-bounds.ts +31 -17
  126. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  127. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  128. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  129. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  130. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  131. package/templates/runtime/schema/control-applicability.ts +433 -0
  132. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  133. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  134. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  135. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +59 -0
  136. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  137. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  138. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  139. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  140. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  141. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  142. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  143. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  144. package/templates/runtime/schema/types.ts +69 -13
  145. package/templates/runtime/state/canvas-background-state.ts +1 -16
  146. package/templates/runtime/state/canvas-state.ts +32 -20
  147. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  148. package/templates/runtime/state/control-value-codecs.ts +700 -0
  149. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  150. package/templates/runtime/state/control-value-normalization.ts +127 -135
  151. package/templates/runtime/state/controls-reducer.ts +26 -3
  152. package/templates/runtime/state/create-template-state.test.ts +30 -0
  153. package/templates/runtime/state/create-template-state.ts +52 -31
  154. package/templates/runtime/state/orientation-pose.ts +80 -0
  155. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  156. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  157. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  158. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  159. package/templates/runtime/state/timeline-reducer.ts +40 -2
  160. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  161. package/templates/starter/AGENTS.md +29 -28
  162. package/templates/starter/docs/toolcraft/README.md +6 -6
  163. package/templates/starter/docs/toolcraft/acceptance-testing.md +34 -48
  164. package/templates/starter/docs/toolcraft/agent-worklog.md +103 -1
  165. package/templates/starter/docs/toolcraft/assembly-workflow.md +16 -8
  166. package/templates/starter/docs/toolcraft/component-rules.md +9 -7
  167. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  168. package/templates/starter/docs/toolcraft/core/layout.md +13 -8
  169. package/templates/starter/docs/toolcraft/core/media-upload.md +3 -1
  170. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  171. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  172. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +15 -3
  173. package/templates/starter/docs/toolcraft/core/setup-export.md +67 -11
  174. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  175. package/templates/starter/docs/toolcraft/decision-contract.md +4 -2
  176. package/templates/starter/docs/toolcraft/performance.md +8 -10
  177. package/templates/starter/docs/toolcraft/renderer-technique.md +6 -2
  178. package/templates/starter/docs/toolcraft/schema-reference.md +24 -22
  179. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  180. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  181. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +45 -2
  182. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  183. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  184. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  185. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +63 -33
  186. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  187. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -15
  188. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  189. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  190. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +20 -11
  191. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  192. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  193. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  194. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  195. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  196. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  197. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  198. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  199. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  200. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +9 -2
  201. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +51 -32
  202. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  203. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +122 -0
  204. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  205. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  206. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  207. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  208. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  209. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  210. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  211. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  212. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  213. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  214. package/templates/starter/package.json +2 -0
  215. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  216. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  217. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  218. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  219. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  220. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  221. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  222. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  223. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  224. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  225. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  226. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  227. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  228. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  229. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  230. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  231. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  232. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  233. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  234. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  235. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  236. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  237. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  238. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  239. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  240. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  241. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  242. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  243. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  244. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  245. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  246. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  247. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  248. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  249. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  250. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  251. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  252. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  253. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  254. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  255. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  256. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  257. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  258. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  259. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  260. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  261. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  262. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  263. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  264. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  265. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  266. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  267. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  268. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  269. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  270. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  271. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  272. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  273. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  274. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  275. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  276. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  277. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  278. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  279. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  280. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  281. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  282. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  283. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  284. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  285. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  286. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  287. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  288. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  289. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  290. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  291. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  292. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  293. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  294. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  295. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  296. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  297. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  298. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  299. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  300. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  301. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  302. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  303. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  304. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  305. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  306. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  307. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  308. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  309. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  310. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  311. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  312. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  313. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  314. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  315. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  316. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  317. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  318. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  319. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  320. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  321. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  322. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  323. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  324. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  325. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  326. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  327. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +85 -115
  328. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  329. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -72
  330. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  331. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  332. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  333. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +16 -18
  334. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +200 -0
  335. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  336. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  337. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  338. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  339. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  340. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  341. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  342. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  343. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  344. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +2 -0
  345. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  346. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  347. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  348. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  349. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  350. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  351. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  352. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  353. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  354. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +161 -0
  355. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  356. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  357. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  358. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  359. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  360. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -31
  361. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  362. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +4 -16
  363. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  364. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  365. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  366. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  367. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  368. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  369. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  370. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  371. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +21 -10
  372. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  373. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  374. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  375. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  376. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  377. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  378. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  379. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  380. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  381. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  382. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  383. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  384. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  385. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  386. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  387. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  388. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  389. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  390. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  391. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  392. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  393. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  394. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  395. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  396. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  397. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  398. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  399. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +22 -10
  400. package/templates/starter/src/app/acceptance/output-export-model.ts +58 -11
  401. package/templates/starter/src/app/acceptance/output-export.ts +25 -10
  402. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  403. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  404. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  405. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  406. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  407. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  408. package/templates/starter/src/app/acceptance/types.ts +65 -125
  409. package/templates/starter/src/app/acceptance/validate-coverage.ts +33 -5
  410. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  411. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  412. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +312 -0
  413. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +35 -0
  414. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +18 -1
  415. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  416. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +66 -1
  417. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  418. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +113 -16
  419. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +225 -0
  420. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  421. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  422. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  423. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  424. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  425. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  426. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  427. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  428. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  429. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +26 -0
  430. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +39 -9
  431. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +31 -3
  432. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  433. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  434. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +56 -0
  435. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  436. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  437. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  438. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  439. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  440. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  441. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +458 -0
  442. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +4 -0
  443. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +116 -104
  444. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +29 -0
  445. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  446. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  447. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  448. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  449. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +3 -1
  450. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  451. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  452. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  453. package/templates/starter/src/app/starter-acceptance.ts +45 -10
  454. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +338 -0
  455. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  456. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +12 -0
  457. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  458. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  459. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  460. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  461. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +5 -2
  462. package/templates/starter/src/routes/index.tsx +1 -0
  463. package/templates/starter/tsconfig.json +1 -0
  464. package/templates/ui/components/composites/tabs.tsx +2 -2
  465. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  466. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  467. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  468. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  469. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  470. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  471. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  472. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  473. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  474. package/templates/ui/components/controls/index.ts +3 -0
  475. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  476. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  477. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  478. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  479. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  480. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  481. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  482. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  483. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  484. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  485. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  486. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  487. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  488. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  489. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  490. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  491. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  492. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  493. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  494. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  495. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  496. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  497. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  498. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  499. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  500. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  501. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
  502. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  503. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -160,115 +160,4 @@ describe("starter acceptance control state contract", () => {
160
160
  );
161
161
  });
162
162
 
163
- it("requires visibleWhen controls to reference a real target and prove hidden behavior", () => {
164
- const schemaWithVisibleDependency = defineContractSchemaFixture({
165
- canvas: { enabled: true },
166
- panels: {
167
- controls: {
168
- sections: [
169
- {
170
- controls: {
171
- shadeCount: {
172
- defaultValue: 2,
173
- label: "Shades",
174
- max: 5,
175
- min: 1,
176
- step: 1,
177
- target: "shapes.shadeCount",
178
- type: "slider",
179
- variant: "discrete",
180
- },
181
- shade3: {
182
- defaultValue: { hex: "#BBBBBB" },
183
- label: "Shade 3",
184
- target: "shapes.color3",
185
- type: "color",
186
- visibleWhen: {
187
- greaterThanOrEqual: 3,
188
- target: "shapes.count",
189
- },
190
- },
191
- },
192
- title: "Shapes",
193
- },
194
- ],
195
- title: "Controls",
196
- },
197
- },
198
- });
199
-
200
- expect(
201
- validateContractAcceptance({
202
- schema: schemaWithVisibleDependency,
203
- acceptance: [
204
- makeControlAcceptance("shapes.shadeCount", "slider"),
205
- makeControlAcceptance("shapes.color3", "color"),
206
- ],
207
- }),
208
- ).toEqual(
209
- expect.arrayContaining([
210
- expect.stringContaining(
211
- "visibleWhen target shapes.count does not match another schema control target",
212
- ),
213
- expect.stringContaining(
214
- "uses visibleWhen and must declare visibilityCoverage",
215
- ),
216
- ]),
217
- );
218
-
219
- const schemaWithValidVisibleDependency = defineContractSchemaFixture({
220
- canvas: { enabled: true },
221
- panels: {
222
- controls: {
223
- sections: [
224
- {
225
- controls: {
226
- shadeCount: {
227
- defaultValue: 2,
228
- label: "Shades",
229
- max: 5,
230
- min: 1,
231
- step: 1,
232
- target: "shapes.shadeCount",
233
- type: "slider",
234
- variant: "discrete",
235
- },
236
- shade3: {
237
- defaultValue: { hex: "#BBBBBB" },
238
- label: "Shade 3",
239
- target: "shapes.color3",
240
- type: "color",
241
- visibleWhen: {
242
- greaterThanOrEqual: 3,
243
- target: "shapes.shadeCount",
244
- },
245
- },
246
- },
247
- title: "Shapes",
248
- },
249
- ],
250
- title: "Controls",
251
- },
252
- },
253
- });
254
- const errors = validateContractAcceptance({
255
- schema: schemaWithValidVisibleDependency,
256
- acceptance: [
257
- makeControlAcceptance("shapes.shadeCount", "slider"),
258
- {
259
- ...makeControlAcceptance("shapes.color3", "color"),
260
- expectedObservable: "Третий цвет доступен только для соответствующего состояния продукта.",
261
- userAction: "Переключить количество оттенков и проверить оба состояния.",
262
- visibilityCoverage: ["hidden", "visible"],
263
- },
264
- ],
265
- });
266
-
267
- expect(errors).not.toEqual(
268
- expect.arrayContaining([
269
- expect.stringContaining("visibleWhen target"),
270
- expect.stringContaining("uses visibleWhen and must declare visibilityCoverage"),
271
- ]),
272
- );
273
- });
274
163
  });
@@ -6,7 +6,7 @@ import {
6
6
  } from "./starter-acceptance.contract-fixtures";
7
7
 
8
8
  describe("starter acceptance custom control collection contract", () => {
9
- it("requires collection-like custom controls to compare actions and collectionActions", () => {
9
+ it("requires collection-like custom controls to compare both cardinality owners and actions", () => {
10
10
  const schema = defineContractSchemaFixture({
11
11
  canvas: { enabled: true },
12
12
  panels: {
@@ -71,6 +71,7 @@ describe("starter acceptance custom control collection contract", () => {
71
71
  ],
72
72
  }),
73
73
  ).toEqual([
74
+ "Masks / maskEditor (masks) builtInFitCheck.checkedBuiltIns must include sourceCollection when the custom control owns a repeated runtime item set whose cardinality could be source-owned.",
74
75
  "Masks / maskEditor (masks) builtInFitCheck.checkedBuiltIns must include collectionActions when the custom control owns a growable, removable, selectable, or reorderable runtime item set.",
75
76
  "Masks / maskEditor (masks) builtInFitCheck.checkedBuiltIns must include actions when the custom control exposes local command buttons such as add, remove, delete, duplicate, sort, normalize, or clear.",
76
77
  ]);
@@ -135,6 +136,7 @@ describe("starter acceptance custom control collection contract", () => {
135
136
  ],
136
137
  }),
137
138
  ).toEqual([
139
+ "Pattern / patternSet (pattern.set) builtInFitCheck.checkedBuiltIns must include sourceCollection when the custom control owns a repeated runtime item set whose cardinality could be source-owned.",
138
140
  "Pattern / patternSet (pattern.set) builtInFitCheck.checkedBuiltIns must include collectionActions when the custom control owns a growable, removable, selectable, or reorderable runtime item set.",
139
141
  ]);
140
142
  });
@@ -82,7 +82,7 @@ describe("starter acceptance custom control built-in fit contract", () => {
82
82
  controls: {
83
83
  shapeButtons: {
84
84
  defaultValue: "rect",
85
- label: "Shape",
85
+ label: false,
86
86
  orderRole: "style",
87
87
  target: "shape.kind",
88
88
  type: "shapeButtons",
@@ -48,7 +48,7 @@ describe("starter acceptance valid custom control contract", () => {
48
48
  "reorder",
49
49
  "selection",
50
50
  ],
51
- checkedBuiltIns: ["actions", "collectionActions", "fileDrop", "imagePicker", "select"],
51
+ checkedBuiltIns: ["actions", "collectionActions", "fileDrop", "imagePicker", "select", "sourceCollection"],
52
52
  closestBuiltIn: "fileDrop",
53
53
  productObservable: "Ordering uploaded glyphs changes the rendered glyph ramp output.",
54
54
  whyInsufficient: "FileDrop imports source files, but it does not provide density ordering, per-glyph preview, reorder, and remove behavior in one runtime value.",
@@ -4,7 +4,9 @@ import { describe, expect, it } from "vitest";
4
4
  import { getToolcraftExportArtifactCoverageErrors } from "./acceptance/export-artifact-coverage";
5
5
  import type { ToolcraftComponentAcceptance } from "./acceptance/types";
6
6
 
7
- function createSchema(roles: readonly ("export-image" | "export-video")[]) {
7
+ function createSchema(
8
+ roles: readonly ("export-image" | "export-svg" | "export-video")[],
9
+ ) {
8
10
  return defineToolcraft({
9
11
  canvas: { enabled: true },
10
12
  panels: {
@@ -14,9 +16,19 @@ function createSchema(roles: readonly ("export-image" | "export-video")[]) {
14
16
  controls: {
15
17
  output: {
16
18
  actions: roles.map((role) => ({
17
- label: role === "export-image" ? "Export Image" : "Export Video",
19
+ label:
20
+ role === "export-image"
21
+ ? "Export Image"
22
+ : role === "export-svg"
23
+ ? "Export SVG"
24
+ : "Export Video",
18
25
  role,
19
- value: role === "export-image" ? "export.image" : "export.video",
26
+ value:
27
+ role === "export-image"
28
+ ? "export.image"
29
+ : role === "export-svg"
30
+ ? "export.svg"
31
+ : "export.video",
20
32
  })),
21
33
  target: "actions.output",
22
34
  type: "panelActions",
@@ -92,6 +104,65 @@ describe("Toolcraft export artifact acceptance", () => {
92
104
  ]);
93
105
  });
94
106
 
107
+ it("requires exact SVG exported-bytes coverage for a typed SVG action", () => {
108
+ const schema = createSchema(["export-svg"]);
109
+
110
+ expect(
111
+ getToolcraftExportArtifactCoverageErrors({
112
+ acceptance: [
113
+ createAcceptance({
114
+ actionCoverage: ["export.svg"],
115
+ exportArtifactCoverage: "all-required-svg-export-behavior",
116
+ }),
117
+ ],
118
+ schema,
119
+ }),
120
+ ).toEqual([]);
121
+ expect(
122
+ getToolcraftExportArtifactCoverageErrors({
123
+ acceptance: [
124
+ createAcceptance({
125
+ actionCoverage: ["export.svg"],
126
+ exportArtifactCoverage: "all-required-image-export-behavior",
127
+ }),
128
+ ],
129
+ schema,
130
+ }),
131
+ ).toEqual([
132
+ expect.stringContaining("without a matching typed export action"),
133
+ expect.stringContaining("all-required-svg-export-behavior"),
134
+ ]);
135
+ });
136
+
137
+ it("rejects typed export roles outside sticky panelActions", () => {
138
+ const schema = defineToolcraft({
139
+ canvas: { enabled: true },
140
+ panels: {
141
+ controls: {
142
+ sections: [
143
+ {
144
+ controls: {
145
+ local: {
146
+ actions: [{ role: "export-svg", value: "export.svg" }],
147
+ target: "local.actions",
148
+ type: "actions",
149
+ },
150
+ },
151
+ id: "local",
152
+ },
153
+ ],
154
+ title: "Controls",
155
+ },
156
+ },
157
+ });
158
+
159
+ expect(
160
+ getToolcraftExportArtifactCoverageErrors({ acceptance: [], schema }),
161
+ ).toContain(
162
+ 'Typed export-svg action "export.svg" must be declared in sticky panelActions.',
163
+ );
164
+ });
165
+
95
166
  it("requires exported bytes plus automated browser proof", () => {
96
167
  const errors = getToolcraftExportArtifactCoverageErrors({
97
168
  acceptance: [
@@ -1,3 +1,25 @@
1
+ import type {
2
+ ToolcraftArtifactExportIntent,
3
+ ToolcraftProductReadiness,
4
+ } from "./acceptance/types";
5
+
6
+ export function makeExportSettingsProductReadiness(
7
+ exportIntent: ToolcraftArtifactExportIntent,
8
+ ): Extract<ToolcraftProductReadiness, { mode: "product" }> {
9
+ return {
10
+ exportIntent,
11
+ interactionOwnership: [],
12
+ mode: "product",
13
+ productName: "Export settings fixture",
14
+ productSummary: "A synthetic product for image, SVG, and video export settings.",
15
+ requestedBehavior: "Export the explicitly requested artifact types.",
16
+ viewInteraction: {
17
+ mode: "non-spatial",
18
+ reason: "The synthetic output is two-dimensional.",
19
+ },
20
+ };
21
+ }
22
+
1
23
  export function makeBackgroundSection() {
2
24
  return {
3
25
  controls: {
@@ -105,3 +127,7 @@ export function textLooksLikePngExport(text: string): boolean {
105
127
  export function textLooksLikeVideoExport(text: string): boolean {
106
128
  return /\b(export|download)\b/i.test(text) && /\b(video|mp4|webm|mov)\b/i.test(text);
107
129
  }
130
+
131
+ export function textLooksLikeSvgExport(text: string): boolean {
132
+ return /\b(export|download)\b/i.test(text) && /\bsvg\b|\bvector\b/i.test(text);
133
+ }
@@ -3,12 +3,28 @@ import { describe, expect, it } from "vitest";
3
3
  import { defineContractSchemaFixture, validateContractAcceptance } from "./starter-acceptance.contract-fixtures";
4
4
  import {
5
5
  makeBackgroundSection,
6
+ makeExportSettingsProductReadiness,
6
7
  makeImageExportSection,
7
8
  makeVideoExportSection,
8
9
  } from "./starter-acceptance.export-test-utils";
9
10
  import { makeControlAcceptance } from "./starter-acceptance.test-utils";
10
11
 
11
- describe("Toolcraft image and video export settings acceptance contract", () => {
12
+ const imageOnlyProductReadiness = makeExportSettingsProductReadiness({
13
+ image: { mode: "toolcraft-default" },
14
+ svg: { mode: "not-requested" },
15
+ video: { mode: "not-requested" },
16
+ });
17
+
18
+ const imageAndVideoProductReadiness = makeExportSettingsProductReadiness({
19
+ image: { mode: "toolcraft-default" },
20
+ svg: { mode: "not-requested" },
21
+ video: {
22
+ evidence: "The user explicitly requested video delivery.",
23
+ mode: "user-requested",
24
+ },
25
+ });
26
+
27
+ describe("Toolcraft image export settings acceptance contract", () => {
12
28
  it("requires still-output apps to expose image export format and resolution settings", () => {
13
29
  const schemaWithoutImageExportSettings = defineContractSchemaFixture({
14
30
  canvas: {
@@ -58,13 +74,15 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
58
74
  componentType: "panelActions",
59
75
  evidence: "exported-bytes",
60
76
  expectedObservable: "Export PNG creates output bytes and reads image format, image resolution, background color, and include-background state.",
77
+ exportArtifactCoverage: "all-required-image-export-behavior",
61
78
  fixture: "export fixture",
62
79
  id: "actions.output",
63
80
  kind: "control",
64
81
  target: "actions.output",
65
- userAction: "Toggle Include off, verify preview has no product background, export PNG with alpha, and verify video export keeps the background.",
82
+ userAction: "Toggle Include off, verify preview has no product background, export PNG with alpha, and verify the image artifact preserves transparency.",
66
83
  },
67
84
  ],
85
+ productReadiness: imageOnlyProductReadiness,
68
86
  }),
69
87
  ).toEqual(
70
88
  expect.arrayContaining([
@@ -142,6 +160,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
142
160
  componentType: "panelActions",
143
161
  evidence: "exported-bytes",
144
162
  expectedObservable: "Export PNG creates output bytes and reads image format, image resolution, background color, and include-background state. JPG changes file type; 8K changes exported pixel dimensions to an 8192px long edge.",
163
+ exportArtifactCoverage: "all-required-image-export-behavior",
145
164
  fixture: "export fixture",
146
165
  id: "actions.output",
147
166
  kind: "control",
@@ -149,6 +168,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
149
168
  userAction: "Set format to JPG and resolution to 8K, then export and decode the output image to verify file type and long-edge dimensions.",
150
169
  },
151
170
  ],
171
+ productReadiness: imageOnlyProductReadiness,
152
172
  }),
153
173
  ).not.toEqual(
154
174
  expect.arrayContaining([
@@ -159,7 +179,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
159
179
  );
160
180
  });
161
181
 
162
- it("requires animated apps with PNG and video actions to expose Image Export before Video Export", () => {
182
+ it("requires explicit image-plus-video delivery to expose Image Export before Video Export", () => {
163
183
  const schemaWithoutImageSettings = defineContractSchemaFixture({
164
184
  canvas: {
165
185
  enabled: true,
@@ -211,19 +231,24 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
211
231
  {
212
232
  actionCoverage: ["export.video", "export.png"],
213
233
  automated: true,
214
- automatedTestName: "exports animated and still output",
234
+ automatedTestName: "exports image and explicitly requested video output",
215
235
  browser: true,
216
236
  browserTestName: "browser: exports video and image output",
217
237
  componentType: "panelActions",
218
238
  evidence: "exported-bytes",
219
239
  expectedObservable: "Export Video and Export PNG both create output bytes and read their runtime export settings.",
220
- fixture: "animated export fixture",
240
+ exportArtifactCoverage: [
241
+ "all-required-image-export-behavior",
242
+ "all-required-video-export-behavior",
243
+ ],
244
+ fixture: "explicit image-plus-video export fixture",
221
245
  id: "actions.output",
222
246
  kind: "control",
223
247
  target: "actions.output",
224
- userAction: "Export video and PNG from the same timeline state, then verify both files exist.",
248
+ userAction: "Export video and PNG with their configured settings, then verify both files exist.",
225
249
  },
226
250
  ],
251
+ productReadiness: imageAndVideoProductReadiness,
227
252
  }),
228
253
  ).toEqual(
229
254
  expect.arrayContaining([
@@ -234,7 +259,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
234
259
  );
235
260
  });
236
261
 
237
- it("accepts animated apps with Image Export immediately before Video Export", () => {
262
+ it("accepts explicit image-plus-video delivery with Image Export immediately before Video Export", () => {
238
263
  const schemaWithDualExportSettings = defineContractSchemaFixture({
239
264
  canvas: {
240
265
  enabled: true,
@@ -303,19 +328,24 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
303
328
  {
304
329
  actionCoverage: ["export.video", "export.png"],
305
330
  automated: true,
306
- automatedTestName: "exports animated and still output",
331
+ automatedTestName: "exports image and explicitly requested video output",
307
332
  browser: true,
308
333
  browserTestName: "browser: exports video and image output",
309
334
  componentType: "panelActions",
310
335
  evidence: "exported-bytes",
311
336
  expectedObservable: "Export Video and Export PNG both create output bytes and read their runtime export settings.",
312
- fixture: "animated export fixture",
337
+ exportArtifactCoverage: [
338
+ "all-required-image-export-behavior",
339
+ "all-required-video-export-behavior",
340
+ ],
341
+ fixture: "explicit image-plus-video export fixture",
313
342
  id: "actions.output",
314
343
  kind: "control",
315
344
  target: "actions.output",
316
345
  userAction: "Choose JPG and 8K, choose MP4 and Current, then export PNG and video and verify both outputs use their selected settings.",
317
346
  },
318
347
  ],
348
+ productReadiness: imageAndVideoProductReadiness,
319
349
  }),
320
350
  ).not.toEqual(
321
351
  expect.arrayContaining([
@@ -70,15 +70,15 @@ function ownership({
70
70
  source?: ToolcraftInteractionOwnershipEntry["evidence"]["source"];
71
71
  surface: ToolcraftInteractionSurface;
72
72
  }): ToolcraftInteractionOwnershipEntry {
73
- return {
73
+ const base = {
74
74
  alternative: {
75
75
  reason:
76
76
  surface === "canvas"
77
77
  ? "A panel copy would separate the same operation from visible output without adding a useful capability."
78
78
  : "A canvas copy would add output chrome without improving this non-spatial operation.",
79
- surface: surface === "canvas" ? "panel" : "canvas",
79
+ surface: (surface === "canvas" ? "panel" : "canvas") as
80
+ ToolcraftInteractionSurface,
80
81
  },
81
- capability,
82
82
  evidence: {
83
83
  detail:
84
84
  source === "reference"
@@ -94,12 +94,30 @@ function ownership({
94
94
  surface,
95
95
  target: "output.position",
96
96
  };
97
+
98
+ if (
99
+ capability === "precise-value-entry" ||
100
+ capability === "property-edit"
101
+ ) {
102
+ return {
103
+ ...base,
104
+ capability,
105
+ selectionScope: { mode: "global" },
106
+ };
107
+ }
108
+
109
+ return { ...base, capability };
97
110
  }
98
111
 
99
112
  function readiness(
100
113
  interactionOwnership: readonly ToolcraftInteractionOwnershipEntry[],
101
114
  ): ToolcraftProductReadiness {
102
115
  return {
116
+ exportIntent: {
117
+ image: { mode: "toolcraft-default" },
118
+ svg: { mode: "not-requested" },
119
+ video: { mode: "not-requested" },
120
+ },
103
121
  interactionOwnership,
104
122
  mode: "product",
105
123
  productName: "Interaction fixture",
@@ -151,6 +169,11 @@ function acceptance({
151
169
  describe("Toolcraft interaction surface ownership", () => {
152
170
  it("runs ownership validation through the protected acceptance pipeline", () => {
153
171
  const productReadiness = {
172
+ exportIntent: {
173
+ image: { mode: "toolcraft-default" },
174
+ svg: { mode: "not-requested" },
175
+ video: { mode: "not-requested" },
176
+ },
154
177
  mode: "product",
155
178
  productName: "Legacy fixture",
156
179
  productSummary: "A product declaration created before interaction ownership.",
@@ -172,6 +195,11 @@ describe("Toolcraft interaction surface ownership", () => {
172
195
 
173
196
  it("rejects product readiness that omits the ownership inventory", () => {
174
197
  const productReadiness = {
198
+ exportIntent: {
199
+ image: { mode: "toolcraft-default" },
200
+ svg: { mode: "not-requested" },
201
+ video: { mode: "not-requested" },
202
+ },
175
203
  mode: "product",
176
204
  productName: "Legacy fixture",
177
205
  productSummary: "A product declaration created before interaction ownership.",
@@ -196,7 +196,8 @@ describe("starter acceptance layers contract", () => {
196
196
  }),
197
197
  ).toEqual(
198
198
  expect.arrayContaining([
199
- 'Layer / opacity (selectedLayer.opacity) targets selectedLayer.* and must have acceptance layerCoverage "selected-layer-controls" proving the control edits the currently selected layer output.',
199
+ 'selectedLayer.opacity must declare selectionScopeCoverage "two-entity-isolation" proving edits stay on the selected entity.',
200
+ 'selectedLayer.opacity targets selectedLayer.* and must declare layerCoverage "selected-layer-controls" together with two-entity isolation.',
200
201
  ]),
201
202
  );
202
203
  });
@@ -60,7 +60,11 @@ export function createSingleFileDropSchema({
60
60
  });
61
61
  }
62
62
 
63
- export function createMultipleFileDropSchema() {
63
+ export function createMultipleFileDropSchema({
64
+ collectionActions = false,
65
+ }: {
66
+ collectionActions?: boolean;
67
+ } = {}) {
64
68
  return defineContractSchemaFixture({
65
69
  canvas: { enabled: true },
66
70
  panels: {
@@ -69,6 +73,12 @@ export function createMultipleFileDropSchema() {
69
73
  {
70
74
  controls: {
71
75
  sources: {
76
+ ...(collectionActions
77
+ ? {
78
+ assetKind: "file" as const,
79
+ variant: "collection-actions",
80
+ }
81
+ : {}),
72
82
  defaultValue: [],
73
83
  label: "Source images",
74
84
  multiple: true,
@@ -15,6 +15,11 @@ import {
15
15
  } from "./starter-acceptance.media-upload.fixtures";
16
16
 
17
17
  const layeredMediaProductReadiness: ToolcraftProductReadiness = {
18
+ exportIntent: {
19
+ image: { mode: "toolcraft-default" },
20
+ svg: { mode: "not-requested" },
21
+ video: { mode: "not-requested" },
22
+ },
18
23
  interactionOwnership: [
19
24
  {
20
25
  alternative: {
@@ -34,6 +39,28 @@ const layeredMediaProductReadiness: ToolcraftProductReadiness = {
34
39
  surface: "panel",
35
40
  target: "media.sources",
36
41
  },
42
+ {
43
+ alternative: {
44
+ reason:
45
+ "Canvas transform buttons would duplicate precise actions already owned by Layers.",
46
+ surface: "canvas",
47
+ },
48
+ capability: "property-edit",
49
+ evidence: {
50
+ detail:
51
+ "The product requires transforms to apply only to the layer selected in Layers.",
52
+ source: "user-request",
53
+ },
54
+ id: "layers-selected-transform",
55
+ reason:
56
+ "The Layers property action remains bound to the explicitly selected image.",
57
+ selectionScope: {
58
+ mode: "selected-entity",
59
+ selectionInteractionId: "layers-media-management",
60
+ },
61
+ surface: "panel",
62
+ target: "selectedLayer.transform",
63
+ },
37
64
  ],
38
65
  mode: "product",
39
66
  productName: "Layered media fixture",
@@ -80,6 +107,10 @@ function createLayerAcceptance({
80
107
  kind: "runtime",
81
108
  layerCoverage,
82
109
  mediaLifecycleCoverage,
110
+ selectionScopeCoverage:
111
+ layerCoverage === "selected-layer-controls"
112
+ ? "two-entity-isolation"
113
+ : undefined,
83
114
  target,
84
115
  userAction: `Exercise ${id} through the runtime Layers panel.`,
85
116
  };
@@ -127,6 +158,7 @@ function createLayeredMediaAcceptance({
127
158
  ? [
128
159
  createLayerAcceptance({
129
160
  id: "layers.selected-transform",
161
+ interactionId: "layers-selected-transform",
130
162
  layerCoverage: "selected-layer-controls",
131
163
  mediaLifecycleCoverage: [
132
164
  "rotate",
@@ -284,6 +316,30 @@ describe("Toolcraft media upload acceptance coverage", () => {
284
316
  ).toEqual([]);
285
317
  });
286
318
 
319
+ it("does not require reorder coverage from collection-actions upload slots", () => {
320
+ const schema = createMultipleFileDropSchema({ collectionActions: true });
321
+
322
+ const errors = validateContractAcceptance({
323
+ schema,
324
+ acceptance: [
325
+ createFileDropAcceptance({
326
+ automatedTestName: "source files add and remove slots",
327
+ browserTestName: "browser: source files add and remove slots",
328
+ expectedObservable:
329
+ "Compact plus adds an empty upload slot and compact minus removes the final slot or attached file.",
330
+ fixture: "source file fixture",
331
+ id: "media.sources",
332
+ mediaLifecycleCoverage: ["upload", "remove", "reset"],
333
+ target: "media.sources",
334
+ userAction:
335
+ "Add an upload slot, attach a file, remove the final slot, and reset.",
336
+ }),
337
+ ],
338
+ });
339
+
340
+ expect(errors.filter((error) => error.includes("reorder"))).toEqual([]);
341
+ });
342
+
287
343
  it("assigns reorder and selected image transform proof to Layers without duplicating fileDrop claims", () => {
288
344
  const fileDropSchema = createMultipleFileDropSchema();
289
345
  const layeredSchema = {
@@ -0,0 +1,17 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ defineToolcraftMotionReferenceEvidence,
5
+ } from "./acceptance/motion-reference-evidence.mjs";
6
+ import type { ToolcraftMotionReferenceEvidence } from "./acceptance/reference-study-types";
7
+
8
+ describe("Toolcraft motion reference evidence decoder", () => {
9
+ it("exposes an exact checked TypeScript boundary without a cast", () => {
10
+ const defineEvidence: (
11
+ value: unknown,
12
+ ) => ToolcraftMotionReferenceEvidence =
13
+ defineToolcraftMotionReferenceEvidence;
14
+
15
+ expect(() => defineEvidence({})).toThrow(/motion reference evidence/iu);
16
+ });
17
+ });