@pixel-point/toolcraft 0.0.14 → 0.0.15

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 (577) hide show
  1. package/README.md +13 -2
  2. package/package.json +1 -1
  3. package/scripts/prepare-pack.mjs +2 -28
  4. package/src/cli-io.mjs +174 -0
  5. package/src/cli-package-manager-flow.test.mjs +206 -0
  6. package/src/cli.mjs +7 -495
  7. package/src/cli.test.mjs +34 -177
  8. package/src/create-command.mjs +152 -0
  9. package/src/create-options.mjs +194 -0
  10. package/src/generate-test-assertions.mjs +27 -0
  11. package/src/generate-test-doc-assertions.mjs +162 -0
  12. package/src/generate-test-file-assertions.mjs +251 -0
  13. package/src/generate-test-fs-utils.mjs +59 -0
  14. package/src/generate-test-integrity-assertions.mjs +30 -0
  15. package/src/generate-test-integrity-framework-assertions.mjs +222 -0
  16. package/src/generate-test-integrity-manifest-assertions.mjs +150 -0
  17. package/src/generate-test-integrity-ownership-assertions.mjs +127 -0
  18. package/src/generate-test-integrity-test-utils.mjs +102 -0
  19. package/src/generate-test-package-assertions.mjs +75 -0
  20. package/src/generate-test-product-fixture.mjs +84 -0
  21. package/src/generate-test-product-fixture.test.mjs +73 -0
  22. package/src/generate-test-standalone-assertions.mjs +209 -0
  23. package/src/generate-transactional.test.mjs +151 -0
  24. package/src/generate.mjs +182 -102
  25. package/src/generate.test.mjs +242 -338
  26. package/src/generated-integrity-manifest.mjs +127 -0
  27. package/src/generated-integrity-manifest.test.mjs +151 -0
  28. package/src/generated-source-policy.mjs +22 -0
  29. package/src/generated-source-policy.test.mjs +35 -0
  30. package/src/generated-target-policy.mjs +55 -0
  31. package/src/generation-transaction.mjs +135 -0
  32. package/src/generation-transaction.test.mjs +74 -0
  33. package/src/package-json.mjs +18 -1
  34. package/src/package-json.test.mjs +38 -5
  35. package/src/package-manager.mjs +2 -0
  36. package/src/package-manager.test.mjs +5 -1
  37. package/src/packaged-template-fallback.test.mjs +126 -0
  38. package/src/prepare-pack-templates.mjs +34 -0
  39. package/templates/runtime/contracts/component-contract-builders.ts +95 -0
  40. package/templates/runtime/contracts/component-contracts.choices.test.ts +293 -0
  41. package/templates/runtime/contracts/component-contracts.choices.ts +322 -0
  42. package/templates/runtime/contracts/component-contracts.inputs.test.ts +210 -0
  43. package/templates/runtime/contracts/component-contracts.inputs.ts +252 -0
  44. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +116 -0
  45. package/templates/runtime/contracts/component-contracts.media-custom.ts +144 -0
  46. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +229 -0
  47. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +76 -0
  48. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +135 -0
  49. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +148 -0
  50. package/templates/runtime/contracts/component-contracts.runtime.ts +361 -0
  51. package/templates/runtime/contracts/component-contracts.test.ts +39 -1458
  52. package/templates/runtime/contracts/component-contracts.ts +44 -1505
  53. package/templates/runtime/contracts/component-contracts.visual.test.ts +316 -0
  54. package/templates/runtime/contracts/component-contracts.visual.ts +385 -0
  55. package/templates/runtime/contracts/contract-manifest.test.ts +64 -0
  56. package/templates/runtime/contracts/decision-contracts.test.ts +29 -4
  57. package/templates/runtime/contracts/decision-contracts.ts +38 -1
  58. package/templates/runtime/index.ts +1 -0
  59. package/templates/runtime/react/{runtime-public-api.test.tsx → app-shell/runtime-public-api.test.tsx} +29 -7
  60. package/templates/runtime/react/{settings-transfer.test.ts → app-shell/settings-transfer.test.ts} +4 -4
  61. package/templates/runtime/react/{settings-transfer.ts → app-shell/settings-transfer.ts} +3 -3
  62. package/templates/runtime/react/{toolbar-panel.test.tsx → app-shell/toolbar-panel.test.tsx} +2 -2
  63. package/templates/runtime/react/{toolbar-panel.tsx → app-shell/toolbar-panel.tsx} +3 -3
  64. package/templates/runtime/react/{toolcraft-app.integration.test.tsx → app-shell/toolcraft-app.integration.test.tsx} +6 -6
  65. package/templates/runtime/react/{toolcraft-app.test.tsx → app-shell/toolcraft-app.test.tsx} +3 -3
  66. package/templates/runtime/react/{toolcraft-app.tsx → app-shell/toolcraft-app.tsx} +11 -8
  67. package/templates/runtime/react/{toolcraft-root.test.tsx → app-shell/toolcraft-root.test.tsx} +1 -1
  68. package/templates/runtime/react/{toolcraft-root.tsx → app-shell/toolcraft-root.tsx} +5 -5
  69. package/templates/runtime/react/{use-toolcraft.ts → app-shell/use-toolcraft.ts} +1 -1
  70. package/templates/runtime/react/canvas/canvas-default-media-layer.tsx +81 -0
  71. package/templates/runtime/react/canvas/canvas-media-transform.ts +33 -0
  72. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +156 -0
  73. package/templates/runtime/react/canvas/canvas-shell-media-rendering.test.tsx +87 -0
  74. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +102 -0
  75. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +108 -0
  76. package/templates/runtime/react/canvas/canvas-shell-upload.test.tsx +106 -0
  77. package/templates/runtime/react/canvas/canvas-shell.tsx +146 -0
  78. package/templates/runtime/react/canvas/canvas-upload-routing.ts +84 -0
  79. package/templates/runtime/react/{media-file.ts → canvas/media-file.ts} +1 -1
  80. package/templates/runtime/react/canvas/use-canvas-drop-import.ts +145 -0
  81. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +227 -0
  82. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +89 -0
  83. package/templates/runtime/react/{controls-panel-filedrop-reorder.test.tsx → controls-panel/__tests__/controls-panel-filedrop-reorder.test.tsx} +4 -4
  84. package/templates/runtime/react/controls-panel/__tests__/controls-panel.actions-layout.test.tsx +91 -0
  85. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +213 -0
  86. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +366 -0
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-picker-models.test.tsx +169 -0
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.compound-layout.test.tsx +160 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +352 -0
  90. package/templates/runtime/react/controls-panel/__tests__/controls-panel.curves.test.tsx +226 -0
  91. package/templates/runtime/react/controls-panel/__tests__/controls-panel.floating-shell.test.tsx +13 -0
  92. package/templates/runtime/react/controls-panel/__tests__/controls-panel.font-picker.test.tsx +302 -0
  93. package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +401 -0
  94. package/templates/runtime/react/controls-panel/__tests__/controls-panel.gradient-control.test.tsx +139 -0
  95. package/templates/runtime/react/controls-panel/__tests__/controls-panel.help-policy.test.tsx +103 -0
  96. package/templates/runtime/react/controls-panel/__tests__/controls-panel.image-picker.test.tsx +16 -0
  97. package/templates/runtime/react/controls-panel/__tests__/controls-panel.inline-layout.test.tsx +290 -0
  98. package/templates/runtime/react/controls-panel/__tests__/controls-panel.keyframes.test.tsx +175 -0
  99. package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-files.test.tsx +121 -0
  100. package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-image.test.tsx +363 -0
  101. package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-multi-image.test.tsx +105 -0
  102. package/templates/runtime/react/controls-panel/__tests__/controls-panel.range-slider-editing.test.tsx +149 -0
  103. package/templates/runtime/react/controls-panel/__tests__/controls-panel.section-shell.test.tsx +138 -0
  104. package/templates/runtime/react/controls-panel/__tests__/controls-panel.select-layout.test.tsx +148 -0
  105. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +189 -0
  106. package/templates/runtime/react/controls-panel/__tests__/controls-panel.slider-rendering.test.tsx +317 -0
  107. package/templates/runtime/react/controls-panel/__tests__/controls-panel.state-reset.test.tsx +137 -0
  108. package/templates/runtime/react/controls-panel/__tests__/controls-panel.structure.test.tsx +66 -0
  109. package/templates/runtime/react/controls-panel/__tests__/controls-panel.text-input.test.tsx +205 -0
  110. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +388 -0
  111. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-layout.test.tsx +155 -0
  112. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +172 -0
  113. package/templates/runtime/react/{control-conditions.ts → controls-panel/conditions/control-conditions.ts} +26 -3
  114. package/templates/runtime/react/{control-renderers.ts → controls-panel/control-renderers.ts} +2 -2
  115. package/templates/runtime/react/controls-panel/controls-panel.tsx +250 -0
  116. package/templates/runtime/react/controls-panel/keyframes/controls-panel-keyframes.tsx +265 -0
  117. package/templates/runtime/react/controls-panel/layout/controls-panel-collapse-storage.ts +131 -0
  118. package/templates/runtime/react/controls-panel/layout/controls-panel-help.tsx +132 -0
  119. package/templates/runtime/react/controls-panel/layout/controls-panel-inline-layout.tsx +311 -0
  120. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +216 -0
  121. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +401 -0
  122. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +137 -0
  123. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +421 -0
  124. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +286 -0
  125. package/templates/runtime/react/controls-panel/renderers/controls-panel-compound-renderers.tsx +366 -0
  126. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +173 -0
  127. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +23 -0
  128. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +55 -0
  129. package/templates/runtime/react/controls-panel/renderers/controls-panel-settings-transfer-renderer.tsx +45 -0
  130. package/templates/runtime/react/controls-panel/testing/controls-panel-test-utils.tsx +300 -0
  131. package/templates/runtime/react/controls-panel/values/controls-panel-aspect-ratio-values.ts +94 -0
  132. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +87 -0
  133. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +82 -0
  134. package/templates/runtime/react/controls-panel/values/controls-panel-font-values.ts +69 -0
  135. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +64 -0
  136. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +93 -0
  137. package/templates/runtime/react/controls-panel/values/controls-panel-value-primitives.ts +30 -0
  138. package/templates/runtime/react/controls-panel/values/controls-panel-values.ts +7 -0
  139. package/templates/runtime/react/index.ts +13 -13
  140. package/templates/runtime/react/{layer-tree.ts → layers/layer-tree.ts} +1 -1
  141. package/templates/runtime/react/layers/layers-panel-drag-drop.test.tsx +190 -0
  142. package/templates/runtime/react/layers/layers-panel-editing.test.tsx +41 -0
  143. package/templates/runtime/react/layers/layers-panel-insert-targets.test.ts +87 -0
  144. package/templates/runtime/react/layers/layers-panel-insert-targets.ts +254 -0
  145. package/templates/runtime/react/layers/layers-panel-model.ts +15 -0
  146. package/templates/runtime/react/layers/layers-panel-rendering.test.tsx +43 -0
  147. package/templates/runtime/react/layers/layers-panel-reorder.ts +148 -0
  148. package/templates/runtime/react/layers/layers-panel-row.tsx +475 -0
  149. package/templates/runtime/react/layers/layers-panel-test-utils.tsx +135 -0
  150. package/templates/runtime/react/layers/layers-panel-visibility.test.tsx +126 -0
  151. package/templates/runtime/react/layers/layers-panel.tsx +349 -0
  152. package/templates/runtime/react/layers/use-layers-panel-drag-controller.ts +327 -0
  153. package/templates/runtime/react/{panel-host-types.ts → panel-host/panel-host-types.ts} +2 -2
  154. package/templates/runtime/react/{panel-host.test.tsx → panel-host/panel-host.test.tsx} +3 -3
  155. package/templates/runtime/react/{panel-host.tsx → panel-host/panel-host.tsx} +1 -1
  156. package/templates/runtime/react/timeline/timeline-easing-editor.tsx +409 -0
  157. package/templates/runtime/react/timeline/timeline-easing-geometry.ts +42 -0
  158. package/templates/runtime/react/timeline/timeline-easing-icons.tsx +135 -0
  159. package/templates/runtime/react/timeline/timeline-easing-model.test.ts +87 -0
  160. package/templates/runtime/react/timeline/timeline-easing-model.ts +271 -0
  161. package/templates/runtime/react/timeline/timeline-easing-popover-content.tsx +227 -0
  162. package/templates/runtime/react/timeline/timeline-easing-popover-layout.ts +69 -0
  163. package/templates/runtime/react/timeline/timeline-easing-popover.tsx +60 -0
  164. package/templates/runtime/react/timeline/timeline-event-targets.ts +19 -0
  165. package/templates/runtime/react/timeline/timeline-expanded-content.tsx +299 -0
  166. package/templates/runtime/react/timeline/timeline-icon-button.tsx +51 -0
  167. package/templates/runtime/react/timeline/timeline-keyframe-row.tsx +360 -0
  168. package/templates/runtime/react/timeline/timeline-keyframes.ts +23 -0
  169. package/templates/runtime/react/timeline/timeline-panel-floating-layout.test.tsx +328 -0
  170. package/templates/runtime/react/timeline/timeline-panel-header.tsx +404 -0
  171. package/templates/runtime/react/timeline/timeline-panel-keyframes.test.tsx +90 -0
  172. package/templates/runtime/react/timeline/timeline-panel-layout.ts +30 -0
  173. package/templates/runtime/react/timeline/timeline-panel-responsive-layout.ts +182 -0
  174. package/templates/runtime/react/timeline/timeline-panel-test-utils.tsx +88 -0
  175. package/templates/runtime/react/timeline/timeline-panel-transport.test.tsx +202 -0
  176. package/templates/runtime/react/timeline/timeline-panel-upload.test.tsx +53 -0
  177. package/templates/runtime/react/timeline/timeline-panel.tsx +449 -0
  178. package/templates/runtime/react/timeline/timeline-playback-hooks.ts +254 -0
  179. package/templates/runtime/schema/assembly-contract.ts +271 -0
  180. package/templates/runtime/schema/control-schema-normalization.ts +55 -0
  181. package/templates/runtime/schema/controls-panel-actions.ts +141 -0
  182. package/templates/runtime/schema/controls-panel-layout-groups.ts +144 -0
  183. package/templates/runtime/schema/controls-panel-normalization.ts +19 -0
  184. package/templates/runtime/schema/controls-panel-section-layout.ts +140 -0
  185. package/templates/runtime/schema/controls-panel-section-titles.ts +161 -0
  186. package/templates/runtime/schema/define-toolcraft-test-utils.ts +18 -0
  187. package/templates/runtime/schema/define-toolcraft.actions.test.ts +182 -0
  188. package/templates/runtime/schema/define-toolcraft.assembly.test.ts +246 -0
  189. package/templates/runtime/schema/define-toolcraft.canvas.test.ts +150 -0
  190. package/templates/runtime/schema/define-toolcraft.control-layout.test.ts +345 -0
  191. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +304 -0
  192. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +69 -0
  193. package/templates/runtime/schema/define-toolcraft.setup-persistence.test.ts +66 -0
  194. package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +116 -0
  195. package/templates/runtime/schema/define-toolcraft.setup-settings-transfer.test.ts +291 -0
  196. package/templates/runtime/schema/define-toolcraft.ts +24 -1449
  197. package/templates/runtime/schema/panels-schema-normalization.ts +49 -0
  198. package/templates/runtime/schema/runtime-section-titles.ts +1 -0
  199. package/templates/runtime/schema/runtime-setup-section.ts +282 -0
  200. package/templates/runtime/schema/schema-resolvers.ts +168 -0
  201. package/templates/runtime/schema/types.ts +17 -0
  202. package/templates/runtime/state/canvas-reducer.ts +106 -0
  203. package/templates/runtime/state/canvas-state.ts +209 -0
  204. package/templates/runtime/state/controls-reducer.ts +277 -0
  205. package/templates/runtime/state/history-patches.ts +174 -0
  206. package/templates/runtime/state/layer-state.ts +12 -0
  207. package/templates/runtime/state/layers-reducer.ts +318 -0
  208. package/templates/runtime/state/media-reducer.ts +283 -0
  209. package/templates/runtime/state/media-state.ts +105 -0
  210. package/templates/runtime/state/panels-reducer.ts +58 -0
  211. package/templates/runtime/state/persistence-merge.ts +53 -0
  212. package/templates/runtime/state/persistence-reader-canvas.ts +27 -0
  213. package/templates/runtime/state/persistence-reader-layers.ts +73 -0
  214. package/templates/runtime/state/persistence-reader-media.ts +82 -0
  215. package/templates/runtime/state/persistence-reader-panels.ts +56 -0
  216. package/templates/runtime/state/persistence-reader-primitives.ts +27 -0
  217. package/templates/runtime/state/persistence-reader-timeline.ts +145 -0
  218. package/templates/runtime/state/persistence-reader-values.ts +40 -0
  219. package/templates/runtime/state/persistence-readers.ts +72 -0
  220. package/templates/runtime/state/persistence-shared.ts +23 -0
  221. package/templates/runtime/state/persistence-snapshot.ts +57 -0
  222. package/templates/runtime/state/persistence.ts +16 -581
  223. package/templates/runtime/state/reducer-canvas-panels.test.ts +324 -0
  224. package/templates/runtime/state/reducer-controls.test.ts +158 -0
  225. package/templates/runtime/state/reducer-layers.test.ts +306 -0
  226. package/templates/runtime/state/reducer-media-import-sizing.test.ts +197 -0
  227. package/templates/runtime/state/reducer-media-reorder-history.test.ts +116 -0
  228. package/templates/runtime/state/reducer-media-reset.test.ts +249 -0
  229. package/templates/runtime/state/reducer-media-test-utils.ts +40 -0
  230. package/templates/runtime/state/reducer-media-transform.test.ts +52 -0
  231. package/templates/runtime/state/reducer-test-utils.ts +30 -0
  232. package/templates/runtime/state/reducer-timeline.test.ts +242 -0
  233. package/templates/runtime/state/reducer.ts +57 -1785
  234. package/templates/runtime/state/timeline-reducer.ts +412 -0
  235. package/templates/runtime/state/timeline-values.test.ts +45 -0
  236. package/templates/runtime/state/timeline-values.ts +45 -0
  237. package/templates/runtime/testing/performance-browser-policy.test.ts +81 -0
  238. package/templates/runtime/testing/performance-browser-policy.ts +102 -0
  239. package/templates/runtime/testing/performance-budget-validation.ts +84 -0
  240. package/templates/runtime/testing/performance-control-classification.test.ts +106 -0
  241. package/templates/runtime/testing/performance-control-classification.ts +101 -0
  242. package/templates/runtime/testing/performance-coverage-context.ts +44 -0
  243. package/templates/runtime/testing/performance-coverage-renderer-policy.ts +221 -0
  244. package/templates/runtime/testing/performance-coverage-scenario-policy.ts +147 -0
  245. package/templates/runtime/testing/performance-coverage-target-policy.ts +121 -0
  246. package/templates/runtime/testing/performance-coverage-validator.ts +34 -0
  247. package/templates/runtime/testing/performance-export-coverage.test.ts +234 -0
  248. package/templates/runtime/testing/performance-fixture-load-profile.test.ts +360 -0
  249. package/templates/runtime/testing/performance-fixture-media.test.ts +80 -0
  250. package/templates/runtime/testing/performance-fixture-stress.test.ts +314 -0
  251. package/templates/runtime/testing/performance-fixture-validation.ts +255 -0
  252. package/templates/runtime/testing/performance-fixture-values.ts +275 -0
  253. package/templates/runtime/testing/performance-fixture-workload.test.ts +140 -0
  254. package/templates/runtime/testing/performance-load-profile-validation.ts +467 -0
  255. package/templates/runtime/testing/performance-renderer-coverage.test.ts +325 -0
  256. package/templates/runtime/testing/performance-renderer-pipeline-coverage.test.ts +115 -0
  257. package/templates/runtime/testing/performance-renderer-pipeline-interactions.test.ts +201 -0
  258. package/templates/runtime/testing/performance-renderer-pipeline-passes.test.ts +247 -0
  259. package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +360 -0
  260. package/templates/runtime/testing/performance-renderer-technique-validation.ts +329 -0
  261. package/templates/runtime/testing/performance-renderer-technique.test.ts +275 -0
  262. package/templates/runtime/testing/performance-renderer-validation.ts +2 -0
  263. package/templates/runtime/testing/performance-scenario-coverage.test.ts +303 -0
  264. package/templates/runtime/testing/performance-scenario-validation.ts +49 -0
  265. package/templates/runtime/testing/performance-schema-derived-workloads.test.ts +231 -0
  266. package/templates/runtime/testing/performance-schema-queries.ts +181 -0
  267. package/templates/runtime/testing/performance-test-fixtures/index.ts +4 -0
  268. package/templates/runtime/testing/performance-test-fixtures/renderer-pipelines.ts +322 -0
  269. package/templates/runtime/testing/performance-test-fixtures/scenarios.ts +172 -0
  270. package/templates/runtime/testing/performance-test-fixtures/schemas.ts +151 -0
  271. package/templates/runtime/testing/performance-test-fixtures/stress-fixtures.ts +133 -0
  272. package/templates/runtime/testing/performance-test-fixtures.ts +1 -0
  273. package/templates/runtime/testing/performance-types.ts +338 -0
  274. package/templates/runtime/testing/performance.ts +15 -2485
  275. package/templates/starter/AGENTS.md +41 -26
  276. package/templates/starter/LICENSE.md +18 -95
  277. package/templates/starter/NOTICE.md +3 -3
  278. package/templates/starter/docs/toolcraft/README.md +5 -5
  279. package/templates/starter/docs/toolcraft/acceptance-testing.md +36 -8
  280. package/templates/starter/docs/toolcraft/assembly-workflow.md +12 -15
  281. package/templates/starter/docs/toolcraft/component-rules.md +6 -2
  282. package/templates/starter/docs/toolcraft/core/layout.md +1 -0
  283. package/templates/starter/docs/toolcraft/core/performance.md +7 -4
  284. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +11 -4
  285. package/templates/starter/docs/toolcraft/core/timeline-animation.md +1 -0
  286. package/templates/starter/docs/toolcraft/custom-controls.md +8 -1
  287. package/templates/starter/docs/toolcraft/decision-contract.md +26 -22
  288. package/templates/starter/docs/toolcraft/performance.md +42 -16
  289. package/templates/starter/docs/toolcraft/schema-reference.md +34 -23
  290. package/templates/starter/docs/toolcraft/workflow.md +25 -17
  291. package/templates/starter/e2e/app-browser-acceptance-evidence.spec.ts +111 -0
  292. package/templates/starter/e2e/app-browser-control-coverage.spec.ts +118 -0
  293. package/templates/starter/e2e/app-browser-performance-evidence.spec.ts +217 -0
  294. package/templates/starter/e2e/app-browser-performance-probe.spec.ts +322 -0
  295. package/templates/starter/e2e/app-browser-proof-session.spec.ts +196 -0
  296. package/templates/starter/e2e/app-browser-runtime-evidence.spec.ts +9 -0
  297. package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +240 -0
  298. package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +180 -0
  299. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +310 -0
  300. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +432 -0
  301. package/templates/starter/e2e/app-browser-shell.spec.ts +171 -0
  302. package/templates/starter/e2e/app-browser-timeline-layers-reference.spec.ts +70 -0
  303. package/templates/starter/e2e/app-performance.spec.ts +0 -491
  304. package/templates/starter/e2e/browser-acceptance-outcome-helpers.ts +97 -0
  305. package/templates/starter/e2e/browser-acceptance-transition-helpers.ts +74 -0
  306. package/templates/starter/e2e/browser-conditional-output-evidence-helpers.ts +230 -0
  307. package/templates/starter/e2e/browser-control-target-helpers.ts +109 -0
  308. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +229 -0
  309. package/templates/starter/e2e/browser-proof-session.ts +392 -0
  310. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +136 -0
  311. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +290 -0
  312. package/templates/starter/e2e/browser-runtime-evidence.ts +27 -0
  313. package/templates/starter/e2e/browser-state-evidence-helpers.ts +205 -0
  314. package/templates/starter/e2e/browser-timeline-evidence-helpers.ts +319 -0
  315. package/templates/starter/e2e/canvas-handle-helpers.ts +86 -4
  316. package/templates/starter/e2e/export-artifact-helpers.ts +132 -0
  317. package/templates/starter/e2e/performance-budget-helpers.ts +159 -0
  318. package/templates/starter/e2e/performance-canvas-helpers.ts +123 -0
  319. package/templates/starter/e2e/performance-control-helpers.ts +3 -0
  320. package/templates/starter/e2e/performance-control-layout-helpers.ts +161 -0
  321. package/templates/starter/e2e/performance-fixture-helpers.ts +217 -0
  322. package/templates/starter/e2e/performance-frame-probe.ts +247 -0
  323. package/templates/starter/e2e/performance-helpers.ts +6 -854
  324. package/templates/starter/e2e/performance-interaction-measurement.ts +251 -0
  325. package/templates/starter/e2e/performance-measurement-evidence.ts +72 -0
  326. package/templates/starter/e2e/performance-output-action-helpers.spec.ts +43 -0
  327. package/templates/starter/e2e/performance-output-action-helpers.ts +109 -0
  328. package/templates/starter/e2e/performance-probe-helpers.ts +12 -0
  329. package/templates/starter/e2e/performance-render-scale-helpers.ts +55 -0
  330. package/templates/starter/e2e/performance-slider-helpers.ts +271 -0
  331. package/templates/starter/e2e/product-observable-helpers.ts +72 -17
  332. package/templates/starter/e2e/stable-outcome-helpers.ts +208 -0
  333. package/templates/starter/package.json +10 -5
  334. package/templates/starter/playwright.config.ts +5 -2
  335. package/templates/starter/scripts/check-ai-skills.mjs +14 -8
  336. package/templates/starter/scripts/check-ai-skills.test.mjs +64 -0
  337. package/templates/starter/scripts/check-toolcraft-code-health.mjs +108 -0
  338. package/templates/starter/scripts/check-toolcraft-code-health.test.mjs +213 -0
  339. package/templates/starter/scripts/check-toolcraft-docs.mjs +47 -34
  340. package/templates/starter/scripts/check-toolcraft-integrity.mjs +141 -144
  341. package/templates/starter/scripts/run-browser-performance.mjs +118 -0
  342. package/templates/starter/scripts/run-browser-performance.test.mjs +53 -0
  343. package/templates/starter/scripts/toolcraft-code-health-core.mjs +297 -0
  344. package/templates/starter/scripts/toolcraft-contract-doc-integrity.mjs +77 -0
  345. package/templates/starter/scripts/toolcraft-contract-doc-integrity.test.mjs +81 -0
  346. package/templates/starter/scripts/toolcraft-contract-manifest.json +113 -0
  347. package/templates/starter/scripts/toolcraft-contract-manifest.mjs +128 -0
  348. package/templates/starter/scripts/toolcraft-contract-manifest.test.mjs +72 -0
  349. package/templates/starter/scripts/toolcraft-integrity-manifest.mjs +172 -0
  350. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +60 -0
  351. package/templates/starter/scripts/toolcraft-product-boundary-ast-utils.mjs +23 -0
  352. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +264 -0
  353. package/templates/starter/scripts/toolcraft-product-boundary-test-fixtures.mjs +16 -0
  354. package/templates/starter/scripts/toolcraft-product-boundary.mjs +243 -0
  355. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +289 -0
  356. package/templates/starter/scripts/toolcraft-product-dependency-graph.mjs +176 -0
  357. package/templates/starter/scripts/toolcraft-product-dependency-graph.test.mjs +196 -0
  358. package/templates/starter/scripts/toolcraft-product-dependency-resolution.mjs +279 -0
  359. package/templates/starter/scripts/toolcraft-product-evidence-boundary-ast.mjs +91 -0
  360. package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +138 -0
  361. package/templates/starter/scripts/toolcraft-product-style-boundary.mjs +219 -0
  362. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +46 -0
  363. package/templates/starter/scripts/toolcraft-source-inventory.mjs +187 -0
  364. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +132 -0
  365. package/templates/starter/scripts/toolcraft-source-ownership.mjs +167 -0
  366. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +113 -0
  367. package/templates/starter/scripts/toolcraft-static-string.mjs +104 -0
  368. package/templates/starter/scripts/toolcraft-verification-inventory.mjs +123 -0
  369. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +19 -0
  370. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +284 -0
  371. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +282 -0
  372. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +32 -0
  373. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +88 -0
  374. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +87 -0
  375. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +109 -0
  376. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +111 -0
  377. package/templates/starter/scripts/toolcraft-workflow-routes.mjs +314 -0
  378. package/templates/starter/scripts/toolcraft-workflow-routes.test.mjs +204 -0
  379. package/templates/starter/src/app/acceptance/actions.ts +30 -0
  380. package/templates/starter/src/app/acceptance/animation-intent.ts +184 -0
  381. package/templates/starter/src/app/acceptance/canvas-handle-acceptance.ts +70 -0
  382. package/templates/starter/src/app/acceptance/color-bank-labels.ts +164 -0
  383. package/templates/starter/src/app/acceptance/conditions.ts +80 -0
  384. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +70 -0
  385. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +271 -0
  386. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +149 -0
  387. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +189 -0
  388. package/templates/starter/src/app/acceptance/control-acceptance.ts +70 -0
  389. package/templates/starter/src/app/acceptance/control-component-rules.ts +277 -0
  390. package/templates/starter/src/app/acceptance/control-labels.ts +223 -0
  391. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +107 -0
  392. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +104 -0
  393. package/templates/starter/src/app/acceptance/control-layout-model.ts +159 -0
  394. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +164 -0
  395. package/templates/starter/src/app/acceptance/control-layout.ts +45 -0
  396. package/templates/starter/src/app/acceptance/control-order.ts +123 -0
  397. package/templates/starter/src/app/acceptance/control-parts.ts +47 -0
  398. package/templates/starter/src/app/acceptance/control-section-inventory.ts +183 -0
  399. package/templates/starter/src/app/acceptance/controls.ts +27 -0
  400. package/templates/starter/src/app/acceptance/coverage.ts +81 -0
  401. package/templates/starter/src/app/acceptance/custom-controls.ts +140 -0
  402. package/templates/starter/src/app/acceptance/inline-layout.ts +192 -0
  403. package/templates/starter/src/app/acceptance/media-upload.ts +55 -0
  404. package/templates/starter/src/app/acceptance/output-background-rules.ts +135 -0
  405. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +76 -0
  406. package/templates/starter/src/app/acceptance/output-export-actions.ts +34 -0
  407. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +46 -0
  408. package/templates/starter/src/app/acceptance/output-export-model.ts +146 -0
  409. package/templates/starter/src/app/acceptance/output-export.ts +45 -0
  410. package/templates/starter/src/app/acceptance/output-image-export-rules.ts +87 -0
  411. package/templates/starter/src/app/acceptance/reference-runtime-coverage.ts +96 -0
  412. package/templates/starter/src/app/acceptance/reference-runtime-feature-inventory.ts +171 -0
  413. package/templates/starter/src/app/acceptance/reference-runtime-study.ts +73 -0
  414. package/templates/starter/src/app/acceptance/reference-runtime-timeline.ts +291 -0
  415. package/templates/starter/src/app/acceptance/reference-runtime.ts +99 -0
  416. package/templates/starter/src/app/acceptance/runtime-coverage.ts +290 -0
  417. package/templates/starter/src/app/acceptance/runtime-setup.ts +117 -0
  418. package/templates/starter/src/app/acceptance/section-title-rules.ts +8 -0
  419. package/templates/starter/src/app/acceptance/sections.ts +6 -0
  420. package/templates/starter/src/app/acceptance/semantic.ts +63 -0
  421. package/templates/starter/src/app/acceptance/timeline-loop.ts +21 -0
  422. package/templates/starter/src/app/acceptance/types.ts +363 -0
  423. package/templates/starter/src/app/acceptance/validate-coverage.ts +217 -0
  424. package/templates/starter/src/app/acceptance/validation-pipeline.test.ts +56 -0
  425. package/templates/starter/src/app/acceptance/validation-pipeline.ts +60 -0
  426. package/templates/starter/src/app/acceptance/video-reference-study.ts +217 -0
  427. package/templates/starter/src/app/starter-acceptance-data.ts +21 -0
  428. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +383 -0
  429. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +349 -0
  430. package/templates/starter/src/app/starter-acceptance.base-coverage.test.ts +47 -0
  431. package/templates/starter/src/app/starter-acceptance.canvas-handles.test.ts +71 -0
  432. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +199 -0
  433. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +244 -0
  434. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +63 -0
  435. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +172 -0
  436. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +387 -0
  437. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +215 -0
  438. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +274 -0
  439. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +275 -0
  440. package/templates/starter/src/app/starter-acceptance.curves-rules.test.ts +184 -0
  441. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +200 -0
  442. package/templates/starter/src/app/starter-acceptance.custom-control-coverage.test.ts +111 -0
  443. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +135 -0
  444. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +74 -0
  445. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +107 -0
  446. package/templates/starter/src/app/starter-acceptance.framework-boundary.test.ts +327 -0
  447. package/templates/starter/src/app/starter-acceptance.image-video-export-settings.test.ts +328 -0
  448. package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +242 -0
  449. package/templates/starter/src/app/starter-acceptance.layers.test.ts +203 -0
  450. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +110 -0
  451. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +153 -0
  452. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +97 -0
  453. package/templates/starter/src/app/starter-acceptance.persistence-coverage.test.ts +134 -0
  454. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +202 -0
  455. package/templates/starter/src/app/starter-acceptance.product-readiness-rules.test.ts +14 -0
  456. package/templates/starter/src/app/starter-acceptance.product-readiness-test-utils.ts +25 -0
  457. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +50 -0
  458. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +27 -0
  459. package/templates/starter/src/app/starter-acceptance.range-slider-rules.test.ts +147 -0
  460. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +197 -0
  461. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +304 -0
  462. package/templates/starter/src/app/starter-acceptance.reference-test-utils.ts +102 -0
  463. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +267 -0
  464. package/templates/starter/src/app/starter-acceptance.schema-test-utils.ts +116 -0
  465. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +373 -0
  466. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +260 -0
  467. package/templates/starter/src/app/starter-acceptance.section-titles.test.ts +180 -0
  468. package/templates/starter/src/app/starter-acceptance.setup-readiness.test.ts +205 -0
  469. package/templates/starter/src/app/starter-acceptance.slider-rules.test.ts +470 -0
  470. package/templates/starter/src/app/starter-acceptance.slider-unit-rules.test.ts +61 -0
  471. package/templates/starter/src/app/starter-acceptance.source-test-utils.ts +43 -0
  472. package/templates/starter/src/app/starter-acceptance.test-utils.ts +21 -0
  473. package/templates/starter/src/app/starter-acceptance.text-control-kind.test.ts +89 -0
  474. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +264 -0
  475. package/templates/starter/src/app/starter-acceptance.timeline-test-utils.ts +56 -0
  476. package/templates/starter/src/app/starter-acceptance.toggle-pair-layout.test.ts +200 -0
  477. package/templates/starter/src/app/starter-acceptance.toggle-parameter-layout.test.ts +277 -0
  478. package/templates/starter/src/app/starter-acceptance.ts +151 -4576
  479. package/templates/starter/src/app/starter-acceptance.video-export-test-utils.ts +37 -0
  480. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +262 -0
  481. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +428 -0
  482. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +283 -0
  483. package/templates/starter/src/app/starter-automated-runtime-evidence.test.ts +34 -0
  484. package/templates/starter/src/app/starter-composition.tsx +7 -0
  485. package/templates/starter/src/app/starter-performance-test-utils.ts +275 -0
  486. package/templates/starter/src/app/starter-performance.budgets.test.ts +374 -0
  487. package/templates/starter/src/app/starter-performance.gates.test.ts +128 -0
  488. package/templates/starter/src/app/starter-performance.renderer-source.test.ts +136 -0
  489. package/templates/starter/src/app/starter-performance.renderer-technique.test.ts +291 -0
  490. package/templates/starter/src/app/starter-performance.scenarios.test.ts +355 -0
  491. package/templates/starter/src/app/test-evidence/browser-runtime-contract.test.ts +253 -0
  492. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +243 -0
  493. package/templates/starter/src/routes/index.tsx +11 -2
  494. package/templates/starter/vite.config.ts +8 -0
  495. package/templates/ui/components/controls/color/color-control-types.ts +38 -0
  496. package/templates/ui/components/controls/color/color-control.tsx +19 -437
  497. package/templates/ui/components/controls/color/color-footer.tsx +272 -0
  498. package/templates/ui/components/controls/color/color-model-slider.tsx +271 -0
  499. package/templates/ui/components/controls/color/color-opacity-input.tsx +94 -0
  500. package/templates/ui/components/controls/color/color-surface.tsx +194 -0
  501. package/templates/ui/components/controls/color/color-value-control.tsx +159 -0
  502. package/templates/ui/components/controls/color/color-value-utils.ts +170 -0
  503. package/templates/ui/components/controls/color/index.ts +10 -3
  504. package/templates/ui/components/controls/color/palette-control-controller.ts +407 -0
  505. package/templates/ui/components/controls/color/palette-control-layout.ts +14 -0
  506. package/templates/ui/components/controls/color/palette-control-types.ts +50 -0
  507. package/templates/ui/components/controls/color/palette-control-view.tsx +174 -0
  508. package/templates/ui/components/controls/color/palette-control.tsx +6 -544
  509. package/templates/ui/components/controls/color/style-guide-color-picker-color-utils.ts +39 -0
  510. package/templates/ui/components/controls/color/style-guide-color-picker-controller.ts +370 -0
  511. package/templates/ui/components/controls/color/style-guide-color-picker-hue-handlers.ts +66 -0
  512. package/templates/ui/components/controls/color/style-guide-color-picker-interaction-state.ts +49 -0
  513. package/templates/ui/components/controls/color/style-guide-color-picker-interactions.ts +2 -2
  514. package/templates/ui/components/controls/color/style-guide-color-picker-model.ts +125 -0
  515. package/templates/ui/components/controls/color/style-guide-color-picker-parts.tsx +10 -707
  516. package/templates/ui/components/controls/color/style-guide-color-picker-surface-drag.ts +93 -0
  517. package/templates/ui/components/controls/color/style-guide-color-picker-surface-geometry.ts +114 -0
  518. package/templates/ui/components/controls/color/style-guide-color-picker-surface-preview.ts +45 -0
  519. package/templates/ui/components/controls/color/style-guide-color-picker-types.ts +84 -0
  520. package/templates/ui/components/controls/color/style-guide-color-picker-view.tsx +69 -0
  521. package/templates/ui/components/controls/color/style-guide-color-picker.tsx +6 -495
  522. package/templates/ui/components/controls/curves/curves-control.tsx +4 -3
  523. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +39 -515
  524. package/templates/ui/components/controls/file-drop/file-drop-empty-state.tsx +35 -0
  525. package/templates/ui/components/controls/file-drop/file-drop-file-list.tsx +160 -0
  526. package/templates/ui/components/controls/file-drop/file-drop-image-grid.tsx +175 -0
  527. package/templates/ui/components/controls/file-drop/file-drop-model.tsx +170 -0
  528. package/templates/ui/components/controls/file-drop/file-drop-single-preview.tsx +63 -0
  529. package/templates/ui/components/controls/file-drop/file-drop-types.ts +48 -0
  530. package/templates/ui/components/controls/file-drop/index.ts +2 -2
  531. package/templates/ui/components/controls/font-picker/font-picker-control.tsx +133 -906
  532. package/templates/ui/components/controls/font-picker/font-picker-footer.tsx +116 -0
  533. package/templates/ui/components/controls/font-picker/font-picker-list.tsx +194 -0
  534. package/templates/ui/components/controls/font-picker/font-picker-popover-content.tsx +191 -0
  535. package/templates/ui/components/controls/font-picker/font-picker-value.ts +222 -0
  536. package/templates/ui/components/controls/font-picker/index.ts +4 -1
  537. package/templates/ui/components/controls/font-picker/use-font-picker-preview-pipeline.ts +163 -0
  538. package/templates/ui/components/controls/font-picker/use-font-picker-virtual-list.ts +293 -0
  539. package/templates/ui/components/controls/gradient/gradient-control-utils.ts +2 -25
  540. package/templates/ui/components/controls/gradient/gradient-control.tsx +4 -464
  541. package/templates/ui/components/controls/gradient/gradient-stops-controller.ts +332 -0
  542. package/templates/ui/components/controls/gradient/gradient-stops-track.tsx +159 -0
  543. package/templates/ui/components/controls/vector/vector-control-types.ts +26 -0
  544. package/templates/ui/components/controls/vector/vector-control.tsx +10 -486
  545. package/templates/ui/components/controls/vector/vector-pad-field.tsx +211 -0
  546. package/templates/ui/components/controls/vector/vector-pad-geometry.ts +61 -0
  547. package/templates/ui/components/controls/vector/vector-pad-parts.tsx +72 -0
  548. package/templates/ui/components/controls/vector/vector-pad-variants.ts +20 -0
  549. package/templates/ui/components/controls/vector/vector-size-field.tsx +104 -0
  550. package/templates/ui/components/controls/vector/vector-value.ts +46 -0
  551. package/templates/ui/components/primitives/slider/slider-discrete-state.ts +181 -0
  552. package/templates/ui/components/primitives/slider/slider-marker-policy.ts +52 -0
  553. package/templates/ui/components/primitives/slider/slider-pointer-dragging.ts +87 -0
  554. package/templates/ui/components/primitives/slider/slider-runtime.ts +109 -0
  555. package/templates/ui/components/primitives/slider/slider-types.ts +21 -0
  556. package/templates/ui/components/primitives/slider/slider.tsx +2 -403
  557. package/templates/runtime/react/canvas-shell.test.tsx +0 -554
  558. package/templates/runtime/react/canvas-shell.tsx +0 -585
  559. package/templates/runtime/react/controls-panel.test.tsx +0 -5446
  560. package/templates/runtime/react/controls-panel.tsx +0 -3220
  561. package/templates/runtime/react/layers-panel.test.tsx +0 -487
  562. package/templates/runtime/react/layers-panel.tsx +0 -1348
  563. package/templates/runtime/react/timeline-panel.test.tsx +0 -751
  564. package/templates/runtime/react/timeline-panel.tsx +0 -3078
  565. package/templates/runtime/schema/define-toolcraft.test.ts +0 -1742
  566. package/templates/runtime/state/reducer.test.ts +0 -1703
  567. package/templates/runtime/testing/performance.test.ts +0 -3081
  568. package/templates/starter/e2e/app-browser-acceptance.spec.ts +0 -785
  569. package/templates/starter/src/app/starter-acceptance.test.ts +0 -10068
  570. package/templates/starter/src/app/starter-performance.test.ts +0 -1583
  571. package/templates/ui/components/controls/color/style-guide-color-picker-logic.ts +0 -490
  572. /package/templates/runtime/react/{storage-key-migration.ts → app-shell/storage-key-migration.ts} +0 -0
  573. /package/templates/runtime/react/{theme-runtime.tsx → app-shell/theme-runtime.tsx} +0 -0
  574. /package/templates/runtime/react/{curve-geometry.test.ts → controls-panel/__tests__/curve-geometry.test.ts} +0 -0
  575. /package/templates/runtime/react/{panel-host-config.ts → panel-host/panel-host-config.ts} +0 -0
  576. /package/templates/runtime/react/{panel-host-geometry.test.ts → panel-host/panel-host-geometry.test.ts} +0 -0
  577. /package/templates/runtime/react/{panel-host-geometry.ts → panel-host/panel-host-geometry.ts} +0 -0
@@ -0,0 +1,202 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { starterProductReadiness, starterTransferMode } from "./starter-acceptance";
4
+ import {
5
+ textLooksLikePngExport,
6
+ textLooksLikeVideoExport,
7
+ } from "./starter-acceptance.export-test-utils";
8
+ import {
9
+ getControlOptionValues,
10
+ getSchemaBackgroundControlTargets,
11
+ getSchemaImageExportSection,
12
+ getSchemaPanelActionSearchTexts,
13
+ getSchemaVideoExportSection,
14
+ getSectionControlByTarget,
15
+ getSectionControlIdByTarget,
16
+ schemaHasProductSurface,
17
+ } from "./starter-acceptance.schema-test-utils";
18
+ import { schemaRequiresVideoExport } from "./starter-acceptance.video-export-test-utils";
19
+ import { starterSchema } from "./starter-schema";
20
+
21
+ describe("Toolcraft output export acceptance contract", () => {
22
+ it("requires product output apps to expose export actions in the sticky footer", () => {
23
+ if (starterProductReadiness.mode !== "product" && !schemaHasProductSurface()) {
24
+ return;
25
+ }
26
+
27
+ const panelActionTexts = getSchemaPanelActionSearchTexts();
28
+ const backgroundColorTargets = getSchemaBackgroundControlTargets(new Set(["color"]));
29
+ const backgroundToggleTargets = getSchemaBackgroundControlTargets(
30
+ new Set(["checkbox", "select", "segmented", "switch"]),
31
+ );
32
+
33
+ expect(
34
+ panelActionTexts.length,
35
+ "Product apps must define panelActions in the controls panel sticky footer.",
36
+ ).toBeGreaterThan(0);
37
+ expect(
38
+ panelActionTexts.some(textLooksLikePngExport),
39
+ "Every product app must expose Export PNG or Download PNG through panelActions.",
40
+ ).toBe(true);
41
+ expect(
42
+ backgroundColorTargets.length,
43
+ "Every product app with Export PNG must expose a user-facing background color control.",
44
+ ).toBeGreaterThan(0);
45
+ expect(
46
+ backgroundToggleTargets.length,
47
+ 'Every product app with Export PNG must expose export.includeBackground in the required "Background" section as a Switch labeled "Include".',
48
+ ).toBeGreaterThan(0);
49
+
50
+ const imageExportSection = getSchemaImageExportSection();
51
+ const imageFormatControl = getSectionControlByTarget(
52
+ imageExportSection,
53
+ "export.image.format",
54
+ );
55
+ const imageResolutionControl = getSectionControlByTarget(
56
+ imageExportSection,
57
+ "export.image.resolution",
58
+ );
59
+ const imageFormatOptionValues = getControlOptionValues(imageFormatControl);
60
+ const imageResolutionOptionValues = getControlOptionValues(imageResolutionControl);
61
+ const imageFormatControlId = getSectionControlIdByTarget(
62
+ imageExportSection,
63
+ "export.image.format",
64
+ );
65
+ const imageResolutionControlId = getSectionControlIdByTarget(
66
+ imageExportSection,
67
+ "export.image.resolution",
68
+ );
69
+ const imageExportHasInlinePair =
70
+ imageFormatControlId === undefined || imageResolutionControlId === undefined
71
+ ? false
72
+ : imageExportSection?.layoutGroups?.some(
73
+ (group) =>
74
+ group.layout === "inline" &&
75
+ group.columns === 2 &&
76
+ group.controls.includes(imageFormatControlId) &&
77
+ group.controls.includes(imageResolutionControlId),
78
+ ) === true;
79
+
80
+ expect(
81
+ imageExportSection,
82
+ 'Apps with Export PNG must expose image settings in a separate controls section titled "Image Export".',
83
+ ).toBeDefined();
84
+ expect(
85
+ imageFormatControl,
86
+ 'The separate "Image Export" section must include a format control with target "export.image.format".',
87
+ ).toBeDefined();
88
+ expect(
89
+ imageFormatControl?.type,
90
+ "Image Export format must use the same Select/dropdown structure as Video Export.",
91
+ ).toBe("select");
92
+ expect(
93
+ imageFormatOptionValues,
94
+ 'Image format options must include "png" and "jpg".',
95
+ ).toEqual(expect.arrayContaining(["png", "jpg"]));
96
+ expect(
97
+ imageFormatControl?.defaultValue,
98
+ 'Image format must default to "png".',
99
+ ).toBe("png");
100
+ expect(
101
+ imageResolutionControl,
102
+ 'The separate "Image Export" section must include a resolution control with target "export.image.resolution".',
103
+ ).toBeDefined();
104
+ expect(
105
+ imageResolutionControl?.type,
106
+ "Image Export resolution must use the same Select/dropdown structure as Video Export.",
107
+ ).toBe("select");
108
+ expect(
109
+ imageResolutionOptionValues,
110
+ 'Image resolution options must include "2k", "4k", and "8k".',
111
+ ).toEqual(expect.arrayContaining(["2k", "4k", "8k"]));
112
+ expect(
113
+ imageResolutionControl?.defaultValue,
114
+ 'Image resolution must default to "4k".',
115
+ ).toBe("4k");
116
+ expect(
117
+ imageExportHasInlinePair,
118
+ "Image Export format and resolution must render as a compact inline pair.",
119
+ ).toBe(true);
120
+ if (!schemaRequiresVideoExport(starterSchema, starterTransferMode)) {
121
+ return;
122
+ }
123
+
124
+ const videoExportSection = getSchemaVideoExportSection();
125
+ const videoFormatControl = getSectionControlByTarget(
126
+ videoExportSection,
127
+ "export.video.format",
128
+ );
129
+ const videoResolutionControl = getSectionControlByTarget(
130
+ videoExportSection,
131
+ "export.video.resolution",
132
+ );
133
+ const videoFormatOptionValues = getControlOptionValues(videoFormatControl);
134
+ const videoResolutionOptionValues = getControlOptionValues(videoResolutionControl);
135
+ expect(
136
+ panelActionTexts.some(textLooksLikeVideoExport),
137
+ "Animated product apps must expose Export Video through panelActions in addition to Export PNG.",
138
+ ).toBe(true);
139
+ expect(
140
+ panelActionTexts.length,
141
+ "Animated product apps need separate footer delivery actions for Export Video and Export PNG.",
142
+ ).toBeGreaterThanOrEqual(2);
143
+ expect(
144
+ videoExportSection,
145
+ 'Animated product apps with Export Video must expose video settings in a separate controls section titled "Video Export".',
146
+ ).toBeDefined();
147
+ expect(
148
+ videoFormatControl,
149
+ 'The separate "Video Export" section must include a format control with target "export.video.format".',
150
+ ).toBeDefined();
151
+ expect(
152
+ ["select", "segmented"],
153
+ "Video format must be a Select or Segmented control so the user chooses a supported container instead of typing a freeform value.",
154
+ ).toContain(videoFormatControl?.type);
155
+ expect(
156
+ videoFormatOptionValues,
157
+ 'Video format options must include safe browser baseline choices: "webm" and "mp4".',
158
+ ).toEqual(expect.arrayContaining(["webm", "mp4"]));
159
+ expect(
160
+ videoResolutionControl,
161
+ 'The separate "Video Export" section must include a resolution control with target "export.video.resolution".',
162
+ ).toBeDefined();
163
+ expect(
164
+ ["select"],
165
+ "Video resolution must be a Select control with explicit output-size choices.",
166
+ ).toContain(videoResolutionControl?.type);
167
+ expect(
168
+ videoResolutionOptionValues,
169
+ 'Video resolution options must include "current" and "4k".',
170
+ ).toEqual(expect.arrayContaining(["current", "4k"]));
171
+ expect(
172
+ videoResolutionControl?.defaultValue,
173
+ 'Video resolution must default to "current".',
174
+ ).toBe("current");
175
+ expect(
176
+ videoFormatControl?.defaultValue,
177
+ 'Video format must default to "mp4".',
178
+ ).toBe("mp4");
179
+ const videoFormatControlId = getSectionControlIdByTarget(
180
+ videoExportSection,
181
+ "export.video.format",
182
+ );
183
+ const videoResolutionControlId = getSectionControlIdByTarget(
184
+ videoExportSection,
185
+ "export.video.resolution",
186
+ );
187
+ const videoExportHasInlinePair =
188
+ videoFormatControlId === undefined || videoResolutionControlId === undefined
189
+ ? false
190
+ : videoExportSection?.layoutGroups?.some(
191
+ (group) =>
192
+ group.layout === "inline" &&
193
+ group.controls.includes(videoFormatControlId) &&
194
+ group.controls.includes(videoResolutionControlId),
195
+ ) === true;
196
+
197
+ expect(
198
+ videoExportHasInlinePair,
199
+ "Video Export format and resolution must render as a compact inline pair unless a documented fit fallback is used.",
200
+ ).toBe(true);
201
+ });
202
+ });
@@ -0,0 +1,14 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { isNeutralTemplateProject } from "./starter-acceptance.product-readiness-test-utils";
4
+
5
+ describe("Toolcraft product readiness rules", () => {
6
+ it("does not classify a generated app named starter as the source template", () => {
7
+ expect(
8
+ isNeutralTemplateProject({
9
+ hasGeneratedManifest: true,
10
+ projectName: "starter",
11
+ }),
12
+ ).toBe(false);
13
+ });
14
+ });
@@ -0,0 +1,25 @@
1
+ import { existsSync } from "node:fs";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const appDir = dirname(fileURLToPath(import.meta.url));
6
+ const projectDir = join(appDir, "../..");
7
+
8
+ export type NeutralTemplateProjectSignals = {
9
+ hasGeneratedManifest: boolean;
10
+ projectName: string;
11
+ };
12
+
13
+ export function isNeutralTemplateProject(
14
+ signals: NeutralTemplateProjectSignals = {
15
+ hasGeneratedManifest: existsSync(
16
+ join(projectDir, "src/toolcraft/.toolcraft-manifest.json"),
17
+ ),
18
+ projectName: basename(projectDir),
19
+ },
20
+ ): boolean {
21
+ return (
22
+ !signals.hasGeneratedManifest &&
23
+ new Set(["starter", "toolcraft-template"]).has(signals.projectName)
24
+ );
25
+ }
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ starterProductReadiness,
5
+ starterTransferMode,
6
+ } from "./starter-acceptance";
7
+ import { isNeutralTemplateProject } from "./starter-acceptance.product-readiness-test-utils";
8
+ import { schemaHasProductSurface } from "./starter-acceptance.schema-test-utils";
9
+ import { starterSchema } from "./starter-schema";
10
+
11
+ describe("Toolcraft product readiness", () => {
12
+ it("defaults generated apps to new Toolcraft assembly mode", () => {
13
+ if (starterProductReadiness.mode !== "starter") {
14
+ return;
15
+ }
16
+
17
+ expect(starterTransferMode).toEqual({
18
+ animationIntent: { mode: "none" },
19
+ mode: "new-toolcraft-app",
20
+ });
21
+ });
22
+
23
+ it("allows neutral readiness only for the source starter/template folder", () => {
24
+ if (starterProductReadiness.mode === "product") {
25
+ expect(starterProductReadiness.productName.trim()).not.toBe("");
26
+ expect(starterProductReadiness.productSummary.trim()).not.toBe("");
27
+ expect(starterProductReadiness.requestedBehavior.trim()).not.toBe("");
28
+ expect(
29
+ schemaHasProductSurface(),
30
+ "Product readiness requires product surface: controls, layers, timeline, canvasContent, or acceptance coverage.",
31
+ ).toBe(true);
32
+ expect(
33
+ starterSchema.panels.controls,
34
+ "Generated product apps must define a controls panel so runtime Setup, product controls, background, export settings, and sticky export actions are visible.",
35
+ ).toBeTruthy();
36
+ expect(starterSchema.panels.controls?.sections[0]?.title).toBe("Setup");
37
+ return;
38
+ }
39
+
40
+ expect(starterProductReadiness.reason.trim()).not.toBe("");
41
+ expect(
42
+ isNeutralTemplateProject(),
43
+ "Renamed/generated product folders must switch product readiness from starter to product so an empty template cannot pass as an implemented app.",
44
+ ).toBe(true);
45
+ expect(
46
+ schemaHasProductSurface(),
47
+ "Neutral starter readiness must not be used after adding product controls, timeline, layers, canvasContent, or acceptance coverage.",
48
+ ).toBe(false);
49
+ });
50
+ });
@@ -0,0 +1,27 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ import { describe, expect, it } from "vitest";
6
+
7
+ import { starterProductReadiness } from "./starter-acceptance";
8
+ import { schemaHasProductSurface } from "./starter-acceptance.schema-test-utils";
9
+ import {
10
+ agentWorklogPath,
11
+ getAgentWorklogValidationErrors,
12
+ } from "./starter-acceptance.worklog-test-utils";
13
+ import { validateToolcraftPerformanceReceipt } from "../../scripts/toolcraft-verification-receipt.mjs";
14
+
15
+ const projectDir = join(dirname(fileURLToPath(import.meta.url)), "../..");
16
+
17
+ describe("Toolcraft product worklog", () => {
18
+ it("requires product apps to replace the starter worklog with decision evidence", async () => {
19
+ if (starterProductReadiness.mode !== "product" && !schemaHasProductSurface()) {
20
+ return;
21
+ }
22
+
23
+ expect(existsSync(agentWorklogPath)).toBe(true);
24
+ expect(getAgentWorklogValidationErrors(readFileSync(agentWorklogPath, "utf8"))).toEqual([]);
25
+ expect(await validateToolcraftPerformanceReceipt({ rootDir: projectDir })).toEqual([]);
26
+ });
27
+ });
@@ -0,0 +1,147 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { defineToolcraft } from "@repo/toolcraft-runtime";
3
+
4
+ import { validateContractAcceptance } from "./starter-acceptance.contract-fixtures";
5
+ import { makeControlAcceptance } from "./starter-acceptance.test-utils";
6
+
7
+ describe("starter acceptance range slider rules", () => {
8
+ it("rejects range slider defaults where lower and upper start equal", () => {
9
+ const schema = defineToolcraft({
10
+ canvas: { enabled: true },
11
+ panels: {
12
+ controls: {
13
+ sections: [
14
+ {
15
+ controls: {
16
+ opacityRange: {
17
+ defaultValue: [0, 0],
18
+ label: "Opacity",
19
+ max: 100,
20
+ min: 0,
21
+ step: 1,
22
+ target: "field.opacityRange",
23
+ type: "rangeSlider",
24
+ unit: "%",
25
+ },
26
+ },
27
+ title: "Field",
28
+ },
29
+ ],
30
+ title: "Controls",
31
+ },
32
+ },
33
+ });
34
+
35
+ expect(
36
+ validateContractAcceptance({
37
+ schema: schema,
38
+ acceptance: [
39
+ {
40
+ automated: true,
41
+ automatedTestName: "opacity range lower and upper change field output",
42
+ browser: true,
43
+ browserTestName: "browser: opacity range lower and upper change field output",
44
+ componentType: "rangeSlider",
45
+ controlPartCoverage: ["rangeSlider.lower", "rangeSlider.upper"],
46
+ evidence: "product-output",
47
+ expectedObservable: "Changing the lower and upper opacity handles changes field alpha output.",
48
+ fixture: "field opacity range fixture",
49
+ id: "field.opacityRange",
50
+ kind: "control",
51
+ target: "field.opacityRange",
52
+ userAction: "Drag both Opacity handles.",
53
+ },
54
+ ],
55
+ }),
56
+ ).toEqual(
57
+ expect.arrayContaining([
58
+ "Field / opacityRange (field.opacityRange) rangeSlider defaultValue must start with different lower and upper values so the two-thumb control does not collapse into a single-value slider.",
59
+ ]),
60
+ );
61
+ });
62
+
63
+ it("rejects inline layout groups that include range sliders", () => {
64
+ const schema = defineToolcraft({
65
+ canvas: { enabled: true },
66
+ panels: {
67
+ controls: {
68
+ sections: [
69
+ {
70
+ controls: {
71
+ opacityRange: {
72
+ defaultValue: [10, 80],
73
+ label: "Opacity",
74
+ max: 100,
75
+ min: 0,
76
+ step: 1,
77
+ target: "field.opacityRange",
78
+ type: "rangeSlider",
79
+ unit: "%",
80
+ },
81
+ speed: {
82
+ defaultValue: 1,
83
+ label: "Speed",
84
+ max: 5,
85
+ min: 0,
86
+ step: 0.1,
87
+ target: "field.speed",
88
+ type: "slider",
89
+ },
90
+ },
91
+ layoutGroups: [
92
+ {
93
+ columns: 2,
94
+ controls: ["opacityRange", "speed"],
95
+ layout: "inline",
96
+ },
97
+ ],
98
+ title: "Field",
99
+ },
100
+ ],
101
+ title: "Controls",
102
+ },
103
+ },
104
+ });
105
+
106
+ expect(
107
+ validateContractAcceptance({
108
+ schema: schema,
109
+ acceptance: [
110
+ {
111
+ automated: true,
112
+ automatedTestName: "opacity range lower and upper change field output",
113
+ browser: true,
114
+ browserTestName: "browser: opacity range lower and upper change field output",
115
+ componentType: "rangeSlider",
116
+ controlPartCoverage: ["rangeSlider.lower", "rangeSlider.upper"],
117
+ evidence: "product-output",
118
+ expectedObservable: "Changing the lower and upper opacity handles changes field alpha output.",
119
+ fixture: "field opacity range fixture",
120
+ id: "field.opacityRange",
121
+ kind: "control",
122
+ target: "field.opacityRange",
123
+ userAction: "Drag both Opacity handles.",
124
+ },
125
+ {
126
+ automated: true,
127
+ automatedTestName: "speed changes field output",
128
+ browser: true,
129
+ browserTestName: "browser: speed changes field output",
130
+ componentType: "slider",
131
+ evidence: "product-output",
132
+ expectedObservable: "Changing Speed changes field animation output.",
133
+ fixture: "field speed fixture",
134
+ id: "field.speed",
135
+ kind: "control",
136
+ target: "field.speed",
137
+ userAction: "Drag the Speed slider.",
138
+ },
139
+ ],
140
+ }),
141
+ ).toEqual(
142
+ expect.arrayContaining([
143
+ 'Field layoutGroups inline row "opacityRange, speed" includes rangeSlider opacityRange. RangeSlider is a full-width two-thumb control and must not share a row with another slider or range slider.',
144
+ ]),
145
+ );
146
+ });
147
+ });
@@ -0,0 +1,197 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ contractAcceptanceFixture,
5
+ contractSchemaFixture,
6
+ validateContractAcceptance,
7
+ } from "./starter-acceptance.contract-fixtures";
8
+ import {
9
+ makeReferenceFeatureInventory,
10
+ referenceStudyEvidence,
11
+ } from "./starter-acceptance.reference-test-utils";
12
+
13
+ describe("starter acceptance custom reference timeline contract", () => {
14
+ it("rejects downgrading custom reference timeline behavior to Toolcraft playback", () => {
15
+ expect(
16
+ validateContractAcceptance({
17
+ schema: contractSchemaFixture,
18
+ acceptance: contractAcceptanceFixture,
19
+ transferMode: {
20
+ behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
21
+ mode: "reference-runtime-clone",
22
+ referenceName: "legacy state timeline",
23
+ referenceTimeline: {
24
+ behaviorCoverage: ["state-jump", "trim-range"],
25
+ mode: "toolcraft-playback",
26
+ },
27
+ sourceOfTruth: "reference-runtime",
28
+ },
29
+ }),
30
+ ).toEqual(
31
+ expect.arrayContaining([
32
+ 'referenceTimeline mode "toolcraft-playback" cannot preserve custom reference timeline behavior "state-jump". Use mode "custom-reference-timeline" and browser-backed referenceTimelineCoverage instead.',
33
+ 'referenceTimeline mode "toolcraft-playback" cannot preserve custom reference timeline behavior "trim-range". Use mode "custom-reference-timeline" and browser-backed referenceTimelineCoverage instead.',
34
+ 'referenceTimeline behaviorCoverage "state-jump" is missing an acceptance entry with referenceTimelineCoverage "state-jump".',
35
+ 'referenceTimeline behaviorCoverage "trim-range" is missing an acceptance entry with referenceTimelineCoverage "trim-range".',
36
+ ]),
37
+ );
38
+ });
39
+
40
+ it("accepts custom reference timeline behavior only when it is test-backed", () => {
41
+ expect(
42
+ validateContractAcceptance({
43
+ schema: contractSchemaFixture,
44
+ acceptance: [
45
+ ...contractAcceptanceFixture,
46
+ {
47
+ automated: true,
48
+ automatedTestName: "reference canvas size matches legacy renderer",
49
+ browser: true,
50
+ browserTestName: "browser: reference canvas size matches legacy renderer",
51
+ componentType: "custom-renderer",
52
+ evidence: "rendered-pixels",
53
+ expectedObservable: "The Toolcraft renderer uses the same output dimensions as the reference runtime.",
54
+ fixture: "legacy renderer fixture",
55
+ id: "reference.canvasSizing",
56
+ kind: "runtime",
57
+ referenceCoverage: "canvas-sizing",
58
+ userAction: "Render the reference-sized output.",
59
+ },
60
+ {
61
+ automated: true,
62
+ automatedTestName: "reference control mapping preserves legacy output",
63
+ browser: true,
64
+ browserTestName: "browser: reference control mapping preserves legacy output",
65
+ componentType: "custom-renderer",
66
+ evidence: "product-output",
67
+ expectedObservable: "Changing each mapped control updates the same renderer parameter as the reference app.",
68
+ fixture: "legacy controls fixture",
69
+ id: "reference.controlMapping",
70
+ kind: "runtime",
71
+ referenceCoverage: "control-mapping",
72
+ userAction: "Change mapped controls and compare reference output behavior.",
73
+ },
74
+ {
75
+ automated: true,
76
+ automatedTestName: "reference renderer state preserves legacy lifecycle",
77
+ browser: true,
78
+ browserTestName: "browser: reference renderer state preserves legacy lifecycle",
79
+ componentType: "custom-renderer",
80
+ evidence: "product-output",
81
+ expectedObservable: "The renderer preserves the reference runtime mutable state lifecycle across frames.",
82
+ fixture: "legacy renderer state fixture",
83
+ id: "reference.rendererState",
84
+ kind: "runtime",
85
+ referenceCoverage: "renderer-state",
86
+ userAction: "Run the renderer across frames and compare stateful output.",
87
+ },
88
+ {
89
+ automated: true,
90
+ automatedTestName: "reference timeline state buttons preserve legacy jumps",
91
+ browser: true,
92
+ browserTestName: "browser: reference timeline state buttons preserve legacy jumps",
93
+ componentType: "custom-timeline",
94
+ evidence: "timeline-output",
95
+ expectedObservable: "Clicking each reference timeline state renders the matching legacy state.",
96
+ fixture: "legacy state timeline fixture",
97
+ id: "reference.timeline.stateJump",
98
+ kind: "runtime",
99
+ referenceTimelineCoverage: "state-jump",
100
+ userAction: "Click each reference timeline state button.",
101
+ },
102
+ {
103
+ automated: true,
104
+ automatedTestName: "reference timeline trim handles preserve legacy range",
105
+ browser: true,
106
+ browserTestName: "browser: reference timeline trim handles preserve legacy range",
107
+ componentType: "custom-timeline",
108
+ evidence: "timeline-output",
109
+ expectedObservable: "Dragging trim handles changes the same start/end state range as the reference.",
110
+ fixture: "legacy trim timeline fixture",
111
+ id: "reference.timeline.trimRange",
112
+ kind: "runtime",
113
+ referenceTimelineCoverage: "trim-range",
114
+ userAction: "Drag reference timeline trim handles.",
115
+ },
116
+ ],
117
+ transferMode: {
118
+ behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
119
+ mode: "reference-runtime-clone",
120
+ referenceFeatureInventory: makeReferenceFeatureInventory([
121
+ {
122
+ acceptanceId: "reference.timeline.stateJump",
123
+ behaviorEvidence: "Clicked the reference timeline state buttons and observed discrete renderer state jumps.",
124
+ featureName: "Timeline state jump",
125
+ id: "timeline-state-jump",
126
+ referenceBehavior: "The reference timeline state buttons jump to discrete renderer states.",
127
+ sourceEvidence: "Inspected reference timeline state button handlers.",
128
+ status: "ported",
129
+ toolcraftMapping: "The custom reference timeline control keeps the same state-jump behavior.",
130
+ },
131
+ {
132
+ acceptanceId: "reference.timeline.trimRange",
133
+ behaviorEvidence: "Dragged the reference trim handles and observed the active playback/render range change.",
134
+ featureName: "Timeline trim range",
135
+ id: "timeline-trim-range",
136
+ referenceBehavior: "The reference trim handles edit the active playback/render range.",
137
+ sourceEvidence: "Inspected reference trim handle drag behavior.",
138
+ status: "ported",
139
+ toolcraftMapping: "The custom reference timeline control keeps the same trim range behavior.",
140
+ },
141
+ ]),
142
+ referenceName: "legacy state timeline",
143
+ referenceStudy: referenceStudyEvidence,
144
+ referenceTimeline: {
145
+ behaviorCoverage: ["state-jump", "trim-range"],
146
+ mode: "custom-reference-timeline",
147
+ },
148
+ sourceOfTruth: "reference-runtime",
149
+ },
150
+ }),
151
+ ).toEqual([]);
152
+ });
153
+
154
+ it("rejects reference coverage entries outside reference-runtime-clone mode", () => {
155
+ expect(
156
+ validateContractAcceptance({
157
+ schema: contractSchemaFixture,
158
+ acceptance: [
159
+ ...contractAcceptanceFixture,
160
+ {
161
+ automated: true,
162
+ automatedTestName: "reference renderer state preserves legacy lifecycle",
163
+ browser: true,
164
+ browserTestName: "browser: reference renderer state preserves legacy lifecycle",
165
+ componentType: "custom-renderer",
166
+ evidence: "product-output",
167
+ expectedObservable: "The renderer preserves the reference runtime mutable state lifecycle across frames.",
168
+ fixture: "legacy renderer state fixture",
169
+ id: "reference.rendererState",
170
+ kind: "runtime",
171
+ referenceCoverage: "renderer-state",
172
+ userAction: "Run the renderer across frames and compare stateful output.",
173
+ },
174
+ {
175
+ automated: true,
176
+ automatedTestName: "reference timeline trim handles preserve legacy range",
177
+ browser: true,
178
+ browserTestName: "browser: reference timeline trim handles preserve legacy range",
179
+ componentType: "custom-timeline",
180
+ evidence: "timeline-output",
181
+ expectedObservable: "Dragging trim handles changes the same start/end state range as the reference.",
182
+ fixture: "legacy trim timeline fixture",
183
+ id: "reference.timeline.trimRange",
184
+ kind: "runtime",
185
+ referenceTimelineCoverage: "trim-range",
186
+ userAction: "Drag reference timeline trim handles.",
187
+ },
188
+ ],
189
+ }),
190
+ ).toEqual(
191
+ expect.arrayContaining([
192
+ 'reference.rendererState declares referenceCoverage "renderer-state" but transferMode is not "reference-runtime-clone".',
193
+ 'reference.timeline.trimRange declares referenceTimelineCoverage "trim-range" but transferMode is not "reference-runtime-clone".',
194
+ ]),
195
+ );
196
+ });
197
+ });