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