@pixel-point/toolcraft 0.0.18 → 0.0.19
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-demand-only-lifecycle.test.mjs +9 -1
- package/src/generate-performance-iteration-execution.test.mjs +3 -3
- package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
- package/src/generate-test-demand-only-lifecycle.mjs +34 -36
- package/src/generate-test-dependency-sandbox.mjs +4 -1
- package/src/generate-test-doc-assertions.mjs +55 -53
- package/src/generate-test-doc-assertions.test.mjs +1 -1
- package/src/generate-test-doc-policy-assertions.mjs +1 -1
- package/src/generate-test-export-doc-assertions.mjs +53 -0
- package/src/generate-test-file-assertions.mjs +51 -8
- package/src/generate-test-integrity-assertions.mjs +5 -2
- package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
- package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
- package/src/generate-test-package-assertions.mjs +4 -0
- package/src/generate-test-product-fixture.mjs +1 -1
- package/src/generate-test-product-fixture.test.mjs +35 -38
- package/src/generate-test-product-iteration.mjs +0 -1
- package/src/generate-test-product-iteration.test.mjs +0 -1
- package/src/generate-test-runtime-boundary-assertions.mjs +20 -0
- package/src/generate-test-standalone-assertions.mjs +0 -16
- package/src/generate-test-standalone-delivery-stages.mjs +2 -86
- package/src/generate.test.mjs +4 -0
- package/src/generated-integrity-manifest.test.mjs +5 -2
- package/src/generated-source-policy.test.mjs +0 -4
- package/src/package-json.mjs +5 -0
- package/src/package-json.test.mjs +21 -0
- package/src/package-manager.mjs +2 -0
- package/src/package-manager.test.mjs +8 -0
- package/src/packaged-template-fallback-helpers.mjs +254 -0
- package/src/packaged-template-fallback.test.mjs +121 -46
- package/src/packaged-template-runtime-assertions.mjs +150 -0
- package/templates/runtime/contracts/component-contracts.choices.test.ts +18 -3
- package/templates/runtime/contracts/component-contracts.choices.ts +8 -3
- package/templates/runtime/contracts/component-contracts.inputs.ts +2 -1
- package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +18 -4
- package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +1 -1
- package/templates/runtime/contracts/component-contracts.runtime.ts +7 -4
- package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
- package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
- package/templates/runtime/contracts/decision-contracts.test.ts +18 -12
- package/templates/runtime/contracts/decision-contracts.ts +4 -4
- package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
- package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
- package/templates/runtime/export/artifact-download.ts +1 -0
- package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
- package/templates/runtime/export/artifact-frame-state.ts +16 -0
- package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
- package/templates/runtime/export/artifact-scene-frame.ts +3 -3
- package/templates/runtime/export/export-error.ts +5 -0
- package/templates/runtime/export/export-renderer-coverage.ts +54 -0
- package/templates/runtime/export/image-artifact-export.ts +2 -2
- package/templates/runtime/export/index.ts +13 -0
- package/templates/runtime/export/product-export-renderer.test.ts +38 -4
- package/templates/runtime/export/product-export-renderer.ts +0 -41
- package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
- package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
- package/templates/runtime/export/svg-artifact-export.ts +120 -0
- package/templates/runtime/export/svg-document.test.ts +221 -0
- package/templates/runtime/export/svg-document.ts +400 -0
- package/templates/runtime/export/svg-policy.ts +47 -0
- package/templates/runtime/index.ts +1 -0
- package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +10 -0
- package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
- package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +46 -1
- package/templates/runtime/react/app-shell/toolcraft-app.tsx +7 -2
- package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
- package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
- package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +1 -1
- package/templates/runtime/react/canvas/canvas-shell.tsx +16 -5
- package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
- package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +39 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +1 -4
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +2 -2
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
- package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +2 -2
- package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +40 -11
- package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +31 -2
- package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +4 -1
- package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
- package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
- package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
- package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
- package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
- package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
- package/templates/runtime/schema/artifact-export-actions.ts +49 -0
- package/templates/runtime/schema/types.ts +1 -0
- package/templates/runtime/state/canvas-background-state.ts +1 -16
- package/templates/runtime/state/canvas-state.ts +32 -20
- package/templates/runtime/state/control-value-codecs.test.ts +98 -0
- package/templates/runtime/state/control-value-codecs.ts +700 -0
- package/templates/runtime/state/control-value-normalization.test.ts +1 -1
- package/templates/runtime/state/control-value-normalization.ts +127 -135
- package/templates/runtime/state/controls-reducer.ts +26 -3
- package/templates/runtime/state/create-template-state.test.ts +30 -0
- package/templates/runtime/state/create-template-state.ts +52 -31
- package/templates/runtime/state/orientation-pose.ts +80 -0
- package/templates/runtime/state/persistence-control-values.test.ts +59 -0
- package/templates/runtime/state/reducer-controls.test.ts +45 -0
- package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
- package/templates/runtime/state/reducer-timeline.test.ts +70 -0
- package/templates/runtime/state/timeline-reducer.ts +40 -2
- package/templates/runtime/testing/performance-schema-queries.ts +2 -2
- package/templates/starter/AGENTS.md +21 -22
- package/templates/starter/docs/toolcraft/README.md +6 -6
- package/templates/starter/docs/toolcraft/acceptance-testing.md +20 -20
- package/templates/starter/docs/toolcraft/agent-worklog.md +88 -1
- package/templates/starter/docs/toolcraft/assembly-workflow.md +7 -6
- package/templates/starter/docs/toolcraft/component-rules.md +2 -2
- package/templates/starter/docs/toolcraft/core/layout.md +6 -1
- package/templates/starter/docs/toolcraft/core/media-upload.md +1 -1
- package/templates/starter/docs/toolcraft/core/performance.md +8 -10
- package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
- package/templates/starter/docs/toolcraft/core/runtime-boundary.md +2 -1
- package/templates/starter/docs/toolcraft/core/setup-export.md +43 -13
- package/templates/starter/docs/toolcraft/decision-contract.md +2 -2
- package/templates/starter/docs/toolcraft/performance.md +8 -10
- package/templates/starter/docs/toolcraft/renderer-technique.md +2 -2
- package/templates/starter/docs/toolcraft/schema-reference.md +8 -8
- package/templates/starter/docs/toolcraft/workflow.md +14 -14
- package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +38 -0
- package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
- package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
- package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +62 -0
- package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
- package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
- package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
- package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
- package/templates/starter/e2e/browser-proof-session.ts +43 -15
- package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
- package/templates/starter/e2e/browser-proof-types.ts +15 -0
- package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +22 -6
- package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
- package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +97 -0
- package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
- package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
- package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
- package/templates/starter/e2e/product-observable-helpers.ts +8 -129
- package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
- package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
- package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
- package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
- package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
- package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
- package/templates/starter/package.json +2 -0
- package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
- package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
- package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
- package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
- package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
- package/templates/starter/scripts/run-browser-performance.mjs +0 -6
- package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
- package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
- package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
- package/templates/starter/scripts/run-feature-verification.mjs +212 -0
- package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
- package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
- package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
- package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
- package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
- package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
- package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
- package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
- package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
- package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
- package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
- package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
- package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
- package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
- package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
- package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
- package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
- package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
- package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
- package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
- package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
- package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
- package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
- package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
- package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
- package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
- package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
- package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
- package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
- package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
- package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
- package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
- package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
- package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
- package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
- package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
- package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
- package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
- package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
- package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
- package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
- package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
- package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
- package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
- package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
- package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
- package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
- package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
- package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
- package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
- package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
- package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
- package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
- package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
- package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
- package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
- package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
- package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
- package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
- package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
- package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
- package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
- package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
- package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
- package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
- package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
- package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
- package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
- package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
- package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
- package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
- package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
- package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
- package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +1 -1
- package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +10 -1
- package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +5 -1
- package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
- package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
- package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
- package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
- package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
- package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
- package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
- package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
- package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
- package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
- package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
- package/templates/starter/src/app/acceptance/artifact-export-intent.ts +51 -20
- package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
- package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
- package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
- package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +0 -11
- package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -3
- package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
- package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
- package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +18 -0
- package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
- package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
- package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
- package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
- package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
- package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
- package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
- package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
- package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
- package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
- package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
- package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
- package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
- package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +5 -1
- package/templates/starter/src/app/acceptance/output-export-model.ts +4 -0
- package/templates/starter/src/app/acceptance/output-export.ts +4 -1
- package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
- package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
- package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
- package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
- package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
- package/templates/starter/src/app/acceptance/types.ts +43 -118
- package/templates/starter/src/app/acceptance/validate-coverage.ts +14 -3
- package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
- package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +81 -8
- package/templates/starter/src/app/starter-acceptance.background-export.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
- package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +1 -1
- package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
- package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
- package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
- package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
- package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +5 -1
- package/templates/starter/src/app/starter-acceptance.image-export-settings.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +19 -3
- package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
- package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
- package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +78 -4
- package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +6 -1
- package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +18 -1
- package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
- package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
- package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
- package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
- package/templates/starter/src/app/starter-acceptance.ts +34 -8
- package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
- package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +4 -0
- package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
- package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
- package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
- package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
- package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +3 -0
- package/templates/starter/tsconfig.json +1 -0
- package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
- package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
- package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
- package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
- package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
- package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
- package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
- package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
- package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
- package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
- package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
- package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
- package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
- package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
- package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
- package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
- package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
- package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
- package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
- package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
- package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
- package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
- package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
- package/templates/starter/src/app/starter-verification-impact.json +0 -15
|
@@ -10,45 +10,50 @@ import type { ToolcraftArtifactExportIntent } from "./acceptance/types";
|
|
|
10
10
|
const deliveryCases: readonly Readonly<{
|
|
11
11
|
expected: Readonly<{
|
|
12
12
|
imageEnabled: boolean;
|
|
13
|
+
svgEnabled: boolean;
|
|
13
14
|
videoEnabled: boolean;
|
|
14
15
|
}>;
|
|
15
16
|
intent: ToolcraftArtifactExportIntent;
|
|
16
17
|
name: string;
|
|
17
18
|
}>[] = [
|
|
18
19
|
{
|
|
19
|
-
expected: { imageEnabled: true, videoEnabled: false },
|
|
20
|
+
expected: { imageEnabled: true, svgEnabled: false, videoEnabled: false },
|
|
20
21
|
intent: {
|
|
21
22
|
image: { mode: "toolcraft-default" },
|
|
23
|
+
svg: { mode: "not-requested" },
|
|
22
24
|
video: { mode: "not-requested" },
|
|
23
25
|
},
|
|
24
26
|
name: "enables default image export without unrequested video export",
|
|
25
27
|
},
|
|
26
28
|
{
|
|
27
|
-
expected: { imageEnabled: true, videoEnabled: false },
|
|
29
|
+
expected: { imageEnabled: true, svgEnabled: false, videoEnabled: false },
|
|
28
30
|
intent: {
|
|
29
31
|
image: {
|
|
30
32
|
evidence: "The user explicitly requested PNG delivery.",
|
|
31
33
|
mode: "user-requested",
|
|
32
34
|
},
|
|
35
|
+
svg: { mode: "not-requested" },
|
|
33
36
|
video: { mode: "not-requested" },
|
|
34
37
|
},
|
|
35
38
|
name: "enables explicitly requested image export",
|
|
36
39
|
},
|
|
37
40
|
{
|
|
38
|
-
expected: { imageEnabled: false, videoEnabled: false },
|
|
41
|
+
expected: { imageEnabled: false, svgEnabled: false, videoEnabled: false },
|
|
39
42
|
intent: {
|
|
40
43
|
image: {
|
|
41
44
|
evidence: "The user explicitly requested no image export.",
|
|
42
45
|
mode: "user-removed",
|
|
43
46
|
},
|
|
47
|
+
svg: { mode: "not-requested" },
|
|
44
48
|
video: { mode: "not-requested" },
|
|
45
49
|
},
|
|
46
50
|
name: "disables explicitly removed image export",
|
|
47
51
|
},
|
|
48
52
|
{
|
|
49
|
-
expected: { imageEnabled: true, videoEnabled: true },
|
|
53
|
+
expected: { imageEnabled: true, svgEnabled: false, videoEnabled: true },
|
|
50
54
|
intent: {
|
|
51
55
|
image: { mode: "toolcraft-default" },
|
|
56
|
+
svg: { mode: "not-requested" },
|
|
52
57
|
video: {
|
|
53
58
|
evidence: "The user explicitly requested MP4 delivery.",
|
|
54
59
|
mode: "user-requested",
|
|
@@ -57,12 +62,13 @@ const deliveryCases: readonly Readonly<{
|
|
|
57
62
|
name: "enables explicitly requested video export",
|
|
58
63
|
},
|
|
59
64
|
{
|
|
60
|
-
expected: { imageEnabled: true, videoEnabled: true },
|
|
65
|
+
expected: { imageEnabled: true, svgEnabled: false, videoEnabled: true },
|
|
61
66
|
intent: {
|
|
62
67
|
image: {
|
|
63
68
|
evidence: "The user explicitly requested PNG delivery.",
|
|
64
69
|
mode: "user-requested",
|
|
65
70
|
},
|
|
71
|
+
svg: { mode: "not-requested" },
|
|
66
72
|
video: {
|
|
67
73
|
evidence: "The user explicitly requested MP4 delivery.",
|
|
68
74
|
mode: "user-requested",
|
|
@@ -71,12 +77,13 @@ const deliveryCases: readonly Readonly<{
|
|
|
71
77
|
name: "enables explicitly requested image and video export",
|
|
72
78
|
},
|
|
73
79
|
{
|
|
74
|
-
expected: { imageEnabled: false, videoEnabled: true },
|
|
80
|
+
expected: { imageEnabled: false, svgEnabled: false, videoEnabled: true },
|
|
75
81
|
intent: {
|
|
76
82
|
image: {
|
|
77
83
|
evidence: "The user explicitly requested no image export.",
|
|
78
84
|
mode: "user-removed",
|
|
79
85
|
},
|
|
86
|
+
svg: { mode: "not-requested" },
|
|
80
87
|
video: {
|
|
81
88
|
evidence: "The user explicitly requested MP4 delivery.",
|
|
82
89
|
mode: "user-requested",
|
|
@@ -84,6 +91,21 @@ const deliveryCases: readonly Readonly<{
|
|
|
84
91
|
},
|
|
85
92
|
name: "keeps requested video export when image export is removed",
|
|
86
93
|
},
|
|
94
|
+
{
|
|
95
|
+
expected: { imageEnabled: false, svgEnabled: true, videoEnabled: false },
|
|
96
|
+
intent: {
|
|
97
|
+
image: {
|
|
98
|
+
evidence: "The user explicitly requested SVG instead of image export.",
|
|
99
|
+
mode: "user-removed",
|
|
100
|
+
},
|
|
101
|
+
svg: {
|
|
102
|
+
evidence: "The user explicitly requested editable SVG delivery.",
|
|
103
|
+
mode: "user-requested",
|
|
104
|
+
},
|
|
105
|
+
video: { mode: "not-requested" },
|
|
106
|
+
},
|
|
107
|
+
name: "enables requested SVG without retaining default image export",
|
|
108
|
+
},
|
|
87
109
|
];
|
|
88
110
|
|
|
89
111
|
const evidenceCases: readonly Readonly<{
|
|
@@ -95,6 +117,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
95
117
|
expected: [],
|
|
96
118
|
intent: {
|
|
97
119
|
image: { mode: "toolcraft-default" },
|
|
120
|
+
svg: { mode: "not-requested" },
|
|
98
121
|
video: { mode: "not-requested" },
|
|
99
122
|
},
|
|
100
123
|
name: "accepts default image and not-requested video modes",
|
|
@@ -106,6 +129,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
106
129
|
evidence: "The user explicitly requested PNG delivery.",
|
|
107
130
|
mode: "user-requested",
|
|
108
131
|
},
|
|
132
|
+
svg: { mode: "not-requested" },
|
|
109
133
|
video: { mode: "not-requested" },
|
|
110
134
|
},
|
|
111
135
|
name: "accepts nonblank requested image evidence",
|
|
@@ -117,6 +141,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
117
141
|
evidence: "The user explicitly requested no image export.",
|
|
118
142
|
mode: "user-removed",
|
|
119
143
|
},
|
|
144
|
+
svg: { mode: "not-requested" },
|
|
120
145
|
video: { mode: "not-requested" },
|
|
121
146
|
},
|
|
122
147
|
name: "accepts nonblank image removal evidence",
|
|
@@ -125,6 +150,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
125
150
|
expected: [],
|
|
126
151
|
intent: {
|
|
127
152
|
image: { mode: "toolcraft-default" },
|
|
153
|
+
svg: { mode: "not-requested" },
|
|
128
154
|
video: {
|
|
129
155
|
evidence: "The user explicitly requested MP4 delivery.",
|
|
130
156
|
mode: "user-requested",
|
|
@@ -138,6 +164,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
138
164
|
],
|
|
139
165
|
intent: {
|
|
140
166
|
image: { evidence: " \n\t ", mode: "user-removed" },
|
|
167
|
+
svg: { mode: "not-requested" },
|
|
141
168
|
video: { mode: "not-requested" },
|
|
142
169
|
},
|
|
143
170
|
name: "rejects blank image removal evidence",
|
|
@@ -148,6 +175,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
148
175
|
],
|
|
149
176
|
intent: {
|
|
150
177
|
image: { evidence: " ", mode: "user-requested" },
|
|
178
|
+
svg: { mode: "not-requested" },
|
|
151
179
|
video: { mode: "not-requested" },
|
|
152
180
|
},
|
|
153
181
|
name: "rejects blank requested image evidence",
|
|
@@ -158,10 +186,22 @@ const evidenceCases: readonly Readonly<{
|
|
|
158
186
|
],
|
|
159
187
|
intent: {
|
|
160
188
|
image: { mode: "toolcraft-default" },
|
|
189
|
+
svg: { mode: "not-requested" },
|
|
161
190
|
video: { evidence: "\t", mode: "user-requested" },
|
|
162
191
|
},
|
|
163
192
|
name: "rejects blank requested video evidence",
|
|
164
193
|
},
|
|
194
|
+
{
|
|
195
|
+
expected: [
|
|
196
|
+
"SVG export user-requested intent requires non-empty evidence.",
|
|
197
|
+
],
|
|
198
|
+
intent: {
|
|
199
|
+
image: { mode: "toolcraft-default" },
|
|
200
|
+
svg: { evidence: "\t", mode: "user-requested" },
|
|
201
|
+
video: { mode: "not-requested" },
|
|
202
|
+
},
|
|
203
|
+
name: "rejects blank requested SVG evidence",
|
|
204
|
+
},
|
|
165
205
|
{
|
|
166
206
|
expected: [
|
|
167
207
|
"Image export user-removed intent requires non-empty evidence.",
|
|
@@ -169,6 +209,7 @@ const evidenceCases: readonly Readonly<{
|
|
|
169
209
|
],
|
|
170
210
|
intent: {
|
|
171
211
|
image: { evidence: " ", mode: "user-removed" },
|
|
212
|
+
svg: { mode: "not-requested" },
|
|
172
213
|
video: { evidence: "\n", mode: "user-requested" },
|
|
173
214
|
},
|
|
174
215
|
name: "aggregates blank image and video evidence errors",
|
|
@@ -194,15 +235,17 @@ describe("Toolcraft artifact export intent", () => {
|
|
|
194
235
|
validateToolcraftArtifactExportIntentCorrespondence({
|
|
195
236
|
hasImageExportAction: false,
|
|
196
237
|
hasImageExportSection: false,
|
|
238
|
+
hasSvgExportAction: false,
|
|
197
239
|
hasVideoExportAction: true,
|
|
198
240
|
hasVideoExportSection: true,
|
|
199
241
|
intent: {
|
|
200
242
|
image: { mode: "toolcraft-default" },
|
|
243
|
+
svg: { mode: "not-requested" },
|
|
201
244
|
video: { mode: "not-requested" },
|
|
202
245
|
},
|
|
203
246
|
}),
|
|
204
247
|
).toEqual({
|
|
205
|
-
delivery: { imageEnabled: true, videoEnabled: false },
|
|
248
|
+
delivery: { imageEnabled: true, svgEnabled: false, videoEnabled: false },
|
|
206
249
|
errors: [
|
|
207
250
|
'Image export intent "toolcraft-default" requires an export-image panel action.',
|
|
208
251
|
'Image export intent "toolcraft-default" requires an "Image Export" section.',
|
|
@@ -217,15 +260,17 @@ describe("Toolcraft artifact export intent", () => {
|
|
|
217
260
|
validateToolcraftArtifactExportIntentCorrespondence({
|
|
218
261
|
hasImageExportAction: true,
|
|
219
262
|
hasImageExportSection: true,
|
|
263
|
+
hasSvgExportAction: false,
|
|
220
264
|
hasVideoExportAction: false,
|
|
221
265
|
hasVideoExportSection: false,
|
|
222
266
|
intent: {
|
|
223
267
|
image: { evidence: " ", mode: "user-removed" },
|
|
268
|
+
svg: { mode: "not-requested" },
|
|
224
269
|
video: { evidence: "\t", mode: "user-requested" },
|
|
225
270
|
},
|
|
226
271
|
}),
|
|
227
272
|
).toEqual({
|
|
228
|
-
delivery: { imageEnabled: false, videoEnabled: true },
|
|
273
|
+
delivery: { imageEnabled: false, svgEnabled: false, videoEnabled: true },
|
|
229
274
|
errors: [
|
|
230
275
|
"Image export user-removed intent requires non-empty evidence.",
|
|
231
276
|
"Video export user-requested intent requires non-empty evidence.",
|
|
@@ -236,4 +281,32 @@ describe("Toolcraft artifact export intent", () => {
|
|
|
236
281
|
],
|
|
237
282
|
});
|
|
238
283
|
});
|
|
284
|
+
|
|
285
|
+
it("requires requested SVG to correspond to one typed action without a settings section", () => {
|
|
286
|
+
expect(
|
|
287
|
+
validateToolcraftArtifactExportIntentCorrespondence({
|
|
288
|
+
hasImageExportAction: false,
|
|
289
|
+
hasImageExportSection: false,
|
|
290
|
+
hasSvgExportAction: false,
|
|
291
|
+
hasVideoExportAction: false,
|
|
292
|
+
hasVideoExportSection: false,
|
|
293
|
+
intent: {
|
|
294
|
+
image: {
|
|
295
|
+
evidence: "The user requested SVG only.",
|
|
296
|
+
mode: "user-removed",
|
|
297
|
+
},
|
|
298
|
+
svg: {
|
|
299
|
+
evidence: "The user requested editable SVG.",
|
|
300
|
+
mode: "user-requested",
|
|
301
|
+
},
|
|
302
|
+
video: { mode: "not-requested" },
|
|
303
|
+
},
|
|
304
|
+
}),
|
|
305
|
+
).toEqual({
|
|
306
|
+
delivery: { imageEnabled: false, svgEnabled: true, videoEnabled: false },
|
|
307
|
+
errors: [
|
|
308
|
+
'SVG export intent "user-requested" requires an export-svg panel action.',
|
|
309
|
+
],
|
|
310
|
+
});
|
|
311
|
+
});
|
|
239
312
|
});
|
|
@@ -11,6 +11,7 @@ import { makeControlAcceptance } from "./starter-acceptance.test-utils";
|
|
|
11
11
|
const imageExportProductReadiness: ToolcraftProductReadiness = {
|
|
12
12
|
exportIntent: {
|
|
13
13
|
image: { mode: "toolcraft-default" },
|
|
14
|
+
svg: { mode: "not-requested" },
|
|
14
15
|
video: { mode: "not-requested" },
|
|
15
16
|
},
|
|
16
17
|
interactionOwnership: [],
|
|
@@ -28,6 +29,7 @@ const videoExportProductReadiness: ToolcraftProductReadiness = {
|
|
|
28
29
|
...imageExportProductReadiness,
|
|
29
30
|
exportIntent: {
|
|
30
31
|
image: { mode: "toolcraft-default" },
|
|
32
|
+
svg: { mode: "not-requested" },
|
|
31
33
|
video: {
|
|
32
34
|
evidence: "The background fixture explicitly exercises video background export.",
|
|
33
35
|
mode: "user-requested",
|
|
@@ -11,6 +11,7 @@ import type { ToolcraftProductReadiness } from "./acceptance/types";
|
|
|
11
11
|
const infinityProductReadiness: ToolcraftProductReadiness = {
|
|
12
12
|
exportIntent: {
|
|
13
13
|
image: { mode: "toolcraft-default" },
|
|
14
|
+
svg: { mode: "not-requested" },
|
|
14
15
|
video: { mode: "not-requested" },
|
|
15
16
|
},
|
|
16
17
|
interactionOwnership: [],
|
|
@@ -28,6 +29,7 @@ const infinityVideoProductReadiness: ToolcraftProductReadiness = {
|
|
|
28
29
|
...infinityProductReadiness,
|
|
29
30
|
exportIntent: {
|
|
30
31
|
image: { mode: "toolcraft-default" },
|
|
32
|
+
svg: { mode: "not-requested" },
|
|
31
33
|
video: {
|
|
32
34
|
evidence: "The Infinity canvas fixture explicitly exercises video export bounds.",
|
|
33
35
|
mode: "user-requested",
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { defineToolcraft } from "@repo/toolcraft-runtime";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { getToolcraftControlSectionInvariantErrors } from "./acceptance/control-layout";
|
|
5
|
+
|
|
6
|
+
function makeMixedColorSchema(includeSemanticGroups: boolean) {
|
|
7
|
+
const withSemanticGroup = (
|
|
8
|
+
semanticGroup: string,
|
|
9
|
+
): { semanticGroup: string } | Record<string, never> =>
|
|
10
|
+
includeSemanticGroups ? { semanticGroup } : {};
|
|
11
|
+
|
|
12
|
+
return defineToolcraft({
|
|
13
|
+
canvas: { enabled: true },
|
|
14
|
+
panels: {
|
|
15
|
+
controls: {
|
|
16
|
+
sections: [
|
|
17
|
+
{
|
|
18
|
+
controls: {
|
|
19
|
+
trackEnabled: {
|
|
20
|
+
defaultValue: true,
|
|
21
|
+
label: "Track",
|
|
22
|
+
target: "track.enabled",
|
|
23
|
+
type: "switch",
|
|
24
|
+
},
|
|
25
|
+
trackColor: {
|
|
26
|
+
...withSemanticGroup("track-line"),
|
|
27
|
+
defaultValue: { hex: "#F1F1F1" },
|
|
28
|
+
label: "Track color",
|
|
29
|
+
target: "track.color",
|
|
30
|
+
type: "color",
|
|
31
|
+
},
|
|
32
|
+
lowerColor: {
|
|
33
|
+
...withSemanticGroup("track-range"),
|
|
34
|
+
defaultValue: { hex: "#7A9CBD" },
|
|
35
|
+
label: "Lower",
|
|
36
|
+
target: "track.lower",
|
|
37
|
+
type: "color",
|
|
38
|
+
},
|
|
39
|
+
upperColor: {
|
|
40
|
+
...withSemanticGroup("track-range"),
|
|
41
|
+
defaultValue: { hex: "#52AAFF" },
|
|
42
|
+
label: "Upper",
|
|
43
|
+
target: "track.upper",
|
|
44
|
+
type: "color",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
id: "track-appearance",
|
|
48
|
+
title: "Track Appearance",
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
title: "Controls",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function makeColorOnlySchema() {
|
|
58
|
+
return defineToolcraft({
|
|
59
|
+
canvas: { enabled: true },
|
|
60
|
+
panels: {
|
|
61
|
+
controls: {
|
|
62
|
+
sections: [
|
|
63
|
+
{
|
|
64
|
+
controls: {
|
|
65
|
+
trackColor: {
|
|
66
|
+
defaultValue: { hex: "#F1F1F1" },
|
|
67
|
+
label: "Track",
|
|
68
|
+
target: "track.color",
|
|
69
|
+
type: "color",
|
|
70
|
+
},
|
|
71
|
+
lowerColor: {
|
|
72
|
+
defaultValue: { hex: "#7A9CBD" },
|
|
73
|
+
label: "Lower",
|
|
74
|
+
target: "track.lower",
|
|
75
|
+
type: "color",
|
|
76
|
+
},
|
|
77
|
+
upperColor: {
|
|
78
|
+
defaultValue: { hex: "#52AAFF" },
|
|
79
|
+
label: "Upper",
|
|
80
|
+
target: "track.upper",
|
|
81
|
+
type: "color",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
id: "track-palette",
|
|
85
|
+
title: "Track Palette",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
title: "Controls",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
describe("starter acceptance semantic color rows", () => {
|
|
95
|
+
it("rejects ambiguous plain colors in a mixed section", () => {
|
|
96
|
+
expect(
|
|
97
|
+
getToolcraftControlSectionInvariantErrors(makeMixedColorSchema(false)),
|
|
98
|
+
).toEqual(
|
|
99
|
+
expect.arrayContaining([
|
|
100
|
+
expect.stringContaining(
|
|
101
|
+
"must declare semanticGroup for every plain Color",
|
|
102
|
+
),
|
|
103
|
+
]),
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("accepts explicit color banks in a mixed section", () => {
|
|
108
|
+
expect(
|
|
109
|
+
getToolcraftControlSectionInvariantErrors(makeMixedColorSchema(true)),
|
|
110
|
+
).toEqual([]);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("keeps a color-only section as one implicit bank", () => {
|
|
114
|
+
expect(
|
|
115
|
+
getToolcraftControlSectionInvariantErrors(makeColorOnlySchema()),
|
|
116
|
+
).toEqual([]);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -265,7 +265,7 @@ describe("starter acceptance compound control part coverage contract", () => {
|
|
|
265
265
|
{ color: "#FFE97A", opacity: 100, position: "100%" },
|
|
266
266
|
],
|
|
267
267
|
},
|
|
268
|
-
label:
|
|
268
|
+
label: false,
|
|
269
269
|
orderRole: "color",
|
|
270
270
|
target: "mesh.gradient",
|
|
271
271
|
type: "gradient",
|
|
@@ -73,6 +73,7 @@ export const contractSectionInventoryFixture: readonly ToolcraftControlSectionIn
|
|
|
73
73
|
export const contractTransferModeFixture: ToolcraftTransferMode = {
|
|
74
74
|
animationIntent: { mode: "none" },
|
|
75
75
|
mode: "new-toolcraft-app",
|
|
76
|
+
referenceInputs: [],
|
|
76
77
|
};
|
|
77
78
|
|
|
78
79
|
export const contractProductReadinessFixture: ToolcraftProductReadiness = {
|
|
@@ -11,6 +11,7 @@ import { collectToolcraftVisibleAcceptanceControls } from "./acceptance/validate
|
|
|
11
11
|
const productReadiness: ToolcraftProductReadiness = {
|
|
12
12
|
exportIntent: {
|
|
13
13
|
image: { mode: "toolcraft-default" },
|
|
14
|
+
svg: { mode: "not-requested" },
|
|
14
15
|
video: { mode: "not-requested" },
|
|
15
16
|
},
|
|
16
17
|
interactionOwnership: [],
|
|
@@ -52,6 +52,7 @@ describe("starter acceptance control label context contract", () => {
|
|
|
52
52
|
reason: "The motion speed is a decorative self-running effect and does not expose product time transport.",
|
|
53
53
|
},
|
|
54
54
|
mode: "new-toolcraft-app",
|
|
55
|
+
referenceInputs: [],
|
|
55
56
|
},
|
|
56
57
|
}),
|
|
57
58
|
).toEqual([]);
|
|
@@ -259,8 +259,81 @@ describe("starter acceptance control label contract", () => {
|
|
|
259
259
|
}),
|
|
260
260
|
).toEqual(
|
|
261
261
|
expect.arrayContaining([
|
|
262
|
-
'Accent Shades / accent1 uses visible label "Color 1" for
|
|
263
|
-
'Accent Shades / accent2 uses visible label "Color 2" for
|
|
262
|
+
'Accent Shades / accent1 uses visible label "Color 1" for one of multiple sibling colors. Set label: false when the colors form one shared bank, or use a distinct user-facing role such as Fill, Stroke, Background, Connector, or Object color.',
|
|
263
|
+
'Accent Shades / accent2 uses visible label "Color 2" for one of multiple sibling colors. Set label: false when the colors form one shared bank, or use a distinct user-facing role such as Fill, Stroke, Background, Connector, or Object color.',
|
|
264
|
+
]),
|
|
265
|
+
);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("rejects sequential labels for sibling colors without palette keywords", () => {
|
|
269
|
+
const schemaWithSpectrumColors = defineContractSchemaFixture({
|
|
270
|
+
canvas: { enabled: true },
|
|
271
|
+
panels: {
|
|
272
|
+
controls: {
|
|
273
|
+
sections: [
|
|
274
|
+
{
|
|
275
|
+
controls: {
|
|
276
|
+
spectrum: {
|
|
277
|
+
defaultValue: "custom",
|
|
278
|
+
label: "Spectrum",
|
|
279
|
+
options: [{ label: "Custom", value: "custom" }],
|
|
280
|
+
target: "dispersion.spectrum",
|
|
281
|
+
type: "select",
|
|
282
|
+
},
|
|
283
|
+
customColorA: {
|
|
284
|
+
defaultValue: { hex: "#A65F15" },
|
|
285
|
+
label: "Color 1",
|
|
286
|
+
semanticGroup: "custom-spectrum",
|
|
287
|
+
target: "dispersion.customColorA",
|
|
288
|
+
type: "color",
|
|
289
|
+
},
|
|
290
|
+
customColorB: {
|
|
291
|
+
defaultValue: { hex: "#371C4D" },
|
|
292
|
+
label: "Color 2",
|
|
293
|
+
semanticGroup: "custom-spectrum",
|
|
294
|
+
target: "dispersion.customColorB",
|
|
295
|
+
type: "color",
|
|
296
|
+
},
|
|
297
|
+
customColorC: {
|
|
298
|
+
defaultValue: { hex: "#375B75" },
|
|
299
|
+
label: "Color 3",
|
|
300
|
+
semanticGroup: "custom-spectrum",
|
|
301
|
+
target: "dispersion.customColorC",
|
|
302
|
+
type: "color",
|
|
303
|
+
},
|
|
304
|
+
customColorD: {
|
|
305
|
+
defaultValue: { hex: "#2A343E" },
|
|
306
|
+
label: "Color 4",
|
|
307
|
+
semanticGroup: "custom-spectrum",
|
|
308
|
+
target: "dispersion.customColorD",
|
|
309
|
+
type: "color",
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
title: "Spectrum",
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
title: "Controls",
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
expect(
|
|
321
|
+
validateContractAcceptance({
|
|
322
|
+
schema: schemaWithSpectrumColors,
|
|
323
|
+
acceptance: [
|
|
324
|
+
makeControlAcceptance("dispersion.spectrum", "select"),
|
|
325
|
+
makeControlAcceptance("dispersion.customColorA", "color"),
|
|
326
|
+
makeControlAcceptance("dispersion.customColorB", "color"),
|
|
327
|
+
makeControlAcceptance("dispersion.customColorC", "color"),
|
|
328
|
+
makeControlAcceptance("dispersion.customColorD", "color"),
|
|
329
|
+
],
|
|
330
|
+
}),
|
|
331
|
+
).toEqual(
|
|
332
|
+
expect.arrayContaining([
|
|
333
|
+
expect.stringContaining('customColorA uses visible label "Color 1"'),
|
|
334
|
+
expect.stringContaining('customColorB uses visible label "Color 2"'),
|
|
335
|
+
expect.stringContaining('customColorC uses visible label "Color 3"'),
|
|
336
|
+
expect.stringContaining('customColorD uses visible label "Color 4"'),
|
|
264
337
|
]),
|
|
265
338
|
);
|
|
266
339
|
});
|
|
@@ -312,7 +385,7 @@ describe("starter acceptance control label contract", () => {
|
|
|
312
385
|
).toEqual(
|
|
313
386
|
expect.arrayContaining([
|
|
314
387
|
"Accent Shades mixes labeled and unlabeled color items in one palette variation group. Decide label visibility for the whole group: omit all per-item labels when colors only add variety, or label every item only when each color has a distinct user-facing role.",
|
|
315
|
-
'Accent Shades / accent2 uses visible label "Color 2" for
|
|
388
|
+
'Accent Shades / accent2 uses visible label "Color 2" for one of multiple sibling colors. Set label: false when the colors form one shared bank, or use a distinct user-facing role such as Fill, Stroke, Background, Connector, or Object color.',
|
|
316
389
|
]),
|
|
317
390
|
);
|
|
318
391
|
});
|
|
@@ -328,12 +401,14 @@ describe("starter acceptance control label contract", () => {
|
|
|
328
401
|
accent1: {
|
|
329
402
|
defaultValue: { hex: "#9CE6FF" },
|
|
330
403
|
label: false,
|
|
404
|
+
semanticGroup: "accent-palette",
|
|
331
405
|
target: "palette.accent1",
|
|
332
406
|
type: "color",
|
|
333
407
|
},
|
|
334
408
|
accent2: {
|
|
335
409
|
defaultValue: { hex: "#FF7A90" },
|
|
336
410
|
label: false,
|
|
411
|
+
semanticGroup: "accent-palette",
|
|
337
412
|
target: "palette.accent2",
|
|
338
413
|
type: "color",
|
|
339
414
|
},
|
|
@@ -128,12 +128,88 @@ describe("starter acceptance control naming rules", () => {
|
|
|
128
128
|
).toEqual(
|
|
129
129
|
expect.arrayContaining([
|
|
130
130
|
expect.stringContaining(
|
|
131
|
-
'
|
|
131
|
+
'Background / includeBackground visible label "Background" duplicates section title "Background". Set label: false when the section supplies the complete visible context, or use a more specific label for a distinct setting.',
|
|
132
132
|
),
|
|
133
133
|
]),
|
|
134
134
|
);
|
|
135
135
|
});
|
|
136
136
|
|
|
137
|
+
it("rejects visible select labels that duplicate their section title", () => {
|
|
138
|
+
const schemaWithDuplicateSelectLabel = defineContractSchemaFixture({
|
|
139
|
+
canvas: { enabled: true },
|
|
140
|
+
panels: {
|
|
141
|
+
controls: {
|
|
142
|
+
sections: [
|
|
143
|
+
{
|
|
144
|
+
controls: {
|
|
145
|
+
spectrum: {
|
|
146
|
+
defaultValue: "custom",
|
|
147
|
+
label: "Spectrum",
|
|
148
|
+
options: [{ label: "Custom", value: "custom" }],
|
|
149
|
+
target: "dispersion.spectrum",
|
|
150
|
+
type: "select",
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
title: "Spectrum",
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
title: "Controls",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
expect(
|
|
162
|
+
validateContractAcceptance({
|
|
163
|
+
schema: schemaWithDuplicateSelectLabel,
|
|
164
|
+
acceptance: [
|
|
165
|
+
makeControlAcceptance("dispersion.spectrum", "select"),
|
|
166
|
+
],
|
|
167
|
+
}),
|
|
168
|
+
).toEqual(
|
|
169
|
+
expect.arrayContaining([
|
|
170
|
+
expect.stringContaining(
|
|
171
|
+
'Spectrum / spectrum visible label "Spectrum" duplicates section title "Spectrum". Set label: false when the section supplies the complete visible context, or use a more specific label for a distinct setting.',
|
|
172
|
+
),
|
|
173
|
+
]),
|
|
174
|
+
);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("allows tabs accessibility names that match their section title", () => {
|
|
178
|
+
const schemaWithMatchingTabsName = defineContractSchemaFixture({
|
|
179
|
+
canvas: { enabled: true },
|
|
180
|
+
panels: {
|
|
181
|
+
controls: {
|
|
182
|
+
sections: [
|
|
183
|
+
{
|
|
184
|
+
controls: {
|
|
185
|
+
spectrum: {
|
|
186
|
+
defaultValue: "custom",
|
|
187
|
+
label: "Spectrum",
|
|
188
|
+
options: [{ label: "Custom", value: "custom" }],
|
|
189
|
+
target: "dispersion.spectrum",
|
|
190
|
+
type: "tabs",
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
title: "Spectrum",
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
title: "Controls",
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const errors = validateContractAcceptance({
|
|
202
|
+
schema: schemaWithMatchingTabsName,
|
|
203
|
+
acceptance: [makeControlAcceptance("dispersion.spectrum", "tabs")],
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
expect(errors).not.toEqual(
|
|
207
|
+
expect.arrayContaining([
|
|
208
|
+
expect.stringContaining("duplicates section title"),
|
|
209
|
+
]),
|
|
210
|
+
);
|
|
211
|
+
});
|
|
212
|
+
|
|
137
213
|
it("rejects single Actions controls that duplicate their only button label", () => {
|
|
138
214
|
const schemaWithDuplicateActionLabel = defineContractSchemaFixture({
|
|
139
215
|
canvas: { enabled: true },
|