nudge-ui 0.2.4 → 0.2.6
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/dist/cli/agentCommand.d.ts +0 -1
- package/dist/cli/agentCommand.js +4 -29
- package/dist/client.mjs +987 -221
- package/dist/compiler/ast.d.ts +0 -6
- package/dist/compiler/ast.js +0 -5
- package/dist/compiler/componentContractTypes.d.ts +11 -5
- package/dist/compiler/componentContracts.js +3 -9
- package/dist/compiler/componentInstrumentation.d.ts +2 -13
- package/dist/compiler/componentInstrumentation.js +3 -12
- package/dist/compiler/componentPolicyResolution.d.ts +3 -22
- package/dist/compiler/componentPolicyResolution.js +6 -38
- package/dist/compiler/identityAttributes.d.ts +2 -0
- package/dist/compiler/identityAttributes.js +2 -0
- package/dist/compiler/index.d.ts +0 -1
- package/dist/compiler/index.js +0 -1
- package/dist/compiler/packageComponentContracts.d.ts +10 -19
- package/dist/compiler/packageComponentContracts.js +60 -43
- package/dist/compiler/reactComponentProtocols.d.ts +0 -7
- package/dist/compiler/reactComponentProtocols.js +0 -7
- package/dist/compiler/reactIdentity.d.ts +2 -2
- package/dist/compiler/reactIdentity.js +41 -43
- package/dist/compiler/sourcePaths.d.ts +4 -8
- package/dist/compiler/sourcePaths.js +6 -8
- package/dist/css/dialects/index.d.ts +2 -21
- package/dist/css/dialects/index.js +2 -9
- package/dist/css/dialects/tailwind.d.ts +2 -16
- package/dist/css/dialects/tailwind.js +2 -25
- package/dist/css/dialects/vanillaExtract.d.ts +1 -9
- package/dist/css/dialects/vanillaExtract.js +0 -1
- package/dist/css/index.d.ts +0 -8
- package/dist/css/index.js +0 -8
- package/dist/css/model/index.d.ts +6 -38
- package/dist/css/model/index.js +0 -9
- package/dist/css/token-inventory/index.d.ts +0 -23
- package/dist/css/token-inventory/index.js +0 -23
- package/dist/css/token-inventory/inventory.js +4 -16
- package/dist/css/token-inventory/parseStylesheet.d.ts +1 -9
- package/dist/css/token-inventory/parseStylesheet.js +5 -42
- package/dist/css/token-inventory/policy.d.ts +2 -39
- package/dist/css/token-inventory/policy.js +2 -39
- package/dist/css/token-inventory/types.d.ts +2 -15
- package/dist/css/value-semantics/borderSemantics.d.ts +1 -8
- package/dist/css/value-semantics/borderSemantics.js +5 -23
- package/dist/css/value-semantics/boxSemantics.d.ts +2 -25
- package/dist/css/value-semantics/boxSemantics.js +1 -7
- package/dist/css/value-semantics/colorSemantics.d.ts +6 -60
- package/dist/css/value-semantics/colorSemantics.js +9 -40
- package/dist/css/value-semantics/cssSyntax.d.ts +10 -10
- package/dist/css/value-semantics/cssSyntax.js +39 -11
- package/dist/css/value-semantics/fontSemantics.d.ts +3 -19
- package/dist/css/value-semantics/fontSemantics.js +7 -25
- package/dist/css/value-semantics/index.d.ts +1 -12
- package/dist/css/value-semantics/index.js +1 -12
- package/dist/css/value-semantics/propertyPolicy.d.ts +6 -53
- package/dist/css/value-semantics/propertyPolicy.js +47 -59
- package/dist/css/value-semantics/stringMaps.d.ts +0 -1
- package/dist/css/value-semantics/structuredValues.d.ts +3 -37
- package/dist/css/value-semantics/structuredValues.js +6 -17
- package/dist/css/value-semantics/tokenInterpretation.d.ts +8 -50
- package/dist/css/value-semantics/tokenInterpretation.js +7 -21
- package/dist/hosts/astro/astroRuntimeConfig.d.ts +0 -1
- package/dist/hosts/astro/astroRuntimeConfig.js +0 -1
- package/dist/hosts/astro/clientAsset.d.ts +1 -5
- package/dist/hosts/astro/clientAsset.js +1 -5
- package/dist/hosts/astro/clientTransport.d.ts +0 -1
- package/dist/hosts/astro/clientTransport.js +4 -9
- package/dist/hosts/astro/integration.d.ts +2 -28
- package/dist/hosts/astro/integration.js +7 -36
- package/dist/hosts/astro/markdownIdentity.d.ts +0 -3
- package/dist/hosts/astro/markdownIdentity.js +0 -3
- package/dist/hosts/astro/middleware.d.ts +1 -12
- package/dist/hosts/astro/middleware.js +1 -12
- package/dist/hosts/astro/projectContext.d.ts +1 -9
- package/dist/hosts/astro/projectContext.js +2 -11
- package/dist/hosts/astro/responseInstrumentation.d.ts +4 -33
- package/dist/hosts/astro/responseInstrumentation.js +5 -34
- package/dist/hosts/environment.d.ts +0 -8
- package/dist/hosts/environment.js +0 -1
- package/dist/hosts/next/index.js +1 -3
- package/dist/hosts/next/loader.d.ts +5 -44
- package/dist/hosts/next/loader.js +22 -103
- package/dist/hosts/next/loaders/identity-loader.cjs +111 -65
- package/dist/hosts/next/loaders/loader-plugin.cjs +111 -65
- package/dist/hosts/next/manifest.d.ts +2 -16
- package/dist/hosts/next/manifest.js +18 -20
- package/dist/hosts/next/mount.d.ts +1 -11
- package/dist/hosts/next/mount.js +1 -11
- package/dist/hosts/next/repositoryScope.d.ts +2 -17
- package/dist/hosts/next/repositoryScope.js +2 -17
- package/dist/hosts/next/sidecar.d.ts +0 -13
- package/dist/hosts/next/sidecar.js +25 -110
- package/dist/hosts/next/wrapper.d.ts +0 -31
- package/dist/hosts/next/wrapper.js +14 -71
- package/dist/hosts/projectBridge.d.ts +0 -2
- package/dist/hosts/projectBridge.js +3 -19
- package/dist/hosts/reactRendererCapture.d.ts +2 -0
- package/dist/hosts/reactRendererCapture.js +12 -0
- package/dist/hosts/static/cli.d.ts +0 -4
- package/dist/hosts/static/cli.js +0 -3
- package/dist/hosts/static/html/bootstrap.d.ts +1 -18
- package/dist/hosts/static/html/bootstrap.js +2 -14
- package/dist/hosts/static/manifest.d.ts +2 -15
- package/dist/hosts/static/manifest.js +5 -18
- package/dist/hosts/static/server.d.ts +4 -38
- package/dist/hosts/static/server.js +17 -67
- package/dist/hosts/vite/index.d.ts +0 -10
- package/dist/hosts/vite/index.js +0 -10
- package/dist/hosts/vite/react.d.ts +4 -17
- package/dist/hosts/vite/react.js +18 -35
- package/dist/hosts/vite/tokens/activeStylesheets.d.ts +1 -10
- package/dist/hosts/vite/tokens/activeStylesheets.js +3 -8
- package/dist/hosts/vite/tokens/fileMap.d.ts +0 -1
- package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +2 -15
- package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +3 -10
- package/dist/hosts/vite/vite.d.ts +5 -26
- package/dist/hosts/vite/vite.js +44 -80
- package/dist/html/dom.d.ts +0 -1
- package/dist/html/dom.js +0 -1
- package/dist/html/identity.d.ts +1 -15
- package/dist/html/identity.js +1 -8
- package/dist/html/insertions.d.ts +2 -8
- package/dist/html/insertions.js +1 -1
- package/dist/inspector/agent/McpConnectionDialog.d.ts +1 -6
- package/dist/inspector/agent/McpConnectionDialog.js +8 -9
- package/dist/inspector/agent/activity.d.ts +2 -2
- package/dist/inspector/agent/activity.js +4 -3
- package/dist/inspector/agent/client.d.ts +3 -27
- package/dist/inspector/agent/client.js +43 -91
- package/dist/inspector/agent/connectionStatus.d.ts +3 -2
- package/dist/inspector/agent/connectionStatus.js +25 -1
- package/dist/inspector/agent/httpTransport.d.ts +0 -8
- package/dist/inspector/agent/httpTransport.js +42 -176
- package/dist/inspector/agent/protocol.d.ts +1 -10
- package/dist/inspector/agent/protocol.js +1 -9
- package/dist/inspector/agent/verification.d.ts +3 -20
- package/dist/inspector/agent/verification.js +10 -43
- package/dist/inspector/boot.d.ts +5 -0
- package/dist/inspector/boot.js +289 -0
- package/dist/inspector/canvas/AgentActivityOverlay.d.ts +3 -2
- package/dist/inspector/canvas/AgentActivityOverlay.js +7 -4
- package/dist/inspector/canvas/CanvasCard.js +26 -24
- package/dist/inspector/canvas/CanvasElementOverlay.js +196 -174
- package/dist/inspector/canvas/CanvasToolbar.js +2 -1
- package/dist/inspector/canvas/CanvasWorkspace.js +87 -124
- package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +3 -2
- package/dist/inspector/canvas/LockedWorkspaceNotice.js +10 -6
- package/dist/inspector/canvas/PageCard.d.ts +9 -0
- package/dist/inspector/canvas/PageCard.js +50 -0
- package/dist/inspector/canvas/SketchToolOptions.d.ts +4 -0
- package/dist/inspector/canvas/SketchToolOptions.js +80 -0
- package/dist/inspector/canvas/StaleChangeIndicator.d.ts +1 -1
- package/dist/inspector/canvas/StaleChangeIndicator.js +1 -1
- package/dist/inspector/canvas/ToolOptionsDrawer.d.ts +16 -0
- package/dist/inspector/canvas/ToolOptionsDrawer.js +71 -0
- package/dist/inspector/canvas/activeCanvasDocument.d.ts +3 -4
- package/dist/inspector/canvas/activeCanvasDocument.js +0 -2
- package/dist/inspector/canvas/agentPresentation.d.ts +2 -13
- package/dist/inspector/canvas/agentPresentation.js +3 -14
- package/dist/inspector/canvas/assets/eraser.svg +28 -0
- package/dist/inspector/canvas/assets/pen.svg +25 -0
- package/dist/inspector/canvas/canvasFrame.d.ts +12 -0
- package/dist/inspector/canvas/canvasFrame.js +9 -0
- package/dist/inspector/canvas/canvasGestures.d.ts +0 -1
- package/dist/inspector/canvas/canvasGestures.js +0 -6
- package/dist/inspector/canvas/canvasResize.d.ts +1 -6
- package/dist/inspector/canvas/canvasResize.js +1 -6
- package/dist/inspector/canvas/canvasStore.d.ts +5 -7
- package/dist/inspector/canvas/canvasStore.js +42 -21
- package/dist/inspector/canvas/frameConnection.d.ts +42 -0
- package/dist/inspector/canvas/frameConnection.js +73 -0
- package/dist/inspector/canvas/frameContent.d.ts +0 -1
- package/dist/inspector/canvas/frameLifecycle.d.ts +12 -0
- package/dist/inspector/canvas/frameLifecycle.js +11 -0
- package/dist/inspector/canvas/frameProtocol.d.ts +20 -38
- package/dist/inspector/canvas/frameProtocol.js +37 -24
- package/dist/inspector/canvas/frameScrollbarStyles.d.ts +0 -1
- package/dist/inspector/canvas/frameScrollbarStyles.js +0 -1
- package/dist/inspector/canvas/layout.d.ts +10 -22
- package/dist/inspector/canvas/layout.js +0 -3
- package/dist/inspector/canvas/normalizeUrl.js +1 -8
- package/dist/inspector/canvas/pageSurface.d.ts +6 -0
- package/dist/inspector/canvas/pageSurface.js +29 -0
- package/dist/inspector/canvas/projection.d.ts +14 -25
- package/dist/inspector/canvas/projection.js +64 -87
- package/dist/inspector/canvas/rendererBootstrap.d.ts +8 -1
- package/dist/inspector/canvas/rendererBootstrap.js +10 -15
- package/dist/inspector/canvas/rendererCidIndex.d.ts +0 -5
- package/dist/inspector/canvas/rendererCidIndex.js +0 -5
- package/dist/inspector/canvas/rendererElementSelector.js +38 -28
- package/dist/inspector/canvas/rendererMessageRouter.d.ts +4 -6
- package/dist/inspector/canvas/rendererMessageRouter.js +12 -17
- package/dist/inspector/canvas/rendererSelectionProxy.d.ts +3 -1
- package/dist/inspector/canvas/rendererSelectionProxy.js +7 -40
- package/dist/inspector/canvas/rendererStylesheet.d.ts +0 -1
- package/dist/inspector/canvas/rendererStylesheet.js +23 -1
- package/dist/inspector/canvas/resizeHandleScale.d.ts +1 -10
- package/dist/inspector/canvas/resizeHandleScale.js +1 -10
- package/dist/inspector/canvas/sessionStore.d.ts +3 -9
- package/dist/inspector/canvas/sessionStore.js +33 -43
- package/dist/inspector/canvas/staleChangeDetector.d.ts +1 -1
- package/dist/inspector/canvas/staleChangeDetector.js +11 -26
- package/dist/inspector/canvas/toolbarScale.d.ts +1 -4
- package/dist/inspector/canvas/toolbarScale.js +1 -4
- package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +0 -1
- package/dist/inspector/canvas/useCanvasLayoutAnimation.js +0 -1
- package/dist/inspector/canvas/viewStore.js +1 -1
- package/dist/inspector/canvas/wheelPan.d.ts +1 -1
- package/dist/inspector/canvas/wheelPan.js +1 -1
- package/dist/inspector/canvas/workspaceLease.d.ts +1 -5
- package/dist/inspector/canvas/workspaceLease.js +1 -7
- package/dist/inspector/changes/codecs.d.ts +1 -0
- package/dist/inspector/changes/codecs.js +21 -5
- package/dist/inspector/changes/draftPreview.d.ts +7 -0
- package/dist/inspector/changes/draftPreview.js +118 -0
- package/dist/inspector/changes/editModel.d.ts +11 -13
- package/dist/inspector/changes/editModel.js +9 -4
- package/dist/inspector/changes/managedStyleProjection.js +6 -15
- package/dist/inspector/changes/model.d.ts +0 -5
- package/dist/inspector/changes/model.js +1 -8
- package/dist/inspector/changes/previewDiagnostics.d.ts +2 -12
- package/dist/inspector/changes/previewDiagnostics.js +5 -21
- package/dist/inspector/changes/previewVerification.d.ts +25 -0
- package/dist/inspector/changes/previewVerification.js +34 -0
- package/dist/inspector/changes/structuralTypes.d.ts +2 -4
- package/dist/inspector/changes/types.d.ts +11 -8
- package/dist/inspector/clientManifest.d.ts +17 -6
- package/dist/inspector/clientManifest.js +16 -3
- package/dist/inspector/comments/CommentsOverlay.js +66 -23
- package/dist/inspector/comments/element.d.ts +1 -2
- package/dist/inspector/comments/element.js +1 -2
- package/dist/inspector/comments/store.d.ts +1 -1
- package/dist/inspector/comments/store.js +4 -3
- package/dist/inspector/comments/verification.d.ts +8 -2
- package/dist/inspector/comments/verification.js +19 -11
- package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +8 -0
- package/dist/inspector/componentSemantics/ComponentPropsSection.js +12 -8
- package/dist/inspector/componentSemantics/adapterRegistry.d.ts +2 -9
- package/dist/inspector/componentSemantics/adapterRegistry.js +2 -9
- package/dist/inspector/componentSemantics/changeAction.js +1 -1
- package/dist/inspector/componentSemantics/changeModel.js +2 -4
- package/dist/inspector/componentSemantics/react/callsites.d.ts +28 -0
- package/dist/inspector/componentSemantics/react/callsites.js +261 -0
- package/dist/inspector/componentSemantics/react/devtoolsHook.d.ts +23 -0
- package/dist/inspector/componentSemantics/react/devtoolsHook.js +71 -0
- package/dist/inspector/componentSemantics/react/fibers.d.ts +17 -0
- package/dist/inspector/componentSemantics/react/fibers.js +30 -0
- package/dist/inspector/componentSemantics/{reactRuntime.d.ts → react/runtime.d.ts} +3 -2
- package/dist/inspector/componentSemantics/{reactRuntime.js → react/runtime.js} +70 -53
- package/dist/inspector/componentSemantics/runtimeBridge.d.ts +2 -18
- package/dist/inspector/componentSemantics/runtimeBridge.js +5 -19
- package/dist/inspector/componentSemantics/textBinding.d.ts +2 -11
- package/dist/inspector/componentSemantics/textBinding.js +20 -87
- package/dist/inspector/componentSemantics/types.d.ts +8 -27
- package/dist/inspector/componentSemantics/types.js +0 -1
- package/dist/inspector/conformance/borderCases.d.ts +0 -5
- package/dist/inspector/conformance/borderCases.js +0 -5
- package/dist/inspector/conformance/colorCases.d.ts +0 -6
- package/dist/inspector/conformance/colorCases.js +0 -6
- package/dist/inspector/conformance/fixture.d.ts +1 -5
- package/dist/inspector/conformance/fixture.js +1 -5
- package/dist/inspector/conformance/spacingCases.d.ts +0 -4
- package/dist/inspector/conformance/spacingCases.js +0 -4
- package/dist/inspector/conformance/typographyCases.d.ts +0 -5
- package/dist/inspector/conformance/typographyCases.js +0 -5
- package/dist/inspector/drafts/draftStore.d.ts +95 -0
- package/dist/inspector/drafts/draftStore.js +461 -0
- package/dist/inspector/drafts/model.d.ts +14 -14
- package/dist/inspector/drafts/model.js +4 -2
- package/dist/inspector/drafts/store.d.ts +47 -16
- package/dist/inspector/drafts/store.js +137 -170
- package/dist/inspector/editScope.d.ts +0 -1
- package/dist/inspector/editScope.js +0 -1
- package/dist/inspector/index.d.ts +2 -4
- package/dist/inspector/index.js +2 -264
- package/dist/inspector/inline-text/inlineTextDiagnostics.d.ts +0 -2
- package/dist/inspector/inline-text/inlineTextDiagnostics.js +0 -2
- package/dist/inspector/inline-text/inlineTextEditor.d.ts +3 -9
- package/dist/inspector/inline-text/inlineTextEditor.js +27 -81
- package/dist/inspector/inline-text/inlineTextLifecycle.js +1 -6
- package/dist/inspector/inline-text/textEditChange.d.ts +1 -2
- package/dist/inspector/inspection/bridge.d.ts +3 -7
- package/dist/inspector/inspection/bridge.js +6 -13
- package/dist/inspector/inspection/browserCssInspection.d.ts +12 -11
- package/dist/inspector/inspection/browserCssInspection.js +32 -14
- package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +0 -7
- package/dist/inspector/inspection/browserCssInspectionRegistry.js +1 -16
- package/dist/inspector/inspection/inspectionSnapshot.d.ts +6 -0
- package/dist/inspector/inspection/inspectionSnapshot.js +10 -0
- package/dist/inspector/inspection/performanceDiagnostics.d.ts +18 -0
- package/dist/inspector/inspection/performanceDiagnostics.js +31 -0
- package/dist/inspector/inspection/selectionProperty.d.ts +1 -6
- package/dist/inspector/inspection/selectionProperty.js +1 -5
- package/dist/inspector/inspection/useBrowserCssInspection.d.ts +1 -5
- package/dist/inspector/inspection/useBrowserCssInspection.js +22 -59
- package/dist/inspector/iterations/capture.d.ts +2 -2
- package/dist/inspector/iterations/capture.js +4 -9
- package/dist/inspector/iterations/client.d.ts +2 -2
- package/dist/inspector/iterations/client.js +0 -1
- package/dist/inspector/iterations/coordinator.d.ts +4 -4
- package/dist/inspector/iterations/coordinator.js +5 -4
- package/dist/inspector/iterations/prompt.d.ts +0 -1
- package/dist/inspector/iterations/prompt.js +9 -9
- package/dist/inspector/overlay/DomNavigator.d.ts +3 -1
- package/dist/inspector/overlay/DomNavigator.js +39 -15
- package/dist/inspector/overlay/DropGuideOverlay.d.ts +0 -1
- package/dist/inspector/overlay/DropGuideOverlay.js +0 -1
- package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +1 -8
- package/dist/inspector/overlay/MeasurementGuideOverlay.js +1 -5
- package/dist/inspector/overlay/clickPolicy.d.ts +3 -14
- package/dist/inspector/overlay/clickPolicy.js +3 -14
- package/dist/inspector/overlay/dropGuide.d.ts +0 -3
- package/dist/inspector/overlay/dropGuide.js +0 -3
- package/dist/inspector/overlay/frameThrottle.d.ts +0 -1
- package/dist/inspector/overlay/frameThrottle.js +0 -1
- package/dist/inspector/overlay/interactionStyles.d.ts +1 -1
- package/dist/inspector/overlay/interactionStyles.js +19 -8
- package/dist/inspector/overlay/measurementGeometry.js +4 -12
- package/dist/inspector/overlay/selectedGeometry.d.ts +1 -6
- package/dist/inspector/overlay/selectedGeometry.js +1 -8
- package/dist/inspector/overlay/spacingGestures.d.ts +14 -21
- package/dist/inspector/overlay/spacingGestures.js +151 -31
- package/dist/inspector/overlay/structuralGestures.d.ts +2 -9
- package/dist/inspector/overlay/structuralGestures.js +1 -4
- package/dist/inspector/pageInspector.d.ts +33 -0
- package/dist/inspector/pageInspector.js +335 -0
- package/dist/inspector/projection/cssEscapes.d.ts +0 -1
- package/dist/inspector/projection/cssEscapes.js +2 -4
- package/dist/inspector/projection/draftProjection.d.ts +6 -10
- package/dist/inspector/projection/draftProjection.js +8 -7
- package/dist/inspector/projection/managedStylesheet.d.ts +1 -7
- package/dist/inspector/projection/managedStylesheet.js +28 -26
- package/dist/inspector/projection/renderedInstance.d.ts +5 -28
- package/dist/inspector/projection/renderedInstance.js +13 -33
- package/dist/inspector/projection/structuralProjection.d.ts +7 -48
- package/dist/inspector/projection/structuralProjection.js +31 -96
- package/dist/inspector/projection/textProjection.d.ts +7 -13
- package/dist/inspector/projection/textProjection.js +35 -80
- package/dist/inspector/prompt/PromptSettingsDialog.d.ts +0 -1
- package/dist/inspector/prompt/PromptSettingsDialog.js +0 -1
- package/dist/inspector/prompt/clipboardHandoff.d.ts +1 -0
- package/dist/inspector/prompt/clipboardHandoff.js +34 -16
- package/dist/inspector/prompt/generatePrompt.d.ts +2 -2
- package/dist/inspector/prompt/generatePrompt.js +247 -166
- package/dist/inspector/prompt/promptDocument.d.ts +3 -0
- package/dist/inspector/prompt/promptDocument.js +8 -0
- package/dist/inspector/prompt/promptSettings.d.ts +0 -3
- package/dist/inspector/prompt/promptSettings.js +7 -8
- package/dist/inspector/runtime/devFlag.d.ts +2 -25
- package/dist/inspector/runtime/devFlag.js +4 -31
- package/dist/inspector/runtime/documentStylesheetOrder.d.ts +0 -2
- package/dist/inspector/runtime/editorShell.d.ts +0 -1
- package/dist/inspector/runtime/editorShell.js +0 -1
- package/dist/inspector/runtime/inspectorStorage.d.ts +11 -0
- package/dist/inspector/runtime/inspectorStorage.js +37 -0
- package/dist/inspector/runtime/ownedStylesheets.d.ts +14 -0
- package/dist/inspector/runtime/ownedStylesheets.js +66 -0
- package/dist/inspector/runtime/runtimeConfig.d.ts +14 -84
- package/dist/inspector/runtime/runtimeConfig.js +18 -50
- package/dist/inspector/runtime/runtimeIdentityClaims.d.ts +19 -0
- package/dist/inspector/runtime/runtimeIdentityClaims.js +178 -0
- package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +6 -23
- package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +103 -52
- package/dist/inspector/runtime/useRuntimeConfig.d.ts +1 -8
- package/dist/inspector/runtime/useRuntimeConfig.js +1 -8
- package/dist/inspector/selection/editScope.d.ts +2 -7
- package/dist/inspector/selection/editScope.js +15 -14
- package/dist/inspector/selection/editTarget.d.ts +1 -5
- package/dist/inspector/selection/hierarchy.d.ts +11 -11
- package/dist/inspector/selection/hierarchy.js +42 -24
- package/dist/inspector/selection/selectionStore.d.ts +0 -3
- package/dist/inspector/selection/selectionStore.js +5 -16
- package/dist/inspector/selection/sourceSite.d.ts +1 -5
- package/dist/inspector/selection/sourceSite.js +2 -8
- package/dist/inspector/selection/styleSelection.d.ts +1 -5
- package/dist/inspector/selection/styleSelection.js +1 -5
- package/dist/inspector/session/lifecycle.d.ts +1 -9
- package/dist/inspector/session/lifecycle.js +0 -1
- package/dist/inspector/session/sessionContext.d.ts +0 -4
- package/dist/inspector/session/sessionContext.js +0 -4
- package/dist/inspector/session/sessionFactory.d.ts +0 -9
- package/dist/inspector/session/sessionFactory.js +0 -6
- package/dist/inspector/settings/SettingsDialog.d.ts +0 -1
- package/dist/inspector/settings/SettingsDialog.js +5 -3
- package/dist/inspector/shell/AgentStatusButton.d.ts +3 -2
- package/dist/inspector/shell/AgentStatusButton.js +7 -7
- package/dist/inspector/shell/AppShell.js +6 -2
- package/dist/inspector/shell/ChangesLog.js +29 -12
- package/dist/inspector/shell/CopyPromptButton.d.ts +2 -1
- package/dist/inspector/shell/CopyPromptButton.js +62 -55
- package/dist/inspector/shell/EmptyState.js +3 -3
- package/dist/inspector/shell/InspectorEditors.d.ts +16 -0
- package/dist/inspector/shell/InspectorEditors.js +14 -0
- package/dist/inspector/shell/InspectorPanel.d.ts +12 -0
- package/dist/inspector/shell/InspectorPanel.js +8 -0
- package/dist/inspector/shell/InspectorSelection.d.ts +24 -0
- package/dist/inspector/shell/InspectorSelection.js +20 -0
- package/dist/inspector/shell/InspectorShell.d.ts +0 -3
- package/dist/inspector/shell/InspectorShell.js +44 -58
- package/dist/inspector/shell/NudgeLogoIcon.d.ts +5 -0
- package/dist/inspector/shell/NudgeLogoIcon.js +5 -0
- package/dist/inspector/shell/PeekOriginalButton.d.ts +0 -5
- package/dist/inspector/shell/PeekOriginalButton.js +3 -8
- package/dist/inspector/shell/PeekOriginalIcon.d.ts +0 -5
- package/dist/inspector/shell/PeekOriginalIcon.js +0 -5
- package/dist/inspector/shell/PromptActionButton.d.ts +21 -0
- package/dist/inspector/shell/PromptActionButton.js +14 -0
- package/dist/inspector/shell/elementName.d.ts +5 -0
- package/dist/inspector/shell/elementName.js +29 -0
- package/dist/inspector/shell/interactionStatePreview.d.ts +6 -0
- package/dist/inspector/shell/interactionStatePreview.js +107 -0
- package/dist/inspector/shell/originalPreview.d.ts +1 -5
- package/dist/inspector/shell/originalPreview.js +5 -37
- package/dist/inspector/shell/stateValue.d.ts +1 -2
- package/dist/inspector/shell/stateValue.js +4 -8
- package/dist/inspector/shell/styleState.d.ts +1 -2
- package/dist/inspector/shell/styleState.js +1 -2
- package/dist/inspector/sketch/SketchEditor.js +5 -5
- package/dist/inspector/sketch/SketchFrameOverlay.d.ts +2 -1
- package/dist/inspector/sketch/SketchFrameOverlay.js +13 -16
- package/dist/inspector/sketch/SketchOverlay.d.ts +3 -5
- package/dist/inspector/sketch/SketchOverlay.js +138 -263
- package/dist/inspector/sketch/SketchPromptPanel.d.ts +1 -2
- package/dist/inspector/sketch/SketchPromptPanel.js +8 -2
- package/dist/inspector/sketch/SketchThumbnail.d.ts +5 -0
- package/dist/inspector/sketch/SketchThumbnail.js +18 -0
- package/dist/inspector/sketch/SketchWorkspace.d.ts +1 -2
- package/dist/inspector/sketch/SketchWorkspace.js +70 -37
- package/dist/inspector/sketch/capture.d.ts +12 -3
- package/dist/inspector/sketch/capture.js +31 -14
- package/dist/inspector/sketch/copySketch.d.ts +4 -0
- package/dist/inspector/sketch/copySketch.js +43 -0
- package/dist/inspector/sketch/drawingTools.d.ts +15 -0
- package/dist/inspector/sketch/drawingTools.js +46 -0
- package/dist/inspector/sketch/frameHeading.d.ts +3 -0
- package/dist/inspector/sketch/frameHeading.js +23 -0
- package/dist/inspector/sketch/freehand.d.ts +0 -1
- package/dist/inspector/sketch/freehand.js +3 -4
- package/dist/inspector/sketch/geometry.d.ts +2 -1
- package/dist/inspector/sketch/geometry.js +15 -1
- package/dist/inspector/sketch/handoff.js +0 -1
- package/dist/inspector/sketch/history.d.ts +26 -0
- package/dist/inspector/sketch/history.js +55 -0
- package/dist/inspector/sketch/interaction.d.ts +3 -5
- package/dist/inspector/sketch/interaction.js +8 -11
- package/dist/inspector/sketch/model.d.ts +33 -6
- package/dist/inspector/sketch/model.js +101 -63
- package/dist/inspector/sketch/persistence.d.ts +14 -1
- package/dist/inspector/sketch/persistence.js +64 -8
- package/dist/inspector/sketch/raster.d.ts +3 -2
- package/dist/inspector/sketch/raster.js +40 -20
- package/dist/inspector/sketch/store.d.ts +1 -1
- package/dist/inspector/sketch/store.js +3 -4
- package/dist/inspector/sketch/videoFrames.d.ts +6 -0
- package/dist/inspector/sketch/videoFrames.js +80 -0
- package/dist/inspector/spacing/projection.d.ts +0 -8
- package/dist/inspector/spacing/projection.js +38 -20
- package/dist/inspector/styleEditors/BackgroundEditor.js +3 -2
- package/dist/inspector/styleEditors/BorderEditor.js +30 -135
- package/dist/inspector/styleEditors/BorderRadiusEditor.js +8 -3
- package/dist/inspector/styleEditors/ChildPlacement.d.ts +12 -0
- package/dist/inspector/styleEditors/ChildPlacement.js +9 -0
- package/dist/inspector/styleEditors/FlexControls.d.ts +35 -0
- package/dist/inspector/styleEditors/FlexControls.js +158 -0
- package/dist/inspector/styleEditors/GapField.d.ts +5 -2
- package/dist/inspector/styleEditors/GapField.js +3 -4
- package/dist/inspector/styleEditors/GridChildSection.d.ts +0 -5
- package/dist/inspector/styleEditors/GridChildSection.js +0 -5
- package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
- package/dist/inspector/styleEditors/GridPicker.js +2 -4
- package/dist/inspector/styleEditors/GridSection.d.ts +10 -8
- package/dist/inspector/styleEditors/GridSection.js +22 -9
- package/dist/inspector/styleEditors/GridValueField.d.ts +1 -5
- package/dist/inspector/styleEditors/GridValueField.js +2 -8
- package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +0 -1
- package/dist/inspector/styleEditors/ImageBackgroundEditor.js +1 -2
- package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +0 -1
- package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +0 -1
- package/dist/inspector/styleEditors/LayoutComboField.js +0 -5
- package/dist/inspector/styleEditors/LayoutModeRow.d.ts +14 -0
- package/dist/inspector/styleEditors/LayoutModeRow.js +60 -0
- package/dist/inspector/styleEditors/LayoutSection.d.ts +2 -2
- package/dist/inspector/styleEditors/LayoutSection.js +30 -356
- package/dist/inspector/styleEditors/OpacityEditor.js +7 -5
- package/dist/inspector/styleEditors/PositionControls.d.ts +18 -0
- package/dist/inspector/styleEditors/PositionControls.js +16 -0
- package/dist/inspector/styleEditors/SizeSection.d.ts +18 -0
- package/dist/inspector/styleEditors/SizeSection.js +71 -0
- package/dist/inspector/styleEditors/{SpacingBox.d.ts → SpacingField.d.ts} +3 -10
- package/dist/inspector/styleEditors/{SpacingBox.js → SpacingField.js} +15 -29
- package/dist/inspector/styleEditors/Typography.js +2 -4
- package/dist/inspector/styleEditors/borderModel.d.ts +36 -0
- package/dist/inspector/styleEditors/borderModel.js +105 -0
- package/dist/inspector/styleEditors/completeCssValue.d.ts +1 -5
- package/dist/inspector/styleEditors/completeCssValue.js +3 -13
- package/dist/inspector/styleEditors/fieldValue.d.ts +20 -0
- package/dist/inspector/styleEditors/fieldValue.js +26 -0
- package/dist/inspector/styleEditors/gradientValue.d.ts +1 -1
- package/dist/inspector/styleEditors/gradientValue.js +3 -2
- package/dist/inspector/styleEditors/gridChildModel.d.ts +7 -47
- package/dist/inspector/styleEditors/gridChildModel.js +6 -37
- package/dist/inspector/styleEditors/hiddenSizeOverrides.d.ts +5 -0
- package/dist/inspector/styleEditors/hiddenSizeOverrides.js +42 -0
- package/dist/inspector/styleEditors/inlineAuthored.d.ts +1 -8
- package/dist/inspector/styleEditors/inlineAuthored.js +3 -17
- package/dist/inspector/styleEditors/layoutMode.d.ts +15 -0
- package/dist/inspector/styleEditors/layoutMode.js +33 -0
- package/dist/inspector/styleEditors/layoutPreviewState.d.ts +0 -1
- package/dist/inspector/styleEditors/layoutPreviewState.js +0 -1
- package/dist/inspector/styleEditors/layoutValue.d.ts +2 -8
- package/dist/inspector/styleEditors/layoutValue.js +6 -15
- package/dist/inspector/styleEditors/nudgeValue.d.ts +1 -13
- package/dist/inspector/styleEditors/nudgeValue.js +1 -13
- package/dist/inspector/styleEditors/rowLookup.d.ts +1 -5
- package/dist/inspector/styleEditors/rowLookup.js +1 -5
- package/dist/inspector/styleEditors/stringRecord.d.ts +1 -2
- package/dist/inspector/styleEditors/stylePresence.d.ts +0 -2
- package/dist/inspector/styleEditors/stylePresence.js +1 -4
- package/dist/inspector/styleEditors/textRelevance.d.ts +1 -1
- package/dist/inspector/styleEditors/textRelevance.js +1 -1
- package/dist/inspector/styleEditors/useFieldVisibility.js +1 -2
- package/dist/inspector/styleEditors/useLayoutContext.d.ts +13 -0
- package/dist/inspector/styleEditors/useLayoutContext.js +53 -0
- package/dist/inspector/styleEditors/valuePolicy.d.ts +1 -5
- package/dist/inspector/styleEditors/valuePolicy.js +0 -1
- package/dist/inspector/testing.d.ts +1 -4
- package/dist/inspector/testing.js +1 -4
- package/dist/inspector/tokens/TokenChip.d.ts +1 -4
- package/dist/inspector/tokens/TokenChip.js +1 -4
- package/dist/inspector/tokens/TokenField.d.ts +4 -3
- package/dist/inspector/tokens/TokenField.js +53 -32
- package/dist/inspector/tokens/TokensPanel.js +2 -1
- package/dist/inspector/tokens/catalog.d.ts +2 -10
- package/dist/inspector/tokens/catalog.js +5 -12
- package/dist/inspector/tokens/dragPointerLock.d.ts +0 -1
- package/dist/inspector/tokens/dragPointerLock.js +2 -3
- package/dist/inspector/tokens/editActions.d.ts +4 -4
- package/dist/inspector/tokens/editActions.js +11 -7
- package/dist/inspector/tokens/resolution/cascade.d.ts +1 -5
- package/dist/inspector/tokens/resolution/cascade.js +1 -5
- package/dist/inspector/tokens/resolution/containerQueryEvaluator.d.ts +11 -0
- package/dist/inspector/tokens/resolution/containerQueryEvaluator.js +82 -0
- package/dist/inspector/tokens/resolution/cssomCollector.d.ts +4 -19
- package/dist/inspector/tokens/resolution/cssomCollector.js +186 -122
- package/dist/inspector/tokens/resolution/nestedSelectors.d.ts +2 -0
- package/dist/inspector/tokens/resolution/nestedSelectors.js +63 -0
- package/dist/inspector/tokens/resolution/ruleMatching.d.ts +4 -14
- package/dist/inspector/tokens/resolution/ruleMatching.js +136 -63
- package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +3 -14
- package/dist/inspector/tokens/resolution/selectorSemantics.js +12 -27
- package/dist/inspector/tokens/resolution.d.ts +11 -27
- package/dist/inspector/tokens/resolution.js +105 -181
- package/dist/inspector/tokens/tokenAvailability.d.ts +2 -14
- package/dist/inspector/tokens/tokenAvailability.js +6 -38
- package/dist/inspector/tokens/tokenEdits.d.ts +1 -1
- package/dist/inspector/tokens/tokenEdits.js +1 -1
- package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +0 -1
- package/dist/inspector/tokens/valueSemanticsAdapter.js +18 -2
- package/dist/inspector/ui/AtRuleContext.d.ts +5 -5
- package/dist/inspector/ui/AtRuleContext.js +8 -6
- package/dist/inspector/ui/ControlSurface.d.ts +0 -4
- package/dist/inspector/ui/Disclosure.d.ts +0 -5
- package/dist/inspector/ui/Disclosure.js +0 -4
- package/dist/inspector/ui/InlineStyleWarning.d.ts +0 -1
- package/dist/inspector/ui/InlineStyleWarning.js +2 -2
- package/dist/inspector/ui/InspectorPopover.d.ts +1 -5
- package/dist/inspector/ui/InspectorPopover.js +1 -5
- package/dist/inspector/ui/InspectorStyle.d.ts +8 -0
- package/dist/inspector/ui/InspectorStyle.js +26 -0
- package/dist/inspector/ui/PopoverListbox.d.ts +2 -1
- package/dist/inspector/ui/PopoverListbox.js +3 -3
- package/dist/inspector/ui/SegmentedControl.d.ts +4 -4
- package/dist/inspector/ui/SegmentedControl.js +6 -4
- package/dist/inspector/ui/SideValuesField.d.ts +1 -6
- package/dist/inspector/ui/SideValuesField.js +2 -8
- package/dist/inspector/ui/Toast.d.ts +10 -0
- package/dist/inspector/ui/Toast.js +26 -0
- package/dist/inspector/ui/assets/canvasIllustration.d.ts +2 -0
- package/dist/inspector/ui/assets/canvasIllustration.js +21 -0
- package/dist/inspector/ui/assets/gridIllustration.d.ts +2 -0
- package/dist/inspector/ui/assets/{grid.svg → gridIllustration.js} +3 -2
- package/dist/inspector/ui/atRuleSegments.d.ts +13 -0
- package/dist/inspector/ui/atRuleSegments.js +34 -0
- package/dist/inspector/ui/classNames.d.ts +0 -1
- package/dist/inspector/ui/classNames.js +0 -1
- package/dist/inspector/ui/customCursors.d.ts +11 -0
- package/dist/inspector/ui/customCursors.js +29 -7
- package/dist/inspector/ui/styles.js +25 -25
- package/dist/inspector/workspace/commands.js +1 -2
- package/dist/inspector/workspace/controller.js +20 -2
- package/dist/inspector/workspace/handoff.d.ts +1 -5
- package/dist/inspector/workspace/handoff.js +4 -7
- package/dist/inspector/workspace/sentItems.d.ts +3 -6
- package/dist/inspector/workspace/sentItems.js +6 -24
- package/dist/inspector/workspace/timeline.d.ts +28 -11
- package/dist/inspector/workspace/timeline.js +117 -96
- package/dist/internal/agent-protocol.d.ts +53 -38
- package/dist/internal/agent-protocol.js +151 -42
- package/dist/nudge-ui.mjs +155 -92
- package/dist/project/artifacts.js +24 -21
- package/dist/project/files.d.ts +0 -1
- package/dist/project/files.js +2 -9
- package/dist/project/identity.d.ts +1 -5
- package/dist/project/identity.js +1 -5
- package/dist/project/mcpPackage.d.ts +3 -0
- package/dist/project/mcpPackage.js +55 -0
- package/dist/project/pathPolicy.d.ts +1 -6
- package/dist/project/pathPolicy.js +1 -6
- package/dist/project/tokens.d.ts +2 -12
- package/dist/project/tokens.js +4 -15
- package/dist/transport/editor.d.ts +1 -12
- package/dist/transport/editor.js +2 -13
- package/dist/transport/index.d.ts +0 -5
- package/dist/transport/index.js +0 -5
- package/dist/transport/routes.d.ts +0 -5
- package/dist/transport/routes.js +0 -5
- package/package.json +16 -5
- package/dist/inspector/canvas/measurementProjection.d.ts +0 -8
- package/dist/inspector/canvas/measurementProjection.js +0 -16
- package/dist/inspector/changes/changesLog.d.ts +0 -49
- package/dist/inspector/changes/changesLog.js +0 -255
- package/dist/inspector/changes/draftChanges.d.ts +0 -58
- package/dist/inspector/changes/draftChanges.js +0 -304
- package/dist/inspector/conformance/projection.d.ts +0 -2
- package/dist/inspector/conformance/projection.js +0 -3
- package/dist/inspector/inline-text/textChangeBoundary.d.ts +0 -6
- package/dist/inspector/inline-text/textChangeBoundary.js +0 -1
- package/dist/inspector/overlay/InspectorOverlay.d.ts +0 -5
- package/dist/inspector/overlay/InspectorOverlay.js +0 -332
- package/dist/inspector/overlay/elementSelector.d.ts +0 -1
- package/dist/inspector/overlay/elementSelector.js +0 -111
- package/dist/inspector/sketch/SketchChanges.d.ts +0 -2
- package/dist/inspector/sketch/SketchChanges.js +0 -72
- package/dist/inspector/sketch/SketchEntryButton.d.ts +0 -4
- package/dist/inspector/sketch/SketchEntryButton.js +0 -11
- package/dist/inspector/sketch/SketchLayersPanel.d.ts +0 -2
- package/dist/inspector/sketch/SketchLayersPanel.js +0 -71
- package/dist/inspector/styleEditors/InsetSection.d.ts +0 -15
- package/dist/inspector/styleEditors/InsetSection.js +0 -15
- package/dist/inspector/styleEditors/PositionInsets.d.ts +0 -15
- package/dist/inspector/styleEditors/PositionInsets.js +0 -12
- package/dist/inspector/tokens/TokenDropdown.d.ts +0 -13
- package/dist/inspector/tokens/TokenDropdown.js +0 -59
|
@@ -1,15 +1,36 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { canvasFrameHost } from "../canvas/canvasFrame.js";
|
|
3
|
+
import { getRegisteredFrames } from "../canvas/projection.js";
|
|
4
|
+
import { setSelectedElement } from "../selection/selectionStore.js";
|
|
5
|
+
import { selectCard } from "../canvas/canvasStore.js";
|
|
6
|
+
import { activateDraftForCard, assignSketchToDraft, getActiveDraftChanges } from "../drafts/store.js";
|
|
4
7
|
import { useEffect, useState } from "react";
|
|
5
8
|
import { renderAnnotatedPng } from "./raster.js";
|
|
9
|
+
import { sketchFrameHeading } from "./frameHeading.js";
|
|
6
10
|
import { closeSketchEditor, completeSketchCapture, beginSketchCapture, cancelSketchInteraction, openSketchEditor, useSketchInteraction } from "./interaction.js";
|
|
7
|
-
import {
|
|
11
|
+
import { recordCanvasChange } from "../workspace/timeline.js";
|
|
12
|
+
import { getSketch, initializeSketchStore, removeSketch, saveSketch, useSketchStore } from "./store.js";
|
|
8
13
|
import { clearSketchClipboardHandoff } from "./handoff.js";
|
|
14
|
+
import { copySketchImage, saveAndCopySketch } from "./copySketch.js";
|
|
9
15
|
import { SketchEditor } from "./SketchEditor.js";
|
|
10
16
|
import { SketchOverlay } from "./SketchOverlay.js";
|
|
11
17
|
import { closeSketchNote, useSketchNote } from "./sketchNote.js";
|
|
12
18
|
import { SketchPromptPanel } from "./SketchPromptPanel.js";
|
|
19
|
+
function recordSketchCreation(document, owner) {
|
|
20
|
+
let snapshot = document;
|
|
21
|
+
recordCanvasChange({
|
|
22
|
+
cardIds: [],
|
|
23
|
+
undo: () => {
|
|
24
|
+
snapshot = getSketch(document.id)?.document ?? snapshot;
|
|
25
|
+
void removeSketch(document.id);
|
|
26
|
+
},
|
|
27
|
+
redo: () => {
|
|
28
|
+
void saveSketch({ ...snapshot, annotations: snapshot.annotations ?? [] })
|
|
29
|
+
.then((saved) => assignSketchToDraft(owner, saved.id));
|
|
30
|
+
},
|
|
31
|
+
dispose: () => undefined,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
13
34
|
function clamp(value, maximum) {
|
|
14
35
|
return Math.max(0, Math.min(maximum, value));
|
|
15
36
|
}
|
|
@@ -37,26 +58,6 @@ export function projectLiveStrokes(draft, captured) {
|
|
|
37
58
|
}];
|
|
38
59
|
});
|
|
39
60
|
}
|
|
40
|
-
function projectLiveAnnotations(draft, captured) {
|
|
41
|
-
const scaleX = captured.imageWidth / Math.max(1, draft.viewport.width);
|
|
42
|
-
const scaleY = captured.imageHeight / Math.max(1, draft.viewport.height);
|
|
43
|
-
const captureScrollX = captured.capture.scrollX;
|
|
44
|
-
const captureScrollY = captured.capture.scrollY;
|
|
45
|
-
const visibleRight = captureScrollX + draft.viewport.width;
|
|
46
|
-
const visibleBottom = captureScrollY + draft.viewport.height;
|
|
47
|
-
return draft.annotations
|
|
48
|
-
.filter((annotation) => annotation.point.x >= captureScrollX
|
|
49
|
-
&& annotation.point.x <= visibleRight
|
|
50
|
-
&& annotation.point.y >= captureScrollY
|
|
51
|
-
&& annotation.point.y <= visibleBottom)
|
|
52
|
-
.map((annotation) => ({
|
|
53
|
-
...annotation,
|
|
54
|
-
point: {
|
|
55
|
-
x: clamp((annotation.point.x - captureScrollX) * scaleX, captured.imageWidth),
|
|
56
|
-
y: clamp((annotation.point.y - captureScrollY) * scaleY, captured.imageHeight),
|
|
57
|
-
},
|
|
58
|
-
}));
|
|
59
|
-
}
|
|
60
61
|
export function SketchWorkspace({ hostElement, projectId }) {
|
|
61
62
|
const interaction = useSketchInteraction();
|
|
62
63
|
const store = useSketchStore();
|
|
@@ -64,9 +65,8 @@ export function SketchWorkspace({ hostElement, projectId }) {
|
|
|
64
65
|
const editingDocument = interaction.editingId
|
|
65
66
|
? store.items.find((item) => item.document.id === interaction.editingId)?.document ?? null
|
|
66
67
|
: null;
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
// the Changes log a recovery message.
|
|
68
|
+
// Deliberately independent of the localStorage session schema; a failed
|
|
69
|
+
// hydration leaves the inspector usable.
|
|
70
70
|
useEffect(() => {
|
|
71
71
|
clearSketchClipboardHandoff();
|
|
72
72
|
closeSketchNote();
|
|
@@ -77,39 +77,71 @@ export function SketchWorkspace({ hostElement, projectId }) {
|
|
|
77
77
|
const noteDocument = note.sketchId
|
|
78
78
|
? store.items.find((item) => item.document.id === note.sketchId)?.document ?? null
|
|
79
79
|
: null;
|
|
80
|
+
function selectTarget(point, lockedTarget) {
|
|
81
|
+
for (const [cardId, frame] of getRegisteredFrames()) {
|
|
82
|
+
const target = canvasFrameHost(frame);
|
|
83
|
+
if (!target || !frame.isConnected || getComputedStyle(target).visibility === "hidden")
|
|
84
|
+
continue;
|
|
85
|
+
const bounds = frame.getBoundingClientRect();
|
|
86
|
+
if (bounds.width <= 0 || bounds.height <= 0)
|
|
87
|
+
continue;
|
|
88
|
+
if (point.x < bounds.left || point.x > bounds.right || point.y < bounds.top || point.y > bounds.bottom)
|
|
89
|
+
continue;
|
|
90
|
+
if (lockedTarget && target !== lockedTarget)
|
|
91
|
+
return null;
|
|
92
|
+
if (target !== hostElement) {
|
|
93
|
+
setSelectedElement(null);
|
|
94
|
+
selectCard(cardId);
|
|
95
|
+
activateDraftForCard(cardId);
|
|
96
|
+
beginSketchCapture();
|
|
97
|
+
}
|
|
98
|
+
return target;
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
80
102
|
async function save(input) {
|
|
81
103
|
const owner = interaction.draftId ?? getActiveDraftChanges().draftId;
|
|
82
104
|
const saved = await saveSketch(input);
|
|
83
|
-
if (!input.id)
|
|
105
|
+
if (!input.id) {
|
|
84
106
|
assignSketchToDraft(owner, saved.id);
|
|
107
|
+
recordSketchCreation(saved, owner);
|
|
108
|
+
}
|
|
85
109
|
closeSketchEditor();
|
|
110
|
+
void copySketchImage(input.annotatedImage);
|
|
111
|
+
}
|
|
112
|
+
function saveLive(draft) {
|
|
113
|
+
return saveAndCopySketch(() => saveLiveSketch(draft));
|
|
86
114
|
}
|
|
87
|
-
async function
|
|
115
|
+
async function saveLiveSketch(draft) {
|
|
88
116
|
if (!hostElement)
|
|
89
117
|
throw new Error("The inspector is no longer available.");
|
|
90
118
|
const owner = interaction.draftId ?? getActiveDraftChanges().draftId;
|
|
91
119
|
const captured = await completeSketchCapture(hostElement);
|
|
92
120
|
const strokes = projectLiveStrokes(draft, captured);
|
|
93
|
-
const
|
|
94
|
-
const rendered = await renderAnnotatedPng(captured.originalImage, captured.imageWidth, captured.imageHeight, strokes, annotations, draft.description);
|
|
121
|
+
const rendered = await renderAnnotatedPng(captured.originalImage, captured.imageWidth, captured.imageHeight, strokes, [], draft.description, sketchFrameHeading(captured.capture.url));
|
|
95
122
|
const saved = await saveSketch({
|
|
96
123
|
capture: captured.capture,
|
|
97
124
|
description: draft.description,
|
|
98
125
|
strokes,
|
|
99
|
-
annotations,
|
|
126
|
+
annotations: [],
|
|
100
127
|
imageWidth: rendered.width,
|
|
101
128
|
imageHeight: rendered.height,
|
|
102
129
|
originalImage: captured.originalImage,
|
|
103
130
|
annotatedImage: rendered.blob,
|
|
104
131
|
});
|
|
105
132
|
assignSketchToDraft(owner, saved.id);
|
|
133
|
+
recordSketchCreation(saved, owner);
|
|
106
134
|
closeSketchEditor();
|
|
135
|
+
return rendered.blob;
|
|
107
136
|
}
|
|
108
|
-
|
|
137
|
+
function saveNote(description) {
|
|
109
138
|
if (!noteDocument)
|
|
110
|
-
return;
|
|
139
|
+
return Promise.resolve();
|
|
140
|
+
return saveAndCopySketch(() => saveNoteSketch(noteDocument, description));
|
|
141
|
+
}
|
|
142
|
+
async function saveNoteSketch(noteDocument, description) {
|
|
111
143
|
const nextDescription = description.trim();
|
|
112
|
-
const rendered = await renderAnnotatedPng(noteDocument.originalImage, noteDocument.capture.imageWidth, noteDocument.capture.imageHeight, noteDocument.strokes, noteDocument.annotations ?? [], nextDescription);
|
|
144
|
+
const rendered = await renderAnnotatedPng(noteDocument.originalImage, noteDocument.capture.imageWidth, noteDocument.capture.imageHeight, noteDocument.strokes, noteDocument.annotations ?? [], nextDescription, sketchFrameHeading(noteDocument.capture.url));
|
|
113
145
|
await saveSketch({
|
|
114
146
|
id: noteDocument.id,
|
|
115
147
|
capture: noteDocument.capture,
|
|
@@ -122,8 +154,9 @@ export function SketchWorkspace({ hostElement, projectId }) {
|
|
|
122
154
|
annotatedImage: rendered.blob,
|
|
123
155
|
});
|
|
124
156
|
closeSketchNote();
|
|
157
|
+
return rendered.blob;
|
|
125
158
|
}
|
|
126
|
-
return (_jsxs(_Fragment, { children: [hostElement ? (_jsx(SketchOverlay, { open: liveOpen, hostElement: hostElement,
|
|
159
|
+
return (_jsxs(_Fragment, { children: [hostElement ? (_jsx(SketchOverlay, { open: liveOpen, hostElement: hostElement, selectTarget: selectTarget, onCancel: cancelSketchInteraction, onDone: saveLive })) : null, _jsx(SketchEditor, { open: editorOpen, document: editingDocument, captured: interaction.captured, onCancel: cancelSketchInteraction, onSave: save }), noteDocument ? (_jsx(SavedSketchNote, { document: noteDocument, onSave: saveNote, onCancel: closeSketchNote })) : null] }));
|
|
127
160
|
}
|
|
128
161
|
function SavedSketchNote({ document, onSave, onCancel, }) {
|
|
129
162
|
const [description, setDescription] = useState(document.description);
|
|
@@ -148,10 +181,10 @@ function SavedSketchNote({ document, onSave, onCancel, }) {
|
|
|
148
181
|
}
|
|
149
182
|
return (_jsx(SketchPromptPanel, { dataTest: "sketch-note-prompt", className: "sketch__saved-note-panel", description: description, error: error, saving: saving, autoFocus: true, onDescriptionChange: setDescription, onDone: done, onCancel: onCancel }));
|
|
150
183
|
}
|
|
151
|
-
export function startSketchCapture(hostElement
|
|
184
|
+
export function startSketchCapture(hostElement) {
|
|
152
185
|
if (!hostElement)
|
|
153
186
|
return;
|
|
154
|
-
beginSketchCapture(
|
|
187
|
+
beginSketchCapture();
|
|
155
188
|
}
|
|
156
189
|
export function editSketch(sketchId) {
|
|
157
190
|
openSketchEditor(sketchId);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type Options } from "modern-screenshot";
|
|
2
|
+
import { getPngDimensions } from "./raster.js";
|
|
1
3
|
export type SketchCaptureErrorCode = "unsupported" | "cancelled" | "capture-failed" | "processing-timeout";
|
|
2
4
|
export declare class SketchCaptureError extends Error {
|
|
3
5
|
readonly code: SketchCaptureErrorCode;
|
|
@@ -29,6 +31,13 @@ export interface SketchCaptureOptions {
|
|
|
29
31
|
readonly signal?: AbortSignal;
|
|
30
32
|
readonly processingTimeoutMs?: number;
|
|
31
33
|
}
|
|
34
|
+
/** The `domToBlob` call shape this module uses: a node plus render options. */
|
|
35
|
+
export type DomCaptureToBlob = (node: Node, options?: Options) => Promise<Blob>;
|
|
36
|
+
/** Replaces the DOM renderer and PNG reader for callers that cannot rasterize, such as jsdom tests. */
|
|
37
|
+
export interface SketchCaptureResources {
|
|
38
|
+
readonly toBlob?: DomCaptureToBlob;
|
|
39
|
+
readonly pngDimensions?: typeof getPngDimensions;
|
|
40
|
+
}
|
|
32
41
|
export interface SketchViewport {
|
|
33
42
|
readonly width: number;
|
|
34
43
|
readonly height: number;
|
|
@@ -44,11 +53,11 @@ export interface SketchScrollPosition {
|
|
|
44
53
|
readonly x: number;
|
|
45
54
|
readonly y: number;
|
|
46
55
|
}
|
|
47
|
-
/**
|
|
56
|
+
/** Browsers expose root scrolling through different APIs. */
|
|
48
57
|
export declare function getSketchScrollPosition(targetWindow: Window): SketchScrollPosition;
|
|
49
58
|
export declare function getSketchViewport(hostElement: HTMLElement): SketchViewport;
|
|
50
|
-
/**
|
|
51
|
-
export declare function captureViewport(options: SketchCaptureOptions): Promise<CapturedSketch>;
|
|
59
|
+
/** DOM-rendered, so no screen-capture permission is required. */
|
|
60
|
+
export declare function captureViewport(options: SketchCaptureOptions, resources?: SketchCaptureResources): Promise<CapturedSketch>;
|
|
52
61
|
export declare function createSketchCaptureOperation(options: SketchCaptureOptions): {
|
|
53
62
|
readonly promise: Promise<CapturedSketch>;
|
|
54
63
|
readonly cancel: () => void;
|
|
@@ -2,6 +2,7 @@ import { domToBlob } from "modern-screenshot";
|
|
|
2
2
|
import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
|
|
3
3
|
import { SKETCH_LIMITS } from "./model.js";
|
|
4
4
|
import { getPngDimensions } from "./raster.js";
|
|
5
|
+
import { prepareSketchVideoFrames } from "./videoFrames.js";
|
|
5
6
|
const MEDIA_LOAD_TIMEOUT_MS = 500;
|
|
6
7
|
const FONT_READY_TIMEOUT_MS = 2_000;
|
|
7
8
|
const DEFAULT_PROCESSING_TIMEOUT_MS = 20_000;
|
|
@@ -73,7 +74,7 @@ async function waitForLayout(signal, targetDocument) {
|
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
76
|
catch {
|
|
76
|
-
// Font readiness is best effort
|
|
77
|
+
// Font readiness is best effort.
|
|
77
78
|
}
|
|
78
79
|
await waitForAnimationFrame(signal);
|
|
79
80
|
await waitForAnimationFrame(signal);
|
|
@@ -88,7 +89,7 @@ function domContentWidth(hostElement) {
|
|
|
88
89
|
function nonNegativeOffset(...values) {
|
|
89
90
|
return Math.max(0, ...values.filter((value) => Number.isFinite(value)));
|
|
90
91
|
}
|
|
91
|
-
/**
|
|
92
|
+
/** Browsers expose root scrolling through different APIs. */
|
|
92
93
|
export function getSketchScrollPosition(targetWindow) {
|
|
93
94
|
const targetDocument = targetWindow.document;
|
|
94
95
|
const scrollingElement = targetDocument.scrollingElement;
|
|
@@ -252,16 +253,28 @@ async function runWithProcessingTimeout(operation, timeoutMs, parentSignal) {
|
|
|
252
253
|
controller.abort();
|
|
253
254
|
}
|
|
254
255
|
}
|
|
255
|
-
async function captureDomFrame(options, signal) {
|
|
256
|
+
async function captureDomFrame(options, resources, signal) {
|
|
257
|
+
const toBlob = resources.toBlob ?? domToBlob;
|
|
258
|
+
const readPngDimensions = resources.pngDimensions ?? getPngDimensions;
|
|
256
259
|
const surface = getSketchSurface(options.hostElement);
|
|
257
260
|
const viewport = domViewportDimensions(options.hostElement);
|
|
258
261
|
let scale = viewport.scale;
|
|
259
262
|
for (let attempt = 0; attempt < 7; attempt += 1) {
|
|
260
263
|
assertNotAborted(signal);
|
|
264
|
+
const videoFrames = prepareSketchVideoFrames(surface.document);
|
|
261
265
|
const restoreMedia = suspendOffscreenLazyImages(surface.document, viewport);
|
|
266
|
+
let restored = false;
|
|
267
|
+
const restore = () => {
|
|
268
|
+
if (restored)
|
|
269
|
+
return;
|
|
270
|
+
restored = true;
|
|
271
|
+
videoFrames.restore();
|
|
272
|
+
restoreMedia();
|
|
273
|
+
};
|
|
274
|
+
signal?.addEventListener("abort", restore, { once: true });
|
|
262
275
|
let blob;
|
|
263
276
|
try {
|
|
264
|
-
blob = await
|
|
277
|
+
blob = await toBlob(surface.document.documentElement, {
|
|
265
278
|
type: "image/png",
|
|
266
279
|
width: viewport.width,
|
|
267
280
|
height: viewport.height,
|
|
@@ -272,21 +285,25 @@ async function captureDomFrame(options, signal) {
|
|
|
272
285
|
height: `${viewport.height}px`,
|
|
273
286
|
overflow: "hidden",
|
|
274
287
|
},
|
|
275
|
-
filter: (node) => node !== options.hostElement && !isGoogleFontStylesheet(node),
|
|
288
|
+
filter: (node) => node !== options.hostElement && !isGoogleFontStylesheet(node) && videoFrames.filter(node),
|
|
276
289
|
features: { restoreScrollPosition: true },
|
|
277
290
|
timeout: MEDIA_LOAD_TIMEOUT_MS,
|
|
278
|
-
//
|
|
279
|
-
//
|
|
280
|
-
// cannot serialize anyway; computed font styles still remain inline.
|
|
291
|
+
// modern-screenshot cannot serialize cross-origin Google CSS; computed
|
|
292
|
+
// font styles still remain inline.
|
|
281
293
|
font: hasGoogleFontStylesheet(surface.document) ? false : undefined,
|
|
282
|
-
onCloneEachNode:
|
|
294
|
+
onCloneEachNode: (node) => {
|
|
295
|
+
prepareDomClone(node);
|
|
296
|
+
videoFrames.prepareClone(node);
|
|
297
|
+
},
|
|
298
|
+
onCloneNode: restore,
|
|
283
299
|
});
|
|
284
300
|
}
|
|
285
301
|
finally {
|
|
286
|
-
|
|
302
|
+
signal?.removeEventListener("abort", restore);
|
|
303
|
+
restore();
|
|
287
304
|
}
|
|
288
305
|
assertNotAborted(signal);
|
|
289
|
-
const dimensions = await
|
|
306
|
+
const dimensions = await readPngDimensions(blob);
|
|
290
307
|
if (!dimensions
|
|
291
308
|
|| dimensions.width > SKETCH_LIMITS.imageEdge
|
|
292
309
|
|| dimensions.height > SKETCH_LIMITS.imageEdge) {
|
|
@@ -299,8 +316,8 @@ async function captureDomFrame(options, signal) {
|
|
|
299
316
|
}
|
|
300
317
|
throw new SketchCaptureError("capture-failed", "This viewport is too detailed to save within the 2 MiB image limit.");
|
|
301
318
|
}
|
|
302
|
-
/**
|
|
303
|
-
export async function captureViewport(options) {
|
|
319
|
+
/** DOM-rendered, so no screen-capture permission is required. */
|
|
320
|
+
export async function captureViewport(options, resources = {}) {
|
|
304
321
|
if (typeof document === "undefined" || typeof window === "undefined") {
|
|
305
322
|
throw new SketchCaptureError("unsupported", "Viewport capture is only available in a browser.");
|
|
306
323
|
}
|
|
@@ -309,7 +326,7 @@ export async function captureViewport(options) {
|
|
|
309
326
|
const surface = getSketchSurface(options.hostElement);
|
|
310
327
|
const frame = await runWithProcessingTimeout(async (processingSignal) => {
|
|
311
328
|
await waitForLayout(processingSignal, surface.document);
|
|
312
|
-
return captureDomFrame(options, processingSignal);
|
|
329
|
+
return captureDomFrame(options, resources, processingSignal);
|
|
313
330
|
}, options.processingTimeoutMs ?? DEFAULT_PROCESSING_TIMEOUT_MS, options.signal);
|
|
314
331
|
assertNotAborted(options.signal);
|
|
315
332
|
const runtime = getNudgeUiRuntimeConfig();
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function copySketchImage(image: Blob): Promise<void>;
|
|
2
|
+
export declare function copySketchImageOnRequest(image: Blob): Promise<void>;
|
|
3
|
+
/** A failed save skips the toast and rethrows so the caller can show its own error; the clipboard write starts before `save` resolves. */
|
|
4
|
+
export declare function saveAndCopySketch(save: () => Promise<Blob>): Promise<void>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { showToast } from "../ui/Toast.js";
|
|
2
|
+
import { copyImageToClipboard } from "./raster.js";
|
|
3
|
+
function reportCopyFailure(title, error) {
|
|
4
|
+
showToast({
|
|
5
|
+
tone: "error",
|
|
6
|
+
title,
|
|
7
|
+
description: error instanceof Error ? error.message : "The sketch image could not be copied.",
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
/** The toast is the only sign the clipboard changed, so success is announced too. */
|
|
11
|
+
function reportAutoCopy(copied) {
|
|
12
|
+
void copied.then(() => showToast({ title: "Copied to clipboard" }), (error) => reportCopyFailure("Sketch saved, but not copied", error));
|
|
13
|
+
}
|
|
14
|
+
export function copySketchImage(image) {
|
|
15
|
+
const copied = copyImageToClipboard(image);
|
|
16
|
+
reportAutoCopy(copied);
|
|
17
|
+
return copied.catch(() => undefined);
|
|
18
|
+
}
|
|
19
|
+
export function copySketchImageOnRequest(image) {
|
|
20
|
+
const copied = copyImageToClipboard(image);
|
|
21
|
+
void copied.catch((error) => reportCopyFailure("Sketch not copied", error));
|
|
22
|
+
return copied.catch(() => undefined);
|
|
23
|
+
}
|
|
24
|
+
/** A failed save skips the toast and rethrows so the caller can show its own error; the clipboard write starts before `save` resolves. */
|
|
25
|
+
export async function saveAndCopySketch(save) {
|
|
26
|
+
let resolveImage = () => undefined;
|
|
27
|
+
let rejectImage = () => undefined;
|
|
28
|
+
const image = new Promise((resolve, reject) => {
|
|
29
|
+
resolveImage = resolve;
|
|
30
|
+
rejectImage = reject;
|
|
31
|
+
});
|
|
32
|
+
image.catch(() => undefined);
|
|
33
|
+
const copied = copyImageToClipboard(image);
|
|
34
|
+
copied.catch(() => undefined);
|
|
35
|
+
try {
|
|
36
|
+
resolveImage(await save());
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
rejectImage(error);
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
reportAutoCopy(copied);
|
|
43
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type SketchPenColor } from "./model.js";
|
|
2
|
+
export type SketchDrawingTool = "pen" | "eraser" | "rectangle";
|
|
3
|
+
export interface SketchDrawingToolsSnapshot {
|
|
4
|
+
readonly tool: SketchDrawingTool;
|
|
5
|
+
readonly color: SketchPenColor;
|
|
6
|
+
}
|
|
7
|
+
export declare function getSketchDrawingTools(): SketchDrawingToolsSnapshot;
|
|
8
|
+
export declare function subscribeSketchDrawingTools(listener: () => void): () => void;
|
|
9
|
+
export declare function useSketchDrawingTools(): SketchDrawingToolsSnapshot;
|
|
10
|
+
export declare function setSketchDrawingTool(tool: SketchDrawingTool): void;
|
|
11
|
+
/** Choosing a color implies drawing with it, so the eraser hands back to the pen. */
|
|
12
|
+
export declare function setSketchStrokeColor(color: SketchPenColor): void;
|
|
13
|
+
/** Resets the tool only; the chosen color is kept. */
|
|
14
|
+
export declare function resetSketchDrawingTool(): void;
|
|
15
|
+
export declare function restoreDefaultSketchDrawingTools(): void;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
import { SKETCH_PEN_COLORS, SKETCH_STROKE_COLOR } from "./model.js";
|
|
3
|
+
const DEFAULT_COLOR = SKETCH_PEN_COLORS.find((color) => color.value === SKETCH_STROKE_COLOR) ?? SKETCH_PEN_COLORS[0];
|
|
4
|
+
const DEFAULT_SNAPSHOT = {
|
|
5
|
+
tool: "pen",
|
|
6
|
+
color: DEFAULT_COLOR,
|
|
7
|
+
};
|
|
8
|
+
let snapshot = DEFAULT_SNAPSHOT;
|
|
9
|
+
const listeners = new Set();
|
|
10
|
+
function publish(next) {
|
|
11
|
+
if (next.tool === snapshot.tool && next.color === snapshot.color)
|
|
12
|
+
return;
|
|
13
|
+
snapshot = next;
|
|
14
|
+
for (const listener of listeners) {
|
|
15
|
+
try {
|
|
16
|
+
listener();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// A view subscriber must not stop the others from seeing the new tool.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function getSketchDrawingTools() {
|
|
24
|
+
return snapshot;
|
|
25
|
+
}
|
|
26
|
+
export function subscribeSketchDrawingTools(listener) {
|
|
27
|
+
listeners.add(listener);
|
|
28
|
+
return () => listeners.delete(listener);
|
|
29
|
+
}
|
|
30
|
+
export function useSketchDrawingTools() {
|
|
31
|
+
return useSyncExternalStore(subscribeSketchDrawingTools, getSketchDrawingTools, getSketchDrawingTools);
|
|
32
|
+
}
|
|
33
|
+
export function setSketchDrawingTool(tool) {
|
|
34
|
+
publish({ ...snapshot, tool });
|
|
35
|
+
}
|
|
36
|
+
/** Choosing a color implies drawing with it, so the eraser hands back to the pen. */
|
|
37
|
+
export function setSketchStrokeColor(color) {
|
|
38
|
+
publish({ tool: snapshot.tool === "eraser" ? "pen" : snapshot.tool, color });
|
|
39
|
+
}
|
|
40
|
+
/** Resets the tool only; the chosen color is kept. */
|
|
41
|
+
export function resetSketchDrawingTool() {
|
|
42
|
+
setSketchDrawingTool("pen");
|
|
43
|
+
}
|
|
44
|
+
export function restoreDefaultSketchDrawingTools() {
|
|
45
|
+
snapshot = DEFAULT_SNAPSHOT;
|
|
46
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type CanvasCard } from "../canvas/canvasStore.js";
|
|
2
|
+
/** Iterations also name their artifact folder: iteration numbers are live labels that nothing persists. */
|
|
3
|
+
export declare function sketchFrameHeading(captureUrl: string, frameCards?: readonly CanvasCard[]): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getCanvasCards } from "../canvas/canvasStore.js";
|
|
2
|
+
import { contentSourceUrl } from "../canvas/frameContent.js";
|
|
3
|
+
import { artifactIdFromUrl, htmlTarget } from "../drafts/model.js";
|
|
4
|
+
function routePath(url) {
|
|
5
|
+
try {
|
|
6
|
+
return new URL(url).pathname || "/";
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return url;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Iterations also name their artifact folder: iteration numbers are live labels that nothing persists. */
|
|
13
|
+
export function sketchFrameHeading(captureUrl, frameCards = getCanvasCards()) {
|
|
14
|
+
const artifactId = artifactIdFromUrl(captureUrl);
|
|
15
|
+
if (!artifactId)
|
|
16
|
+
return `Implement these changes for "${routePath(captureUrl)}"`;
|
|
17
|
+
const card = frameCards.find((candidate) => candidate.content.kind === "iteration"
|
|
18
|
+
&& candidate.content.artifactId === artifactId);
|
|
19
|
+
const path = htmlTarget(artifactId).path;
|
|
20
|
+
return card
|
|
21
|
+
? `Implement these changes for the HTML iteration "${routePath(contentSourceUrl(card.content))}" (${path})`
|
|
22
|
+
: `Implement these changes for the HTML iteration (${path})`;
|
|
23
|
+
}
|
|
@@ -9,5 +9,4 @@ export interface SketchSvgLayerProps {
|
|
|
9
9
|
readonly annotations?: readonly SketchAnnotation[];
|
|
10
10
|
readonly annotationScale?: number;
|
|
11
11
|
}
|
|
12
|
-
/** Renders sketch geometry as DOM-native SVG shapes. */
|
|
13
12
|
export declare function SketchSvgLayer({ strokes, annotations, annotationScale, }: SketchSvgLayerProps): ReactElement;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { getStroke } from "perfect-freehand";
|
|
3
|
-
import { SKETCH_STROKE_COLOR, } from "./model.js";
|
|
3
|
+
import { SKETCH_ACCENT_COLOR, SKETCH_RECTANGLE_FILL_OPACITY, SKETCH_STROKE_COLOR, } from "./model.js";
|
|
4
4
|
const FREEHAND_OPTIONS = {
|
|
5
5
|
thinning: 0.45,
|
|
6
6
|
smoothing: 0.5,
|
|
@@ -49,16 +49,15 @@ export function sketchStrokePath(stroke, scaleX = 1, scaleY = scaleX) {
|
|
|
49
49
|
return linePath(stroke.points, scaleX, scaleY);
|
|
50
50
|
return getSvgPathFromStroke(sketchStrokeOutline(stroke, scaleX, scaleY));
|
|
51
51
|
}
|
|
52
|
-
/** Renders sketch geometry as DOM-native SVG shapes. */
|
|
53
52
|
export function SketchSvgLayer({ strokes, annotations = [], annotationScale = 1, }) {
|
|
54
53
|
return (_jsxs("g", { "data-test": "sketch-svg-layer", children: [strokes.map((stroke) => {
|
|
55
54
|
const path = sketchStrokePath(stroke);
|
|
56
55
|
if (!path)
|
|
57
56
|
return null;
|
|
58
57
|
const rectangle = stroke.kind === "rectangle";
|
|
59
|
-
return (_jsx("path", { d: path, fill:
|
|
58
|
+
return (_jsx("path", { d: path, fill: stroke.color || SKETCH_STROKE_COLOR, fillOpacity: rectangle ? SKETCH_RECTANGLE_FILL_OPACITY : undefined, stroke: rectangle ? stroke.color || SKETCH_STROKE_COLOR : "none", strokeWidth: rectangle ? stroke.width : undefined, strokeLinecap: "round", strokeLinejoin: "round", pointerEvents: "none" }, stroke.id));
|
|
60
59
|
}), annotations.map((annotation) => {
|
|
61
60
|
const radius = 16 * annotationScale;
|
|
62
|
-
return (_jsxs("g", { transform: `translate(${number(annotation.point.x)} ${number(annotation.point.y)})`, pointerEvents: "none", children: [_jsx("circle", { r: radius, fill:
|
|
61
|
+
return (_jsxs("g", { transform: `translate(${number(annotation.point.x)} ${number(annotation.point.y)})`, pointerEvents: "none", children: [_jsx("circle", { r: radius, fill: SKETCH_ACCENT_COLOR }), _jsx("text", { x: "0", y: "0", fill: "#ffffff", fontFamily: "system-ui, sans-serif", fontSize: 12 * annotationScale, fontWeight: "600", textAnchor: "middle", dominantBaseline: "central", children: annotation.number })] }, annotation.id));
|
|
63
62
|
})] }));
|
|
64
63
|
}
|
|
@@ -11,7 +11,8 @@ export type SketchElementReference = {
|
|
|
11
11
|
readonly id: string;
|
|
12
12
|
};
|
|
13
13
|
export declare function distanceToSegment(point: SketchPoint, start: SketchPoint, end: SketchPoint): number;
|
|
14
|
-
/** Returns the topmost drawable object under a point in canvas coordinates. */
|
|
15
14
|
export declare function findSketchElementAt(point: SketchPoint, strokes: readonly SketchStroke[], annotations: readonly SketchAnnotation[]): SketchElementReference | null;
|
|
16
15
|
export declare function translateSketchStroke(stroke: SketchStroke, delta: SketchPoint, bounds: SketchBounds): SketchStroke;
|
|
17
16
|
export declare function translateSketchAnnotation(annotation: SketchAnnotation, delta: SketchPoint, bounds: SketchBounds): SketchAnnotation;
|
|
17
|
+
/** Rectangles are hit on their outline only, so erasing inside a box leaves it in place. */
|
|
18
|
+
export declare function findErasedSketchStrokeIds(start: SketchPoint, end: SketchPoint, strokes: readonly SketchStroke[], radius: number): string[];
|
|
@@ -37,7 +37,6 @@ function pointBounds(points) {
|
|
|
37
37
|
}
|
|
38
38
|
return { minX, maxX, minY, maxY };
|
|
39
39
|
}
|
|
40
|
-
/** Returns the topmost drawable object under a point in canvas coordinates. */
|
|
41
40
|
export function findSketchElementAt(point, strokes, annotations) {
|
|
42
41
|
for (let index = annotations.length - 1; index >= 0; index -= 1) {
|
|
43
42
|
const annotation = annotations[index];
|
|
@@ -96,3 +95,18 @@ export function translateSketchAnnotation(annotation, delta, bounds) {
|
|
|
96
95
|
},
|
|
97
96
|
};
|
|
98
97
|
}
|
|
98
|
+
/** Rectangles are hit on their outline only, so erasing inside a box leaves it in place. */
|
|
99
|
+
export function findErasedSketchStrokeIds(start, end, strokes, radius) {
|
|
100
|
+
const steps = Math.max(1, Math.ceil(distance(start, end) / Math.max(1, radius / 2)));
|
|
101
|
+
const samples = [];
|
|
102
|
+
for (let step = 0; step <= steps; step += 1) {
|
|
103
|
+
const position = step / steps;
|
|
104
|
+
samples.push({ x: start.x + (end.x - start.x) * position, y: start.y + (end.y - start.y) * position });
|
|
105
|
+
}
|
|
106
|
+
return strokes
|
|
107
|
+
.filter((stroke) => {
|
|
108
|
+
const tolerance = radius + stroke.width / 2;
|
|
109
|
+
return samples.some((sample) => distanceToStroke(sample, stroke) <= tolerance);
|
|
110
|
+
})
|
|
111
|
+
.map((stroke) => stroke.id);
|
|
112
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SketchStroke } from "./model.js";
|
|
2
|
+
interface ErasedStroke {
|
|
3
|
+
readonly stroke: SketchStroke;
|
|
4
|
+
/** Position in the stroke list at the moment it was erased. */
|
|
5
|
+
readonly index: number;
|
|
6
|
+
}
|
|
7
|
+
type SketchHistoryEntry = {
|
|
8
|
+
readonly kind: "add";
|
|
9
|
+
readonly stroke: SketchStroke;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: "erase";
|
|
12
|
+
readonly gesture: number;
|
|
13
|
+
readonly erased: readonly ErasedStroke[];
|
|
14
|
+
};
|
|
15
|
+
export interface SketchHistory {
|
|
16
|
+
readonly strokes: readonly SketchStroke[];
|
|
17
|
+
readonly undo: readonly SketchHistoryEntry[];
|
|
18
|
+
readonly redo: readonly SketchHistoryEntry[];
|
|
19
|
+
}
|
|
20
|
+
export declare const EMPTY_SKETCH_HISTORY: SketchHistory;
|
|
21
|
+
export declare function addSketchStroke(history: SketchHistory, stroke: SketchStroke): SketchHistory;
|
|
22
|
+
/** Strokes erased by the same `gesture` share one undo entry, so an eraser drag undoes in one step. */
|
|
23
|
+
export declare function eraseSketchStrokes(history: SketchHistory, ids: readonly string[], gesture: number): SketchHistory;
|
|
24
|
+
export declare function undoSketchEdit(history: SketchHistory): SketchHistory;
|
|
25
|
+
export declare function redoSketchEdit(history: SketchHistory): SketchHistory;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const EMPTY_SKETCH_HISTORY = { strokes: [], undo: [], redo: [] };
|
|
2
|
+
export function addSketchStroke(history, stroke) {
|
|
3
|
+
return {
|
|
4
|
+
strokes: [...history.strokes, stroke],
|
|
5
|
+
undo: [...history.undo, { kind: "add", stroke }],
|
|
6
|
+
redo: [],
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function removeStrokes(strokes, ids) {
|
|
10
|
+
const remaining = [];
|
|
11
|
+
const erased = [];
|
|
12
|
+
strokes.forEach((stroke, index) => {
|
|
13
|
+
if (ids.has(stroke.id))
|
|
14
|
+
erased.push({ stroke, index: index - erased.length });
|
|
15
|
+
else
|
|
16
|
+
remaining.push(stroke);
|
|
17
|
+
});
|
|
18
|
+
return { strokes: remaining, erased };
|
|
19
|
+
}
|
|
20
|
+
/** Strokes erased by the same `gesture` share one undo entry, so an eraser drag undoes in one step. */
|
|
21
|
+
export function eraseSketchStrokes(history, ids, gesture) {
|
|
22
|
+
const { strokes, erased } = removeStrokes(history.strokes, new Set(ids));
|
|
23
|
+
if (erased.length === 0)
|
|
24
|
+
return history;
|
|
25
|
+
const last = history.undo.at(-1);
|
|
26
|
+
const undo = last?.kind === "erase" && last.gesture === gesture
|
|
27
|
+
? [...history.undo.slice(0, -1), { ...last, erased: [...last.erased, ...erased] }]
|
|
28
|
+
: [...history.undo, { kind: "erase", gesture, erased }];
|
|
29
|
+
return { strokes, undo, redo: [] };
|
|
30
|
+
}
|
|
31
|
+
function restoreErased(strokes, erased) {
|
|
32
|
+
const restored = [...strokes];
|
|
33
|
+
// Reinsert in reverse removal order so each recorded index is valid again.
|
|
34
|
+
for (const { stroke, index } of [...erased].reverse())
|
|
35
|
+
restored.splice(index, 0, stroke);
|
|
36
|
+
return restored;
|
|
37
|
+
}
|
|
38
|
+
export function undoSketchEdit(history) {
|
|
39
|
+
const entry = history.undo.at(-1);
|
|
40
|
+
if (!entry)
|
|
41
|
+
return history;
|
|
42
|
+
const strokes = entry.kind === "add"
|
|
43
|
+
? history.strokes.filter((stroke) => stroke.id !== entry.stroke.id)
|
|
44
|
+
: restoreErased(history.strokes, entry.erased);
|
|
45
|
+
return { strokes, undo: history.undo.slice(0, -1), redo: [...history.redo, entry] };
|
|
46
|
+
}
|
|
47
|
+
export function redoSketchEdit(history) {
|
|
48
|
+
const entry = history.redo.at(-1);
|
|
49
|
+
if (!entry)
|
|
50
|
+
return history;
|
|
51
|
+
const strokes = entry.kind === "add"
|
|
52
|
+
? [...history.strokes, entry.stroke]
|
|
53
|
+
: removeStrokes(history.strokes, new Set(entry.erased.map(({ stroke }) => stroke.id))).strokes;
|
|
54
|
+
return { strokes, undo: [...history.undo, entry], redo: history.redo.slice(0, -1) };
|
|
55
|
+
}
|