@pixel-point/toolcraft 0.0.16 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/package.json +1 -1
  2. package/src/generate-performance-iteration-execution.test.mjs +2 -2
  3. package/src/generate-test-demand-only-lifecycle.mjs +14 -3
  4. package/src/generate-test-dependency-sandbox.mjs +42 -5
  5. package/src/generate-test-doc-assertions.mjs +109 -69
  6. package/src/generate-test-doc-assertions.test.mjs +65 -0
  7. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  8. package/src/generate-test-file-assertions.mjs +36 -118
  9. package/src/generate-test-output-assertions.mjs +95 -0
  10. package/src/generate-test-package-assertions.mjs +6 -0
  11. package/src/generate-test-performance-boundary-assertions.mjs +45 -0
  12. package/src/generate-test-product-fixture.mjs +1 -0
  13. package/src/generate-test-product-fixture.test.mjs +18 -0
  14. package/src/generate-test-product-iteration.mjs +1 -0
  15. package/src/generate-test-product-iteration.test.mjs +18 -0
  16. package/src/generate-test-runtime-boundary-assertions.mjs +158 -0
  17. package/src/generate-test-standalone-assertions.mjs +10 -0
  18. package/src/generate-test-standalone-delivery-stages.mjs +14 -6
  19. package/src/generate.test.mjs +14 -0
  20. package/templates/runtime/contracts/component-contracts.choices.test.ts +59 -12
  21. package/templates/runtime/contracts/component-contracts.choices.ts +58 -12
  22. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  23. package/templates/runtime/contracts/component-contracts.inputs.ts +6 -6
  24. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  25. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  26. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +21 -6
  27. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  28. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +4 -1
  29. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  30. package/templates/runtime/contracts/component-contracts.runtime.ts +15 -10
  31. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  32. package/templates/runtime/contracts/decision-contracts.test.ts +43 -4
  33. package/templates/runtime/contracts/decision-contracts.ts +10 -10
  34. package/templates/runtime/contracts/performance-verification-policy.test.ts +59 -6
  35. package/templates/runtime/contracts/performance-verification-policy.ts +5 -2
  36. package/templates/runtime/export/artifact-download.test.ts +71 -0
  37. package/templates/runtime/export/artifact-download.ts +80 -0
  38. package/templates/runtime/export/artifact-export-request.ts +23 -0
  39. package/templates/runtime/export/artifact-export-settings.test.ts +75 -0
  40. package/templates/runtime/export/artifact-export-settings.ts +96 -0
  41. package/templates/runtime/export/artifact-frame-renderer.test.ts +107 -0
  42. package/templates/runtime/export/artifact-frame-renderer.ts +96 -0
  43. package/templates/runtime/export/artifact-frame-state.test.ts +54 -0
  44. package/templates/runtime/export/artifact-frame-state.ts +44 -0
  45. package/templates/runtime/export/artifact-scene-frame.test.ts +84 -0
  46. package/templates/runtime/export/artifact-scene-frame.ts +118 -0
  47. package/templates/runtime/export/export-background.ts +46 -0
  48. package/templates/runtime/export/export-error.ts +43 -0
  49. package/templates/runtime/export/export.test.ts +49 -226
  50. package/templates/runtime/export/image-artifact-export.test.ts +111 -0
  51. package/templates/runtime/export/image-artifact-export.ts +145 -0
  52. package/templates/runtime/export/index.ts +44 -3
  53. package/templates/runtime/export/product-export-renderer.test.ts +77 -0
  54. package/templates/runtime/export/product-export-renderer.ts +63 -0
  55. package/templates/runtime/export/video-artifact-export.test.ts +166 -0
  56. package/templates/runtime/export/video-artifact-export.ts +164 -0
  57. package/templates/runtime/export/video-encoding-backend.ts +124 -0
  58. package/templates/runtime/export/video-encoding-policy.test.ts +68 -0
  59. package/templates/runtime/export/video-encoding-policy.ts +86 -0
  60. package/templates/runtime/export/video-frame-schedule.test.ts +58 -0
  61. package/templates/runtime/export/video-frame-schedule.ts +42 -0
  62. package/templates/runtime/index.ts +3 -0
  63. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  64. package/templates/runtime/react/app-shell/runtime-public-api-runtime.test.tsx +291 -0
  65. package/templates/runtime/react/app-shell/runtime-public-api-test-support.ts +21 -0
  66. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +15 -304
  67. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +41 -27
  68. package/templates/runtime/react/app-shell/toolcraft-app.tsx +39 -11
  69. package/templates/runtime/react/app-shell/toolcraft-source-asset-context.test.tsx +16 -57
  70. package/templates/runtime/react/app-shell/toolcraft-source-asset-context.tsx +75 -434
  71. package/templates/runtime/react/app-shell/toolcraft-source-asset-owner.test.ts +194 -0
  72. package/templates/runtime/react/app-shell/toolcraft-source-asset-owner.ts +227 -0
  73. package/templates/runtime/react/app-shell/toolcraft-source-asset-provider-ownership.test.tsx +243 -0
  74. package/templates/runtime/react/app-shell/toolcraft-source-asset-test-support.ts +51 -0
  75. package/templates/runtime/react/app-shell/toolcraft-unavailable-resource-proof.test.ts +138 -0
  76. package/templates/runtime/react/app-shell/toolcraft-unavailable-resource-proof.ts +378 -0
  77. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +76 -0
  78. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  79. package/templates/runtime/react/canvas/canvas-shell.tsx +16 -1
  80. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  81. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  82. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  83. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  84. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  85. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  86. package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +7 -12
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +18 -84
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +62 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  90. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +43 -87
  91. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +68 -0
  92. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  93. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  94. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +10 -8
  95. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +3 -3
  96. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  97. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  98. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  99. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  100. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  101. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  102. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  106. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  107. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  108. package/templates/runtime/react/index.ts +4 -0
  109. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  110. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  111. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  112. package/templates/runtime/react/panel-host/panel-host-runtime-placement.test.tsx +30 -0
  113. package/templates/runtime/react/panel-host/panel-host.tsx +4 -0
  114. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  115. package/templates/runtime/scene/scene-bounds.ts +32 -19
  116. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  117. package/templates/runtime/schema/canvas-render-scale.ts +62 -0
  118. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  119. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  120. package/templates/runtime/schema/control-applicability.ts +433 -0
  121. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  122. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  123. package/templates/runtime/schema/controls-panel-section-id.test.ts +1 -1
  124. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  125. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +62 -3
  126. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  127. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  128. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  129. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  130. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  131. package/templates/runtime/schema/define-toolcraft.setup-background.test.ts +1 -1
  132. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  133. package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +71 -3
  134. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  135. package/templates/runtime/schema/define-toolcraft.ts +1 -1
  136. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  137. package/templates/runtime/schema/schema-resolvers.ts +0 -56
  138. package/templates/runtime/schema/types.ts +72 -17
  139. package/templates/runtime/state/canvas-background-state.ts +6 -0
  140. package/templates/runtime/testing/performance-render-plan-integration.test.ts +64 -0
  141. package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +18 -1
  142. package/templates/starter/AGENTS.md +18 -15
  143. package/templates/starter/NOTICE.md +6 -0
  144. package/templates/starter/docs/toolcraft/README.md +2 -1
  145. package/templates/starter/docs/toolcraft/acceptance-testing.md +23 -35
  146. package/templates/starter/docs/toolcraft/agent-worklog.md +18 -3
  147. package/templates/starter/docs/toolcraft/assembly-workflow.md +13 -5
  148. package/templates/starter/docs/toolcraft/component-rules.md +8 -6
  149. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  150. package/templates/starter/docs/toolcraft/core/layout.md +7 -7
  151. package/templates/starter/docs/toolcraft/core/media-upload.md +4 -2
  152. package/templates/starter/docs/toolcraft/core/performance.md +14 -3
  153. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +16 -3
  154. package/templates/starter/docs/toolcraft/core/setup-export.md +49 -19
  155. package/templates/starter/docs/toolcraft/core/timeline-animation.md +4 -4
  156. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  157. package/templates/starter/docs/toolcraft/decision-contract.md +3 -1
  158. package/templates/starter/docs/toolcraft/performance.md +20 -6
  159. package/templates/starter/docs/toolcraft/renderer-technique.md +5 -1
  160. package/templates/starter/docs/toolcraft/schema-reference.md +23 -25
  161. package/templates/starter/docs/toolcraft/workflow.md +7 -2
  162. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  163. package/templates/starter/e2e/app-browser-control-coverage.spec.ts +33 -0
  164. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +50 -3
  165. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  166. package/templates/starter/e2e/app-browser-render-scale-evidence.spec.ts +60 -6
  167. package/templates/starter/e2e/app-browser-render-scale-requirements.spec.ts +77 -1
  168. package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +8 -0
  169. package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +35 -0
  170. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +5 -34
  171. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -16
  172. package/templates/starter/e2e/app-browser-shell.spec.ts +13 -5
  173. package/templates/starter/e2e/app-performance-path-adapters.ts +8 -1
  174. package/templates/starter/e2e/app-performance.spec.ts +16 -9
  175. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  176. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  177. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +29 -341
  178. package/templates/starter/e2e/browser-infinity-canvas-unavailable-image-evidence.ts +370 -0
  179. package/templates/starter/e2e/browser-media-export-evidence.spec.ts +77 -0
  180. package/templates/starter/e2e/browser-media-export-evidence.ts +208 -0
  181. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  182. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  183. package/templates/starter/e2e/browser-render-scale-evidence.ts +37 -29
  184. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  185. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +13 -3
  186. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +72 -35
  187. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +25 -0
  188. package/templates/starter/e2e/browser-standard-timeline-evidence.ts +106 -0
  189. package/templates/starter/e2e/decoded-pixel-observation.spec.ts +74 -0
  190. package/templates/starter/e2e/decoded-pixel-observation.ts +227 -0
  191. package/templates/starter/e2e/export-artifact-helpers.ts +206 -25
  192. package/templates/starter/e2e/image-artifact-inspection.spec.ts +41 -0
  193. package/templates/starter/e2e/image-artifact-inspection.ts +99 -0
  194. package/templates/starter/e2e/performance-canvas-helpers.ts +22 -21
  195. package/templates/starter/e2e/performance-canvas-quality-guard.spec.ts +312 -0
  196. package/templates/starter/e2e/performance-canvas-quality-guard.ts +196 -0
  197. package/templates/starter/e2e/performance-canvas-quality-observer.ts +351 -0
  198. package/templates/starter/e2e/performance-control-layout-helpers.ts +2 -2
  199. package/templates/starter/e2e/performance-path-adapter-contract.ts +4 -4
  200. package/templates/starter/e2e/performance-path-helpers.spec.ts +203 -70
  201. package/templates/starter/e2e/performance-path-helpers.ts +210 -91
  202. package/templates/starter/e2e/performance-pipeline-evidence-continuity.spec.ts +76 -0
  203. package/templates/starter/e2e/performance-pipeline-evidence-test-fixtures.ts +11 -2
  204. package/templates/starter/e2e/performance-pipeline-invariants.ts +47 -4
  205. package/templates/starter/e2e/performance-render-scale-runner.spec.ts +140 -38
  206. package/templates/starter/e2e/video-artifact-inspection.spec.ts +64 -0
  207. package/templates/starter/e2e/video-artifact-inspection.ts +281 -0
  208. package/templates/starter/gitignore +1 -0
  209. package/templates/starter/package.json +1 -0
  210. package/templates/starter/scripts/check-toolcraft-docs.mjs +17 -0
  211. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  212. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +60 -0
  213. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +7 -2
  214. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +7 -3
  215. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +95 -103
  216. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  217. package/templates/starter/scripts/toolcraft-product-boundary.mjs +12 -0
  218. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -26
  219. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  220. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  221. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  222. package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +85 -20
  223. package/templates/starter/scripts/toolcraft-product-evidence-import-policy.mjs +43 -0
  224. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +157 -0
  225. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +196 -0
  226. package/templates/starter/scripts/toolcraft-typescript-analysis.d.mts +73 -0
  227. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  228. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  229. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade-test-helpers.mjs +318 -0
  230. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +157 -206
  231. package/templates/starter/scripts/toolcraft-verification-inventory.mjs +1 -0
  232. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +51 -0
  233. package/templates/starter/scripts/toolcraft-vite-env-activation.test.mjs +128 -59
  234. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +130 -0
  235. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  236. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  237. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -20
  238. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  239. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -13
  240. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  241. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  242. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  243. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  244. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  245. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  246. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +3 -10
  247. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  248. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  249. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  250. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  251. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  252. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  253. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +113 -0
  254. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  255. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  256. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  257. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  258. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +18 -10
  259. package/templates/starter/src/app/acceptance/output-export-model.ts +54 -11
  260. package/templates/starter/src/app/acceptance/output-export.ts +35 -12
  261. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  262. package/templates/starter/src/app/acceptance/types.ts +30 -8
  263. package/templates/starter/src/app/acceptance/validate-coverage.ts +20 -2
  264. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +239 -0
  265. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +33 -0
  266. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +16 -1
  267. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +65 -0
  268. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  269. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +112 -16
  270. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +224 -0
  271. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  272. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  273. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  274. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  275. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +131 -0
  276. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +22 -0
  277. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +37 -9
  278. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +12 -0
  279. package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +14 -4
  280. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  281. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
  282. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +384 -0
  283. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +46 -1
  284. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +112 -105
  285. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +12 -0
  286. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +1 -1
  287. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  288. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  289. package/templates/starter/src/app/starter-acceptance.ts +13 -2
  290. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +336 -0
  291. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +8 -0
  292. package/templates/starter/src/app/starter-performance-test-utils.ts +103 -0
  293. package/templates/starter/src/app/starter-performance.gates.test.ts +231 -278
  294. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +261 -0
  295. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +4 -2
  296. package/templates/starter/src/routes/index.tsx +2 -0
  297. package/templates/ui/components/composites/tabs.tsx +2 -2
  298. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  299. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  300. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  301. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  302. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  303. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  304. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  305. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  306. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  307. package/templates/ui/components/controls/index.ts +3 -0
  308. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  309. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  310. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  311. package/templates/runtime/export/export.ts +0 -166
  312. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  313. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  defineToolcraft,
3
+ resolveToolcraftControlApplicability,
4
+ type ResolvedToolcraftAppSchema,
3
5
  type ToolcraftAppSchema,
4
6
  } from "@repo/toolcraft-runtime";
5
7
 
@@ -16,8 +18,32 @@ import {
16
18
  } from "./acceptance/validate-coverage";
17
19
 
18
20
  export function defineContractSchemaFixture(schema: ToolcraftAppSchema) {
21
+ const controls = schema.panels.controls
22
+ ? {
23
+ ...schema.panels.controls,
24
+ sections: schema.panels.controls.sections.map((section) => ({
25
+ ...section,
26
+ controls: Object.fromEntries(
27
+ Object.entries(section.controls).map(([controlId, control]) => [
28
+ controlId,
29
+ control.applicability || control.visibleWhen
30
+ ? control
31
+ : {
32
+ ...control,
33
+ applicability: { mode: "always" as const },
34
+ },
35
+ ]),
36
+ ),
37
+ })),
38
+ }
39
+ : undefined;
40
+
19
41
  return defineToolcraft({
20
42
  ...schema,
43
+ panels: {
44
+ ...schema.panels,
45
+ ...(controls ? { controls } : {}),
46
+ },
21
47
  persistence: { storage: "none" },
22
48
  });
23
49
  }
@@ -54,28 +80,98 @@ export const contractProductReadinessFixture: ToolcraftProductReadiness = {
54
80
  reason: "Neutral contract fixture without a product-owned spatial scene.",
55
81
  };
56
82
 
57
- export function validateContractAcceptance(
58
- overrides: Partial<ToolcraftAcceptanceValidationInput> = {},
59
- ): string[] {
60
- return validateToolcraftAcceptanceCoverage({
83
+ type ContractAcceptanceOverrides = Omit<
84
+ Partial<ToolcraftAcceptanceValidationInput>,
85
+ "schema"
86
+ > & {
87
+ schema?: ContractValidationSchemaFixture;
88
+ };
89
+
90
+ type ContractValidationSchemaFixture = Omit<
91
+ ResolvedToolcraftAppSchema,
92
+ "panels"
93
+ > & {
94
+ panels: Omit<ResolvedToolcraftAppSchema["panels"], "controls"> & {
95
+ controls?: ToolcraftAppSchema["panels"]["controls"];
96
+ };
97
+ };
98
+
99
+ function resolveContractValidationSchemaFixture(
100
+ schema: ContractValidationSchemaFixture,
101
+ ): ResolvedToolcraftAppSchema {
102
+ const {
103
+ controls: _fixtureControls,
104
+ ...panelsWithoutFixtureControls
105
+ } = schema.panels;
106
+ const controls = schema.panels.controls
107
+ ? {
108
+ ...schema.panels.controls,
109
+ sections: schema.panels.controls.sections.map((section) => ({
110
+ ...section,
111
+ controls: Object.fromEntries(
112
+ Object.entries(section.controls).map(([controlId, control]) => {
113
+ const {
114
+ applicability: authoredApplicability,
115
+ visibleWhen,
116
+ ...controlWithoutApplicability
117
+ } = control;
118
+
119
+ return [
120
+ controlId,
121
+ {
122
+ ...controlWithoutApplicability,
123
+ applicability: resolveToolcraftControlApplicability({
124
+ applicability:
125
+ authoredApplicability ??
126
+ (visibleWhen ? undefined : { mode: "always" }),
127
+ visibleWhen,
128
+ }),
129
+ },
130
+ ];
131
+ }),
132
+ ),
133
+ })),
134
+ }
135
+ : undefined;
136
+
137
+ // Contract tests deliberately preserve malformed post-normalization fields so
138
+ // the matching acceptance validator, rather than defineToolcraft, reports them.
139
+ return {
140
+ ...schema,
141
+ panels: {
142
+ ...panelsWithoutFixtureControls,
143
+ ...(controls ? { controls } : {}),
144
+ },
145
+ } as ResolvedToolcraftAppSchema;
146
+ }
147
+
148
+ function resolveContractAcceptanceInput(
149
+ overrides: ContractAcceptanceOverrides,
150
+ ): ToolcraftAcceptanceValidationInput {
151
+ const { schema = contractSchemaFixture, ...remainingOverrides } = overrides;
152
+
153
+ return {
61
154
  acceptance: contractAcceptanceFixture,
62
155
  productReadiness: contractProductReadinessFixture,
63
- schema: contractSchemaFixture,
156
+ schema: resolveContractValidationSchemaFixture(schema),
64
157
  sectionInventory: contractSectionInventoryFixture,
65
158
  transferMode: contractTransferModeFixture,
66
- ...overrides,
67
- });
159
+ ...remainingOverrides,
160
+ };
161
+ }
162
+
163
+ export function validateContractAcceptance(
164
+ overrides: ContractAcceptanceOverrides = {},
165
+ ): string[] {
166
+ return validateToolcraftAcceptanceCoverage(
167
+ resolveContractAcceptanceInput(overrides),
168
+ );
68
169
  }
69
170
 
70
171
  export function validateContractAcceptanceDiagnostics(
71
- overrides: Partial<ToolcraftAcceptanceValidationInput> = {},
172
+ overrides: ContractAcceptanceOverrides = {},
72
173
  ) {
73
- return validateToolcraftAcceptanceDiagnostics({
74
- acceptance: contractAcceptanceFixture,
75
- productReadiness: contractProductReadinessFixture,
76
- schema: contractSchemaFixture,
77
- sectionInventory: contractSectionInventoryFixture,
78
- transferMode: contractTransferModeFixture,
79
- ...overrides,
80
- });
174
+ return validateToolcraftAcceptanceDiagnostics(
175
+ resolveContractAcceptanceInput(overrides),
176
+ );
81
177
  }
@@ -0,0 +1,224 @@
1
+ import {
2
+ defineToolcraft,
3
+ type ToolcraftControlSchema,
4
+ } from "@repo/toolcraft-runtime";
5
+ import { describe, expect, it } from "vitest";
6
+
7
+ import { getToolcraftControlApplicabilityErrors } from "./acceptance/control-applicability";
8
+ import type { ToolcraftProductReadiness } from "./acceptance/types";
9
+ import { collectToolcraftVisibleAcceptanceControls } from "./acceptance/validate-coverage";
10
+
11
+ const productReadiness: ToolcraftProductReadiness = {
12
+ exportIntent: {
13
+ image: { mode: "toolcraft-default" },
14
+ video: { mode: "not-requested" },
15
+ },
16
+ interactionOwnership: [],
17
+ mode: "product",
18
+ productName: "Shape fixture",
19
+ productSummary: "Neutral applicability contract fixture.",
20
+ requestedBehavior: "Show only controls that apply to the selected shape.",
21
+ viewInteraction: { mode: "non-spatial", reason: "Schema-only fixture." },
22
+ };
23
+
24
+ const shapeKind: ToolcraftControlSchema = {
25
+ applicability: { mode: "always" },
26
+ defaultValue: "circle",
27
+ options: [
28
+ { label: "Circle", value: "circle" },
29
+ { label: "Square", value: "square" },
30
+ { label: "Polygon", value: "polygon" },
31
+ { label: "Star", value: "star" },
32
+ ],
33
+ target: "shape.kind",
34
+ type: "segmented",
35
+ };
36
+
37
+ const alwaysControls: Record<string, ToolcraftControlSchema> = {
38
+ kind: shapeKind,
39
+ cornerRadius: {
40
+ applicability: {
41
+ all: [
42
+ {
43
+ oneOf: ["square", "polygon", "star"],
44
+ target: "shape.kind",
45
+ },
46
+ ],
47
+ mode: "conditional",
48
+ },
49
+ target: "shape.cornerRadius",
50
+ type: "slider",
51
+ },
52
+ depth: {
53
+ applicability: {
54
+ all: [{ equals: "star", target: "shape.kind" }],
55
+ mode: "conditional",
56
+ },
57
+ target: "shape.depth",
58
+ type: "slider",
59
+ },
60
+ sides: {
61
+ applicability: {
62
+ all: [
63
+ { oneOf: ["polygon", "star"], target: "shape.kind" },
64
+ ],
65
+ mode: "conditional",
66
+ },
67
+ target: "shape.sides",
68
+ type: "slider",
69
+ },
70
+ };
71
+
72
+ function validateProduct(
73
+ controls: Record<string, ToolcraftControlSchema>,
74
+ ): string[] {
75
+ const schema = defineToolcraft({
76
+ canvas: { enabled: true },
77
+ panels: {
78
+ controls: {
79
+ sections: [{ controls, id: "shape", title: "Shape" }],
80
+ title: "Controls",
81
+ },
82
+ },
83
+ });
84
+
85
+ return getToolcraftControlApplicabilityErrors({
86
+ controls: collectToolcraftVisibleAcceptanceControls(schema),
87
+ productReadiness,
88
+ });
89
+ }
90
+
91
+ describe("starter product control applicability", () => {
92
+ it("requires explicit product applicability and rejects legacy visibility", () => {
93
+ expect(
94
+ validateProduct({
95
+ kind: shapeKind,
96
+ sides: { target: "shape.sides", type: "slider" },
97
+ }),
98
+ ).toContainEqual(
99
+ expect.stringContaining("shape.sides must declare explicit applicability"),
100
+ );
101
+
102
+ expect(
103
+ validateProduct({
104
+ kind: shapeKind,
105
+ sides: {
106
+ target: "shape.sides",
107
+ type: "slider",
108
+ visibleWhen: { equals: "star", target: "shape.kind" },
109
+ },
110
+ }),
111
+ ).toContainEqual(
112
+ expect.stringContaining("shape.sides uses legacy visibleWhen"),
113
+ );
114
+ });
115
+
116
+ it("rejects missing, invalid, contradictory, and unsupported selectors", () => {
117
+ expect(
118
+ validateProduct({
119
+ kind: shapeKind,
120
+ sides: {
121
+ applicability: {
122
+ all: [{ equals: true, target: "shape.missing" }],
123
+ mode: "conditional",
124
+ },
125
+ target: "shape.sides",
126
+ type: "slider",
127
+ },
128
+ }),
129
+ ).toContainEqual(
130
+ expect.stringContaining('predicate target "shape.missing" does not exist'),
131
+ );
132
+
133
+ expect(
134
+ validateProduct({
135
+ kind: shapeKind,
136
+ sides: {
137
+ applicability: {
138
+ all: [{ equals: "triangle", target: "shape.kind" }],
139
+ mode: "conditional",
140
+ },
141
+ target: "shape.sides",
142
+ type: "slider",
143
+ },
144
+ }),
145
+ ).toContainEqual(
146
+ expect.stringContaining(
147
+ 'value "triangle" is not an option of shape.kind',
148
+ ),
149
+ );
150
+
151
+ expect(
152
+ validateProduct({
153
+ kind: shapeKind,
154
+ sides: {
155
+ applicability: {
156
+ all: [
157
+ { equals: "polygon", target: "shape.kind" },
158
+ { equals: "star", target: "shape.kind" },
159
+ ],
160
+ mode: "conditional",
161
+ },
162
+ target: "shape.sides",
163
+ type: "slider",
164
+ },
165
+ }),
166
+ ).toContainEqual(
167
+ expect.stringContaining("shape.sides applicability is unsatisfiable"),
168
+ );
169
+
170
+ expect(
171
+ validateProduct({
172
+ kind: shapeKind,
173
+ name: {
174
+ applicability: { mode: "always" },
175
+ target: "shape.name",
176
+ type: "text",
177
+ },
178
+ sides: {
179
+ applicability: {
180
+ all: [{ equals: "named", target: "shape.name" }],
181
+ mode: "conditional",
182
+ },
183
+ target: "shape.sides",
184
+ type: "slider",
185
+ },
186
+ }),
187
+ ).toContainEqual(
188
+ expect.stringContaining(
189
+ "shape.name is not a supported applicability selector",
190
+ ),
191
+ );
192
+ });
193
+
194
+ it("rejects numeric gates with no satisfying selector value", () => {
195
+ expect(
196
+ validateProduct({
197
+ count: {
198
+ applicability: { mode: "always" },
199
+ defaultValue: 2,
200
+ max: 3,
201
+ min: 1,
202
+ step: 1,
203
+ target: "shape.count",
204
+ type: "slider",
205
+ variant: "discrete",
206
+ },
207
+ sides: {
208
+ applicability: {
209
+ all: [{ greaterThan: 10, target: "shape.count" }],
210
+ mode: "conditional",
211
+ },
212
+ target: "shape.sides",
213
+ type: "slider",
214
+ },
215
+ }),
216
+ ).toContainEqual(
217
+ expect.stringContaining("shape.sides has no satisfying value in shape.count"),
218
+ );
219
+ });
220
+
221
+ it("accepts a complete finite applicability declaration", () => {
222
+ expect(validateProduct(alwaysControls)).toEqual([]);
223
+ });
224
+ });
@@ -1,6 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import {
3
3
  getToolcraftSegmentedStaticFitError,
4
+ type ToolcraftCollectionItemControlType,
4
5
  } from "@repo/toolcraft-runtime";
5
6
 
6
7
  import {
@@ -18,7 +19,7 @@ const SCREENSHOT_LABELS = ["Default", "Ink Drops", "Solar", "Background"];
18
19
  const BOUNDARY_LABELS = ["Ink Drops", "Default", "Solar", "RGB"];
19
20
 
20
21
  function createRawCollectionModesSchema(
21
- itemControlType: string,
22
+ itemControlType: ToolcraftCollectionItemControlType,
22
23
  labels: readonly string[],
23
24
  ) {
24
25
  return {
@@ -64,6 +65,11 @@ const collectionModesAcceptance = [
64
65
  browser: true,
65
66
  browserTestName: "browser: collection modes update rendered output",
66
67
  componentType: "collectionActions",
68
+ controlPartCoverage: [
69
+ "collectionActions.add",
70
+ "collectionActions.remove",
71
+ "collectionActions.items",
72
+ ] as const,
67
73
  evidence: "rendered-pixels" as const,
68
74
  expectedObservable: "Adding and editing modes changes rendered output.",
69
75
  fixture: "collection modes fixture",
@@ -339,7 +345,7 @@ describe("starter acceptance control order contract", () => {
339
345
  it("reports canonical fit guidance for an overwide collectionActions itemControl", () => {
340
346
  const itemControl = {
341
347
  options: SCREENSHOT_LABELS.map((label) => ({ label })),
342
- type: "segmented",
348
+ type: "segmented" as const,
343
349
  };
344
350
  const fitGuidance = getToolcraftSegmentedStaticFitError(itemControl);
345
351
 
@@ -359,10 +365,59 @@ describe("starter acceptance control order contract", () => {
359
365
  );
360
366
  });
361
367
 
368
+ it("reports canonical fit guidance for every compound itemControls field", () => {
369
+ const schema = createRawCollectionModesSchema("segmented", SCREENSHOT_LABELS);
370
+ const modes = schema.panels.controls.sections[0]!.controls.modes;
371
+ const compoundSchema = {
372
+ ...schema,
373
+ panels: {
374
+ ...schema.panels,
375
+ controls: {
376
+ ...schema.panels.controls,
377
+ sections: [
378
+ {
379
+ ...schema.panels.controls.sections[0],
380
+ controls: {
381
+ modes: {
382
+ ...modes,
383
+ defaultValue: [{ enabled: true, mode: "default" }],
384
+ itemControl: undefined,
385
+ itemControls: {
386
+ enabled: {
387
+ defaultValue: true,
388
+ label: "Enabled",
389
+ type: "switch" as const,
390
+ },
391
+ mode: modes.itemControl,
392
+ },
393
+ },
394
+ },
395
+ },
396
+ ],
397
+ },
398
+ },
399
+ };
400
+ const fitGuidance = getToolcraftSegmentedStaticFitError(
401
+ modes.itemControl,
402
+ );
403
+
404
+ expect(fitGuidance).not.toBeNull();
405
+ expect(
406
+ validateContractAcceptance({
407
+ schema: compoundSchema,
408
+ acceptance: collectionModesAcceptance,
409
+ }),
410
+ ).toEqual(
411
+ expect.arrayContaining([
412
+ `Style / modes (appearance.modes) itemControls.mode ${fitGuidance}`,
413
+ ]),
414
+ );
415
+ });
416
+
362
417
  it.each([
363
418
  { labels: BOUNDARY_LABELS, type: "segmented" },
364
419
  { labels: SCREENSHOT_LABELS, type: "select" },
365
- ])(
420
+ ] as const)(
366
421
  "does not report itemControl fit guidance for nested $type",
367
422
  ({ labels, type }) => {
368
423
  const errors = validateContractAcceptance({
@@ -160,115 +160,4 @@ describe("starter acceptance control state contract", () => {
160
160
  );
161
161
  });
162
162
 
163
- it("requires visibleWhen controls to reference a real target and prove hidden behavior", () => {
164
- const schemaWithVisibleDependency = defineContractSchemaFixture({
165
- canvas: { enabled: true },
166
- panels: {
167
- controls: {
168
- sections: [
169
- {
170
- controls: {
171
- shadeCount: {
172
- defaultValue: 2,
173
- label: "Shades",
174
- max: 5,
175
- min: 1,
176
- step: 1,
177
- target: "shapes.shadeCount",
178
- type: "slider",
179
- variant: "discrete",
180
- },
181
- shade3: {
182
- defaultValue: { hex: "#BBBBBB" },
183
- label: "Shade 3",
184
- target: "shapes.color3",
185
- type: "color",
186
- visibleWhen: {
187
- greaterThanOrEqual: 3,
188
- target: "shapes.count",
189
- },
190
- },
191
- },
192
- title: "Shapes",
193
- },
194
- ],
195
- title: "Controls",
196
- },
197
- },
198
- });
199
-
200
- expect(
201
- validateContractAcceptance({
202
- schema: schemaWithVisibleDependency,
203
- acceptance: [
204
- makeControlAcceptance("shapes.shadeCount", "slider"),
205
- makeControlAcceptance("shapes.color3", "color"),
206
- ],
207
- }),
208
- ).toEqual(
209
- expect.arrayContaining([
210
- expect.stringContaining(
211
- "visibleWhen target shapes.count does not match another schema control target",
212
- ),
213
- expect.stringContaining(
214
- "uses visibleWhen and must declare visibilityCoverage",
215
- ),
216
- ]),
217
- );
218
-
219
- const schemaWithValidVisibleDependency = defineContractSchemaFixture({
220
- canvas: { enabled: true },
221
- panels: {
222
- controls: {
223
- sections: [
224
- {
225
- controls: {
226
- shadeCount: {
227
- defaultValue: 2,
228
- label: "Shades",
229
- max: 5,
230
- min: 1,
231
- step: 1,
232
- target: "shapes.shadeCount",
233
- type: "slider",
234
- variant: "discrete",
235
- },
236
- shade3: {
237
- defaultValue: { hex: "#BBBBBB" },
238
- label: "Shade 3",
239
- target: "shapes.color3",
240
- type: "color",
241
- visibleWhen: {
242
- greaterThanOrEqual: 3,
243
- target: "shapes.shadeCount",
244
- },
245
- },
246
- },
247
- title: "Shapes",
248
- },
249
- ],
250
- title: "Controls",
251
- },
252
- },
253
- });
254
- const errors = validateContractAcceptance({
255
- schema: schemaWithValidVisibleDependency,
256
- acceptance: [
257
- makeControlAcceptance("shapes.shadeCount", "slider"),
258
- {
259
- ...makeControlAcceptance("shapes.color3", "color"),
260
- expectedObservable: "Третий цвет доступен только для соответствующего состояния продукта.",
261
- userAction: "Переключить количество оттенков и проверить оба состояния.",
262
- visibilityCoverage: ["hidden", "visible"],
263
- },
264
- ],
265
- });
266
-
267
- expect(errors).not.toEqual(
268
- expect.arrayContaining([
269
- expect.stringContaining("visibleWhen target"),
270
- expect.stringContaining("uses visibleWhen and must declare visibilityCoverage"),
271
- ]),
272
- );
273
- });
274
163
  });
@@ -6,7 +6,7 @@ import {
6
6
  } from "./starter-acceptance.contract-fixtures";
7
7
 
8
8
  describe("starter acceptance custom control collection contract", () => {
9
- it("requires collection-like custom controls to compare actions and collectionActions", () => {
9
+ it("requires collection-like custom controls to compare both cardinality owners and actions", () => {
10
10
  const schema = defineContractSchemaFixture({
11
11
  canvas: { enabled: true },
12
12
  panels: {
@@ -71,6 +71,7 @@ describe("starter acceptance custom control collection contract", () => {
71
71
  ],
72
72
  }),
73
73
  ).toEqual([
74
+ "Masks / maskEditor (masks) builtInFitCheck.checkedBuiltIns must include sourceCollection when the custom control owns a repeated runtime item set whose cardinality could be source-owned.",
74
75
  "Masks / maskEditor (masks) builtInFitCheck.checkedBuiltIns must include collectionActions when the custom control owns a growable, removable, selectable, or reorderable runtime item set.",
75
76
  "Masks / maskEditor (masks) builtInFitCheck.checkedBuiltIns must include actions when the custom control exposes local command buttons such as add, remove, delete, duplicate, sort, normalize, or clear.",
76
77
  ]);
@@ -135,6 +136,7 @@ describe("starter acceptance custom control collection contract", () => {
135
136
  ],
136
137
  }),
137
138
  ).toEqual([
139
+ "Pattern / patternSet (pattern.set) builtInFitCheck.checkedBuiltIns must include sourceCollection when the custom control owns a repeated runtime item set whose cardinality could be source-owned.",
138
140
  "Pattern / patternSet (pattern.set) builtInFitCheck.checkedBuiltIns must include collectionActions when the custom control owns a growable, removable, selectable, or reorderable runtime item set.",
139
141
  ]);
140
142
  });
@@ -48,7 +48,7 @@ describe("starter acceptance valid custom control contract", () => {
48
48
  "reorder",
49
49
  "selection",
50
50
  ],
51
- checkedBuiltIns: ["actions", "collectionActions", "fileDrop", "imagePicker", "select"],
51
+ checkedBuiltIns: ["actions", "collectionActions", "fileDrop", "imagePicker", "select", "sourceCollection"],
52
52
  closestBuiltIn: "fileDrop",
53
53
  productObservable: "Ordering uploaded glyphs changes the rendered glyph ramp output.",
54
54
  whyInsufficient: "FileDrop imports source files, but it does not provide density ordering, per-glyph preview, reorder, and remove behavior in one runtime value.",