nudge-ui 0.2.0
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/README.md +66 -0
- package/bin/nudge-ui.mjs +7 -0
- package/dist/LICENSE +21 -0
- package/dist/client.mjs +261 -0
- package/dist/compiler/ast.d.ts +18 -0
- package/dist/compiler/ast.js +75 -0
- package/dist/compiler/componentContractTypes.d.ts +19 -0
- package/dist/compiler/componentContractTypes.js +1 -0
- package/dist/compiler/componentContracts.d.ts +2 -0
- package/dist/compiler/componentContracts.js +260 -0
- package/dist/compiler/componentInstrumentation.d.ts +32 -0
- package/dist/compiler/componentInstrumentation.js +140 -0
- package/dist/compiler/componentPolicyResolution.d.ts +71 -0
- package/dist/compiler/componentPolicyResolution.js +388 -0
- package/dist/compiler/index.d.ts +9 -0
- package/dist/compiler/index.js +9 -0
- package/dist/compiler/packageComponentContracts.d.ts +32 -0
- package/dist/compiler/packageComponentContracts.js +308 -0
- package/dist/compiler/reactComponentProtocols.d.ts +145 -0
- package/dist/compiler/reactComponentProtocols.js +47 -0
- package/dist/compiler/reactIdentity.d.ts +15 -0
- package/dist/compiler/reactIdentity.js +339 -0
- package/dist/compiler/sourcePaths.d.ts +12 -0
- package/dist/compiler/sourcePaths.js +27 -0
- package/dist/css/dialects/index.d.ts +62 -0
- package/dist/css/dialects/index.js +103 -0
- package/dist/css/dialects/tailwind.d.ts +46 -0
- package/dist/css/dialects/tailwind.js +119 -0
- package/dist/css/dialects/vanillaExtract.d.ts +20 -0
- package/dist/css/dialects/vanillaExtract.js +32 -0
- package/dist/css/index.d.ts +10 -0
- package/dist/css/index.js +10 -0
- package/dist/css/model/index.d.ts +190 -0
- package/dist/css/model/index.js +10 -0
- package/dist/css/token-inventory/index.d.ts +26 -0
- package/dist/css/token-inventory/index.js +24 -0
- package/dist/css/token-inventory/inventory.d.ts +8 -0
- package/dist/css/token-inventory/inventory.js +421 -0
- package/dist/css/token-inventory/parseStylesheet.d.ts +16 -0
- package/dist/css/token-inventory/parseStylesheet.js +155 -0
- package/dist/css/token-inventory/policy.d.ts +47 -0
- package/dist/css/token-inventory/policy.js +50 -0
- package/dist/css/token-inventory/types.d.ts +97 -0
- package/dist/css/token-inventory/types.js +1 -0
- package/dist/css/value-semantics/borderSemantics.d.ts +28 -0
- package/dist/css/value-semantics/borderSemantics.js +91 -0
- package/dist/css/value-semantics/boxSemantics.d.ts +37 -0
- package/dist/css/value-semantics/boxSemantics.js +71 -0
- package/dist/css/value-semantics/colorSemantics.d.ts +99 -0
- package/dist/css/value-semantics/colorSemantics.js +526 -0
- package/dist/css/value-semantics/cssSyntax.d.ts +19 -0
- package/dist/css/value-semantics/cssSyntax.js +111 -0
- package/dist/css/value-semantics/fontSemantics.d.ts +35 -0
- package/dist/css/value-semantics/fontSemantics.js +131 -0
- package/dist/css/value-semantics/index.d.ts +20 -0
- package/dist/css/value-semantics/index.js +15 -0
- package/dist/css/value-semantics/propertyPolicy.d.ts +118 -0
- package/dist/css/value-semantics/propertyPolicy.js +356 -0
- package/dist/css/value-semantics/stringMaps.d.ts +2 -0
- package/dist/css/value-semantics/stringMaps.js +1 -0
- package/dist/css/value-semantics/structuredValues.d.ts +64 -0
- package/dist/css/value-semantics/structuredValues.js +250 -0
- package/dist/css/value-semantics/tokenInterpretation.d.ts +90 -0
- package/dist/css/value-semantics/tokenInterpretation.js +193 -0
- package/dist/css/virtual-design-tokens.d.ts +17 -0
- package/dist/hosts/astro/astroRuntimeConfig.d.ts +12 -0
- package/dist/hosts/astro/astroRuntimeConfig.js +26 -0
- package/dist/hosts/astro/clientAsset.d.ts +12 -0
- package/dist/hosts/astro/clientAsset.js +51 -0
- package/dist/hosts/astro/clientTransport.d.ts +3 -0
- package/dist/hosts/astro/clientTransport.js +57 -0
- package/dist/hosts/astro/index.d.ts +3 -0
- package/dist/hosts/astro/index.js +2 -0
- package/dist/hosts/astro/integration.d.ts +35 -0
- package/dist/hosts/astro/integration.js +96 -0
- package/dist/hosts/astro/middleware.d.ts +13 -0
- package/dist/hosts/astro/middleware.js +22 -0
- package/dist/hosts/astro/projectContext.d.ts +11 -0
- package/dist/hosts/astro/projectContext.js +34 -0
- package/dist/hosts/astro/responseInstrumentation.d.ts +41 -0
- package/dist/hosts/astro/responseInstrumentation.js +80 -0
- package/dist/hosts/next/index.d.ts +4 -0
- package/dist/hosts/next/index.js +7 -0
- package/dist/hosts/next/loader.d.ts +66 -0
- package/dist/hosts/next/loader.js +346 -0
- package/dist/hosts/next/loaders/identity-loader.cjs +228257 -0
- package/dist/hosts/next/loaders/loader-plugin.cjs +228257 -0
- package/dist/hosts/next/manifest.d.ts +38 -0
- package/dist/hosts/next/manifest.js +30 -0
- package/dist/hosts/next/mount.d.ts +12 -0
- package/dist/hosts/next/mount.js +23 -0
- package/dist/hosts/next/repositoryScope.d.ts +20 -0
- package/dist/hosts/next/repositoryScope.js +33 -0
- package/dist/hosts/next/sidecar.d.ts +27 -0
- package/dist/hosts/next/sidecar.js +526 -0
- package/dist/hosts/next/wrapper.d.ts +67 -0
- package/dist/hosts/next/wrapper.js +310 -0
- package/dist/hosts/static/cli.d.ts +12 -0
- package/dist/hosts/static/cli.js +77 -0
- package/dist/hosts/static/html/bootstrap.d.ts +27 -0
- package/dist/hosts/static/html/bootstrap.js +93 -0
- package/dist/hosts/static/index.d.ts +4 -0
- package/dist/hosts/static/index.js +4 -0
- package/dist/hosts/static/manifest.d.ts +18 -0
- package/dist/hosts/static/manifest.js +51 -0
- package/dist/hosts/static/server.d.ts +72 -0
- package/dist/hosts/static/server.js +554 -0
- package/dist/hosts/vite/index.d.ts +20 -0
- package/dist/hosts/vite/index.js +48 -0
- package/dist/hosts/vite/react.d.ts +67 -0
- package/dist/hosts/vite/react.js +231 -0
- package/dist/hosts/vite/tokens/activeStylesheets.d.ts +28 -0
- package/dist/hosts/vite/tokens/activeStylesheets.js +70 -0
- package/dist/hosts/vite/tokens/fileMap.d.ts +2 -0
- package/dist/hosts/vite/tokens/fileMap.js +1 -0
- package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +46 -0
- package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +104 -0
- package/dist/hosts/vite/virtual/design-tokens.d.ts +9 -0
- package/dist/hosts/vite/virtual/design-tokens.js +7 -0
- package/dist/hosts/vite/virtual-design-tokens.d.ts +1 -0
- package/dist/hosts/vite/vite.d.ts +62 -0
- package/dist/hosts/vite/vite.js +854 -0
- package/dist/html/dom.d.ts +13 -0
- package/dist/html/dom.js +46 -0
- package/dist/html/identity.d.ts +40 -0
- package/dist/html/identity.js +196 -0
- package/dist/html/insertions.d.ts +26 -0
- package/dist/html/insertions.js +59 -0
- package/dist/inspector/agent/McpConnectionDialog.d.ts +26 -0
- package/dist/inspector/agent/McpConnectionDialog.js +135 -0
- package/dist/inspector/agent/client.d.ts +98 -0
- package/dist/inspector/agent/client.js +728 -0
- package/dist/inspector/agent/connectionStatus.d.ts +13 -0
- package/dist/inspector/agent/connectionStatus.js +35 -0
- package/dist/inspector/agent/httpTransport.d.ts +21 -0
- package/dist/inspector/agent/httpTransport.js +347 -0
- package/dist/inspector/agent/protocol.d.ts +95 -0
- package/dist/inspector/agent/protocol.js +9 -0
- package/dist/inspector/agent/verification.d.ts +39 -0
- package/dist/inspector/agent/verification.js +207 -0
- package/dist/inspector/canvas/CanvasCard.d.ts +10 -0
- package/dist/inspector/canvas/CanvasCard.js +275 -0
- package/dist/inspector/canvas/CanvasElementOverlay.d.ts +2 -0
- package/dist/inspector/canvas/CanvasElementOverlay.js +301 -0
- package/dist/inspector/canvas/CanvasWorkspace.d.ts +2 -0
- package/dist/inspector/canvas/CanvasWorkspace.js +301 -0
- package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +6 -0
- package/dist/inspector/canvas/LockedWorkspaceNotice.js +17 -0
- package/dist/inspector/canvas/StaleChangeIndicator.d.ts +7 -0
- package/dist/inspector/canvas/StaleChangeIndicator.js +43 -0
- package/dist/inspector/canvas/agentPresentation.d.ts +87 -0
- package/dist/inspector/canvas/agentPresentation.js +421 -0
- package/dist/inspector/canvas/canvasGestures.d.ts +12 -0
- package/dist/inspector/canvas/canvasGestures.js +21 -0
- package/dist/inspector/canvas/canvasStore.d.ts +108 -0
- package/dist/inspector/canvas/canvasStore.js +448 -0
- package/dist/inspector/canvas/frameProtocol.d.ts +231 -0
- package/dist/inspector/canvas/frameProtocol.js +165 -0
- package/dist/inspector/canvas/linkEligibility.d.ts +8 -0
- package/dist/inspector/canvas/linkEligibility.js +68 -0
- package/dist/inspector/canvas/measurementProjection.d.ts +8 -0
- package/dist/inspector/canvas/measurementProjection.js +16 -0
- package/dist/inspector/canvas/normalizeUrl.d.ts +7 -0
- package/dist/inspector/canvas/normalizeUrl.js +27 -0
- package/dist/inspector/canvas/projection.d.ts +41 -0
- package/dist/inspector/canvas/projection.js +232 -0
- package/dist/inspector/canvas/rendererBootstrap.d.ts +4 -0
- package/dist/inspector/canvas/rendererBootstrap.js +410 -0
- package/dist/inspector/canvas/rendererCidIndex.d.ts +11 -0
- package/dist/inspector/canvas/rendererCidIndex.js +21 -0
- package/dist/inspector/canvas/rendererElementSelector.d.ts +2 -0
- package/dist/inspector/canvas/rendererElementSelector.js +378 -0
- package/dist/inspector/canvas/rendererSelectionProxy.d.ts +2 -0
- package/dist/inspector/canvas/rendererSelectionProxy.js +61 -0
- package/dist/inspector/canvas/rendererStylesheet.d.ts +16 -0
- package/dist/inspector/canvas/rendererStylesheet.js +221 -0
- package/dist/inspector/canvas/resizeHandleScale.d.ts +13 -0
- package/dist/inspector/canvas/resizeHandleScale.js +20 -0
- package/dist/inspector/canvas/roleDetection.d.ts +5 -0
- package/dist/inspector/canvas/roleDetection.js +21 -0
- package/dist/inspector/canvas/sessionStore.d.ts +71 -0
- package/dist/inspector/canvas/sessionStore.js +453 -0
- package/dist/inspector/canvas/staleChangeDetector.d.ts +11 -0
- package/dist/inspector/canvas/staleChangeDetector.js +217 -0
- package/dist/inspector/canvas/toolbarScale.d.ts +7 -0
- package/dist/inspector/canvas/toolbarScale.js +11 -0
- package/dist/inspector/canvas/workspaceLease.d.ts +26 -0
- package/dist/inspector/canvas/workspaceLease.js +214 -0
- package/dist/inspector/changes/changesLog.d.ts +46 -0
- package/dist/inspector/changes/changesLog.js +209 -0
- package/dist/inspector/changes/codecs.d.ts +98 -0
- package/dist/inspector/changes/codecs.js +389 -0
- package/dist/inspector/changes/editModel.d.ts +74 -0
- package/dist/inspector/changes/editModel.js +120 -0
- package/dist/inspector/changes/managedStyleProjection.d.ts +6 -0
- package/dist/inspector/changes/managedStyleProjection.js +109 -0
- package/dist/inspector/changes/model.d.ts +13 -0
- package/dist/inspector/changes/model.js +163 -0
- package/dist/inspector/changes/presentation.d.ts +14 -0
- package/dist/inspector/changes/presentation.js +81 -0
- package/dist/inspector/changes/previewDiagnostics.d.ts +39 -0
- package/dist/inspector/changes/previewDiagnostics.js +172 -0
- package/dist/inspector/changes/structuralTypes.d.ts +35 -0
- package/dist/inspector/changes/structuralTypes.js +1 -0
- package/dist/inspector/changes/types.d.ts +76 -0
- package/dist/inspector/changes/types.js +16 -0
- package/dist/inspector/changes/workspaceChanges.d.ts +43 -0
- package/dist/inspector/changes/workspaceChanges.js +239 -0
- package/dist/inspector/clientManifest.d.ts +24 -0
- package/dist/inspector/clientManifest.js +69 -0
- package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +5 -0
- package/dist/inspector/componentSemantics/ComponentPropsSection.js +44 -0
- package/dist/inspector/componentSemantics/adapterRegistry.d.ts +11 -0
- package/dist/inspector/componentSemantics/adapterRegistry.js +75 -0
- package/dist/inspector/componentSemantics/boundaries.d.ts +2 -0
- package/dist/inspector/componentSemantics/boundaries.js +10 -0
- package/dist/inspector/componentSemantics/changeAction.d.ts +3 -0
- package/dist/inspector/componentSemantics/changeAction.js +6 -0
- package/dist/inspector/componentSemantics/changeModel.d.ts +8 -0
- package/dist/inspector/componentSemantics/changeModel.js +60 -0
- package/dist/inspector/componentSemantics/index.d.ts +4 -0
- package/dist/inspector/componentSemantics/index.js +2 -0
- package/dist/inspector/componentSemantics/reactRuntime.d.ts +10 -0
- package/dist/inspector/componentSemantics/reactRuntime.js +186 -0
- package/dist/inspector/componentSemantics/runtimeBridge.d.ts +25 -0
- package/dist/inspector/componentSemantics/runtimeBridge.js +161 -0
- package/dist/inspector/componentSemantics/runtimeTypes.d.ts +2 -0
- package/dist/inspector/componentSemantics/runtimeTypes.js +1 -0
- package/dist/inspector/componentSemantics/textBinding.d.ts +69 -0
- package/dist/inspector/componentSemantics/textBinding.js +514 -0
- package/dist/inspector/componentSemantics/types.d.ts +96 -0
- package/dist/inspector/componentSemantics/types.js +5 -0
- package/dist/inspector/conformance/borderCases.d.ts +7 -0
- package/dist/inspector/conformance/borderCases.js +428 -0
- package/dist/inspector/conformance/colorCases.d.ts +8 -0
- package/dist/inspector/conformance/colorCases.js +470 -0
- package/dist/inspector/conformance/fixture.d.ts +68 -0
- package/dist/inspector/conformance/fixture.js +153 -0
- package/dist/inspector/conformance/projection.d.ts +2 -0
- package/dist/inspector/conformance/projection.js +3 -0
- package/dist/inspector/conformance/spacingCases.d.ts +6 -0
- package/dist/inspector/conformance/spacingCases.js +417 -0
- package/dist/inspector/conformance/typographyCases.d.ts +7 -0
- package/dist/inspector/conformance/typographyCases.js +174 -0
- package/dist/inspector/editScope.d.ts +4 -0
- package/dist/inspector/editScope.js +5 -0
- package/dist/inspector/index.d.ts +20 -0
- package/dist/inspector/index.js +236 -0
- package/dist/inspector/inline-text/inlineTextEditor.d.ts +74 -0
- package/dist/inspector/inline-text/inlineTextEditor.js +1207 -0
- package/dist/inspector/inline-text/inlineTextLifecycle.d.ts +2 -0
- package/dist/inspector/inline-text/inlineTextLifecycle.js +17 -0
- package/dist/inspector/inline-text/textChangeBoundary.d.ts +6 -0
- package/dist/inspector/inline-text/textChangeBoundary.js +1 -0
- package/dist/inspector/inspection/bridge.d.ts +72 -0
- package/dist/inspector/inspection/bridge.js +134 -0
- package/dist/inspector/inspection/browserCssInspection.d.ts +74 -0
- package/dist/inspector/inspection/browserCssInspection.js +317 -0
- package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +12 -0
- package/dist/inspector/inspection/browserCssInspectionRegistry.js +66 -0
- package/dist/inspector/inspection/selectionProperty.d.ts +32 -0
- package/dist/inspector/inspection/selectionProperty.js +33 -0
- package/dist/inspector/inspection/useBrowserCssInspection.d.ts +20 -0
- package/dist/inspector/inspection/useBrowserCssInspection.js +159 -0
- package/dist/inspector/overlay/DropGuideOverlay.d.ts +17 -0
- package/dist/inspector/overlay/DropGuideOverlay.js +17 -0
- package/dist/inspector/overlay/InspectorOverlay.d.ts +5 -0
- package/dist/inspector/overlay/InspectorOverlay.js +328 -0
- package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +19 -0
- package/dist/inspector/overlay/MeasurementGuideOverlay.js +40 -0
- package/dist/inspector/overlay/clickPolicy.d.ts +7 -0
- package/dist/inspector/overlay/clickPolicy.js +13 -0
- package/dist/inspector/overlay/dropGuide.d.ts +22 -0
- package/dist/inspector/overlay/dropGuide.js +48 -0
- package/dist/inspector/overlay/elementSelector.d.ts +1 -0
- package/dist/inspector/overlay/elementSelector.js +100 -0
- package/dist/inspector/overlay/frameThrottle.d.ts +10 -0
- package/dist/inspector/overlay/frameThrottle.js +38 -0
- package/dist/inspector/overlay/interactionStyles.d.ts +3 -0
- package/dist/inspector/overlay/interactionStyles.js +70 -0
- package/dist/inspector/overlay/measurementGeometry.d.ts +25 -0
- package/dist/inspector/overlay/measurementGeometry.js +104 -0
- package/dist/inspector/overlay/overlayGeometry.d.ts +40 -0
- package/dist/inspector/overlay/overlayGeometry.js +59 -0
- package/dist/inspector/overlay/selectedGeometry.d.ts +7 -0
- package/dist/inspector/overlay/selectedGeometry.js +51 -0
- package/dist/inspector/overlay/structuralGestures.d.ts +28 -0
- package/dist/inspector/overlay/structuralGestures.js +180 -0
- package/dist/inspector/projection/cssEscapes.d.ts +3 -0
- package/dist/inspector/projection/cssEscapes.js +20 -0
- package/dist/inspector/projection/managedStylesheet.d.ts +33 -0
- package/dist/inspector/projection/managedStylesheet.js +240 -0
- package/dist/inspector/projection/renderedInstance.d.ts +56 -0
- package/dist/inspector/projection/renderedInstance.js +306 -0
- package/dist/inspector/projection/structuralProjection.d.ts +93 -0
- package/dist/inspector/projection/structuralProjection.js +560 -0
- package/dist/inspector/projection/structuralProjectionBoundary.d.ts +5 -0
- package/dist/inspector/projection/structuralProjectionBoundary.js +65 -0
- package/dist/inspector/projection/textProjection.d.ts +53 -0
- package/dist/inspector/projection/textProjection.js +705 -0
- package/dist/inspector/projection/workspaceProjection.d.ts +43 -0
- package/dist/inspector/projection/workspaceProjection.js +58 -0
- package/dist/inspector/prompt/PromptSettingsDialog.d.ts +15 -0
- package/dist/inspector/prompt/PromptSettingsDialog.js +17 -0
- package/dist/inspector/prompt/clipboardHandoff.d.ts +34 -0
- package/dist/inspector/prompt/clipboardHandoff.js +212 -0
- package/dist/inspector/prompt/copyToClipboard.d.ts +1 -0
- package/dist/inspector/prompt/copyToClipboard.js +34 -0
- package/dist/inspector/prompt/detectFramework.d.ts +6 -0
- package/dist/inspector/prompt/detectFramework.js +4 -0
- package/dist/inspector/prompt/generatePrompt.d.ts +7 -0
- package/dist/inspector/prompt/generatePrompt.js +391 -0
- package/dist/inspector/prompt/promptSettings.d.ts +8 -0
- package/dist/inspector/prompt/promptSettings.js +28 -0
- package/dist/inspector/runtime/devFlag.d.ts +28 -0
- package/dist/inspector/runtime/devFlag.js +50 -0
- package/dist/inspector/runtime/documentStylesheetOrder.d.ts +19 -0
- package/dist/inspector/runtime/documentStylesheetOrder.js +89 -0
- package/dist/inspector/runtime/domRealm.d.ts +4 -0
- package/dist/inspector/runtime/domRealm.js +11 -0
- package/dist/inspector/runtime/runtimeConfig.d.ts +119 -0
- package/dist/inspector/runtime/runtimeConfig.js +276 -0
- package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +32 -0
- package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +149 -0
- package/dist/inspector/runtime/useRuntimeConfig.d.ts +10 -0
- package/dist/inspector/runtime/useRuntimeConfig.js +13 -0
- package/dist/inspector/selection/editScope.d.ts +32 -0
- package/dist/inspector/selection/editScope.js +140 -0
- package/dist/inspector/selection/editTarget.d.ts +8 -0
- package/dist/inspector/selection/editTarget.js +11 -0
- package/dist/inspector/selection/hierarchy.d.ts +7 -0
- package/dist/inspector/selection/hierarchy.js +42 -0
- package/dist/inspector/selection/resolveSelection.d.ts +10 -0
- package/dist/inspector/selection/resolveSelection.js +60 -0
- package/dist/inspector/selection/selectionStore.d.ts +41 -0
- package/dist/inspector/selection/selectionStore.js +262 -0
- package/dist/inspector/selection/selectionTarget.d.ts +5 -0
- package/dist/inspector/selection/selectionTarget.js +50 -0
- package/dist/inspector/selection/sourceSite.d.ts +2 -0
- package/dist/inspector/selection/sourceSite.js +12 -0
- package/dist/inspector/selection/styleSelection.d.ts +22 -0
- package/dist/inspector/selection/styleSelection.js +104 -0
- package/dist/inspector/session/index.d.ts +3 -0
- package/dist/inspector/session/index.js +2 -0
- package/dist/inspector/session/lifecycle.d.ts +22 -0
- package/dist/inspector/session/lifecycle.js +63 -0
- package/dist/inspector/session/sessionContext.d.ts +21 -0
- package/dist/inspector/session/sessionContext.js +28 -0
- package/dist/inspector/session/sessionFactory.d.ts +29 -0
- package/dist/inspector/session/sessionFactory.js +73 -0
- package/dist/inspector/settings/SettingsDialog.d.ts +12 -0
- package/dist/inspector/settings/SettingsDialog.js +46 -0
- package/dist/inspector/shell/AppShell.d.ts +2 -0
- package/dist/inspector/shell/AppShell.js +9 -0
- package/dist/inspector/shell/ChangesLog.d.ts +6 -0
- package/dist/inspector/shell/ChangesLog.js +92 -0
- package/dist/inspector/shell/CopyPromptButton.d.ts +9 -0
- package/dist/inspector/shell/CopyPromptButton.js +159 -0
- package/dist/inspector/shell/DomNavigation.d.ts +8 -0
- package/dist/inspector/shell/DomNavigation.js +30 -0
- package/dist/inspector/shell/EmptyState.d.ts +2 -0
- package/dist/inspector/shell/EmptyState.js +15 -0
- package/dist/inspector/shell/InspectorShell.d.ts +11 -0
- package/dist/inspector/shell/InspectorShell.js +268 -0
- package/dist/inspector/shell/openStore.d.ts +6 -0
- package/dist/inspector/shell/openStore.js +29 -0
- package/dist/inspector/shell/panelLayout.d.ts +2 -0
- package/dist/inspector/shell/panelLayout.js +29 -0
- package/dist/inspector/shell/shortcuts.d.ts +3 -0
- package/dist/inspector/shell/shortcuts.js +25 -0
- package/dist/inspector/shell/stateValue.d.ts +3 -0
- package/dist/inspector/shell/stateValue.js +34 -0
- package/dist/inspector/shell/styleState.d.ts +7 -0
- package/dist/inspector/shell/styleState.js +13 -0
- package/dist/inspector/spacing/projection.d.ts +43 -0
- package/dist/inspector/spacing/projection.js +136 -0
- package/dist/inspector/styleEditors/AppearanceSection.d.ts +13 -0
- package/dist/inspector/styleEditors/AppearanceSection.js +6 -0
- package/dist/inspector/styleEditors/AspectRatioField.d.ts +17 -0
- package/dist/inspector/styleEditors/AspectRatioField.js +10 -0
- package/dist/inspector/styleEditors/BorderEditor.d.ts +13 -0
- package/dist/inspector/styleEditors/BorderEditor.js +295 -0
- package/dist/inspector/styleEditors/BorderRadiusEditor.d.ts +14 -0
- package/dist/inspector/styleEditors/BorderRadiusEditor.js +108 -0
- package/dist/inspector/styleEditors/BoxShadowEditor.d.ts +13 -0
- package/dist/inspector/styleEditors/BoxShadowEditor.js +13 -0
- package/dist/inspector/styleEditors/ColorPicker.d.ts +15 -0
- package/dist/inspector/styleEditors/ColorPicker.js +73 -0
- package/dist/inspector/styleEditors/GapField.d.ts +17 -0
- package/dist/inspector/styleEditors/GapField.js +12 -0
- package/dist/inspector/styleEditors/GridChildSection.d.ts +14 -0
- package/dist/inspector/styleEditors/GridChildSection.js +91 -0
- package/dist/inspector/styleEditors/GridPicker.d.ts +13 -0
- package/dist/inspector/styleEditors/GridPicker.js +179 -0
- package/dist/inspector/styleEditors/GridSection.d.ts +17 -0
- package/dist/inspector/styleEditors/GridSection.js +27 -0
- package/dist/inspector/styleEditors/GridValueField.d.ts +17 -0
- package/dist/inspector/styleEditors/GridValueField.js +70 -0
- package/dist/inspector/styleEditors/InsetSection.d.ts +15 -0
- package/dist/inspector/styleEditors/InsetSection.js +15 -0
- package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +6 -0
- package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +6 -0
- package/dist/inspector/styleEditors/LayoutComboField.d.ts +18 -0
- package/dist/inspector/styleEditors/LayoutComboField.js +138 -0
- package/dist/inspector/styleEditors/LayoutDropdown.d.ts +14 -0
- package/dist/inspector/styleEditors/LayoutDropdown.js +34 -0
- package/dist/inspector/styleEditors/LayoutSection.d.ts +13 -0
- package/dist/inspector/styleEditors/LayoutSection.js +342 -0
- package/dist/inspector/styleEditors/OpacityEditor.d.ts +13 -0
- package/dist/inspector/styleEditors/OpacityEditor.js +34 -0
- package/dist/inspector/styleEditors/PositionInsets.d.ts +15 -0
- package/dist/inspector/styleEditors/PositionInsets.js +12 -0
- package/dist/inspector/styleEditors/SpacingBox.d.ts +29 -0
- package/dist/inspector/styleEditors/SpacingBox.js +189 -0
- package/dist/inspector/styleEditors/Typography.d.ts +13 -0
- package/dist/inspector/styleEditors/Typography.js +137 -0
- package/dist/inspector/styleEditors/completeCssValue.d.ts +8 -0
- package/dist/inspector/styleEditors/completeCssValue.js +34 -0
- package/dist/inspector/styleEditors/gridChildModel.d.ts +74 -0
- package/dist/inspector/styleEditors/gridChildModel.js +138 -0
- package/dist/inspector/styleEditors/layoutValue.d.ts +24 -0
- package/dist/inspector/styleEditors/layoutValue.js +103 -0
- package/dist/inspector/styleEditors/nudgeValue.d.ts +8 -0
- package/dist/inspector/styleEditors/nudgeValue.js +71 -0
- package/dist/inspector/styleEditors/rowLookup.d.ts +11 -0
- package/dist/inspector/styleEditors/rowLookup.js +13 -0
- package/dist/inspector/styleEditors/stringRecord.d.ts +4 -0
- package/dist/inspector/styleEditors/stringRecord.js +1 -0
- package/dist/inspector/styleEditors/valuePolicy.d.ts +20 -0
- package/dist/inspector/styleEditors/valuePolicy.js +82 -0
- package/dist/inspector/testing.d.ts +10 -0
- package/dist/inspector/testing.js +9 -0
- package/dist/inspector/tokens/TokenChip.d.ts +24 -0
- package/dist/inspector/tokens/TokenChip.js +23 -0
- package/dist/inspector/tokens/TokenDropdown.d.ts +13 -0
- package/dist/inspector/tokens/TokenDropdown.js +59 -0
- package/dist/inspector/tokens/TokenField.d.ts +68 -0
- package/dist/inspector/tokens/TokenField.js +485 -0
- package/dist/inspector/tokens/TokenLabel.d.ts +7 -0
- package/dist/inspector/tokens/TokenLabel.js +23 -0
- package/dist/inspector/tokens/TokensPanel.d.ts +5 -0
- package/dist/inspector/tokens/TokensPanel.js +47 -0
- package/dist/inspector/tokens/catalog.d.ts +51 -0
- package/dist/inspector/tokens/catalog.js +184 -0
- package/dist/inspector/tokens/editActions.d.ts +35 -0
- package/dist/inspector/tokens/editActions.js +164 -0
- package/dist/inspector/tokens/resolution/cascade.d.ts +14 -0
- package/dist/inspector/tokens/resolution/cascade.js +31 -0
- package/dist/inspector/tokens/resolution/cssomCollector.d.ts +43 -0
- package/dist/inspector/tokens/resolution/cssomCollector.js +528 -0
- package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +12 -0
- package/dist/inspector/tokens/resolution/selectorSemantics.js +106 -0
- package/dist/inspector/tokens/resolution.d.ts +56 -0
- package/dist/inspector/tokens/resolution.js +1401 -0
- package/dist/inspector/tokens/tokenEdits.d.ts +3 -0
- package/dist/inspector/tokens/tokenEdits.js +22 -0
- package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +6 -0
- package/dist/inspector/tokens/valueSemanticsAdapter.js +68 -0
- package/dist/inspector/ui/AtRuleContext.d.ts +18 -0
- package/dist/inspector/ui/AtRuleContext.js +54 -0
- package/dist/inspector/ui/Button.d.ts +9 -0
- package/dist/inspector/ui/Button.js +4 -0
- package/dist/inspector/ui/ColorSwatch.d.ts +7 -0
- package/dist/inspector/ui/ColorSwatch.js +6 -0
- package/dist/inspector/ui/ControlSurface.d.ts +14 -0
- package/dist/inspector/ui/ControlSurface.js +10 -0
- package/dist/inspector/ui/FieldRow.d.ts +14 -0
- package/dist/inspector/ui/FieldRow.js +15 -0
- package/dist/inspector/ui/IconButton.d.ts +14 -0
- package/dist/inspector/ui/IconButton.js +5 -0
- package/dist/inspector/ui/InspectorPopover.d.ts +17 -0
- package/dist/inspector/ui/InspectorPopover.js +13 -0
- package/dist/inspector/ui/PopoverListbox.d.ts +37 -0
- package/dist/inspector/ui/PopoverListbox.js +21 -0
- package/dist/inspector/ui/SegmentedControl.d.ts +24 -0
- package/dist/inspector/ui/SegmentedControl.js +16 -0
- package/dist/inspector/ui/Select.d.ts +25 -0
- package/dist/inspector/ui/Select.js +56 -0
- package/dist/inspector/ui/SideValuesField.d.ts +44 -0
- package/dist/inspector/ui/SideValuesField.js +76 -0
- package/dist/inspector/ui/StatusCallout.d.ts +9 -0
- package/dist/inspector/ui/StatusCallout.js +4 -0
- package/dist/inspector/ui/TextInput.d.ts +12 -0
- package/dist/inspector/ui/TextInput.js +5 -0
- package/dist/inspector/ui/ToggleButton.d.ts +11 -0
- package/dist/inspector/ui/ToggleButton.js +6 -0
- package/dist/inspector/ui/assets/grid.svg +14 -0
- package/dist/inspector/ui/css.d.ts +9 -0
- package/dist/inspector/ui/labels.d.ts +1 -0
- package/dist/inspector/ui/labels.js +7 -0
- package/dist/inspector/ui/styles.d.ts +1 -0
- package/dist/inspector/ui/styles.js +68 -0
- package/dist/inspector/virtual-modules.d.ts +7 -0
- package/dist/inspector/vite-env.d.ts +10 -0
- package/dist/internal/agent-protocol.d.ts +232 -0
- package/dist/internal/agent-protocol.js +237 -0
- package/dist/nudge-ui.mjs +15722 -0
- package/dist/project/files.d.ts +19 -0
- package/dist/project/files.js +226 -0
- package/dist/project/identity.d.ts +6 -0
- package/dist/project/identity.js +19 -0
- package/dist/project/pathPolicy.d.ts +8 -0
- package/dist/project/pathPolicy.js +12 -0
- package/dist/project/tokens.d.ts +36 -0
- package/dist/project/tokens.js +223 -0
- package/dist/transport/index.d.ts +8 -0
- package/dist/transport/index.js +8 -0
- package/dist/transport/routes.d.ts +13 -0
- package/dist/transport/routes.js +16 -0
- package/package.json +137 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { changeKey, tokenReference } from "../changes/model.js";
|
|
2
|
+
import { selectorForManagedChange } from "../changes/managedStyleProjection.js";
|
|
3
|
+
import { getWorkspaceChanges } from "../changes/workspaceChanges.js";
|
|
4
|
+
import { getChangesList, isComponentChange, isTextContentChange, isTokenChange, reconcileVerifiedWorkspaceChanges, } from "../changes/changesLog.js";
|
|
5
|
+
import { verifyPreview } from "../projection/managedStylesheet.js";
|
|
6
|
+
import { resolveRenderedInstance } from "../projection/renderedInstance.js";
|
|
7
|
+
import { getStructuralChanges, } from "../projection/structuralProjection.js";
|
|
8
|
+
import { resolveTextProjectionTarget, resolveTextProjectionTextNode, } from "../projection/textProjection.js";
|
|
9
|
+
import { applyHostWorkspaceProjection, compileWorkspaceProjection, } from "../projection/workspaceProjection.js";
|
|
10
|
+
const dispatches = new Map();
|
|
11
|
+
function stableJsonValue(value) {
|
|
12
|
+
if (Array.isArray(value))
|
|
13
|
+
return value.map(stableJsonValue);
|
|
14
|
+
if (!value || typeof value !== "object")
|
|
15
|
+
return value;
|
|
16
|
+
return Object.fromEntries(Object.entries(value)
|
|
17
|
+
.filter(([, entry]) => entry !== undefined)
|
|
18
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
19
|
+
.map(([key, entry]) => [key, stableJsonValue(entry)]));
|
|
20
|
+
}
|
|
21
|
+
function stableSerialized(value) {
|
|
22
|
+
return JSON.stringify(stableJsonValue(value));
|
|
23
|
+
}
|
|
24
|
+
/** Stable, preview-metadata-free identity for one prompt handoff record. */
|
|
25
|
+
export function handoffChangeFingerprint(change) {
|
|
26
|
+
return stableSerialized(change);
|
|
27
|
+
}
|
|
28
|
+
/** Stable identity for one structural record included in a prompt handoff. */
|
|
29
|
+
export function handoffStructuralFingerprint(change) {
|
|
30
|
+
return stableSerialized(change);
|
|
31
|
+
}
|
|
32
|
+
function requestedStyleValue(change) {
|
|
33
|
+
if (isTokenChange(change))
|
|
34
|
+
return change.rawValue;
|
|
35
|
+
if (change.newToken)
|
|
36
|
+
return tokenReference(change.newToken);
|
|
37
|
+
return change.rawValue ?? "";
|
|
38
|
+
}
|
|
39
|
+
function verifyStyle(change, doc) {
|
|
40
|
+
if (!isTokenChange(change) && (change.state ?? "base") !== "base")
|
|
41
|
+
return false;
|
|
42
|
+
const selector = selectorForManagedChange(change);
|
|
43
|
+
if (!selector)
|
|
44
|
+
return false;
|
|
45
|
+
let targets;
|
|
46
|
+
try {
|
|
47
|
+
targets = Array.from(doc.querySelectorAll(selector));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const requested = requestedStyleValue(change);
|
|
53
|
+
return requested.length > 0
|
|
54
|
+
&& targets.length > 0
|
|
55
|
+
&& targets.every((target) => verifyPreview(target, change.property, requested).status === "applied");
|
|
56
|
+
}
|
|
57
|
+
function verifyText(change, doc) {
|
|
58
|
+
const resolved = resolveTextProjectionTarget(doc, change.target, change.after);
|
|
59
|
+
if (resolved.status !== "resolved")
|
|
60
|
+
return false;
|
|
61
|
+
const node = resolveTextProjectionTextNode(resolved.element, change.target, change.after);
|
|
62
|
+
if (node)
|
|
63
|
+
return node.nodeValue === change.after;
|
|
64
|
+
return change.target.textNodePath === undefined
|
|
65
|
+
&& change.after.length === 0
|
|
66
|
+
&& (resolved.element.textContent ?? "") === "";
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A delete verifies when its target no longer resolves in the document once
|
|
70
|
+
* the preview is lifted: the source really removed it. Ambiguous evidence
|
|
71
|
+
* still means identical elements are present, so only a definitive miss
|
|
72
|
+
* verifies.
|
|
73
|
+
*/
|
|
74
|
+
function verifyStructuralDelete(change, doc) {
|
|
75
|
+
return resolveRenderedInstance(doc, change.target).status === "missing";
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A move verifies when the element sits at its recorded destination without
|
|
79
|
+
* the preview holding it there. The projection rebuild returns a cleanly
|
|
80
|
+
* applied move preview to its captured origin, so such records conservatively
|
|
81
|
+
* stay unverified instead of trusting rendered placement alone.
|
|
82
|
+
*/
|
|
83
|
+
function verifyStructuralMove(change, doc) {
|
|
84
|
+
const target = resolveRenderedInstance(doc, change.target);
|
|
85
|
+
if (target.status !== "resolved")
|
|
86
|
+
return false;
|
|
87
|
+
const parent = resolveRenderedInstance(doc, change.destination.parent);
|
|
88
|
+
if (parent.status !== "resolved")
|
|
89
|
+
return false;
|
|
90
|
+
if (target.element.parentElement !== parent.element)
|
|
91
|
+
return false;
|
|
92
|
+
if (!change.destination.before)
|
|
93
|
+
return target.element.nextElementSibling === null;
|
|
94
|
+
const before = resolveRenderedInstance(doc, change.destination.before);
|
|
95
|
+
return before.status === "resolved" && target.element.nextElementSibling === before.element;
|
|
96
|
+
}
|
|
97
|
+
function verifiedStructuralChangeIds(eligible, doc) {
|
|
98
|
+
const verified = new Set();
|
|
99
|
+
for (const change of eligible) {
|
|
100
|
+
const applied = change.kind === "delete"
|
|
101
|
+
? verifyStructuralDelete(change, doc)
|
|
102
|
+
: verifyStructuralMove(change, doc);
|
|
103
|
+
if (applied)
|
|
104
|
+
verified.add(change.id);
|
|
105
|
+
}
|
|
106
|
+
return verified;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Positively verifies browser-observable source results after the inspector's
|
|
110
|
+
* own projections have been removed. Component props and interaction states
|
|
111
|
+
* intentionally remain unresolved because rendered output alone cannot prove
|
|
112
|
+
* that their source was updated.
|
|
113
|
+
*/
|
|
114
|
+
export function verifiedChangeKeys(sentChanges, doc = document) {
|
|
115
|
+
const verified = new Set();
|
|
116
|
+
for (const change of sentChanges) {
|
|
117
|
+
if (isComponentChange(change))
|
|
118
|
+
continue;
|
|
119
|
+
const applied = isTextContentChange(change)
|
|
120
|
+
? verifyText(change, doc)
|
|
121
|
+
: verifyStyle(change, doc);
|
|
122
|
+
if (applied)
|
|
123
|
+
verified.add(changeKey(change));
|
|
124
|
+
}
|
|
125
|
+
return verified;
|
|
126
|
+
}
|
|
127
|
+
/** Captures the exact canonical edits associated with one dispatched prompt. */
|
|
128
|
+
export function recordAgentDispatch(revision, changes, structuralChanges = []) {
|
|
129
|
+
dispatches.set(revision, {
|
|
130
|
+
changes: changes.map((change) => structuredClone(change)),
|
|
131
|
+
structuralChanges: structuralChanges.map((change) => structuredClone(change)),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** Drops a captured revision when the bridge rejects its dispatch. */
|
|
135
|
+
export function discardAgentDispatch(revision) {
|
|
136
|
+
dispatches.delete(revision);
|
|
137
|
+
}
|
|
138
|
+
/** Returns how many canonical edits were in flight for one dispatch. */
|
|
139
|
+
export function getAgentDispatchSize(revision) {
|
|
140
|
+
const snapshot = dispatches.get(revision);
|
|
141
|
+
if (!snapshot)
|
|
142
|
+
return 0;
|
|
143
|
+
return snapshot.changes.length + snapshot.structuralChanges.length;
|
|
144
|
+
}
|
|
145
|
+
function afterBrowserPaint() {
|
|
146
|
+
if (typeof requestAnimationFrame !== "function")
|
|
147
|
+
return Promise.resolve();
|
|
148
|
+
return new Promise((resolve) => {
|
|
149
|
+
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Reconciles only records that still equal the sent snapshot and that remain
|
|
154
|
+
* observable after removing Nudge's own preview. Newer edits and ambiguous
|
|
155
|
+
* records are preserved.
|
|
156
|
+
*/
|
|
157
|
+
export async function verifyAndReconcileHandoff(snapshot) {
|
|
158
|
+
const sentByKey = new Map(snapshot.changes.map((change) => [changeKey(change), handoffChangeFingerprint(change)]));
|
|
159
|
+
const current = getChangesList();
|
|
160
|
+
const eligible = current.filter((change) => sentByKey.get(changeKey(change)) === handoffChangeFingerprint(change));
|
|
161
|
+
const eligibleKeys = new Set(eligible.map(changeKey));
|
|
162
|
+
const remaining = current.filter((change) => !eligibleKeys.has(changeKey(change)));
|
|
163
|
+
// The same "still unchanged" rule for structural intent: only canonical
|
|
164
|
+
// records byte-identical to the dispatched snapshot may be reconciled.
|
|
165
|
+
const sentStructural = new Map(snapshot.structuralChanges.map((change) => [change.id, handoffStructuralFingerprint(change)]));
|
|
166
|
+
const currentStructural = getStructuralChanges();
|
|
167
|
+
const eligibleStructural = currentStructural.filter((change) => sentStructural.get(change.id) === handoffStructuralFingerprint(change));
|
|
168
|
+
const eligibleStructuralIds = new Set(eligibleStructural.map((change) => change.id));
|
|
169
|
+
const remainingStructural = currentStructural.filter((change) => !eligibleStructuralIds.has(change.id));
|
|
170
|
+
try {
|
|
171
|
+
const currentWorkspace = getWorkspaceChanges();
|
|
172
|
+
applyHostWorkspaceProjection(compileWorkspaceProjection({
|
|
173
|
+
revision: currentWorkspace.revision,
|
|
174
|
+
changes: remaining,
|
|
175
|
+
structuralChanges: remainingStructural,
|
|
176
|
+
}));
|
|
177
|
+
await afterBrowserPaint();
|
|
178
|
+
const verified = verifiedChangeKeys(eligible);
|
|
179
|
+
const verifiedStructural = verifiedStructuralChangeIds(eligibleStructural, document);
|
|
180
|
+
// A user can make another inspector edit while the two-frame verification
|
|
181
|
+
// window is open. Recheck byte identity immediately before reconciliation
|
|
182
|
+
// so a newer value at the same key can never be removed.
|
|
183
|
+
const currentByKey = new Map(getChangesList().map((change) => [changeKey(change), handoffChangeFingerprint(change)]));
|
|
184
|
+
const stillVerified = new Set([...verified].filter((key) => currentByKey.get(key) === sentByKey.get(key)));
|
|
185
|
+
const currentStructuralById = new Map(getStructuralChanges().map((change) => [change.id, handoffStructuralFingerprint(change)]));
|
|
186
|
+
const stillVerifiedStructural = new Set([...verifiedStructural].filter((id) => currentStructuralById.get(id) === sentStructural.get(id)));
|
|
187
|
+
return reconcileVerifiedWorkspaceChanges(stillVerified, stillVerifiedStructural);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
// Reconciliation reapplies the canonical set. If it was unable to write
|
|
191
|
+
// (for example, a read-only Canvas lease), restore the untouched set here.
|
|
192
|
+
const canonicalWorkspace = getWorkspaceChanges();
|
|
193
|
+
applyHostWorkspaceProjection(compileWorkspaceProjection(canonicalWorkspace));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Reconciles the captured records for one completed connected-agent request. */
|
|
197
|
+
export async function verifyAndReconcileAgentDispatch(revision) {
|
|
198
|
+
const snapshot = dispatches.get(revision);
|
|
199
|
+
if (!snapshot)
|
|
200
|
+
return 0;
|
|
201
|
+
dispatches.delete(revision);
|
|
202
|
+
return verifyAndReconcileHandoff(snapshot);
|
|
203
|
+
}
|
|
204
|
+
/** Test/session reset for in-memory dispatch snapshots. */
|
|
205
|
+
export function resetAgentVerification() {
|
|
206
|
+
dispatches.clear();
|
|
207
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ReactElement } from "react";
|
|
2
|
+
import { type CanvasCard } from "./canvasStore.js";
|
|
3
|
+
import type { InspectorSession } from "../session/sessionFactory.js";
|
|
4
|
+
interface CanvasCardProps {
|
|
5
|
+
card: CanvasCard;
|
|
6
|
+
onEdit?: (card: CanvasCard) => void;
|
|
7
|
+
documentOwner?: InspectorSession;
|
|
8
|
+
}
|
|
9
|
+
export declare function CanvasCard({ card, onEdit, documentOwner }: CanvasCardProps): ReactElement;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { CANVAS_RENDERER_ATTR } from "./roleDetection.js";
|
|
4
|
+
import { removeCanvasCard, duplicateCard, updateCardTitle, updateCardUrl, resizeCard, setCardPosition, selectCard, getSelectedCardId, useSelectedCardId, useFocusedCardId, useBoardCamera } from "./canvasStore.js";
|
|
5
|
+
import { IconRefresh, IconPlayerPlay, IconCopy, IconArrowsDiagonal } from "@tabler/icons-react";
|
|
6
|
+
import { PROTOCOL_VERSION, isRendererMessageFor, } from "./frameProtocol.js";
|
|
7
|
+
import { registerCardFrame, registerCardFrameSource, unregisterCardFrame, sendProjectionToCard, invalidateCanvasPreviewDocument, PROJECT_ID, WORKSPACE_ID } from "./projection.js";
|
|
8
|
+
import { IconButton } from "../ui/IconButton.js";
|
|
9
|
+
import { Button } from "../ui/Button.js";
|
|
10
|
+
import { setSelectedElement } from "../selection/selectionStore.js";
|
|
11
|
+
import { clearCanvasStructuralProjectionReports } from "../projection/structuralProjection.js";
|
|
12
|
+
import { clearCanvasRenderedInstanceProjectionReports } from "../projection/renderedInstance.js";
|
|
13
|
+
import { clearCanvasTextProjectionReports } from "../projection/textProjection.js";
|
|
14
|
+
import { getCanvasToolbarScale } from "./toolbarScale.js";
|
|
15
|
+
import { getCanvasResizeHandleScale } from "./resizeHandleScale.js";
|
|
16
|
+
import { disposeBrowserCssInspection } from "../inspection/browserCssInspectionRegistry.js";
|
|
17
|
+
import { releaseDocumentProjection } from "../projection/structuralProjection.js";
|
|
18
|
+
const MIN_CARD_WIDTH = 200;
|
|
19
|
+
const MIN_CARD_HEIGHT = 150;
|
|
20
|
+
export function CanvasCard({ card, onEdit, documentOwner }) {
|
|
21
|
+
const iframeRef = useRef(null);
|
|
22
|
+
const documentSessionRef = useRef(null);
|
|
23
|
+
const [loadState, setLoadState] = useState("loading");
|
|
24
|
+
const [errorMessage, setErrorMessage] = useState(null);
|
|
25
|
+
const camera = useBoardCamera();
|
|
26
|
+
const selectedCardId = useSelectedCardId();
|
|
27
|
+
const focusedCardId = useFocusedCardId();
|
|
28
|
+
const isSelected = selectedCardId === card.id;
|
|
29
|
+
const isFocused = focusedCardId === card.id;
|
|
30
|
+
const toolbarScale = getCanvasToolbarScale(camera.zoom);
|
|
31
|
+
const resizeHandleScale = getCanvasResizeHandleScale(camera.zoom);
|
|
32
|
+
const disposeDocumentSession = useCallback(() => {
|
|
33
|
+
documentSessionRef.current?.session.dispose();
|
|
34
|
+
documentSessionRef.current = null;
|
|
35
|
+
}, []);
|
|
36
|
+
const bindDocumentSession = useCallback(() => {
|
|
37
|
+
const frameDocument = iframeRef.current?.contentDocument;
|
|
38
|
+
if (!documentOwner || !frameDocument)
|
|
39
|
+
return;
|
|
40
|
+
if (documentSessionRef.current?.document === frameDocument)
|
|
41
|
+
return;
|
|
42
|
+
disposeDocumentSession();
|
|
43
|
+
const session = documentOwner.createDocumentSession(frameDocument);
|
|
44
|
+
session.registerCleanup(() => disposeBrowserCssInspection(frameDocument));
|
|
45
|
+
session.registerCleanup(() => releaseDocumentProjection(frameDocument));
|
|
46
|
+
documentSessionRef.current = { document: frameDocument, session };
|
|
47
|
+
}, [disposeDocumentSession, documentOwner]);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const iframe = iframeRef.current;
|
|
50
|
+
if (!iframe)
|
|
51
|
+
return;
|
|
52
|
+
registerCardFrameSource(card.id, iframe);
|
|
53
|
+
bindDocumentSession();
|
|
54
|
+
return () => {
|
|
55
|
+
disposeDocumentSession();
|
|
56
|
+
unregisterCardFrame(card.id);
|
|
57
|
+
};
|
|
58
|
+
}, [bindDocumentSession, card.id, disposeDocumentSession]);
|
|
59
|
+
function handleReload() {
|
|
60
|
+
if (iframeRef.current) {
|
|
61
|
+
if (getSelectedCardId() === card.id)
|
|
62
|
+
setSelectedElement(null);
|
|
63
|
+
disposeDocumentSession();
|
|
64
|
+
invalidateCanvasPreviewDocument(card.id);
|
|
65
|
+
setLoadState("loading");
|
|
66
|
+
setErrorMessage(null);
|
|
67
|
+
const currentSrc = iframeRef.current.src;
|
|
68
|
+
iframeRef.current.setAttribute("src", currentSrc);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function handleRemove() {
|
|
72
|
+
if (getSelectedCardId() === card.id)
|
|
73
|
+
setSelectedElement(null);
|
|
74
|
+
removeCanvasCard(card.id);
|
|
75
|
+
}
|
|
76
|
+
function handleEdit() {
|
|
77
|
+
onEdit?.(card);
|
|
78
|
+
}
|
|
79
|
+
function handleDuplicate() {
|
|
80
|
+
duplicateCard(card.id);
|
|
81
|
+
}
|
|
82
|
+
/** The controller half of the handshake: announce workspace identity. */
|
|
83
|
+
function sendParentReady() {
|
|
84
|
+
iframeRef.current?.contentWindow?.postMessage({
|
|
85
|
+
type: "parent-ready",
|
|
86
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
87
|
+
projectId: PROJECT_ID,
|
|
88
|
+
workspaceId: WORKSPACE_ID,
|
|
89
|
+
cardId: card.id,
|
|
90
|
+
}, window.location.origin);
|
|
91
|
+
}
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
function onMessage(event) {
|
|
94
|
+
if (event.origin !== window.location.origin)
|
|
95
|
+
return;
|
|
96
|
+
if (event.source !== iframeRef.current?.contentWindow)
|
|
97
|
+
return;
|
|
98
|
+
const msg = event.data;
|
|
99
|
+
if (!msg || typeof msg !== "object")
|
|
100
|
+
return;
|
|
101
|
+
// A renderer whose runtime finished booting after the iframe load event
|
|
102
|
+
// asks for the identity announcement it may have missed.
|
|
103
|
+
// SAFETY: Renderer messages arrive as unvalidated structured clones, so the discriminant must be read structurally.
|
|
104
|
+
if (msg.type === "renderer-hello") {
|
|
105
|
+
// SAFETY: The `type === "renderer-hello"` branch above selects exactly the hello payload shape.
|
|
106
|
+
const hello = msg;
|
|
107
|
+
if (hello.protocolVersion !== PROTOCOL_VERSION)
|
|
108
|
+
return;
|
|
109
|
+
sendParentReady();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!isRendererMessageFor(msg, {
|
|
113
|
+
projectId: PROJECT_ID,
|
|
114
|
+
workspaceId: WORKSPACE_ID,
|
|
115
|
+
cardId: card.id,
|
|
116
|
+
}))
|
|
117
|
+
return;
|
|
118
|
+
// SAFETY: isRendererMessageFor validated the frame identity and message shape above.
|
|
119
|
+
const data = msg;
|
|
120
|
+
if (data.type === "frame-ready") {
|
|
121
|
+
setLoadState("ready");
|
|
122
|
+
setErrorMessage(null);
|
|
123
|
+
if (data.title)
|
|
124
|
+
updateCardTitle(card.id, data.title);
|
|
125
|
+
if (data.url)
|
|
126
|
+
updateCardUrl(card.id, data.url);
|
|
127
|
+
if (iframeRef.current) {
|
|
128
|
+
registerCardFrame(card.id, iframeRef.current);
|
|
129
|
+
sendProjectionToCard(card, iframeRef.current);
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (data.type === "frame-metadata") {
|
|
134
|
+
if (data.title)
|
|
135
|
+
updateCardTitle(card.id, data.title);
|
|
136
|
+
if (data.url)
|
|
137
|
+
updateCardUrl(card.id, data.url);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (data.type === "frame-error") {
|
|
141
|
+
setLoadState("error");
|
|
142
|
+
setErrorMessage(data.message || "Frame failed to load");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
window.addEventListener("message", onMessage);
|
|
147
|
+
return () => {
|
|
148
|
+
window.removeEventListener("message", onMessage);
|
|
149
|
+
};
|
|
150
|
+
}, [card.id]);
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
if (loadState !== "loading")
|
|
153
|
+
return;
|
|
154
|
+
const timeout = setTimeout(() => {
|
|
155
|
+
setLoadState("error");
|
|
156
|
+
setErrorMessage("Frame load timed out");
|
|
157
|
+
}, 15000);
|
|
158
|
+
return () => clearTimeout(timeout);
|
|
159
|
+
}, [loadState]);
|
|
160
|
+
// A late handshake still recovers: the message listener stays installed in
|
|
161
|
+
// the error state, so a slow renderer's eventual frame-ready flips the card
|
|
162
|
+
// back to "ready" without user action.
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
const iframe = iframeRef.current;
|
|
165
|
+
if (!iframe)
|
|
166
|
+
return;
|
|
167
|
+
function onLoad() {
|
|
168
|
+
if (getSelectedCardId() === card.id)
|
|
169
|
+
setSelectedElement(null);
|
|
170
|
+
disposeDocumentSession();
|
|
171
|
+
// A reload creates a new renderer document; do not show diagnostics
|
|
172
|
+
// produced by the old frame while its replacement is handshaking.
|
|
173
|
+
invalidateCanvasPreviewDocument(card.id);
|
|
174
|
+
clearCanvasStructuralProjectionReports(card.id);
|
|
175
|
+
clearCanvasRenderedInstanceProjectionReports(card.id);
|
|
176
|
+
clearCanvasTextProjectionReports(card.id);
|
|
177
|
+
bindDocumentSession();
|
|
178
|
+
sendParentReady();
|
|
179
|
+
}
|
|
180
|
+
iframe.addEventListener("load", onLoad);
|
|
181
|
+
return () => iframe.removeEventListener("load", onLoad);
|
|
182
|
+
}, [bindDocumentSession, card.id, disposeDocumentSession]);
|
|
183
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
184
|
+
const dragRef = useRef({ startX: 0, startY: 0, cardX: 0, cardY: 0 });
|
|
185
|
+
const handleToolbarPointerDown = useCallback((e) => {
|
|
186
|
+
// SAFETY: pointer events on the card target are HTMLElements in this DOM context.
|
|
187
|
+
const target = e.target;
|
|
188
|
+
if (target.closest("button"))
|
|
189
|
+
return;
|
|
190
|
+
if (getSelectedCardId() !== card.id)
|
|
191
|
+
setSelectedElement(null);
|
|
192
|
+
selectCard(card.id);
|
|
193
|
+
e.stopPropagation();
|
|
194
|
+
e.preventDefault();
|
|
195
|
+
dragRef.current = {
|
|
196
|
+
startX: e.clientX,
|
|
197
|
+
startY: e.clientY,
|
|
198
|
+
cardX: card.x,
|
|
199
|
+
cardY: card.y,
|
|
200
|
+
};
|
|
201
|
+
setIsDragging(true);
|
|
202
|
+
// SAFETY: pointerdown targets are HTMLElements in the card DOM.
|
|
203
|
+
e.target.setPointerCapture(e.pointerId);
|
|
204
|
+
function onMove(ev) {
|
|
205
|
+
const dx = (ev.clientX - dragRef.current.startX) / camera.zoom;
|
|
206
|
+
const dy = (ev.clientY - dragRef.current.startY) / camera.zoom;
|
|
207
|
+
setCardPosition(card.id, dragRef.current.cardX + dx, dragRef.current.cardY + dy);
|
|
208
|
+
}
|
|
209
|
+
function onUp() {
|
|
210
|
+
setIsDragging(false);
|
|
211
|
+
window.removeEventListener("pointermove", onMove);
|
|
212
|
+
window.removeEventListener("pointerup", onUp);
|
|
213
|
+
}
|
|
214
|
+
window.addEventListener("pointermove", onMove);
|
|
215
|
+
window.addEventListener("pointerup", onUp);
|
|
216
|
+
}, [card.id, card.x, card.y, camera.zoom]);
|
|
217
|
+
const handleCardPointerDown = useCallback(() => {
|
|
218
|
+
if (getSelectedCardId() !== card.id)
|
|
219
|
+
setSelectedElement(null);
|
|
220
|
+
selectCard(card.id);
|
|
221
|
+
}, [card.id]);
|
|
222
|
+
const handleResizeStart = useCallback((e) => {
|
|
223
|
+
e.stopPropagation();
|
|
224
|
+
e.preventDefault();
|
|
225
|
+
const startX = e.clientX;
|
|
226
|
+
const startY = e.clientY;
|
|
227
|
+
const startWidth = card.width;
|
|
228
|
+
const startHeight = card.height;
|
|
229
|
+
// SAFETY: pointerdown targets are HTMLElements in the card DOM.
|
|
230
|
+
e.target.setPointerCapture(e.pointerId);
|
|
231
|
+
function onMove(ev) {
|
|
232
|
+
const dx = (ev.clientX - startX) / camera.zoom;
|
|
233
|
+
const dy = (ev.clientY - startY) / camera.zoom;
|
|
234
|
+
const newWidth = Math.max(MIN_CARD_WIDTH, startWidth + dx);
|
|
235
|
+
const newHeight = Math.max(MIN_CARD_HEIGHT, startHeight + dy);
|
|
236
|
+
resizeCard(card.id, newWidth, newHeight);
|
|
237
|
+
}
|
|
238
|
+
function onUp() {
|
|
239
|
+
window.removeEventListener("pointermove", onMove);
|
|
240
|
+
window.removeEventListener("pointerup", onUp);
|
|
241
|
+
}
|
|
242
|
+
window.addEventListener("pointermove", onMove);
|
|
243
|
+
window.addEventListener("pointerup", onUp);
|
|
244
|
+
}, [card.id, card.width, card.height, camera.zoom]);
|
|
245
|
+
function handleResizeKeyDown(event) {
|
|
246
|
+
const step = event.shiftKey ? 40 : 20;
|
|
247
|
+
if (event.key === "ArrowRight")
|
|
248
|
+
resizeCard(card.id, card.width + step, card.height);
|
|
249
|
+
else if (event.key === "ArrowLeft")
|
|
250
|
+
resizeCard(card.id, Math.max(MIN_CARD_WIDTH, card.width - step), card.height);
|
|
251
|
+
else if (event.key === "ArrowDown")
|
|
252
|
+
resizeCard(card.id, card.width, card.height + step);
|
|
253
|
+
else if (event.key === "ArrowUp")
|
|
254
|
+
resizeCard(card.id, card.width, Math.max(MIN_CARD_HEIGHT, card.height - step));
|
|
255
|
+
else
|
|
256
|
+
return;
|
|
257
|
+
event.preventDefault();
|
|
258
|
+
}
|
|
259
|
+
return (_jsxs("div", { className: `canvas-card${isDragging ? " is-dragging" : ""}${isSelected ? " is-selected" : ""}${isFocused ? " is-focused" : ""}`, "data-card-id": card.id, style: {
|
|
260
|
+
position: "absolute",
|
|
261
|
+
left: card.x,
|
|
262
|
+
top: card.y,
|
|
263
|
+
width: card.width,
|
|
264
|
+
height: card.height,
|
|
265
|
+
}, onPointerDown: handleCardPointerDown, children: [_jsxs("div", { className: "canvas-card__toolbar", onPointerDown: handleToolbarPointerDown, children: [_jsx("div", { className: "canvas-card__drag-surface", "data-test": `canvas-card-drag-${card.id}`, children: _jsxs("span", { className: "canvas-card__dimensions", "data-test": `canvas-card-dimensions-${card.id}`, style: {
|
|
266
|
+
transform: `scale(${toolbarScale})`,
|
|
267
|
+
transformOrigin: "left bottom",
|
|
268
|
+
}, children: [Math.round(card.width), " \u00D7 ", Math.round(card.height), " px"] }) }), _jsxs("div", { className: "canvas-card__actions", style: {
|
|
269
|
+
transform: `scale(${toolbarScale})`,
|
|
270
|
+
transformOrigin: "right bottom",
|
|
271
|
+
}, children: [_jsxs(Button, { variant: "secondary", size: "default", "data-test": `canvas-card-preview-${card.id}`, onClick: handleEdit, children: [_jsx(IconPlayerPlay, { size: 14, stroke: 1.8, "aria-hidden": "true" }), "Page view"] }), _jsx(IconButton, { label: "Duplicate card", variant: "secondary", size: "default", "data-test": `canvas-card-duplicate-${card.id}`, onClick: handleDuplicate, children: _jsx(IconCopy, { size: 14, stroke: 1.8, "aria-hidden": "true" }) }), _jsx(IconButton, { label: "Reload card", variant: "secondary", size: "default", "data-test": `canvas-card-reload-${card.id}`, onClick: handleReload, children: _jsx(IconRefresh, { size: 14, stroke: 1.8, "aria-hidden": "true" }) })] })] }), _jsxs("div", { className: "canvas-card__frame", children: [loadState === "loading" ? (_jsx("div", { className: "canvas-card__loading", "data-test": `canvas-card-loading-${card.id}`, children: "Loading preview..." })) : loadState === "error" ? (_jsxs("div", { className: "canvas-card__error", "data-test": `canvas-card-error-${card.id}`, children: [_jsx("p", { children: errorMessage || "Frame could not be loaded" }), _jsxs("div", { className: "canvas-card__error-actions", children: [_jsx(Button, { size: "compact", variant: "secondary", onClick: handleReload, children: "Retry" }), _jsx(Button, { size: "compact", variant: "danger", onClick: handleRemove, children: "Remove" })] })] })) : null, _jsx("iframe", { ref: iframeRef, className: "canvas-card__iframe", src: card.url, title: card.title || card.url, [CANVAS_RENDERER_ATTR]: "", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", "data-test": `canvas-card-iframe-${card.id}` })] }), _jsx("div", { className: "canvas-card__resize-handle", "data-test": `canvas-card-resize-${card.id}`, style: {
|
|
272
|
+
transform: `scale(${resizeHandleScale})`,
|
|
273
|
+
transformOrigin: "right bottom",
|
|
274
|
+
}, onPointerDown: handleResizeStart, onKeyDown: handleResizeKeyDown, role: "button", "aria-label": "Resize card", tabIndex: 0, children: _jsx(IconArrowsDiagonal, { size: 12, "aria-hidden": "true" }) })] }));
|
|
275
|
+
}
|