@pixel-point/toolcraft 0.0.16 → 0.0.18

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 (313) hide show
  1. package/package.json +1 -1
  2. package/src/generate-performance-iteration-execution.test.mjs +2 -2
  3. package/src/generate-test-demand-only-lifecycle.mjs +14 -3
  4. package/src/generate-test-dependency-sandbox.mjs +42 -5
  5. package/src/generate-test-doc-assertions.mjs +109 -69
  6. package/src/generate-test-doc-assertions.test.mjs +65 -0
  7. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  8. package/src/generate-test-file-assertions.mjs +36 -118
  9. package/src/generate-test-output-assertions.mjs +95 -0
  10. package/src/generate-test-package-assertions.mjs +6 -0
  11. package/src/generate-test-performance-boundary-assertions.mjs +45 -0
  12. package/src/generate-test-product-fixture.mjs +1 -0
  13. package/src/generate-test-product-fixture.test.mjs +18 -0
  14. package/src/generate-test-product-iteration.mjs +1 -0
  15. package/src/generate-test-product-iteration.test.mjs +18 -0
  16. package/src/generate-test-runtime-boundary-assertions.mjs +158 -0
  17. package/src/generate-test-standalone-assertions.mjs +10 -0
  18. package/src/generate-test-standalone-delivery-stages.mjs +14 -6
  19. package/src/generate.test.mjs +14 -0
  20. package/templates/runtime/contracts/component-contracts.choices.test.ts +59 -12
  21. package/templates/runtime/contracts/component-contracts.choices.ts +58 -12
  22. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  23. package/templates/runtime/contracts/component-contracts.inputs.ts +6 -6
  24. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  25. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  26. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +21 -6
  27. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  28. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +4 -1
  29. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  30. package/templates/runtime/contracts/component-contracts.runtime.ts +15 -10
  31. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  32. package/templates/runtime/contracts/decision-contracts.test.ts +43 -4
  33. package/templates/runtime/contracts/decision-contracts.ts +10 -10
  34. package/templates/runtime/contracts/performance-verification-policy.test.ts +59 -6
  35. package/templates/runtime/contracts/performance-verification-policy.ts +5 -2
  36. package/templates/runtime/export/artifact-download.test.ts +71 -0
  37. package/templates/runtime/export/artifact-download.ts +80 -0
  38. package/templates/runtime/export/artifact-export-request.ts +23 -0
  39. package/templates/runtime/export/artifact-export-settings.test.ts +75 -0
  40. package/templates/runtime/export/artifact-export-settings.ts +96 -0
  41. package/templates/runtime/export/artifact-frame-renderer.test.ts +107 -0
  42. package/templates/runtime/export/artifact-frame-renderer.ts +96 -0
  43. package/templates/runtime/export/artifact-frame-state.test.ts +54 -0
  44. package/templates/runtime/export/artifact-frame-state.ts +44 -0
  45. package/templates/runtime/export/artifact-scene-frame.test.ts +84 -0
  46. package/templates/runtime/export/artifact-scene-frame.ts +118 -0
  47. package/templates/runtime/export/export-background.ts +46 -0
  48. package/templates/runtime/export/export-error.ts +43 -0
  49. package/templates/runtime/export/export.test.ts +49 -226
  50. package/templates/runtime/export/image-artifact-export.test.ts +111 -0
  51. package/templates/runtime/export/image-artifact-export.ts +145 -0
  52. package/templates/runtime/export/index.ts +44 -3
  53. package/templates/runtime/export/product-export-renderer.test.ts +77 -0
  54. package/templates/runtime/export/product-export-renderer.ts +63 -0
  55. package/templates/runtime/export/video-artifact-export.test.ts +166 -0
  56. package/templates/runtime/export/video-artifact-export.ts +164 -0
  57. package/templates/runtime/export/video-encoding-backend.ts +124 -0
  58. package/templates/runtime/export/video-encoding-policy.test.ts +68 -0
  59. package/templates/runtime/export/video-encoding-policy.ts +86 -0
  60. package/templates/runtime/export/video-frame-schedule.test.ts +58 -0
  61. package/templates/runtime/export/video-frame-schedule.ts +42 -0
  62. package/templates/runtime/index.ts +3 -0
  63. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  64. package/templates/runtime/react/app-shell/runtime-public-api-runtime.test.tsx +291 -0
  65. package/templates/runtime/react/app-shell/runtime-public-api-test-support.ts +21 -0
  66. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +15 -304
  67. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +41 -27
  68. package/templates/runtime/react/app-shell/toolcraft-app.tsx +39 -11
  69. package/templates/runtime/react/app-shell/toolcraft-source-asset-context.test.tsx +16 -57
  70. package/templates/runtime/react/app-shell/toolcraft-source-asset-context.tsx +75 -434
  71. package/templates/runtime/react/app-shell/toolcraft-source-asset-owner.test.ts +194 -0
  72. package/templates/runtime/react/app-shell/toolcraft-source-asset-owner.ts +227 -0
  73. package/templates/runtime/react/app-shell/toolcraft-source-asset-provider-ownership.test.tsx +243 -0
  74. package/templates/runtime/react/app-shell/toolcraft-source-asset-test-support.ts +51 -0
  75. package/templates/runtime/react/app-shell/toolcraft-unavailable-resource-proof.test.ts +138 -0
  76. package/templates/runtime/react/app-shell/toolcraft-unavailable-resource-proof.ts +378 -0
  77. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +76 -0
  78. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  79. package/templates/runtime/react/canvas/canvas-shell.tsx +16 -1
  80. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  81. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  82. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  83. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  84. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  85. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  86. package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +7 -12
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +18 -84
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +62 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  90. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +43 -87
  91. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +68 -0
  92. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  93. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  94. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +10 -8
  95. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +3 -3
  96. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  97. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  98. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  99. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  100. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  101. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  102. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  106. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  107. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  108. package/templates/runtime/react/index.ts +4 -0
  109. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  110. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  111. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  112. package/templates/runtime/react/panel-host/panel-host-runtime-placement.test.tsx +30 -0
  113. package/templates/runtime/react/panel-host/panel-host.tsx +4 -0
  114. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  115. package/templates/runtime/scene/scene-bounds.ts +32 -19
  116. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  117. package/templates/runtime/schema/canvas-render-scale.ts +62 -0
  118. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  119. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  120. package/templates/runtime/schema/control-applicability.ts +433 -0
  121. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  122. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  123. package/templates/runtime/schema/controls-panel-section-id.test.ts +1 -1
  124. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  125. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +62 -3
  126. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  127. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  128. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  129. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  130. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  131. package/templates/runtime/schema/define-toolcraft.setup-background.test.ts +1 -1
  132. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  133. package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +71 -3
  134. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  135. package/templates/runtime/schema/define-toolcraft.ts +1 -1
  136. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  137. package/templates/runtime/schema/schema-resolvers.ts +0 -56
  138. package/templates/runtime/schema/types.ts +72 -17
  139. package/templates/runtime/state/canvas-background-state.ts +6 -0
  140. package/templates/runtime/testing/performance-render-plan-integration.test.ts +64 -0
  141. package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +18 -1
  142. package/templates/starter/AGENTS.md +18 -15
  143. package/templates/starter/NOTICE.md +6 -0
  144. package/templates/starter/docs/toolcraft/README.md +2 -1
  145. package/templates/starter/docs/toolcraft/acceptance-testing.md +23 -35
  146. package/templates/starter/docs/toolcraft/agent-worklog.md +18 -3
  147. package/templates/starter/docs/toolcraft/assembly-workflow.md +13 -5
  148. package/templates/starter/docs/toolcraft/component-rules.md +8 -6
  149. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  150. package/templates/starter/docs/toolcraft/core/layout.md +7 -7
  151. package/templates/starter/docs/toolcraft/core/media-upload.md +4 -2
  152. package/templates/starter/docs/toolcraft/core/performance.md +14 -3
  153. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +16 -3
  154. package/templates/starter/docs/toolcraft/core/setup-export.md +49 -19
  155. package/templates/starter/docs/toolcraft/core/timeline-animation.md +4 -4
  156. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  157. package/templates/starter/docs/toolcraft/decision-contract.md +3 -1
  158. package/templates/starter/docs/toolcraft/performance.md +20 -6
  159. package/templates/starter/docs/toolcraft/renderer-technique.md +5 -1
  160. package/templates/starter/docs/toolcraft/schema-reference.md +23 -25
  161. package/templates/starter/docs/toolcraft/workflow.md +7 -2
  162. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  163. package/templates/starter/e2e/app-browser-control-coverage.spec.ts +33 -0
  164. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +50 -3
  165. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  166. package/templates/starter/e2e/app-browser-render-scale-evidence.spec.ts +60 -6
  167. package/templates/starter/e2e/app-browser-render-scale-requirements.spec.ts +77 -1
  168. package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +8 -0
  169. package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +35 -0
  170. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +5 -34
  171. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -16
  172. package/templates/starter/e2e/app-browser-shell.spec.ts +13 -5
  173. package/templates/starter/e2e/app-performance-path-adapters.ts +8 -1
  174. package/templates/starter/e2e/app-performance.spec.ts +16 -9
  175. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  176. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  177. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +29 -341
  178. package/templates/starter/e2e/browser-infinity-canvas-unavailable-image-evidence.ts +370 -0
  179. package/templates/starter/e2e/browser-media-export-evidence.spec.ts +77 -0
  180. package/templates/starter/e2e/browser-media-export-evidence.ts +208 -0
  181. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  182. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  183. package/templates/starter/e2e/browser-render-scale-evidence.ts +37 -29
  184. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  185. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +13 -3
  186. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +72 -35
  187. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +25 -0
  188. package/templates/starter/e2e/browser-standard-timeline-evidence.ts +106 -0
  189. package/templates/starter/e2e/decoded-pixel-observation.spec.ts +74 -0
  190. package/templates/starter/e2e/decoded-pixel-observation.ts +227 -0
  191. package/templates/starter/e2e/export-artifact-helpers.ts +206 -25
  192. package/templates/starter/e2e/image-artifact-inspection.spec.ts +41 -0
  193. package/templates/starter/e2e/image-artifact-inspection.ts +99 -0
  194. package/templates/starter/e2e/performance-canvas-helpers.ts +22 -21
  195. package/templates/starter/e2e/performance-canvas-quality-guard.spec.ts +312 -0
  196. package/templates/starter/e2e/performance-canvas-quality-guard.ts +196 -0
  197. package/templates/starter/e2e/performance-canvas-quality-observer.ts +351 -0
  198. package/templates/starter/e2e/performance-control-layout-helpers.ts +2 -2
  199. package/templates/starter/e2e/performance-path-adapter-contract.ts +4 -4
  200. package/templates/starter/e2e/performance-path-helpers.spec.ts +203 -70
  201. package/templates/starter/e2e/performance-path-helpers.ts +210 -91
  202. package/templates/starter/e2e/performance-pipeline-evidence-continuity.spec.ts +76 -0
  203. package/templates/starter/e2e/performance-pipeline-evidence-test-fixtures.ts +11 -2
  204. package/templates/starter/e2e/performance-pipeline-invariants.ts +47 -4
  205. package/templates/starter/e2e/performance-render-scale-runner.spec.ts +140 -38
  206. package/templates/starter/e2e/video-artifact-inspection.spec.ts +64 -0
  207. package/templates/starter/e2e/video-artifact-inspection.ts +281 -0
  208. package/templates/starter/gitignore +1 -0
  209. package/templates/starter/package.json +1 -0
  210. package/templates/starter/scripts/check-toolcraft-docs.mjs +17 -0
  211. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  212. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +60 -0
  213. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +7 -2
  214. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +7 -3
  215. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +95 -103
  216. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  217. package/templates/starter/scripts/toolcraft-product-boundary.mjs +12 -0
  218. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -26
  219. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  220. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  221. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  222. package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +85 -20
  223. package/templates/starter/scripts/toolcraft-product-evidence-import-policy.mjs +43 -0
  224. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +157 -0
  225. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +196 -0
  226. package/templates/starter/scripts/toolcraft-typescript-analysis.d.mts +73 -0
  227. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  228. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  229. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade-test-helpers.mjs +318 -0
  230. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +157 -206
  231. package/templates/starter/scripts/toolcraft-verification-inventory.mjs +1 -0
  232. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +51 -0
  233. package/templates/starter/scripts/toolcraft-vite-env-activation.test.mjs +128 -59
  234. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +130 -0
  235. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  236. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  237. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -20
  238. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  239. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -13
  240. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  241. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  242. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  243. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  244. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  245. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  246. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +3 -10
  247. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  248. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  249. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  250. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  251. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  252. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  253. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +113 -0
  254. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  255. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  256. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  257. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  258. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +18 -10
  259. package/templates/starter/src/app/acceptance/output-export-model.ts +54 -11
  260. package/templates/starter/src/app/acceptance/output-export.ts +35 -12
  261. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  262. package/templates/starter/src/app/acceptance/types.ts +30 -8
  263. package/templates/starter/src/app/acceptance/validate-coverage.ts +20 -2
  264. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +239 -0
  265. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +33 -0
  266. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +16 -1
  267. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +65 -0
  268. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  269. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +112 -16
  270. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +224 -0
  271. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  272. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  273. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  274. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  275. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +131 -0
  276. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +22 -0
  277. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +37 -9
  278. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +12 -0
  279. package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +14 -4
  280. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  281. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
  282. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +384 -0
  283. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +46 -1
  284. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +112 -105
  285. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +12 -0
  286. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +1 -1
  287. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  288. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  289. package/templates/starter/src/app/starter-acceptance.ts +13 -2
  290. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +336 -0
  291. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +8 -0
  292. package/templates/starter/src/app/starter-performance-test-utils.ts +103 -0
  293. package/templates/starter/src/app/starter-performance.gates.test.ts +231 -278
  294. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +261 -0
  295. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +4 -2
  296. package/templates/starter/src/routes/index.tsx +2 -0
  297. package/templates/ui/components/composites/tabs.tsx +2 -2
  298. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  299. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  300. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  301. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  302. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  303. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  304. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  305. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  306. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  307. package/templates/ui/components/controls/index.ts +3 -0
  308. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  309. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  310. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  311. package/templates/runtime/export/export.ts +0 -166
  312. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  313. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
@@ -0,0 +1,131 @@
1
+ import { defineToolcraft } from "@repo/toolcraft-runtime";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { getToolcraftExportArtifactCoverageErrors } from "./acceptance/export-artifact-coverage";
5
+ import type { ToolcraftComponentAcceptance } from "./acceptance/types";
6
+
7
+ function createSchema(roles: readonly ("export-image" | "export-video")[]) {
8
+ return defineToolcraft({
9
+ canvas: { enabled: true },
10
+ panels: {
11
+ controls: {
12
+ sections: [
13
+ {
14
+ controls: {
15
+ output: {
16
+ actions: roles.map((role) => ({
17
+ label: role === "export-image" ? "Export Image" : "Export Video",
18
+ role,
19
+ value: role === "export-image" ? "export.image" : "export.video",
20
+ })),
21
+ target: "actions.output",
22
+ type: "panelActions",
23
+ },
24
+ },
25
+ },
26
+ ],
27
+ title: "Controls",
28
+ },
29
+ },
30
+ });
31
+ }
32
+
33
+ function createAcceptance(
34
+ overrides: Partial<ToolcraftComponentAcceptance> = {},
35
+ ): ToolcraftComponentAcceptance {
36
+ return {
37
+ actionCoverage: ["export.image"],
38
+ automated: true,
39
+ automatedTestName: "exports image",
40
+ browser: true,
41
+ browserTestName: "browser: exports image",
42
+ componentType: "panelActions",
43
+ evidence: "exported-bytes",
44
+ expectedObservable: "Downloads decoded image output.",
45
+ fixture: "image export fixture",
46
+ id: "actions.output",
47
+ kind: "control",
48
+ target: "actions.output",
49
+ userAction: "Click Export Image.",
50
+ ...overrides,
51
+ };
52
+ }
53
+
54
+ describe("Toolcraft export artifact acceptance", () => {
55
+ it("requires exact image coverage for an image action", () => {
56
+ const schema = createSchema(["export-image"]);
57
+
58
+ expect(
59
+ getToolcraftExportArtifactCoverageErrors({
60
+ acceptance: [createAcceptance()],
61
+ schema,
62
+ }),
63
+ ).toContainEqual(
64
+ expect.stringContaining("all-required-image-export-behavior"),
65
+ );
66
+ expect(
67
+ getToolcraftExportArtifactCoverageErrors({
68
+ acceptance: [
69
+ createAcceptance({
70
+ exportArtifactCoverage: "all-required-image-export-behavior",
71
+ }),
72
+ ],
73
+ schema,
74
+ }),
75
+ ).toEqual([]);
76
+ });
77
+
78
+ it("does not allow image coverage to satisfy video", () => {
79
+ const errors = getToolcraftExportArtifactCoverageErrors({
80
+ acceptance: [
81
+ createAcceptance({
82
+ actionCoverage: ["export.video"],
83
+ exportArtifactCoverage: "all-required-image-export-behavior",
84
+ }),
85
+ ],
86
+ schema: createSchema(["export-video"]),
87
+ });
88
+
89
+ expect(errors).toEqual([
90
+ expect.stringContaining("without a matching typed export action"),
91
+ expect.stringContaining("all-required-video-export-behavior"),
92
+ ]);
93
+ });
94
+
95
+ it("requires exported bytes plus automated browser proof", () => {
96
+ const errors = getToolcraftExportArtifactCoverageErrors({
97
+ acceptance: [
98
+ createAcceptance({
99
+ automated: false,
100
+ browser: false,
101
+ evidence: "command-side-effect",
102
+ exportArtifactCoverage: "all-required-image-export-behavior",
103
+ }),
104
+ ],
105
+ schema: createSchema(["export-image"]),
106
+ });
107
+
108
+ expect(errors).toEqual([
109
+ expect.stringContaining('evidence is not "exported-bytes"'),
110
+ expect.stringContaining("requires automated and browser proof"),
111
+ expect.stringContaining("all-required-image-export-behavior"),
112
+ ]);
113
+ });
114
+
115
+ it("allows one row to cover both typed actions explicitly", () => {
116
+ expect(
117
+ getToolcraftExportArtifactCoverageErrors({
118
+ acceptance: [
119
+ createAcceptance({
120
+ actionCoverage: ["export.image", "export.video"],
121
+ exportArtifactCoverage: [
122
+ "all-required-image-export-behavior",
123
+ "all-required-video-export-behavior",
124
+ ],
125
+ }),
126
+ ],
127
+ schema: createSchema(["export-image", "export-video"]),
128
+ }),
129
+ ).toEqual([]);
130
+ });
131
+ });
@@ -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 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: {
@@ -3,12 +3,26 @@ 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
+ video: { mode: "not-requested" },
15
+ });
16
+
17
+ const imageAndVideoProductReadiness = makeExportSettingsProductReadiness({
18
+ image: { mode: "toolcraft-default" },
19
+ video: {
20
+ evidence: "The user explicitly requested video delivery.",
21
+ mode: "user-requested",
22
+ },
23
+ });
24
+
25
+ describe("Toolcraft image export settings acceptance contract", () => {
12
26
  it("requires still-output apps to expose image export format and resolution settings", () => {
13
27
  const schemaWithoutImageExportSettings = defineContractSchemaFixture({
14
28
  canvas: {
@@ -58,13 +72,15 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
58
72
  componentType: "panelActions",
59
73
  evidence: "exported-bytes",
60
74
  expectedObservable: "Export PNG creates output bytes and reads image format, image resolution, background color, and include-background state.",
75
+ exportArtifactCoverage: "all-required-image-export-behavior",
61
76
  fixture: "export fixture",
62
77
  id: "actions.output",
63
78
  kind: "control",
64
79
  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.",
80
+ userAction: "Toggle Include off, verify preview has no product background, export PNG with alpha, and verify the image artifact preserves transparency.",
66
81
  },
67
82
  ],
83
+ productReadiness: imageOnlyProductReadiness,
68
84
  }),
69
85
  ).toEqual(
70
86
  expect.arrayContaining([
@@ -142,6 +158,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
142
158
  componentType: "panelActions",
143
159
  evidence: "exported-bytes",
144
160
  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.",
161
+ exportArtifactCoverage: "all-required-image-export-behavior",
145
162
  fixture: "export fixture",
146
163
  id: "actions.output",
147
164
  kind: "control",
@@ -149,6 +166,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
149
166
  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
167
  },
151
168
  ],
169
+ productReadiness: imageOnlyProductReadiness,
152
170
  }),
153
171
  ).not.toEqual(
154
172
  expect.arrayContaining([
@@ -159,7 +177,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
159
177
  );
160
178
  });
161
179
 
162
- it("requires animated apps with PNG and video actions to expose Image Export before Video Export", () => {
180
+ it("requires explicit image-plus-video delivery to expose Image Export before Video Export", () => {
163
181
  const schemaWithoutImageSettings = defineContractSchemaFixture({
164
182
  canvas: {
165
183
  enabled: true,
@@ -211,19 +229,24 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
211
229
  {
212
230
  actionCoverage: ["export.video", "export.png"],
213
231
  automated: true,
214
- automatedTestName: "exports animated and still output",
232
+ automatedTestName: "exports image and explicitly requested video output",
215
233
  browser: true,
216
234
  browserTestName: "browser: exports video and image output",
217
235
  componentType: "panelActions",
218
236
  evidence: "exported-bytes",
219
237
  expectedObservable: "Export Video and Export PNG both create output bytes and read their runtime export settings.",
220
- fixture: "animated export fixture",
238
+ exportArtifactCoverage: [
239
+ "all-required-image-export-behavior",
240
+ "all-required-video-export-behavior",
241
+ ],
242
+ fixture: "explicit image-plus-video export fixture",
221
243
  id: "actions.output",
222
244
  kind: "control",
223
245
  target: "actions.output",
224
- userAction: "Export video and PNG from the same timeline state, then verify both files exist.",
246
+ userAction: "Export video and PNG with their configured settings, then verify both files exist.",
225
247
  },
226
248
  ],
249
+ productReadiness: imageAndVideoProductReadiness,
227
250
  }),
228
251
  ).toEqual(
229
252
  expect.arrayContaining([
@@ -234,7 +257,7 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
234
257
  );
235
258
  });
236
259
 
237
- it("accepts animated apps with Image Export immediately before Video Export", () => {
260
+ it("accepts explicit image-plus-video delivery with Image Export immediately before Video Export", () => {
238
261
  const schemaWithDualExportSettings = defineContractSchemaFixture({
239
262
  canvas: {
240
263
  enabled: true,
@@ -303,19 +326,24 @@ describe("Toolcraft image and video export settings acceptance contract", () =>
303
326
  {
304
327
  actionCoverage: ["export.video", "export.png"],
305
328
  automated: true,
306
- automatedTestName: "exports animated and still output",
329
+ automatedTestName: "exports image and explicitly requested video output",
307
330
  browser: true,
308
331
  browserTestName: "browser: exports video and image output",
309
332
  componentType: "panelActions",
310
333
  evidence: "exported-bytes",
311
334
  expectedObservable: "Export Video and Export PNG both create output bytes and read their runtime export settings.",
312
- fixture: "animated export fixture",
335
+ exportArtifactCoverage: [
336
+ "all-required-image-export-behavior",
337
+ "all-required-video-export-behavior",
338
+ ],
339
+ fixture: "explicit image-plus-video export fixture",
313
340
  id: "actions.output",
314
341
  kind: "control",
315
342
  target: "actions.output",
316
343
  userAction: "Choose JPG and 8K, choose MP4 and Current, then export PNG and video and verify both outputs use their selected settings.",
317
344
  },
318
345
  ],
346
+ productReadiness: imageAndVideoProductReadiness,
319
347
  }),
320
348
  ).not.toEqual(
321
349
  expect.arrayContaining([
@@ -100,6 +100,10 @@ function readiness(
100
100
  interactionOwnership: readonly ToolcraftInteractionOwnershipEntry[],
101
101
  ): ToolcraftProductReadiness {
102
102
  return {
103
+ exportIntent: {
104
+ image: { mode: "toolcraft-default" },
105
+ video: { mode: "not-requested" },
106
+ },
103
107
  interactionOwnership,
104
108
  mode: "product",
105
109
  productName: "Interaction fixture",
@@ -151,6 +155,10 @@ function acceptance({
151
155
  describe("Toolcraft interaction surface ownership", () => {
152
156
  it("runs ownership validation through the protected acceptance pipeline", () => {
153
157
  const productReadiness = {
158
+ exportIntent: {
159
+ image: { mode: "toolcraft-default" },
160
+ video: { mode: "not-requested" },
161
+ },
154
162
  mode: "product",
155
163
  productName: "Legacy fixture",
156
164
  productSummary: "A product declaration created before interaction ownership.",
@@ -172,6 +180,10 @@ describe("Toolcraft interaction surface ownership", () => {
172
180
 
173
181
  it("rejects product readiness that omits the ownership inventory", () => {
174
182
  const productReadiness = {
183
+ exportIntent: {
184
+ image: { mode: "toolcraft-default" },
185
+ video: { mode: "not-requested" },
186
+ },
175
187
  mode: "product",
176
188
  productName: "Legacy fixture",
177
189
  productSummary: "A product declaration created before interaction ownership.",
@@ -4,7 +4,6 @@ import type { ToolcraftControlSchema } from "@repo/toolcraft-runtime";
4
4
  import type { ToolcraftComponentAcceptance } from "./acceptance/types";
5
5
  import {
6
6
  defineContractSchemaFixture,
7
- contractSchemaFixture,
8
7
  validateContractAcceptance,
9
8
  } from "./starter-acceptance.contract-fixtures";
10
9
 
@@ -63,9 +62,11 @@ function createKeyframesSchema(
63
62
  title = "Style",
64
63
  ) {
65
64
  return defineContractSchemaFixture({
66
- ...contractSchemaFixture,
65
+ canvas: {
66
+ enabled: true,
67
+ upload: true,
68
+ },
67
69
  panels: {
68
- ...contractSchemaFixture.panels,
69
70
  controls: {
70
71
  sections: [
71
72
  {
@@ -75,7 +76,16 @@ function createKeyframesSchema(
75
76
  ],
76
77
  title: "Controls",
77
78
  },
78
- timeline: { defaultDurationSeconds: 8, enabled: true, mode: "keyframes" as const },
79
+ timeline: {
80
+ defaultDurationSeconds: 8,
81
+ enabled: true,
82
+ mode: "keyframes",
83
+ },
84
+ },
85
+ toolbar: {
86
+ history: true,
87
+ radar: true,
88
+ zoom: true,
79
89
  },
80
90
  });
81
91
  }
@@ -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,10 @@ import {
15
15
  } from "./starter-acceptance.media-upload.fixtures";
16
16
 
17
17
  const layeredMediaProductReadiness: ToolcraftProductReadiness = {
18
+ exportIntent: {
19
+ image: { mode: "toolcraft-default" },
20
+ video: { mode: "not-requested" },
21
+ },
18
22
  interactionOwnership: [
19
23
  {
20
24
  alternative: {
@@ -284,6 +288,30 @@ describe("Toolcraft media upload acceptance coverage", () => {
284
288
  ).toEqual([]);
285
289
  });
286
290
 
291
+ it("does not require reorder coverage from collection-actions upload slots", () => {
292
+ const schema = createMultipleFileDropSchema({ collectionActions: true });
293
+
294
+ const errors = validateContractAcceptance({
295
+ schema,
296
+ acceptance: [
297
+ createFileDropAcceptance({
298
+ automatedTestName: "source files add and remove slots",
299
+ browserTestName: "browser: source files add and remove slots",
300
+ expectedObservable:
301
+ "Compact plus adds an empty upload slot and compact minus removes the final slot or attached file.",
302
+ fixture: "source file fixture",
303
+ id: "media.sources",
304
+ mediaLifecycleCoverage: ["upload", "remove", "reset"],
305
+ target: "media.sources",
306
+ userAction:
307
+ "Add an upload slot, attach a file, remove the final slot, and reset.",
308
+ }),
309
+ ],
310
+ });
311
+
312
+ expect(errors.filter((error) => error.includes("reorder"))).toEqual([]);
313
+ });
314
+
287
315
  it("assigns reorder and selected image transform proof to Layers without duplicating fileDrop claims", () => {
288
316
  const fileDropSchema = createMultipleFileDropSchema();
289
317
  const layeredSchema = {