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,20 @@
|
|
|
1
|
+
import { MAX_CAMERA_ZOOM } from "./canvasStore.js";
|
|
2
|
+
import { CANVAS_TOOLBAR_MAX_SCALE } from "./toolbarScale.js";
|
|
3
|
+
/**
|
|
4
|
+
* Keep the resize handle usable while the board is zoomed without allowing
|
|
5
|
+
* inverse scaling to make it disproportionately large or small.
|
|
6
|
+
*/
|
|
7
|
+
export const CANVAS_RESIZE_HANDLE_MIN_SCALE = 1 / MAX_CAMERA_ZOOM;
|
|
8
|
+
export const CANVAS_RESIZE_HANDLE_MAX_SCALE = CANVAS_TOOLBAR_MAX_SCALE;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the scale to apply inside the board's zoomed coordinate space.
|
|
11
|
+
*
|
|
12
|
+
* The lower bound matches the inverse of the largest supported camera zoom,
|
|
13
|
+
* and the upper bound follows the toolbar compensation policy.
|
|
14
|
+
*/
|
|
15
|
+
export function getCanvasResizeHandleScale(zoom) {
|
|
16
|
+
if (!Number.isFinite(zoom) || zoom <= 0) {
|
|
17
|
+
return CANVAS_RESIZE_HANDLE_MAX_SCALE;
|
|
18
|
+
}
|
|
19
|
+
return Math.max(CANVAS_RESIZE_HANDLE_MIN_SCALE, Math.min(1 / zoom, CANVAS_RESIZE_HANDLE_MAX_SCALE));
|
|
20
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const CANVAS_RENDERER_ATTR = "data-nudge-ui-canvas-renderer";
|
|
2
|
+
export type NudgeUiRole = "controller" | "renderer";
|
|
3
|
+
export declare function detectRole(): NudgeUiRole;
|
|
4
|
+
export declare function isCanvasRenderer(): boolean;
|
|
5
|
+
export declare function isTopLevelController(): boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const CANVAS_RENDERER_ATTR = "data-nudge-ui-canvas-renderer";
|
|
2
|
+
export function detectRole() {
|
|
3
|
+
try {
|
|
4
|
+
const frameEl = window.frameElement;
|
|
5
|
+
if (!frameEl)
|
|
6
|
+
return "controller";
|
|
7
|
+
if (frameEl.hasAttribute?.(CANVAS_RENDERER_ATTR)) {
|
|
8
|
+
return "renderer";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// frameElement access may throw if cross-origin
|
|
13
|
+
}
|
|
14
|
+
return "controller";
|
|
15
|
+
}
|
|
16
|
+
export function isCanvasRenderer() {
|
|
17
|
+
return detectRole() === "renderer";
|
|
18
|
+
}
|
|
19
|
+
export function isTopLevelController() {
|
|
20
|
+
return detectRole() === "controller";
|
|
21
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type SerializableChange } from "../changes/codecs.js";
|
|
2
|
+
import { type CanvasMode } from "./canvasStore.js";
|
|
3
|
+
import { type StructuralChange } from "../projection/structuralProjection.js";
|
|
4
|
+
import { type ClipboardHandoffSnapshot } from "../prompt/clipboardHandoff.js";
|
|
5
|
+
declare const SCHEMA_VERSION = 12;
|
|
6
|
+
declare function storageKey(projectId: string): string;
|
|
7
|
+
export interface SerializableCard {
|
|
8
|
+
id: string;
|
|
9
|
+
url: string;
|
|
10
|
+
title: string | null;
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
comparisonGroupId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SerializableComparisonGroup {
|
|
18
|
+
id: string;
|
|
19
|
+
label: string;
|
|
20
|
+
owner: "agent";
|
|
21
|
+
agentId: string;
|
|
22
|
+
cardIds: string[];
|
|
23
|
+
routes: Array<{
|
|
24
|
+
url: string;
|
|
25
|
+
title?: string | null;
|
|
26
|
+
label?: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
export interface DurableSession {
|
|
30
|
+
schemaVersion: typeof SCHEMA_VERSION;
|
|
31
|
+
projectId: string;
|
|
32
|
+
mode: CanvasMode;
|
|
33
|
+
inspectUrl: string;
|
|
34
|
+
cards: SerializableCard[];
|
|
35
|
+
comparisonGroups: SerializableComparisonGroup[];
|
|
36
|
+
camera: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
zoom: number;
|
|
40
|
+
};
|
|
41
|
+
changes: SerializableChange[];
|
|
42
|
+
structuralChanges: StructuralChange[];
|
|
43
|
+
clipboardHandoff: ClipboardHandoffSnapshot | null;
|
|
44
|
+
}
|
|
45
|
+
export type { SerializableChange, SerializableComponentChange, SerializableElementChange, SerializableTextContentChange, SerializableTokenChange, SerializableTokenRef, } from "../changes/codecs.js";
|
|
46
|
+
export interface HydrationResult {
|
|
47
|
+
restored: boolean;
|
|
48
|
+
changeCount: number;
|
|
49
|
+
}
|
|
50
|
+
export declare function serializeSession(): DurableSession;
|
|
51
|
+
export declare function persistSession(): boolean;
|
|
52
|
+
export declare function hydrateSession(): HydrationResult;
|
|
53
|
+
export declare function clearSession(): void;
|
|
54
|
+
export declare function enableAutoSave(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Coalesces the synchronous full-session `JSON.stringify` + `localStorage`
|
|
57
|
+
* write behind a trailing timer so commits never block on persistence. A
|
|
58
|
+
* refresh or close inside the debounce window still flushes on `beforeunload`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function scheduleAutoSave(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Canvas mode/card/camera changes persist immediately (synchronous) so a
|
|
63
|
+
* refresh always restores the workspace, even inside the edit-autosave
|
|
64
|
+
* debounce window. Edit autosave stays coalesced behind the trailing timer.
|
|
65
|
+
*/
|
|
66
|
+
export declare function scheduleCanvasSave(): void;
|
|
67
|
+
export declare function getRestoreCount(): number;
|
|
68
|
+
export declare function setRestoreCount(count: number): void;
|
|
69
|
+
export declare function clearRestoreCount(): void;
|
|
70
|
+
export declare function resetAutoSave(): void;
|
|
71
|
+
export { storageKey, SCHEMA_VERSION, type SerializableCard as HydratedCard };
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { getWorkspaceChanges } from "../changes/workspaceChanges.js";
|
|
2
|
+
import { loadWorkspaceChanges } from "../changes/changesLog.js";
|
|
3
|
+
import { deserializeChange, isSerializableChange, serializeChange, } from "../changes/codecs.js";
|
|
4
|
+
import { getCanvasMode, getCanvasCards, getCanvasComparisonGroups, getBoardCamera, setBoardCamera, hydrateCanvasStore, removeCanvasCard, } from "./canvasStore.js";
|
|
5
|
+
import { applyRules } from "../projection/managedStylesheet.js";
|
|
6
|
+
import { clearWorkspace as clearWorkspaceLog } from "../changes/changesLog.js";
|
|
7
|
+
import { removeManagedSheet } from "../projection/managedStylesheet.js";
|
|
8
|
+
import { clearInspectorLayout } from "../shell/panelLayout.js";
|
|
9
|
+
import { setSelectedElement } from "../selection/selectionStore.js";
|
|
10
|
+
import { canWriteWorkspace } from "./workspaceLease.js";
|
|
11
|
+
import { isStructuralChange, resetStructuralDeleteProjection, } from "../projection/structuralProjection.js";
|
|
12
|
+
import { projectToAllReadyCards } from "./projection.js";
|
|
13
|
+
import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
|
|
14
|
+
import { clearClipboardHandoff, getClipboardHandoffSnapshot, hydrateClipboardHandoff, isClipboardHandoffSnapshot, } from "../prompt/clipboardHandoff.js";
|
|
15
|
+
// v12 is the first durable-session schema after the edit model and preview
|
|
16
|
+
// diagnostic split. Previous session shapes are intentionally incompatible.
|
|
17
|
+
const SCHEMA_VERSION = 12;
|
|
18
|
+
const STORAGE_PREFIX = "nudge-ui";
|
|
19
|
+
function projectId() {
|
|
20
|
+
return getNudgeUiRuntimeConfig().projectId;
|
|
21
|
+
}
|
|
22
|
+
function isFiniteNumber(value) {
|
|
23
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
24
|
+
}
|
|
25
|
+
function isRecord(value) {
|
|
26
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
function isSameOriginUrl(value) {
|
|
29
|
+
if (typeof value !== "string")
|
|
30
|
+
return false;
|
|
31
|
+
try {
|
|
32
|
+
return new URL(value).origin === window.location.origin;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function hasOnlyKeys(value, allowed) {
|
|
39
|
+
return Object.keys(value).every((key) => allowed.includes(key));
|
|
40
|
+
}
|
|
41
|
+
function isSerializableComparisonGroup(value) {
|
|
42
|
+
if (!isRecord(value)
|
|
43
|
+
|| !hasOnlyKeys(value, ["id", "label", "owner", "agentId", "cardIds", "routes"])
|
|
44
|
+
|| typeof value.id !== "string"
|
|
45
|
+
|| value.id.length === 0
|
|
46
|
+
|| value.id.length > 256
|
|
47
|
+
|| typeof value.label !== "string"
|
|
48
|
+
|| value.label.length === 0
|
|
49
|
+
|| value.label.length > 160
|
|
50
|
+
|| value.owner !== "agent"
|
|
51
|
+
|| typeof value.agentId !== "string"
|
|
52
|
+
|| value.agentId.length === 0
|
|
53
|
+
|| value.agentId.length > 256
|
|
54
|
+
|| !Array.isArray(value.cardIds)
|
|
55
|
+
|| value.cardIds.length === 0
|
|
56
|
+
|| value.cardIds.length > 64
|
|
57
|
+
|| !Array.isArray(value.routes)
|
|
58
|
+
|| value.routes.length === 0
|
|
59
|
+
|| value.routes.length > 64) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (!value.cardIds.every((cardId) => typeof cardId === "string" && cardId.length > 0 && cardId.length <= 256)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return value.routes.every((route) => {
|
|
66
|
+
if (!isRecord(route)
|
|
67
|
+
|| !hasOnlyKeys(route, ["url", "title", "label"])
|
|
68
|
+
|| !isSameOriginUrl(route.url)
|
|
69
|
+
|| (route.title !== undefined && route.title !== null
|
|
70
|
+
&& (typeof route.title !== "string" || route.title.length > 512))
|
|
71
|
+
|| (route.label !== undefined
|
|
72
|
+
&& (typeof route.label !== "string" || route.label.length > 160))) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function storageKey(projectId) {
|
|
79
|
+
return `${STORAGE_PREFIX}:${projectId}:v${SCHEMA_VERSION}`;
|
|
80
|
+
}
|
|
81
|
+
function buildSession() {
|
|
82
|
+
const workspace = getWorkspaceChanges();
|
|
83
|
+
const changes = workspace.changes;
|
|
84
|
+
const serializableChanges = [];
|
|
85
|
+
for (const change of changes) {
|
|
86
|
+
const serialized = serializeChange(change);
|
|
87
|
+
// serializeChange already fails closed, but re-validate here so a future
|
|
88
|
+
// serializer skew can never poison the whole durable session.
|
|
89
|
+
if (serialized && isSerializableChange(serialized))
|
|
90
|
+
serializableChanges.push(serialized);
|
|
91
|
+
}
|
|
92
|
+
const cards = getCanvasCards();
|
|
93
|
+
const comparisonGroups = getCanvasComparisonGroups();
|
|
94
|
+
const camera = getBoardCamera();
|
|
95
|
+
const mode = getCanvasMode();
|
|
96
|
+
return {
|
|
97
|
+
schemaVersion: SCHEMA_VERSION,
|
|
98
|
+
projectId: projectId(),
|
|
99
|
+
mode,
|
|
100
|
+
inspectUrl: window.location.href,
|
|
101
|
+
cards: cards.map((c) => ({
|
|
102
|
+
id: c.id,
|
|
103
|
+
url: c.url,
|
|
104
|
+
title: c.title,
|
|
105
|
+
x: c.x,
|
|
106
|
+
y: c.y,
|
|
107
|
+
width: c.width,
|
|
108
|
+
height: c.height,
|
|
109
|
+
...(c.comparisonGroupId ? { comparisonGroupId: c.comparisonGroupId } : {}),
|
|
110
|
+
})),
|
|
111
|
+
comparisonGroups: comparisonGroups.map((group) => ({
|
|
112
|
+
id: group.id,
|
|
113
|
+
label: group.label,
|
|
114
|
+
owner: "agent",
|
|
115
|
+
agentId: group.agentId,
|
|
116
|
+
cardIds: [...group.cardIds],
|
|
117
|
+
routes: group.routes.map((route) => ({
|
|
118
|
+
url: route.url,
|
|
119
|
+
...(route.title === undefined ? {} : { title: route.title }),
|
|
120
|
+
...(route.label === undefined ? {} : { label: route.label }),
|
|
121
|
+
})),
|
|
122
|
+
})),
|
|
123
|
+
camera: { x: camera.x, y: camera.y, zoom: camera.zoom },
|
|
124
|
+
changes: serializableChanges,
|
|
125
|
+
structuralChanges: workspace.structuralChanges.map((change) => ({ ...change })),
|
|
126
|
+
clipboardHandoff: getClipboardHandoffSnapshot(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function serializeSession() {
|
|
130
|
+
return buildSession();
|
|
131
|
+
}
|
|
132
|
+
export function persistSession() {
|
|
133
|
+
if (!canWriteWorkspace())
|
|
134
|
+
return false;
|
|
135
|
+
return persistSessionUnchecked();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Serializes and writes the session without the write-lease gate. The public
|
|
139
|
+
* persistence path checks the lease before calling this helper.
|
|
140
|
+
*/
|
|
141
|
+
function persistSessionUnchecked() {
|
|
142
|
+
if (!projectId())
|
|
143
|
+
return false;
|
|
144
|
+
try {
|
|
145
|
+
const session = buildSession();
|
|
146
|
+
localStorage.setItem(storageKey(projectId()), JSON.stringify(session));
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Storage unavailable or quota exceeded — silently ignore
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function hydrateSession() {
|
|
155
|
+
if (!projectId())
|
|
156
|
+
return { restored: false, changeCount: 0 };
|
|
157
|
+
let raw = null;
|
|
158
|
+
try {
|
|
159
|
+
raw = localStorage.getItem(storageKey(projectId()));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return { restored: false, changeCount: 0 };
|
|
163
|
+
}
|
|
164
|
+
if (!raw)
|
|
165
|
+
return { restored: false, changeCount: 0 };
|
|
166
|
+
let session;
|
|
167
|
+
try {
|
|
168
|
+
session = JSON.parse(raw);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
safeDiscard();
|
|
172
|
+
return { restored: false, changeCount: 0 };
|
|
173
|
+
}
|
|
174
|
+
if (!session || typeof session !== "object") {
|
|
175
|
+
safeDiscard();
|
|
176
|
+
return { restored: false, changeCount: 0 };
|
|
177
|
+
}
|
|
178
|
+
const s = session;
|
|
179
|
+
if (typeof s.schemaVersion !== "number" || s.schemaVersion !== SCHEMA_VERSION) {
|
|
180
|
+
safeDiscard();
|
|
181
|
+
return { restored: false, changeCount: 0 };
|
|
182
|
+
}
|
|
183
|
+
if (typeof s.projectId !== "string" || s.projectId !== projectId()) {
|
|
184
|
+
safeDiscard();
|
|
185
|
+
return { restored: false, changeCount: 0 };
|
|
186
|
+
}
|
|
187
|
+
if (typeof s.mode !== "string" || (s.mode !== "inspect" && s.mode !== "canvas")) {
|
|
188
|
+
safeDiscard();
|
|
189
|
+
return { restored: false, changeCount: 0 };
|
|
190
|
+
}
|
|
191
|
+
if (!isSameOriginUrl(s.inspectUrl)) {
|
|
192
|
+
safeDiscard();
|
|
193
|
+
return { restored: false, changeCount: 0 };
|
|
194
|
+
}
|
|
195
|
+
const inspectRouteChanged = s.mode === "inspect" && s.inspectUrl !== window.location.href;
|
|
196
|
+
const cards = Array.isArray(s.cards) ? s.cards : null;
|
|
197
|
+
if (!cards) {
|
|
198
|
+
safeDiscard();
|
|
199
|
+
return { restored: false, changeCount: 0 };
|
|
200
|
+
}
|
|
201
|
+
const serializableCards = [];
|
|
202
|
+
for (const card of cards) {
|
|
203
|
+
const candidate = card;
|
|
204
|
+
if (!card || typeof card !== "object" ||
|
|
205
|
+
typeof candidate.id !== "string" ||
|
|
206
|
+
!isSameOriginUrl(candidate.url) ||
|
|
207
|
+
!isFiniteNumber(candidate.x) ||
|
|
208
|
+
!isFiniteNumber(candidate.y) ||
|
|
209
|
+
!isFiniteNumber(candidate.width) ||
|
|
210
|
+
!isFiniteNumber(candidate.height) ||
|
|
211
|
+
candidate.width <= 0 ||
|
|
212
|
+
candidate.height <= 0) {
|
|
213
|
+
safeDiscard();
|
|
214
|
+
return { restored: false, changeCount: 0 };
|
|
215
|
+
}
|
|
216
|
+
const c = card;
|
|
217
|
+
serializableCards.push({
|
|
218
|
+
id: c.id,
|
|
219
|
+
url: c.url,
|
|
220
|
+
title: typeof c.title === "string" ? c.title : null,
|
|
221
|
+
x: c.x,
|
|
222
|
+
y: c.y,
|
|
223
|
+
width: c.width,
|
|
224
|
+
height: c.height,
|
|
225
|
+
...(typeof c.comparisonGroupId === "string"
|
|
226
|
+
? { comparisonGroupId: c.comparisonGroupId }
|
|
227
|
+
: {}),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (new Set(serializableCards.map((card) => card.id)).size !== serializableCards.length) {
|
|
231
|
+
safeDiscard();
|
|
232
|
+
return { restored: false, changeCount: 0 };
|
|
233
|
+
}
|
|
234
|
+
const comparisonGroupsRaw = s.comparisonGroups;
|
|
235
|
+
if (!Array.isArray(comparisonGroupsRaw) || comparisonGroupsRaw.length > 128) {
|
|
236
|
+
safeDiscard();
|
|
237
|
+
return { restored: false, changeCount: 0 };
|
|
238
|
+
}
|
|
239
|
+
const serializableComparisonGroups = [];
|
|
240
|
+
for (const group of comparisonGroupsRaw) {
|
|
241
|
+
if (!isSerializableComparisonGroup(group)) {
|
|
242
|
+
safeDiscard();
|
|
243
|
+
return { restored: false, changeCount: 0 };
|
|
244
|
+
}
|
|
245
|
+
serializableComparisonGroups.push({
|
|
246
|
+
id: group.id,
|
|
247
|
+
label: group.label,
|
|
248
|
+
owner: "agent",
|
|
249
|
+
agentId: group.agentId,
|
|
250
|
+
cardIds: [...group.cardIds],
|
|
251
|
+
routes: group.routes.map((route) => ({ ...route })),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
if (new Set(serializableComparisonGroups.map((group) => group.id)).size
|
|
255
|
+
!== serializableComparisonGroups.length) {
|
|
256
|
+
safeDiscard();
|
|
257
|
+
return { restored: false, changeCount: 0 };
|
|
258
|
+
}
|
|
259
|
+
const cardsById = new Map(serializableCards.map((card) => [card.id, card]));
|
|
260
|
+
const groupedCardIds = new Set();
|
|
261
|
+
for (const group of serializableComparisonGroups) {
|
|
262
|
+
if (group.cardIds.length !== group.routes.length) {
|
|
263
|
+
safeDiscard();
|
|
264
|
+
return { restored: false, changeCount: 0 };
|
|
265
|
+
}
|
|
266
|
+
for (const [routeIndex, cardId] of group.cardIds.entries()) {
|
|
267
|
+
const card = cardsById.get(cardId);
|
|
268
|
+
const route = group.routes[routeIndex];
|
|
269
|
+
if (!card || !route || card.comparisonGroupId !== group.id || groupedCardIds.has(cardId)
|
|
270
|
+
|| card.url !== route.url) {
|
|
271
|
+
safeDiscard();
|
|
272
|
+
return { restored: false, changeCount: 0 };
|
|
273
|
+
}
|
|
274
|
+
groupedCardIds.add(cardId);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
for (const card of serializableCards) {
|
|
278
|
+
if (card.comparisonGroupId && !serializableComparisonGroups.some((group) => group.id === card.comparisonGroupId)) {
|
|
279
|
+
safeDiscard();
|
|
280
|
+
return { restored: false, changeCount: 0 };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const cameraRaw = s.camera;
|
|
284
|
+
if (!cameraRaw || typeof cameraRaw !== "object" ||
|
|
285
|
+
!isFiniteNumber(cameraRaw.x) ||
|
|
286
|
+
!isFiniteNumber(cameraRaw.y) ||
|
|
287
|
+
!isFiniteNumber(cameraRaw.zoom)) {
|
|
288
|
+
safeDiscard();
|
|
289
|
+
return { restored: false, changeCount: 0 };
|
|
290
|
+
}
|
|
291
|
+
const changesRaw = s.changes;
|
|
292
|
+
if (!Array.isArray(changesRaw)) {
|
|
293
|
+
safeDiscard();
|
|
294
|
+
return { restored: false, changeCount: 0 };
|
|
295
|
+
}
|
|
296
|
+
const deserializedChanges = [];
|
|
297
|
+
const textChangeIds = new Set();
|
|
298
|
+
for (const c of changesRaw) {
|
|
299
|
+
if (!isSerializableChange(c)) {
|
|
300
|
+
safeDiscard();
|
|
301
|
+
return { restored: false, changeCount: 0 };
|
|
302
|
+
}
|
|
303
|
+
if (c.kind === "text-content") {
|
|
304
|
+
if (textChangeIds.has(c.id)) {
|
|
305
|
+
safeDiscard();
|
|
306
|
+
return { restored: false, changeCount: 0 };
|
|
307
|
+
}
|
|
308
|
+
textChangeIds.add(c.id);
|
|
309
|
+
}
|
|
310
|
+
try {
|
|
311
|
+
deserializedChanges.push(deserializeChange(c));
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
safeDiscard();
|
|
315
|
+
return { restored: false, changeCount: 0 };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const structuralChanges = s.structuralChanges;
|
|
319
|
+
if (!Array.isArray(structuralChanges) || !structuralChanges.every(isStructuralChange)) {
|
|
320
|
+
safeDiscard();
|
|
321
|
+
return { restored: false, changeCount: 0 };
|
|
322
|
+
}
|
|
323
|
+
const clipboardHandoff = s.clipboardHandoff;
|
|
324
|
+
if (!isClipboardHandoffSnapshot(clipboardHandoff)) {
|
|
325
|
+
safeDiscard();
|
|
326
|
+
return { restored: false, changeCount: 0 };
|
|
327
|
+
}
|
|
328
|
+
const camera = {
|
|
329
|
+
x: cameraRaw.x,
|
|
330
|
+
y: cameraRaw.y,
|
|
331
|
+
zoom: cameraRaw.zoom,
|
|
332
|
+
};
|
|
333
|
+
hydrateCanvasStore(s.mode, serializableCards, camera, serializableComparisonGroups);
|
|
334
|
+
// Structural intent and instance evidence become visible atomically. The
|
|
335
|
+
// projection layer preserves structural-first document application order.
|
|
336
|
+
loadWorkspaceChanges(deserializedChanges, structuralChanges);
|
|
337
|
+
hydrateClipboardHandoff(clipboardHandoff);
|
|
338
|
+
// A different URL means the user intentionally navigated while Inspect was
|
|
339
|
+
// active. Keep the durable edits, but adopt the new route instead of
|
|
340
|
+
// sending the user back to the previous page. On refresh, the URLs already
|
|
341
|
+
// match and restoration remains unchanged.
|
|
342
|
+
if (inspectRouteChanged)
|
|
343
|
+
persistSessionUnchecked();
|
|
344
|
+
projectToAllReadyCards();
|
|
345
|
+
return { restored: true, changeCount: deserializedChanges.length + structuralChanges.length };
|
|
346
|
+
}
|
|
347
|
+
function safeDiscard() {
|
|
348
|
+
try {
|
|
349
|
+
localStorage.removeItem(storageKey(projectId()));
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// ignore
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
export function clearSession() {
|
|
356
|
+
if (!canWriteWorkspace())
|
|
357
|
+
return;
|
|
358
|
+
try {
|
|
359
|
+
localStorage.removeItem(storageKey(projectId()));
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
// ignore
|
|
363
|
+
}
|
|
364
|
+
clearWorkspaceLog();
|
|
365
|
+
clearClipboardHandoff();
|
|
366
|
+
resetStructuralDeleteProjection();
|
|
367
|
+
removeManagedSheet();
|
|
368
|
+
setSelectedElement(null);
|
|
369
|
+
clearInspectorLayout();
|
|
370
|
+
for (const card of getCanvasCards()) {
|
|
371
|
+
removeCanvasCard(card.id);
|
|
372
|
+
}
|
|
373
|
+
setBoardCamera({ x: 0, y: 0, zoom: 1 });
|
|
374
|
+
applyRules([]);
|
|
375
|
+
autoSaveDirty = false;
|
|
376
|
+
if (autosaveTimer !== null) {
|
|
377
|
+
clearTimeout(autosaveTimer);
|
|
378
|
+
autosaveTimer = null;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
let autoSaveEnabled = false;
|
|
382
|
+
let autosaveTimer = null;
|
|
383
|
+
let autoSaveDirty = false;
|
|
384
|
+
const AUTOSAVE_DEBOUNCE_MS = 500;
|
|
385
|
+
export function enableAutoSave() {
|
|
386
|
+
if (autoSaveEnabled)
|
|
387
|
+
return;
|
|
388
|
+
autoSaveEnabled = true;
|
|
389
|
+
window.addEventListener("beforeunload", flushAutoSave);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Coalesces the synchronous full-session `JSON.stringify` + `localStorage`
|
|
393
|
+
* write behind a trailing timer so commits never block on persistence. A
|
|
394
|
+
* refresh or close inside the debounce window still flushes on `beforeunload`.
|
|
395
|
+
*/
|
|
396
|
+
export function scheduleAutoSave() {
|
|
397
|
+
if (!autoSaveEnabled)
|
|
398
|
+
return;
|
|
399
|
+
autoSaveDirty = true;
|
|
400
|
+
if (autosaveTimer !== null)
|
|
401
|
+
clearTimeout(autosaveTimer);
|
|
402
|
+
autosaveTimer = setTimeout(() => {
|
|
403
|
+
autosaveTimer = null;
|
|
404
|
+
if (!autoSaveDirty)
|
|
405
|
+
return;
|
|
406
|
+
if (persistSession())
|
|
407
|
+
autoSaveDirty = false;
|
|
408
|
+
}, AUTOSAVE_DEBOUNCE_MS);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Canvas mode/card/camera changes persist immediately (synchronous) so a
|
|
412
|
+
* refresh always restores the workspace, even inside the edit-autosave
|
|
413
|
+
* debounce window. Edit autosave stays coalesced behind the trailing timer.
|
|
414
|
+
*/
|
|
415
|
+
export function scheduleCanvasSave() {
|
|
416
|
+
if (!autoSaveEnabled)
|
|
417
|
+
return;
|
|
418
|
+
if (persistSession())
|
|
419
|
+
autoSaveDirty = false;
|
|
420
|
+
}
|
|
421
|
+
function flushAutoSave() {
|
|
422
|
+
if (autosaveTimer !== null) {
|
|
423
|
+
clearTimeout(autosaveTimer);
|
|
424
|
+
autosaveTimer = null;
|
|
425
|
+
}
|
|
426
|
+
if (!autoSaveDirty)
|
|
427
|
+
return;
|
|
428
|
+
// Keep the normal lease gate on the unload path. The controller registers
|
|
429
|
+
// this listener before releaseLease, so a current owner can flush a first
|
|
430
|
+
// write without allowing a stale tab to overwrite the new owner's session.
|
|
431
|
+
if (persistSession())
|
|
432
|
+
autoSaveDirty = false;
|
|
433
|
+
}
|
|
434
|
+
let restoreCount = 0;
|
|
435
|
+
export function getRestoreCount() {
|
|
436
|
+
return restoreCount;
|
|
437
|
+
}
|
|
438
|
+
export function setRestoreCount(count) {
|
|
439
|
+
restoreCount = count;
|
|
440
|
+
}
|
|
441
|
+
export function clearRestoreCount() {
|
|
442
|
+
restoreCount = 0;
|
|
443
|
+
}
|
|
444
|
+
export function resetAutoSave() {
|
|
445
|
+
autoSaveEnabled = false;
|
|
446
|
+
autoSaveDirty = false;
|
|
447
|
+
if (autosaveTimer !== null) {
|
|
448
|
+
clearTimeout(autosaveTimer);
|
|
449
|
+
autosaveTimer = null;
|
|
450
|
+
}
|
|
451
|
+
window.removeEventListener("beforeunload", flushAutoSave);
|
|
452
|
+
}
|
|
453
|
+
export { storageKey, SCHEMA_VERSION };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChangeRecord } from "../changes/changesLog.js";
|
|
2
|
+
export type StaleChangeStatus = "unverified" | "verified" | "stale" | "token-drift";
|
|
3
|
+
export interface StaleChangeInfo {
|
|
4
|
+
index: number;
|
|
5
|
+
status: StaleChangeStatus;
|
|
6
|
+
matchedRoutes: string[];
|
|
7
|
+
driftMessage?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function startStaleDetection(changes: ChangeRecord[]): void;
|
|
10
|
+
export declare function cancelStaleDetection(): void;
|
|
11
|
+
export declare function isVerificationPending(): boolean;
|