@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
@@ -1,21 +1,15 @@
1
1
  import { expect, type Page } from "@playwright/test";
2
2
 
3
3
  import { attachToolcraftBrowserRuntimeEvidence } from "./browser-runtime-evidence";
4
- import {
5
- assertToolcraftBrowserProofSession,
6
- getToolcraftBrowserActionTarget,
7
- readToolcraftBrowserObservation,
8
- runToolcraftBrowserAction,
9
- runToolcraftBrowserValueAction,
10
- type ToolcraftBrowserAction,
11
- type ToolcraftBrowserObservation,
12
- type ToolcraftBrowserProofSession,
13
- } from "./browser-proof-session";
14
- import {
15
- assertToolcraftProducedArtifact,
16
- validateToolcraftExportArtifactInspection,
17
- type ToolcraftExportArtifactInspection,
18
- } from "./export-artifact-helpers";
4
+
5
+ export {
6
+ createToolcraftUnavailableImageResourceFixture,
7
+ expectToolcraftInfinityCanvasUnavailableImageExportEvidence,
8
+ } from "./browser-infinity-canvas-unavailable-image-evidence";
9
+ export type {
10
+ ToolcraftUnavailableImageResourceFixture,
11
+ ToolcraftUnavailableImageResourceObservation,
12
+ } from "./browser-infinity-canvas-unavailable-image-evidence";
19
13
 
20
14
  export type InfinityCanvasObservation = Readonly<{
21
15
  artboardPresent: boolean;
@@ -24,6 +18,7 @@ export type InfinityCanvasObservation = Readonly<{
24
18
  finiteControlSize: { height: number; width: number } | null;
25
19
  finiteControlsPresent: boolean;
26
20
  overflow: string;
21
+ productSceneStatus: "empty" | "ready" | "unavailable" | null;
27
22
  sceneRect: { height: number; width: number; x: number; y: number } | null;
28
23
  viewportOffset: { x: number; y: number };
29
24
  }>;
@@ -97,18 +92,17 @@ export async function observeInfinityCanvasBackground(
97
92
 
98
93
  export async function observeInfinityCanvas(
99
94
  page: Page,
100
- sceneSelector?: string,
101
95
  ): Promise<InfinityCanvasObservation> {
102
- return page.evaluate((selector) => {
96
+ return page.evaluate(() => {
103
97
  const surface = document.querySelector<HTMLElement>(
104
98
  "[data-toolcraft-canvas-mode]",
105
99
  );
106
100
  const world = document.querySelector<HTMLElement>(
107
101
  "[data-toolcraft-canvas-world]",
108
102
  );
109
- const scene = selector
110
- ? document.querySelector<HTMLElement>(selector)
111
- : null;
103
+ const productScene = document.querySelector<HTMLElement>(
104
+ "[data-toolcraft-product-scene]",
105
+ );
112
106
  const finiteControlsPresent = [
113
107
  "canvas.aspectRatio",
114
108
  "canvas.size.width",
@@ -144,7 +138,7 @@ export async function observeInfinityCanvas(
144
138
  const parsed = Number.parseFloat(value ?? "");
145
139
  return Number.isFinite(parsed) ? parsed : null;
146
140
  };
147
- const style = scene?.style;
141
+ const style = productScene?.style;
148
142
  const sceneValues = style
149
143
  ? {
150
144
  height: read(style.height),
@@ -162,11 +156,11 @@ export async function observeInfinityCanvas(
162
156
  y: sceneValues.y!,
163
157
  }
164
158
  : null;
159
+ const productSceneStatus =
160
+ productScene?.dataset.toolcraftProductSceneStatus;
165
161
 
166
162
  return {
167
- artboardPresent: Boolean(
168
- editableCanvas,
169
- ),
163
+ artboardPresent: Boolean(editableCanvas),
170
164
  canvasMode: surface?.getAttribute("data-toolcraft-canvas-mode") ?? null,
171
165
  finiteCanvasSize:
172
166
  canvasWidth === null || canvasHeight === null
@@ -178,13 +172,19 @@ export async function observeInfinityCanvas(
178
172
  : { height: controlHeight, width: controlWidth },
179
173
  finiteControlsPresent,
180
174
  overflow: surface ? getComputedStyle(surface).overflow : "missing",
175
+ productSceneStatus:
176
+ productSceneStatus === "ready" ||
177
+ productSceneStatus === "empty" ||
178
+ productSceneStatus === "unavailable"
179
+ ? productSceneStatus
180
+ : null,
181
181
  sceneRect,
182
182
  viewportOffset: {
183
183
  x: Number(world?.dataset.toolcraftCanvasOffsetX ?? 0),
184
184
  y: Number(world?.dataset.toolcraftCanvasOffsetY ?? 0),
185
185
  },
186
186
  };
187
- }, sceneSelector);
187
+ });
188
188
  }
189
189
 
190
190
  export function expectInfiniteCanvasObservation(
@@ -197,7 +197,10 @@ export function expectInfiniteCanvasObservation(
197
197
  expect(observation.finiteControlSize).toEqual(null);
198
198
  expect(observation.finiteControlsPresent).toBe(false);
199
199
  expect(observation.overflow).toBe("visible");
200
- if (expectedSceneRect) expect(observation.sceneRect).toEqual(expectedSceneRect);
200
+ if (expectedSceneRect) {
201
+ expect(observation.productSceneStatus).toBe("ready");
202
+ expect(observation.sceneRect).toEqual(expectedSceneRect);
203
+ }
201
204
  expect(Number.isFinite(observation.viewportOffset.x)).toBe(true);
202
205
  expect(Number.isFinite(observation.viewportOffset.y)).toBe(true);
203
206
  }
@@ -367,321 +370,6 @@ export async function expectToolcraftInfinityCanvasImageExportEvidence(
367
370
  });
368
371
  }
369
372
 
370
- declare const toolcraftUnavailableImageResourceFixtureBrand: unique symbol;
371
-
372
- export type ToolcraftUnavailableImageResourceObservation = Readonly<{
373
- assetId?: string;
374
- fileName?: string;
375
- lifecycle?: "ready" | "unavailable";
376
- message?: string;
377
- requestId?: string;
378
- resolverAvailable?: boolean;
379
- status: "active" | "cleaned" | "error" | "missing";
380
- }>;
381
-
382
- export type ToolcraftUnavailableImageResourceFixture = Readonly<{
383
- readonly [toolcraftUnavailableImageResourceFixtureBrand]: true;
384
- }>;
385
-
386
- type ToolcraftUnavailableImageResourceFixtureRecord = Readonly<{
387
- activate: ToolcraftBrowserAction;
388
- cleanup: ToolcraftBrowserAction;
389
- fileName: string;
390
- observe: ToolcraftBrowserObservation<ToolcraftUnavailableImageResourceObservation>;
391
- requestId: string;
392
- session: ToolcraftBrowserProofSession;
393
- target: string;
394
- }>;
395
-
396
- const unavailableImageResourceFixtureRecords = new WeakMap<
397
- object,
398
- ToolcraftUnavailableImageResourceFixtureRecord
399
- >();
400
- let unavailableImageResourceFixtureSequence = 0;
401
-
402
- function requireUnavailableImageResourceFixture(
403
- fixture: ToolcraftUnavailableImageResourceFixture,
404
- ): ToolcraftUnavailableImageResourceFixtureRecord {
405
- const record =
406
- typeof fixture === "object" && fixture !== null
407
- ? unavailableImageResourceFixtureRecords.get(fixture)
408
- : undefined;
409
- if (!record) {
410
- throw new Error(
411
- "Unavailable-image export evidence requires the protected Toolcraft unavailable-resource fixture facade.",
412
- );
413
- }
414
- return record;
415
- }
416
-
417
- function validateUnavailableImageResourceObservation(
418
- observation: ToolcraftUnavailableImageResourceObservation,
419
- expected: Readonly<{
420
- fileName: string;
421
- requestId: string;
422
- status: "active" | "cleaned";
423
- }>,
424
- ): void {
425
- if (observation.status === "error") {
426
- throw new Error(
427
- observation.message ??
428
- "The Toolcraft unavailable-resource proof fixture failed.",
429
- );
430
- }
431
- expect(
432
- observation,
433
- `Unavailable-resource proof "${expected.requestId}" must publish its exact typed state.`,
434
- ).toMatchObject(
435
- expected.status === "active"
436
- ? {
437
- fileName: expected.fileName,
438
- lifecycle: "unavailable",
439
- requestId: expected.requestId,
440
- resolverAvailable: false,
441
- status: "active",
442
- }
443
- : {
444
- fileName: expected.fileName,
445
- lifecycle: "ready",
446
- requestId: expected.requestId,
447
- resolverAvailable: true,
448
- status: "cleaned",
449
- },
450
- );
451
- expect(
452
- observation.assetId?.trim(),
453
- "Unavailable-resource proof must identify the exact affected runtime asset.",
454
- ).toBeTruthy();
455
- }
456
-
457
- export function createToolcraftUnavailableImageResourceFixture(
458
- session: ToolcraftBrowserProofSession,
459
- {
460
- fileName,
461
- sourceTarget,
462
- target,
463
- }: Readonly<{
464
- fileName: string;
465
- sourceTarget?: string;
466
- target: string;
467
- }>,
468
- ): ToolcraftUnavailableImageResourceFixture {
469
- const normalizedFileName = fileName.trim();
470
- const normalizedSourceTarget = sourceTarget?.trim();
471
- const normalizedTarget = target.trim();
472
- expect(
473
- normalizedFileName,
474
- "Unavailable-resource proof requires an exact non-empty image file name.",
475
- ).not.toBe("");
476
- expect(
477
- normalizedTarget,
478
- "Unavailable-resource proof requires an exact semantic acceptance target.",
479
- ).not.toBe("");
480
- if (sourceTarget !== undefined) {
481
- expect(
482
- normalizedSourceTarget,
483
- "Unavailable-resource proof sourceTarget must be non-empty when provided.",
484
- ).not.toBe("");
485
- }
486
-
487
- const requestId =
488
- `unavailable-image-${++unavailableImageResourceFixtureSequence}`;
489
- const request = {
490
- fileName: normalizedFileName,
491
- requestId,
492
- ...(normalizedSourceTarget
493
- ? { sourceTarget: normalizedSourceTarget }
494
- : {}),
495
- };
496
- const runRequest = (
497
- action: "activate" | "cleanup",
498
- expectedStatus: "active" | "cleaned",
499
- ) =>
500
- session.targetAction(normalizedTarget, async (page) => {
501
- await page.evaluate(
502
- ({ detail, eventName }) => {
503
- document.dispatchEvent(
504
- new CustomEvent(eventName, {
505
- detail,
506
- }),
507
- );
508
- },
509
- {
510
- detail: { ...request, action },
511
- eventName:
512
- "toolcraft.browser-proof.unavailable-resource-request",
513
- },
514
- );
515
- await expect
516
- .poll(
517
- async () => {
518
- const raw = await page
519
- .locator('[data-slot="toolcraft-runtime-app"]')
520
- .getAttribute(
521
- "data-toolcraft-unavailable-resource-evidence",
522
- );
523
- if (!raw) return "missing";
524
- const observation = JSON.parse(
525
- raw,
526
- ) as ToolcraftUnavailableImageResourceObservation;
527
- if (
528
- observation.requestId === requestId &&
529
- observation.status === "error"
530
- ) {
531
- throw new Error(
532
- observation.message ??
533
- "The Toolcraft unavailable-resource proof fixture failed.",
534
- );
535
- }
536
- return observation.requestId === requestId
537
- ? observation.status
538
- : "other-request";
539
- },
540
- {
541
- message:
542
- `Unavailable-resource proof "${requestId}" should reach ${expectedStatus}.`,
543
- },
544
- )
545
- .toBe(expectedStatus);
546
- });
547
- const activate = runRequest("activate", "active");
548
- const cleanup = runRequest("cleanup", "cleaned");
549
- const observe = session.observe((root) => {
550
- const raw = root.getAttribute(
551
- "data-toolcraft-unavailable-resource-evidence",
552
- );
553
- if (!raw) {
554
- return { status: "missing" as const };
555
- }
556
- try {
557
- return JSON.parse(
558
- raw,
559
- ) as ToolcraftUnavailableImageResourceObservation;
560
- } catch {
561
- return {
562
- message: "Unavailable-resource proof published malformed state.",
563
- status: "error" as const,
564
- };
565
- }
566
- });
567
- const fixture = Object.freeze({}) as ToolcraftUnavailableImageResourceFixture;
568
- unavailableImageResourceFixtureRecords.set(fixture, {
569
- activate,
570
- cleanup,
571
- fileName: normalizedFileName,
572
- observe,
573
- requestId,
574
- session,
575
- target: normalizedTarget,
576
- });
577
- return fixture;
578
- }
579
-
580
- export async function expectToolcraftInfinityCanvasUnavailableImageExportEvidence<
581
- TArtifact,
582
- >(
583
- fixture: ToolcraftUnavailableImageResourceFixture,
584
- produceArtifact: ToolcraftBrowserAction<"interaction", TArtifact>,
585
- inspectArtifact: (
586
- artifact: TArtifact,
587
- ) => Promise<ToolcraftExportArtifactInspection> | ToolcraftExportArtifactInspection,
588
- {
589
- expectedSize,
590
- requirementId,
591
- }: Readonly<{
592
- expectedSize: Readonly<{ height: number; width: number }>;
593
- requirementId: string;
594
- }>,
595
- ): Promise<ToolcraftExportArtifactInspection> {
596
- const record = requireUnavailableImageResourceFixture(fixture);
597
- assertToolcraftBrowserProofSession(
598
- record.observe,
599
- record.activate,
600
- record.cleanup,
601
- produceArtifact,
602
- );
603
- const exportTarget = getToolcraftBrowserActionTarget(produceArtifact)?.trim();
604
- expect(
605
- exportTarget,
606
- "Unavailable-image export evidence requires a target-scoped artifact action.",
607
- ).toBe(record.target);
608
-
609
- let activationAttempted = false;
610
- let cleanupSucceeded = false;
611
- let inspection: ToolcraftExportArtifactInspection | null = null;
612
- let outputVerified = false;
613
- try {
614
- activationAttempted = true;
615
- await runToolcraftBrowserAction(record.activate);
616
- validateUnavailableImageResourceObservation(
617
- await readToolcraftBrowserObservation(record.observe),
618
- {
619
- fileName: record.fileName,
620
- requestId: record.requestId,
621
- status: "active",
622
- },
623
- );
624
-
625
- const artifact = await runToolcraftBrowserValueAction(produceArtifact);
626
- assertToolcraftProducedArtifact(artifact, requirementId);
627
- inspection = await inspectArtifact(artifact);
628
- validateToolcraftExportArtifactInspection(inspection, requirementId);
629
- expect(
630
- inspection,
631
- `Unavailable-image export "${requirementId}" must decode to the expected visible scene bounds.`,
632
- ).toMatchObject(expectedSize);
633
- validateUnavailableImageResourceObservation(
634
- await readToolcraftBrowserObservation(record.observe),
635
- {
636
- fileName: record.fileName,
637
- requestId: record.requestId,
638
- status: "active",
639
- },
640
- );
641
- outputVerified = true;
642
- } finally {
643
- const current = activationAttempted
644
- ? await readToolcraftBrowserObservation(record.observe)
645
- : null;
646
- if (
647
- current?.requestId === record.requestId &&
648
- current.status === "active"
649
- ) {
650
- await runToolcraftBrowserAction(record.cleanup);
651
- validateUnavailableImageResourceObservation(
652
- await readToolcraftBrowserObservation(record.observe),
653
- {
654
- fileName: record.fileName,
655
- requestId: record.requestId,
656
- status: "cleaned",
657
- },
658
- );
659
- cleanupSucceeded = true;
660
- } else if (outputVerified) {
661
- throw new Error(
662
- "Unavailable-image export evidence requires the exact active fixture to remain available for deterministic cleanup.",
663
- );
664
- }
665
- }
666
-
667
- if (!cleanupSucceeded || !inspection) {
668
- throw new Error(
669
- "Unavailable-image export evidence requires successful fixture cleanup before publication.",
670
- );
671
- }
672
- await attachToolcraftBrowserRuntimeEvidence({
673
- evidenceType: "exported-artifact",
674
- requirementId,
675
- target: exportTarget,
676
- });
677
- await attachToolcraftBrowserRuntimeEvidence({
678
- evidenceType: "infinity-scene-bounds-image-export",
679
- requirementId,
680
- target: exportTarget,
681
- });
682
- return inspection;
683
- }
684
-
685
373
  export async function expectToolcraftInfinityCanvasVideoExportEvidence(
686
374
  artifacts: Readonly<{
687
375
  finite: Readonly<{