@pixel-point/toolcraft 0.0.13 → 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 (582) 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 +241 -294
  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 +45 -29
  276. package/templates/starter/LICENSE.md +18 -95
  277. package/templates/starter/NOTICE.md +3 -3
  278. package/templates/starter/docs/toolcraft/README.md +19 -4
  279. package/templates/starter/docs/toolcraft/acceptance-testing.md +38 -8
  280. package/templates/starter/docs/toolcraft/assembly-workflow.md +46 -185
  281. package/templates/starter/docs/toolcraft/component-rules.md +18 -190
  282. package/templates/starter/docs/toolcraft/core/control-selection.md +93 -0
  283. package/templates/starter/docs/toolcraft/core/layout.md +105 -0
  284. package/templates/starter/docs/toolcraft/core/media-upload.md +85 -0
  285. package/templates/starter/docs/toolcraft/core/performance.md +86 -0
  286. package/templates/starter/docs/toolcraft/core/reference-study.md +115 -0
  287. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +60 -0
  288. package/templates/starter/docs/toolcraft/core/setup-export.md +86 -0
  289. package/templates/starter/docs/toolcraft/core/timeline-animation.md +68 -0
  290. package/templates/starter/docs/toolcraft/custom-controls.md +10 -1
  291. package/templates/starter/docs/toolcraft/decision-contract.md +26 -22
  292. package/templates/starter/docs/toolcraft/performance.md +44 -16
  293. package/templates/starter/docs/toolcraft/renderer-technique.md +2 -0
  294. package/templates/starter/docs/toolcraft/schema-reference.md +127 -366
  295. package/templates/starter/docs/toolcraft/workflow.md +26 -16
  296. package/templates/starter/e2e/app-browser-acceptance-evidence.spec.ts +111 -0
  297. package/templates/starter/e2e/app-browser-control-coverage.spec.ts +118 -0
  298. package/templates/starter/e2e/app-browser-performance-evidence.spec.ts +217 -0
  299. package/templates/starter/e2e/app-browser-performance-probe.spec.ts +322 -0
  300. package/templates/starter/e2e/app-browser-proof-session.spec.ts +196 -0
  301. package/templates/starter/e2e/app-browser-runtime-evidence.spec.ts +9 -0
  302. package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +240 -0
  303. package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +180 -0
  304. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +310 -0
  305. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +432 -0
  306. package/templates/starter/e2e/app-browser-shell.spec.ts +171 -0
  307. package/templates/starter/e2e/app-browser-timeline-layers-reference.spec.ts +70 -0
  308. package/templates/starter/e2e/app-performance.spec.ts +0 -491
  309. package/templates/starter/e2e/browser-acceptance-outcome-helpers.ts +97 -0
  310. package/templates/starter/e2e/browser-acceptance-transition-helpers.ts +74 -0
  311. package/templates/starter/e2e/browser-conditional-output-evidence-helpers.ts +230 -0
  312. package/templates/starter/e2e/browser-control-target-helpers.ts +109 -0
  313. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +229 -0
  314. package/templates/starter/e2e/browser-proof-session.ts +392 -0
  315. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +136 -0
  316. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +290 -0
  317. package/templates/starter/e2e/browser-runtime-evidence.ts +27 -0
  318. package/templates/starter/e2e/browser-state-evidence-helpers.ts +205 -0
  319. package/templates/starter/e2e/browser-timeline-evidence-helpers.ts +319 -0
  320. package/templates/starter/e2e/canvas-handle-helpers.ts +86 -4
  321. package/templates/starter/e2e/export-artifact-helpers.ts +132 -0
  322. package/templates/starter/e2e/performance-budget-helpers.ts +159 -0
  323. package/templates/starter/e2e/performance-canvas-helpers.ts +123 -0
  324. package/templates/starter/e2e/performance-control-helpers.ts +3 -0
  325. package/templates/starter/e2e/performance-control-layout-helpers.ts +161 -0
  326. package/templates/starter/e2e/performance-fixture-helpers.ts +217 -0
  327. package/templates/starter/e2e/performance-frame-probe.ts +247 -0
  328. package/templates/starter/e2e/performance-helpers.ts +6 -854
  329. package/templates/starter/e2e/performance-interaction-measurement.ts +251 -0
  330. package/templates/starter/e2e/performance-measurement-evidence.ts +72 -0
  331. package/templates/starter/e2e/performance-output-action-helpers.spec.ts +43 -0
  332. package/templates/starter/e2e/performance-output-action-helpers.ts +109 -0
  333. package/templates/starter/e2e/performance-probe-helpers.ts +12 -0
  334. package/templates/starter/e2e/performance-render-scale-helpers.ts +55 -0
  335. package/templates/starter/e2e/performance-slider-helpers.ts +271 -0
  336. package/templates/starter/e2e/product-observable-helpers.ts +72 -17
  337. package/templates/starter/e2e/stable-outcome-helpers.ts +208 -0
  338. package/templates/starter/package.json +10 -5
  339. package/templates/starter/playwright.config.ts +5 -2
  340. package/templates/starter/scripts/check-ai-skills.mjs +14 -8
  341. package/templates/starter/scripts/check-ai-skills.test.mjs +64 -0
  342. package/templates/starter/scripts/check-toolcraft-code-health.mjs +108 -0
  343. package/templates/starter/scripts/check-toolcraft-code-health.test.mjs +213 -0
  344. package/templates/starter/scripts/check-toolcraft-docs.mjs +70 -35
  345. package/templates/starter/scripts/check-toolcraft-integrity.mjs +141 -144
  346. package/templates/starter/scripts/run-browser-performance.mjs +118 -0
  347. package/templates/starter/scripts/run-browser-performance.test.mjs +53 -0
  348. package/templates/starter/scripts/toolcraft-code-health-core.mjs +297 -0
  349. package/templates/starter/scripts/toolcraft-contract-doc-integrity.mjs +77 -0
  350. package/templates/starter/scripts/toolcraft-contract-doc-integrity.test.mjs +81 -0
  351. package/templates/starter/scripts/toolcraft-contract-manifest.json +113 -0
  352. package/templates/starter/scripts/toolcraft-contract-manifest.mjs +128 -0
  353. package/templates/starter/scripts/toolcraft-contract-manifest.test.mjs +72 -0
  354. package/templates/starter/scripts/toolcraft-integrity-manifest.mjs +172 -0
  355. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +60 -0
  356. package/templates/starter/scripts/toolcraft-product-boundary-ast-utils.mjs +23 -0
  357. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +264 -0
  358. package/templates/starter/scripts/toolcraft-product-boundary-test-fixtures.mjs +16 -0
  359. package/templates/starter/scripts/toolcraft-product-boundary.mjs +243 -0
  360. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +289 -0
  361. package/templates/starter/scripts/toolcraft-product-dependency-graph.mjs +176 -0
  362. package/templates/starter/scripts/toolcraft-product-dependency-graph.test.mjs +196 -0
  363. package/templates/starter/scripts/toolcraft-product-dependency-resolution.mjs +279 -0
  364. package/templates/starter/scripts/toolcraft-product-evidence-boundary-ast.mjs +91 -0
  365. package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +138 -0
  366. package/templates/starter/scripts/toolcraft-product-style-boundary.mjs +219 -0
  367. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +46 -0
  368. package/templates/starter/scripts/toolcraft-source-inventory.mjs +187 -0
  369. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +132 -0
  370. package/templates/starter/scripts/toolcraft-source-ownership.mjs +167 -0
  371. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +113 -0
  372. package/templates/starter/scripts/toolcraft-static-string.mjs +104 -0
  373. package/templates/starter/scripts/toolcraft-verification-inventory.mjs +123 -0
  374. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +19 -0
  375. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +284 -0
  376. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +282 -0
  377. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +32 -0
  378. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +88 -0
  379. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +87 -0
  380. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +109 -0
  381. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +111 -0
  382. package/templates/starter/scripts/toolcraft-workflow-routes.mjs +314 -0
  383. package/templates/starter/scripts/toolcraft-workflow-routes.test.mjs +204 -0
  384. package/templates/starter/src/app/acceptance/actions.ts +30 -0
  385. package/templates/starter/src/app/acceptance/animation-intent.ts +184 -0
  386. package/templates/starter/src/app/acceptance/canvas-handle-acceptance.ts +70 -0
  387. package/templates/starter/src/app/acceptance/color-bank-labels.ts +164 -0
  388. package/templates/starter/src/app/acceptance/conditions.ts +80 -0
  389. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +70 -0
  390. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +271 -0
  391. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +149 -0
  392. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +189 -0
  393. package/templates/starter/src/app/acceptance/control-acceptance.ts +70 -0
  394. package/templates/starter/src/app/acceptance/control-component-rules.ts +277 -0
  395. package/templates/starter/src/app/acceptance/control-labels.ts +223 -0
  396. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +107 -0
  397. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +104 -0
  398. package/templates/starter/src/app/acceptance/control-layout-model.ts +159 -0
  399. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +164 -0
  400. package/templates/starter/src/app/acceptance/control-layout.ts +45 -0
  401. package/templates/starter/src/app/acceptance/control-order.ts +123 -0
  402. package/templates/starter/src/app/acceptance/control-parts.ts +47 -0
  403. package/templates/starter/src/app/acceptance/control-section-inventory.ts +183 -0
  404. package/templates/starter/src/app/acceptance/controls.ts +27 -0
  405. package/templates/starter/src/app/acceptance/coverage.ts +81 -0
  406. package/templates/starter/src/app/acceptance/custom-controls.ts +140 -0
  407. package/templates/starter/src/app/acceptance/inline-layout.ts +192 -0
  408. package/templates/starter/src/app/acceptance/media-upload.ts +55 -0
  409. package/templates/starter/src/app/acceptance/output-background-rules.ts +135 -0
  410. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +76 -0
  411. package/templates/starter/src/app/acceptance/output-export-actions.ts +34 -0
  412. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +46 -0
  413. package/templates/starter/src/app/acceptance/output-export-model.ts +146 -0
  414. package/templates/starter/src/app/acceptance/output-export.ts +45 -0
  415. package/templates/starter/src/app/acceptance/output-image-export-rules.ts +87 -0
  416. package/templates/starter/src/app/acceptance/reference-runtime-coverage.ts +96 -0
  417. package/templates/starter/src/app/acceptance/reference-runtime-feature-inventory.ts +171 -0
  418. package/templates/starter/src/app/acceptance/reference-runtime-study.ts +73 -0
  419. package/templates/starter/src/app/acceptance/reference-runtime-timeline.ts +291 -0
  420. package/templates/starter/src/app/acceptance/reference-runtime.ts +99 -0
  421. package/templates/starter/src/app/acceptance/runtime-coverage.ts +290 -0
  422. package/templates/starter/src/app/acceptance/runtime-setup.ts +117 -0
  423. package/templates/starter/src/app/acceptance/section-title-rules.ts +8 -0
  424. package/templates/starter/src/app/acceptance/sections.ts +6 -0
  425. package/templates/starter/src/app/acceptance/semantic.ts +63 -0
  426. package/templates/starter/src/app/acceptance/timeline-loop.ts +21 -0
  427. package/templates/starter/src/app/acceptance/types.ts +363 -0
  428. package/templates/starter/src/app/acceptance/validate-coverage.ts +217 -0
  429. package/templates/starter/src/app/acceptance/validation-pipeline.test.ts +56 -0
  430. package/templates/starter/src/app/acceptance/validation-pipeline.ts +60 -0
  431. package/templates/starter/src/app/acceptance/video-reference-study.ts +217 -0
  432. package/templates/starter/src/app/starter-acceptance-data.ts +21 -0
  433. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +383 -0
  434. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +349 -0
  435. package/templates/starter/src/app/starter-acceptance.base-coverage.test.ts +47 -0
  436. package/templates/starter/src/app/starter-acceptance.canvas-handles.test.ts +71 -0
  437. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +199 -0
  438. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +244 -0
  439. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +63 -0
  440. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +172 -0
  441. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +387 -0
  442. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +215 -0
  443. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +274 -0
  444. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +275 -0
  445. package/templates/starter/src/app/starter-acceptance.curves-rules.test.ts +184 -0
  446. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +200 -0
  447. package/templates/starter/src/app/starter-acceptance.custom-control-coverage.test.ts +111 -0
  448. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +135 -0
  449. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +74 -0
  450. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +107 -0
  451. package/templates/starter/src/app/starter-acceptance.framework-boundary.test.ts +327 -0
  452. package/templates/starter/src/app/starter-acceptance.image-video-export-settings.test.ts +328 -0
  453. package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +242 -0
  454. package/templates/starter/src/app/starter-acceptance.layers.test.ts +203 -0
  455. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +110 -0
  456. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +153 -0
  457. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +97 -0
  458. package/templates/starter/src/app/starter-acceptance.persistence-coverage.test.ts +134 -0
  459. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +202 -0
  460. package/templates/starter/src/app/starter-acceptance.product-readiness-rules.test.ts +14 -0
  461. package/templates/starter/src/app/starter-acceptance.product-readiness-test-utils.ts +25 -0
  462. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +50 -0
  463. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +27 -0
  464. package/templates/starter/src/app/starter-acceptance.range-slider-rules.test.ts +147 -0
  465. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +197 -0
  466. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +304 -0
  467. package/templates/starter/src/app/starter-acceptance.reference-test-utils.ts +102 -0
  468. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +267 -0
  469. package/templates/starter/src/app/starter-acceptance.schema-test-utils.ts +116 -0
  470. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +373 -0
  471. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +260 -0
  472. package/templates/starter/src/app/starter-acceptance.section-titles.test.ts +180 -0
  473. package/templates/starter/src/app/starter-acceptance.setup-readiness.test.ts +205 -0
  474. package/templates/starter/src/app/starter-acceptance.slider-rules.test.ts +470 -0
  475. package/templates/starter/src/app/starter-acceptance.slider-unit-rules.test.ts +61 -0
  476. package/templates/starter/src/app/starter-acceptance.source-test-utils.ts +43 -0
  477. package/templates/starter/src/app/starter-acceptance.test-utils.ts +21 -0
  478. package/templates/starter/src/app/starter-acceptance.text-control-kind.test.ts +89 -0
  479. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +264 -0
  480. package/templates/starter/src/app/starter-acceptance.timeline-test-utils.ts +56 -0
  481. package/templates/starter/src/app/starter-acceptance.toggle-pair-layout.test.ts +200 -0
  482. package/templates/starter/src/app/starter-acceptance.toggle-parameter-layout.test.ts +277 -0
  483. package/templates/starter/src/app/starter-acceptance.ts +151 -4576
  484. package/templates/starter/src/app/starter-acceptance.video-export-test-utils.ts +37 -0
  485. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +262 -0
  486. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +428 -0
  487. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +283 -0
  488. package/templates/starter/src/app/starter-automated-runtime-evidence.test.ts +34 -0
  489. package/templates/starter/src/app/starter-composition.tsx +7 -0
  490. package/templates/starter/src/app/starter-performance-test-utils.ts +275 -0
  491. package/templates/starter/src/app/starter-performance.budgets.test.ts +374 -0
  492. package/templates/starter/src/app/starter-performance.gates.test.ts +128 -0
  493. package/templates/starter/src/app/starter-performance.renderer-source.test.ts +136 -0
  494. package/templates/starter/src/app/starter-performance.renderer-technique.test.ts +291 -0
  495. package/templates/starter/src/app/starter-performance.scenarios.test.ts +355 -0
  496. package/templates/starter/src/app/test-evidence/browser-runtime-contract.test.ts +253 -0
  497. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +243 -0
  498. package/templates/starter/src/routes/index.tsx +11 -2
  499. package/templates/starter/vite.config.ts +8 -0
  500. package/templates/ui/components/controls/color/color-control-types.ts +38 -0
  501. package/templates/ui/components/controls/color/color-control.tsx +19 -437
  502. package/templates/ui/components/controls/color/color-footer.tsx +272 -0
  503. package/templates/ui/components/controls/color/color-model-slider.tsx +271 -0
  504. package/templates/ui/components/controls/color/color-opacity-input.tsx +94 -0
  505. package/templates/ui/components/controls/color/color-surface.tsx +194 -0
  506. package/templates/ui/components/controls/color/color-value-control.tsx +159 -0
  507. package/templates/ui/components/controls/color/color-value-utils.ts +170 -0
  508. package/templates/ui/components/controls/color/index.ts +10 -3
  509. package/templates/ui/components/controls/color/palette-control-controller.ts +407 -0
  510. package/templates/ui/components/controls/color/palette-control-layout.ts +14 -0
  511. package/templates/ui/components/controls/color/palette-control-types.ts +50 -0
  512. package/templates/ui/components/controls/color/palette-control-view.tsx +174 -0
  513. package/templates/ui/components/controls/color/palette-control.tsx +6 -544
  514. package/templates/ui/components/controls/color/style-guide-color-picker-color-utils.ts +39 -0
  515. package/templates/ui/components/controls/color/style-guide-color-picker-controller.ts +370 -0
  516. package/templates/ui/components/controls/color/style-guide-color-picker-hue-handlers.ts +66 -0
  517. package/templates/ui/components/controls/color/style-guide-color-picker-interaction-state.ts +49 -0
  518. package/templates/ui/components/controls/color/style-guide-color-picker-interactions.ts +2 -2
  519. package/templates/ui/components/controls/color/style-guide-color-picker-model.ts +125 -0
  520. package/templates/ui/components/controls/color/style-guide-color-picker-parts.tsx +10 -707
  521. package/templates/ui/components/controls/color/style-guide-color-picker-surface-drag.ts +93 -0
  522. package/templates/ui/components/controls/color/style-guide-color-picker-surface-geometry.ts +114 -0
  523. package/templates/ui/components/controls/color/style-guide-color-picker-surface-preview.ts +45 -0
  524. package/templates/ui/components/controls/color/style-guide-color-picker-types.ts +84 -0
  525. package/templates/ui/components/controls/color/style-guide-color-picker-view.tsx +69 -0
  526. package/templates/ui/components/controls/color/style-guide-color-picker.tsx +6 -495
  527. package/templates/ui/components/controls/curves/curves-control.tsx +4 -3
  528. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +39 -515
  529. package/templates/ui/components/controls/file-drop/file-drop-empty-state.tsx +35 -0
  530. package/templates/ui/components/controls/file-drop/file-drop-file-list.tsx +160 -0
  531. package/templates/ui/components/controls/file-drop/file-drop-image-grid.tsx +175 -0
  532. package/templates/ui/components/controls/file-drop/file-drop-model.tsx +170 -0
  533. package/templates/ui/components/controls/file-drop/file-drop-single-preview.tsx +63 -0
  534. package/templates/ui/components/controls/file-drop/file-drop-types.ts +48 -0
  535. package/templates/ui/components/controls/file-drop/index.ts +2 -2
  536. package/templates/ui/components/controls/font-picker/font-picker-control.tsx +133 -906
  537. package/templates/ui/components/controls/font-picker/font-picker-footer.tsx +116 -0
  538. package/templates/ui/components/controls/font-picker/font-picker-list.tsx +194 -0
  539. package/templates/ui/components/controls/font-picker/font-picker-popover-content.tsx +191 -0
  540. package/templates/ui/components/controls/font-picker/font-picker-value.ts +222 -0
  541. package/templates/ui/components/controls/font-picker/index.ts +4 -1
  542. package/templates/ui/components/controls/font-picker/use-font-picker-preview-pipeline.ts +163 -0
  543. package/templates/ui/components/controls/font-picker/use-font-picker-virtual-list.ts +293 -0
  544. package/templates/ui/components/controls/gradient/gradient-control-utils.ts +2 -25
  545. package/templates/ui/components/controls/gradient/gradient-control.tsx +4 -464
  546. package/templates/ui/components/controls/gradient/gradient-stops-controller.ts +332 -0
  547. package/templates/ui/components/controls/gradient/gradient-stops-track.tsx +159 -0
  548. package/templates/ui/components/controls/vector/vector-control-types.ts +26 -0
  549. package/templates/ui/components/controls/vector/vector-control.tsx +10 -486
  550. package/templates/ui/components/controls/vector/vector-pad-field.tsx +211 -0
  551. package/templates/ui/components/controls/vector/vector-pad-geometry.ts +61 -0
  552. package/templates/ui/components/controls/vector/vector-pad-parts.tsx +72 -0
  553. package/templates/ui/components/controls/vector/vector-pad-variants.ts +20 -0
  554. package/templates/ui/components/controls/vector/vector-size-field.tsx +104 -0
  555. package/templates/ui/components/controls/vector/vector-value.ts +46 -0
  556. package/templates/ui/components/primitives/slider/slider-discrete-state.ts +181 -0
  557. package/templates/ui/components/primitives/slider/slider-marker-policy.ts +52 -0
  558. package/templates/ui/components/primitives/slider/slider-pointer-dragging.ts +87 -0
  559. package/templates/ui/components/primitives/slider/slider-runtime.ts +109 -0
  560. package/templates/ui/components/primitives/slider/slider-types.ts +21 -0
  561. package/templates/ui/components/primitives/slider/slider.tsx +2 -403
  562. package/templates/runtime/react/canvas-shell.test.tsx +0 -554
  563. package/templates/runtime/react/canvas-shell.tsx +0 -585
  564. package/templates/runtime/react/controls-panel.test.tsx +0 -5446
  565. package/templates/runtime/react/controls-panel.tsx +0 -3220
  566. package/templates/runtime/react/layers-panel.test.tsx +0 -487
  567. package/templates/runtime/react/layers-panel.tsx +0 -1348
  568. package/templates/runtime/react/timeline-panel.test.tsx +0 -751
  569. package/templates/runtime/react/timeline-panel.tsx +0 -3078
  570. package/templates/runtime/schema/define-toolcraft.test.ts +0 -1742
  571. package/templates/runtime/state/reducer.test.ts +0 -1703
  572. package/templates/runtime/testing/performance.test.ts +0 -3081
  573. package/templates/starter/e2e/app-browser-acceptance.spec.ts +0 -785
  574. package/templates/starter/src/app/starter-acceptance.test.ts +0 -10067
  575. package/templates/starter/src/app/starter-performance.test.ts +0 -1583
  576. package/templates/ui/components/controls/color/style-guide-color-picker-logic.ts +0 -490
  577. /package/templates/runtime/react/{storage-key-migration.ts → app-shell/storage-key-migration.ts} +0 -0
  578. /package/templates/runtime/react/{theme-runtime.tsx → app-shell/theme-runtime.tsx} +0 -0
  579. /package/templates/runtime/react/{curve-geometry.test.ts → controls-panel/__tests__/curve-geometry.test.ts} +0 -0
  580. /package/templates/runtime/react/{panel-host-config.ts → panel-host/panel-host-config.ts} +0 -0
  581. /package/templates/runtime/react/{panel-host-geometry.test.ts → panel-host/panel-host-geometry.test.ts} +0 -0
  582. /package/templates/runtime/react/{panel-host-geometry.ts → panel-host/panel-host-geometry.ts} +0 -0
@@ -0,0 +1,271 @@
1
+ import { expect, type Locator, type Page } from "@playwright/test";
2
+
3
+ import type { ToolcraftPerformanceConfig } from "@repo/toolcraft-runtime";
4
+
5
+ import {
6
+ expectToolcraftPerformanceBudget,
7
+ getToolcraftPerformanceStressValue,
8
+ } from "./performance-budget-helpers";
9
+ import { attachToolcraftBrowserRuntimeEvidence } from "./browser-runtime-evidence";
10
+ import { getToolcraftControlFieldByTarget } from "./browser-control-target-helpers";
11
+ import { getToolcraftFieldByLabel } from "./performance-control-layout-helpers";
12
+ import { measureToolcraftInteraction } from "./performance-interaction-measurement";
13
+ import type {
14
+ ToolcraftInteractionOptions,
15
+ ToolcraftInteractionResult,
16
+ } from "./performance-measurement-evidence";
17
+
18
+ async function dragToolcraftSliderInField(
19
+ page: Page,
20
+ field: Locator,
21
+ description: string,
22
+ targetRatio: number,
23
+ ): Promise<void> {
24
+ const slider = field.locator('[data-slot="slider"]').first();
25
+ const sliderValues = field.getByRole("slider");
26
+
27
+ await expect(slider, `Toolcraft slider "${description}" should be visible`).toBeVisible();
28
+
29
+ const box = await slider.boundingBox();
30
+ if (!box) {
31
+ throw new Error(`Could not measure slider "${description}".`);
32
+ }
33
+
34
+ const startX = box.x + box.width * 0.15;
35
+ const endX = box.x + box.width * targetRatio;
36
+ const y = box.y + box.height / 2;
37
+ const valuesBefore = await sliderValues.evaluateAll((elements) =>
38
+ elements.map((element) =>
39
+ element.getAttribute("aria-valuenow") ??
40
+ (element instanceof HTMLInputElement ? element.value : null),
41
+ ),
42
+ );
43
+
44
+ await page.mouse.move(startX, y);
45
+ await page.mouse.down();
46
+ await page.mouse.move(endX, y, { steps: 12 });
47
+ await page.mouse.up();
48
+
49
+ const valuesAfter = await sliderValues.evaluateAll((elements) =>
50
+ elements.map((element) =>
51
+ element.getAttribute("aria-valuenow") ??
52
+ (element instanceof HTMLInputElement ? element.value : null),
53
+ ),
54
+ );
55
+ expect(
56
+ valuesAfter,
57
+ `Toolcraft slider "${description}" must expose a changed value after its drag interaction.`,
58
+ ).not.toEqual(valuesBefore);
59
+ }
60
+
61
+ export async function dragToolcraftSliderByLabel(
62
+ page: Page,
63
+ label: string,
64
+ targetRatio: number,
65
+ options: { scenarioId?: string } = {},
66
+ ): Promise<void> {
67
+ if (options.scenarioId) {
68
+ throw new Error(
69
+ "Performance slider evidence must use dragToolcraftSliderByTarget(schemaTarget), not a visible label.",
70
+ );
71
+ }
72
+ const field = await getToolcraftFieldByLabel(page, label);
73
+ await dragToolcraftSliderInField(page, field, label, targetRatio);
74
+ }
75
+
76
+ export async function dragToolcraftSliderByTarget(
77
+ page: Page,
78
+ target: string,
79
+ targetRatio: number,
80
+ options: { scenarioId?: string } = {},
81
+ ): Promise<void> {
82
+ const field = await getToolcraftControlFieldByTarget(page, target);
83
+ await dragToolcraftSliderInField(page, field, target, targetRatio);
84
+ if (options.scenarioId) {
85
+ await attachToolcraftBrowserRuntimeEvidence({
86
+ evidenceType: "performance-control-drag",
87
+ requirementId: options.scenarioId,
88
+ target,
89
+ });
90
+ }
91
+ }
92
+
93
+ export async function dragToolcraftSliderToValue(
94
+ page: Page,
95
+ label: string,
96
+ value: number,
97
+ options: { scenarioId?: string } = {},
98
+ ): Promise<void> {
99
+ const field = await getToolcraftFieldByLabel(page, label);
100
+ const slider = field.getByRole("slider").first();
101
+
102
+ await expect(slider, `Toolcraft slider "${label}" should be visible`).toBeVisible();
103
+
104
+ const range = await slider.evaluate((element) => {
105
+ const htmlElement = element as HTMLElement;
106
+ const min = Number(
107
+ htmlElement.getAttribute("aria-valuemin") ??
108
+ (htmlElement as HTMLInputElement).min ??
109
+ "0",
110
+ );
111
+ const max = Number(
112
+ htmlElement.getAttribute("aria-valuemax") ??
113
+ (htmlElement as HTMLInputElement).max ??
114
+ "100",
115
+ );
116
+
117
+ return {
118
+ max: Number.isFinite(max) ? max : 100,
119
+ min: Number.isFinite(min) ? min : 0,
120
+ };
121
+ });
122
+ const denominator = range.max - range.min;
123
+ const ratio = denominator === 0 ? 0 : (value - range.min) / denominator;
124
+
125
+ await dragToolcraftSliderByLabel(
126
+ page,
127
+ label,
128
+ Math.min(1, Math.max(0, ratio)),
129
+ options,
130
+ );
131
+ }
132
+
133
+ export async function dragToolcraftSliderTargetToValue(
134
+ page: Page,
135
+ target: string,
136
+ value: number,
137
+ options: { scenarioId?: string } = {},
138
+ ): Promise<void> {
139
+ const field = await getToolcraftControlFieldByTarget(page, target);
140
+ const slider = field.getByRole("slider").first();
141
+ const range = await slider.evaluate((element) => {
142
+ const htmlElement = element as HTMLElement;
143
+ const min = Number(
144
+ htmlElement.getAttribute("aria-valuemin") ??
145
+ (htmlElement as HTMLInputElement).min ??
146
+ "0",
147
+ );
148
+ const max = Number(
149
+ htmlElement.getAttribute("aria-valuemax") ??
150
+ (htmlElement as HTMLInputElement).max ??
151
+ "100",
152
+ );
153
+ return {
154
+ max: Number.isFinite(max) ? max : 100,
155
+ min: Number.isFinite(min) ? min : 0,
156
+ };
157
+ });
158
+ const denominator = range.max - range.min;
159
+ const ratio = denominator === 0 ? 0 : (value - range.min) / denominator;
160
+ await dragToolcraftSliderByTarget(
161
+ page,
162
+ target,
163
+ Math.min(1, Math.max(0, ratio)),
164
+ options,
165
+ );
166
+ }
167
+
168
+ export async function dragToolcraftSliderToPerformanceStressValue(
169
+ page: Page,
170
+ label: string,
171
+ config: ToolcraftPerformanceConfig,
172
+ scenarioId: string,
173
+ ): Promise<void> {
174
+ const value = getToolcraftPerformanceStressValue(config, scenarioId);
175
+ const scenario = config.scenarios.find((item) => item.id === scenarioId);
176
+
177
+ if (typeof value !== "number" || !Number.isFinite(value)) {
178
+ throw new Error(
179
+ `Toolcraft performance scenario "${scenarioId}" must provide a numeric stressFixture.value for slider "${label}".`,
180
+ );
181
+ }
182
+ if (!scenario?.target) {
183
+ throw new Error(
184
+ `Toolcraft slider performance scenario "${scenarioId}" must declare its schema target.`,
185
+ );
186
+ }
187
+
188
+ await dragToolcraftSliderTargetToValue(page, scenario.target, value, { scenarioId });
189
+ const field = await getToolcraftControlFieldByTarget(page, scenario.target);
190
+ const observedValues = await field.getByRole("slider").evaluateAll((elements) =>
191
+ elements.map((element) =>
192
+ Number(
193
+ element.getAttribute("aria-valuenow") ??
194
+ (element instanceof HTMLInputElement ? element.value : Number.NaN),
195
+ ),
196
+ ),
197
+ );
198
+ expect(
199
+ observedValues.some((observedValue) => Math.abs(observedValue - value) < 0.000_001),
200
+ `Toolcraft performance scenario "${scenarioId}" must visibly apply stressFixture.value ${value} to slider "${label}".`,
201
+ ).toBe(true);
202
+ await attachToolcraftBrowserRuntimeEvidence({
203
+ evidenceType: "performance-stress-fixture",
204
+ requirementId: scenarioId,
205
+ target: scenario.target,
206
+ });
207
+ }
208
+
209
+ export async function expectToolcraftDiscreteSliderDragSmoothness(
210
+ page: Page,
211
+ label: string,
212
+ options: ToolcraftInteractionOptions & {
213
+ expectMarkers?: boolean;
214
+ maxFrameGapMs?: number;
215
+ maxInteractionMs?: number;
216
+ requirementId?: string;
217
+ target?: string;
218
+ } = {},
219
+ ): Promise<ToolcraftInteractionResult> {
220
+ const field = options.target
221
+ ? await getToolcraftControlFieldByTarget(page, options.target)
222
+ : await getToolcraftFieldByLabel(page, label);
223
+ const slider = field.locator('[data-slot="slider"][data-variant="discrete"]').first();
224
+
225
+ await expect(
226
+ slider,
227
+ `Toolcraft discrete slider "${label}" should render the discrete variant.`,
228
+ ).toBeVisible();
229
+
230
+ const markers = field.locator('[data-slot="slider-marker"]');
231
+ if (options.expectMarkers === false) {
232
+ await expect(
233
+ markers,
234
+ `Toolcraft half-width discrete slider "${label}" should hide over-budget tick markers.`,
235
+ ).toHaveCount(0);
236
+ } else {
237
+ await expect(
238
+ markers.first(),
239
+ `Toolcraft discrete slider "${label}" should render tick markers.`,
240
+ ).toBeVisible();
241
+ }
242
+
243
+ const result = await measureToolcraftInteraction(
244
+ page,
245
+ async () => {
246
+ if (options.target) {
247
+ await dragToolcraftSliderByTarget(page, options.target, 0.85);
248
+ } else {
249
+ await dragToolcraftSliderByLabel(page, label, 0.85);
250
+ }
251
+ },
252
+ options,
253
+ );
254
+
255
+ expectToolcraftPerformanceBudget(result, {
256
+ maxFrameGapMs: options.maxFrameGapMs ?? 80,
257
+ maxInteractionMs: options.maxInteractionMs ?? 500,
258
+ });
259
+ if (options.requirementId) {
260
+ if (!options.target) {
261
+ throw new Error("Discrete-slider runtime evidence requires a schema target.");
262
+ }
263
+ await attachToolcraftBrowserRuntimeEvidence({
264
+ evidenceType: "discrete-slider-layout",
265
+ requirementId: options.requirementId,
266
+ target: options.target,
267
+ });
268
+ }
269
+
270
+ return result;
271
+ }
@@ -1,5 +1,18 @@
1
1
  import { expect, type Page } from "@playwright/test";
2
2
 
3
+ import { attachToolcraftBrowserRuntimeEvidence } from "./browser-runtime-evidence";
4
+ import {
5
+ assertToolcraftBrowserActionForSession,
6
+ getToolcraftBrowserActionTarget,
7
+ getToolcraftBrowserProofPage,
8
+ isToolcraftBrowserAction,
9
+ isToolcraftBrowserProofSession,
10
+ runToolcraftBrowserAction,
11
+ type ToolcraftBrowserAction,
12
+ type ToolcraftBrowserProofSession,
13
+ } from "./browser-proof-session";
14
+ import { expectToolcraftPersistentOutcomeAfterAction } from "./stable-outcome-helpers";
15
+
3
16
  const defaultProductObservableSelector = [
4
17
  "[data-toolcraft-product-output]",
5
18
  "[data-toolcraft-product-text]",
@@ -16,7 +29,12 @@ export type ToolcraftProductObservableSnapshotOptions = {
16
29
 
17
30
  export type ToolcraftProductObservableChangeOptions =
18
31
  ToolcraftProductObservableSnapshotOptions & {
32
+ baselineStabilityIntervalMs?: number;
33
+ baselineStabilitySamples?: number;
19
34
  message?: string;
35
+ requirementId?: string;
36
+ stabilityIntervalMs?: number;
37
+ stabilitySamples?: number;
20
38
  };
21
39
 
22
40
  export async function getToolcraftProductObservableSnapshot(
@@ -148,23 +166,60 @@ export async function getToolcraftProductObservableSnapshot(
148
166
  }
149
167
 
150
168
  export async function expectToolcraftProductObservableToChange(
151
- page: Page,
152
- action: () => Promise<void>,
169
+ pageOrSession: Page | ToolcraftBrowserProofSession,
170
+ action: (() => Promise<void>) | ToolcraftBrowserAction,
153
171
  options: ToolcraftProductObservableChangeOptions = {},
154
172
  ): Promise<void> {
155
- const before = await getToolcraftProductObservableSnapshot(page, options);
156
-
157
- await action();
158
-
159
- await expect
160
- .poll(
161
- async () => getToolcraftProductObservableSnapshot(page, options),
162
- {
163
- message:
164
- options.message ??
165
- "Product output should change after the visible user interaction.",
166
- timeout: options.timeoutMs ?? 5000,
167
- },
168
- )
169
- .not.toBe(before);
173
+ if (options.requirementId !== undefined && !isToolcraftBrowserProofSession(pageOrSession)) {
174
+ throw new Error(
175
+ "Product-observable runtime evidence requires a verified Toolcraft browser proof session; a raw Page may be used only for non-evidence helper checks.",
176
+ );
177
+ }
178
+ const page = isToolcraftBrowserProofSession(pageOrSession)
179
+ ? await getToolcraftBrowserProofPage(pageOrSession)
180
+ : pageOrSession;
181
+ let target: string | undefined;
182
+ let runAction: () => Promise<void>;
183
+
184
+ if (isToolcraftBrowserAction(action)) {
185
+ if (isToolcraftBrowserProofSession(pageOrSession)) {
186
+ assertToolcraftBrowserActionForSession(pageOrSession, action);
187
+ }
188
+ target = getToolcraftBrowserActionTarget(action);
189
+ runAction = () => runToolcraftBrowserAction(action);
190
+ } else {
191
+ runAction = action;
192
+ }
193
+
194
+ if (options.requirementId !== undefined && target === undefined) {
195
+ throw new Error(
196
+ "Product-observable runtime evidence requires a target-scoped proofSession.controlAction(schemaTarget, action).",
197
+ );
198
+ }
199
+
200
+ await expectToolcraftPersistentOutcomeAfterAction(
201
+ () => getToolcraftProductObservableSnapshot(page, options),
202
+ runAction,
203
+ {
204
+ baselineStabilityIntervalMs: options.baselineStabilityIntervalMs,
205
+ baselineStabilitySamples: options.baselineStabilitySamples,
206
+ message:
207
+ options.message ??
208
+ "Product output should change after the visible user interaction.",
209
+ stabilityIntervalMs: options.stabilityIntervalMs,
210
+ stabilitySamples: options.stabilitySamples,
211
+ timeoutMs: options.timeoutMs ?? 5000,
212
+ },
213
+ );
214
+
215
+ if (options.requirementId !== undefined) {
216
+ await getToolcraftBrowserProofPage(
217
+ pageOrSession as ToolcraftBrowserProofSession,
218
+ );
219
+ await attachToolcraftBrowserRuntimeEvidence({
220
+ evidenceType: "product-observable-change",
221
+ requirementId: options.requirementId,
222
+ target,
223
+ });
224
+ }
170
225
  }
@@ -0,0 +1,208 @@
1
+ import { expect } from "@playwright/test";
2
+
3
+ export type ToolcraftStableOutcomeOptions = {
4
+ baselineStabilityIntervalMs?: number;
5
+ baselineStabilitySamples?: number;
6
+ message: string;
7
+ onFirstChange?: () => Promise<void> | void;
8
+ pollIntervalMs?: number;
9
+ stabilityIntervalMs?: number;
10
+ stabilitySamples?: number;
11
+ timeoutMs?: number;
12
+ };
13
+
14
+ type ToolcraftOutcomeChangeOptions = Pick<
15
+ ToolcraftStableOutcomeOptions,
16
+ "message" | "onFirstChange" | "pollIntervalMs" | "timeoutMs"
17
+ >;
18
+
19
+ function delay(durationMs: number): Promise<void> {
20
+ return new Promise((resolve) => setTimeout(resolve, durationMs));
21
+ }
22
+
23
+ export function snapshotToolcraftOutcome<T>(value: T, message: string): T {
24
+ try {
25
+ return structuredClone(value);
26
+ } catch {
27
+ throw new Error(
28
+ `${message} Outcome observations must be structured-cloneable snapshots.`,
29
+ );
30
+ }
31
+ }
32
+
33
+ export async function waitForToolcraftOutcomeChange<T>(
34
+ observeOutcome: () => Promise<T>,
35
+ before: T,
36
+ {
37
+ message,
38
+ onFirstChange,
39
+ pollIntervalMs,
40
+ timeoutMs = 5_000,
41
+ }: ToolcraftOutcomeChangeOptions,
42
+ ): Promise<T> {
43
+ const baseline = snapshotToolcraftOutcome(before, message);
44
+ let current = before;
45
+
46
+ await expect
47
+ .poll(
48
+ async () => {
49
+ current = await observeOutcome();
50
+ return current;
51
+ },
52
+ {
53
+ message,
54
+ ...(pollIntervalMs === undefined
55
+ ? {}
56
+ : { intervals: [Math.max(1, pollIntervalMs)] }),
57
+ timeout: timeoutMs,
58
+ },
59
+ )
60
+ .not.toEqual(baseline);
61
+
62
+ await onFirstChange?.();
63
+
64
+ return current;
65
+ }
66
+
67
+ export async function waitForToolcraftExpectedOutcome<T>(
68
+ observeOutcome: () => Promise<T>,
69
+ expected: T,
70
+ {
71
+ message,
72
+ onFirstChange,
73
+ pollIntervalMs,
74
+ timeoutMs = 5_000,
75
+ }: ToolcraftOutcomeChangeOptions,
76
+ ): Promise<T> {
77
+ const expectedSnapshot = snapshotToolcraftOutcome(expected, message);
78
+ let current = await observeOutcome();
79
+
80
+ await expect
81
+ .poll(
82
+ async () => {
83
+ current = await observeOutcome();
84
+ return current;
85
+ },
86
+ {
87
+ message,
88
+ ...(pollIntervalMs === undefined
89
+ ? {}
90
+ : { intervals: [Math.max(1, pollIntervalMs)] }),
91
+ timeout: timeoutMs,
92
+ },
93
+ )
94
+ .toEqual(expectedSnapshot);
95
+
96
+ await onFirstChange?.();
97
+ return current;
98
+ }
99
+
100
+ export async function expectToolcraftStableOutcomeBaseline<T>(
101
+ observeOutcome: () => Promise<T>,
102
+ baseline: T,
103
+ {
104
+ baselineStabilityIntervalMs,
105
+ baselineStabilitySamples,
106
+ message,
107
+ stabilityIntervalMs = 50,
108
+ stabilitySamples = 3,
109
+ }: ToolcraftStableOutcomeOptions,
110
+ ): Promise<T> {
111
+ const baselineSnapshot = snapshotToolcraftOutcome(baseline, message);
112
+ const intervalMs = Math.max(
113
+ 0,
114
+ baselineStabilityIntervalMs ?? stabilityIntervalMs,
115
+ );
116
+ const sampleCount = Math.max(
117
+ 2,
118
+ baselineStabilitySamples ?? stabilitySamples,
119
+ );
120
+ let current = baselineSnapshot;
121
+
122
+ for (let sample = 1; sample < sampleCount; sample += 1) {
123
+ await delay(intervalMs);
124
+ current = await observeOutcome();
125
+ expect(
126
+ current,
127
+ `${message} The baseline must remain stable before the action; autonomous output requires an expected semantic observation or a deterministic fixed phase.`,
128
+ ).toEqual(baselineSnapshot);
129
+ }
130
+
131
+ return current;
132
+ }
133
+
134
+ export async function expectToolcraftPersistentOutcomeChange<T>(
135
+ observeOutcome: () => Promise<T>,
136
+ before: T,
137
+ {
138
+ message,
139
+ onFirstChange,
140
+ pollIntervalMs,
141
+ stabilityIntervalMs = 50,
142
+ stabilitySamples = 3,
143
+ timeoutMs = 5_000,
144
+ }: ToolcraftStableOutcomeOptions,
145
+ ): Promise<T> {
146
+ const baseline = snapshotToolcraftOutcome(before, message);
147
+ let current = await waitForToolcraftOutcomeChange(observeOutcome, baseline, {
148
+ message,
149
+ onFirstChange,
150
+ pollIntervalMs,
151
+ timeoutMs,
152
+ });
153
+
154
+ for (let sample = 1; sample < Math.max(2, stabilitySamples); sample += 1) {
155
+ await delay(Math.max(0, stabilityIntervalMs));
156
+ current = await observeOutcome();
157
+ expect(
158
+ current,
159
+ `${message} The changed outcome must remain different from its baseline throughout the stability window.`,
160
+ ).not.toEqual(baseline);
161
+ }
162
+
163
+ return current;
164
+ }
165
+
166
+ export async function expectToolcraftPersistentExpectedOutcome<T>(
167
+ observeOutcome: () => Promise<T>,
168
+ expected: T,
169
+ {
170
+ message,
171
+ pollIntervalMs,
172
+ stabilityIntervalMs = 50,
173
+ stabilitySamples = 3,
174
+ timeoutMs = 5_000,
175
+ }: ToolcraftStableOutcomeOptions,
176
+ ): Promise<T> {
177
+ const expectedSnapshot = snapshotToolcraftOutcome(expected, message);
178
+ let current = await waitForToolcraftExpectedOutcome(
179
+ observeOutcome,
180
+ expectedSnapshot,
181
+ { message, pollIntervalMs, timeoutMs },
182
+ );
183
+
184
+ for (let sample = 1; sample < Math.max(2, stabilitySamples); sample += 1) {
185
+ await delay(Math.max(0, stabilityIntervalMs));
186
+ current = await observeOutcome();
187
+ expect(
188
+ current,
189
+ `${message} The expected outcome must remain stable throughout the verification window.`,
190
+ ).toEqual(expectedSnapshot);
191
+ }
192
+
193
+ return current;
194
+ }
195
+
196
+ export async function expectToolcraftPersistentOutcomeAfterAction<T>(
197
+ observeOutcome: () => Promise<T>,
198
+ action: () => Promise<void>,
199
+ options: ToolcraftStableOutcomeOptions,
200
+ ): Promise<T> {
201
+ const before = snapshotToolcraftOutcome(
202
+ await observeOutcome(),
203
+ options.message,
204
+ );
205
+ await expectToolcraftStableOutcomeBaseline(observeOutcome, before, options);
206
+ await action();
207
+ return expectToolcraftPersistentOutcomeChange(observeOutcome, before, options);
208
+ }
@@ -1,25 +1,28 @@
1
1
  {
2
2
  "name": "toolcraft-starter",
3
3
  "private": true,
4
- "license": "SEE LICENSE IN LICENSE.md",
4
+ "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "ai:check": "node scripts/check-ai-skills.mjs",
7
+ "ai:check": "node scripts/check-toolcraft-code-health.mjs && node scripts/toolcraft-product-boundary.mjs --allow-missing-compiler && node scripts/check-ai-skills.mjs",
8
8
  "dev": "node scripts/run-vite-on-free-port.mjs dev",
9
9
  "dev:restart": "node scripts/run-vite-on-free-port.mjs dev --toolcraft-restart",
10
10
  "build": "tsc -p tsconfig.json --noEmit && vite build",
11
11
  "preview": "node scripts/run-vite-on-free-port.mjs preview",
12
12
  "preview:restart": "node scripts/run-vite-on-free-port.mjs preview --toolcraft-restart",
13
13
  "docs:check": "node scripts/check-toolcraft-docs.mjs",
14
- "test": "node scripts/check-toolcraft-docs.mjs && node scripts/check-toolcraft-integrity.mjs && node --test scripts/*.test.mjs && vitest run src --passWithNoTests",
14
+ "test": "node scripts/check-toolcraft-docs.mjs && node --test scripts/*.test.mjs && vitest run src --passWithNoTests --reporter=default --reporter=./scripts/toolcraft-vitest-runtime-evidence-reporter.mjs",
15
+ "test:generated": "node scripts/check-toolcraft-docs.mjs && node scripts/check-toolcraft-integrity.mjs && node --test scripts/*.test.mjs && vitest run src --passWithNoTests --reporter=default --reporter=./scripts/toolcraft-vitest-runtime-evidence-reporter.mjs",
15
16
  "test:browser": "playwright install chromium && playwright test --grep-invert \"browser perf:\"",
16
- "test:browser:perf": "playwright install chromium && playwright test --grep \"browser perf:\" --workers=1 --pass-with-no-tests",
17
+ "test:browser:perf": "node scripts/run-browser-performance.mjs",
17
18
  "typecheck": "tsc -p tsconfig.json --noEmit",
18
19
  "verify:quick": "pnpm ai:check && pnpm test",
19
20
  "verify:ui": "pnpm test:browser",
20
21
  "verify:perf": "pnpm test:browser:perf",
21
22
  "verify:perf:playwright": "pnpm test:browser:perf",
22
- "verify:final": "pnpm ai:check && pnpm test && pnpm build && pnpm test:browser"
23
+ "verify:perf:record-exemption": "node scripts/toolcraft-verification-receipt.mjs record-exemption",
24
+ "verify:receipt": "node scripts/toolcraft-verification-receipt.mjs validate",
25
+ "verify:final": "pnpm ai:check && pnpm test && pnpm build && pnpm test:browser && pnpm verify:receipt"
23
26
  },
24
27
  "dependencies": {
25
28
  "@base-ui/react": "^1.4.1",
@@ -45,6 +48,8 @@
45
48
  },
46
49
  "devDependencies": {
47
50
  "@playwright/test": "^1.51.1",
51
+ "postcss": "^8.5.6",
52
+ "postcss-selector-parser": "^7.1.0",
48
53
  "@tailwindcss/vite": "^4.1.18",
49
54
  "@types/node": "22.19.19",
50
55
  "@types/react": "^19.2.14",
@@ -15,6 +15,8 @@ const testPort =
15
15
  ? resolvedTestPort
16
16
  : await findAvailablePort(preferredTestPort);
17
17
  const testBaseUrl = `http://localhost:${testPort}`;
18
+ const browserServerMode =
19
+ process.env.TOOLCRAFT_BROWSER_SERVER_MODE === "preview" ? "preview" : "dev";
18
20
  process.env[resolvedTestPortEnvName] = String(testPort);
19
21
 
20
22
  if (!resolvedTestPort && testPort !== preferredTestPort) {
@@ -22,20 +24,21 @@ if (!resolvedTestPort && testPort !== preferredTestPort) {
22
24
  }
23
25
 
24
26
  export default defineConfig({
27
+ forbidOnly: true,
25
28
  testDir: "./e2e",
26
29
  timeout: 30_000,
27
30
  expect: {
28
31
  timeout: 5_000,
29
32
  },
30
33
  fullyParallel: false,
31
- reporter: [["list"]],
34
+ reporter: [["list"], ["./e2e/browser-runtime-evidence-reporter.ts"]],
32
35
  use: {
33
36
  ...devices["Desktop Chrome"],
34
37
  baseURL: testBaseUrl,
35
38
  trace: "retain-on-failure",
36
39
  },
37
40
  webServer: {
38
- command: `pnpm exec vite dev --host 127.0.0.1 --port ${testPort} --strictPort`,
41
+ command: `pnpm exec vite ${browserServerMode} --host 127.0.0.1 --port ${testPort} --strictPort`,
39
42
  reuseExistingServer: false,
40
43
  timeout: 60_000,
41
44
  url: testBaseUrl,
@@ -117,14 +117,20 @@ if (missingSkills.length === 0) {
117
117
  process.exit(0);
118
118
  }
119
119
 
120
- console.error("Missing required AI workflow skills:");
120
+ console.warn("Optional AI workflow skills are not installed:");
121
121
  for (const skill of missingSkills) {
122
- console.error(`- ${skill.name}: ${skill.purpose}`);
122
+ console.warn(`- ${skill.name}: ${skill.purpose}`);
123
123
  }
124
124
 
125
- console.error("");
126
- console.error("If your AI environment supports Codex skills, install the missing skills before implementation.");
127
- console.error("If installation is not available, stop and ask the user to install them.");
128
- console.error("Checked project and global skill locations for Codex, Claude Code, Cursor, and OpenCode-compatible agents.");
129
-
130
- process.exit(1);
125
+ console.warn("");
126
+ console.warn(
127
+ "Signed local AGENTS.md and docs/toolcraft contracts remain the mandatory workflow authority.",
128
+ );
129
+ console.warn(
130
+ "Continue with the local Toolcraft workflow; install available external skills when the environment supports them.",
131
+ );
132
+ console.warn(
133
+ "Checked project and global skill locations for Codex, Claude Code, Cursor, and OpenCode-compatible agents.",
134
+ );
135
+
136
+ process.exit(0);