nudge-ui 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/agentCommand.d.ts +0 -1
- package/dist/cli/agentCommand.js +4 -29
- package/dist/client.mjs +987 -221
- package/dist/compiler/ast.d.ts +0 -6
- package/dist/compiler/ast.js +0 -5
- package/dist/compiler/componentContractTypes.d.ts +11 -5
- package/dist/compiler/componentContracts.js +3 -9
- package/dist/compiler/componentInstrumentation.d.ts +2 -13
- package/dist/compiler/componentInstrumentation.js +3 -12
- package/dist/compiler/componentPolicyResolution.d.ts +3 -22
- package/dist/compiler/componentPolicyResolution.js +6 -38
- package/dist/compiler/identityAttributes.d.ts +2 -0
- package/dist/compiler/identityAttributes.js +2 -0
- package/dist/compiler/index.d.ts +0 -1
- package/dist/compiler/index.js +0 -1
- package/dist/compiler/packageComponentContracts.d.ts +10 -19
- package/dist/compiler/packageComponentContracts.js +60 -43
- package/dist/compiler/reactComponentProtocols.d.ts +0 -7
- package/dist/compiler/reactComponentProtocols.js +0 -7
- package/dist/compiler/reactIdentity.d.ts +2 -2
- package/dist/compiler/reactIdentity.js +41 -43
- package/dist/compiler/sourcePaths.d.ts +4 -8
- package/dist/compiler/sourcePaths.js +6 -8
- package/dist/css/dialects/index.d.ts +2 -21
- package/dist/css/dialects/index.js +2 -9
- package/dist/css/dialects/tailwind.d.ts +2 -16
- package/dist/css/dialects/tailwind.js +2 -25
- package/dist/css/dialects/vanillaExtract.d.ts +1 -9
- package/dist/css/dialects/vanillaExtract.js +0 -1
- package/dist/css/index.d.ts +0 -8
- package/dist/css/index.js +0 -8
- package/dist/css/model/index.d.ts +6 -38
- package/dist/css/model/index.js +0 -9
- package/dist/css/token-inventory/index.d.ts +0 -23
- package/dist/css/token-inventory/index.js +0 -23
- package/dist/css/token-inventory/inventory.js +4 -16
- package/dist/css/token-inventory/parseStylesheet.d.ts +1 -9
- package/dist/css/token-inventory/parseStylesheet.js +5 -42
- package/dist/css/token-inventory/policy.d.ts +2 -39
- package/dist/css/token-inventory/policy.js +2 -39
- package/dist/css/token-inventory/types.d.ts +2 -15
- package/dist/css/value-semantics/borderSemantics.d.ts +1 -8
- package/dist/css/value-semantics/borderSemantics.js +5 -23
- package/dist/css/value-semantics/boxSemantics.d.ts +2 -25
- package/dist/css/value-semantics/boxSemantics.js +1 -7
- package/dist/css/value-semantics/colorSemantics.d.ts +6 -60
- package/dist/css/value-semantics/colorSemantics.js +9 -40
- package/dist/css/value-semantics/cssSyntax.d.ts +10 -10
- package/dist/css/value-semantics/cssSyntax.js +39 -11
- package/dist/css/value-semantics/fontSemantics.d.ts +3 -19
- package/dist/css/value-semantics/fontSemantics.js +7 -25
- package/dist/css/value-semantics/index.d.ts +1 -12
- package/dist/css/value-semantics/index.js +1 -12
- package/dist/css/value-semantics/propertyPolicy.d.ts +6 -53
- package/dist/css/value-semantics/propertyPolicy.js +47 -59
- package/dist/css/value-semantics/stringMaps.d.ts +0 -1
- package/dist/css/value-semantics/structuredValues.d.ts +3 -37
- package/dist/css/value-semantics/structuredValues.js +6 -17
- package/dist/css/value-semantics/tokenInterpretation.d.ts +8 -50
- package/dist/css/value-semantics/tokenInterpretation.js +7 -21
- package/dist/hosts/astro/astroRuntimeConfig.d.ts +0 -1
- package/dist/hosts/astro/astroRuntimeConfig.js +0 -1
- package/dist/hosts/astro/clientAsset.d.ts +1 -5
- package/dist/hosts/astro/clientAsset.js +1 -5
- package/dist/hosts/astro/clientTransport.d.ts +0 -1
- package/dist/hosts/astro/clientTransport.js +4 -9
- package/dist/hosts/astro/integration.d.ts +2 -28
- package/dist/hosts/astro/integration.js +7 -36
- package/dist/hosts/astro/markdownIdentity.d.ts +0 -3
- package/dist/hosts/astro/markdownIdentity.js +0 -3
- package/dist/hosts/astro/middleware.d.ts +1 -12
- package/dist/hosts/astro/middleware.js +1 -12
- package/dist/hosts/astro/projectContext.d.ts +1 -9
- package/dist/hosts/astro/projectContext.js +2 -11
- package/dist/hosts/astro/responseInstrumentation.d.ts +4 -33
- package/dist/hosts/astro/responseInstrumentation.js +5 -34
- package/dist/hosts/environment.d.ts +0 -8
- package/dist/hosts/environment.js +0 -1
- package/dist/hosts/next/index.js +1 -3
- package/dist/hosts/next/loader.d.ts +5 -44
- package/dist/hosts/next/loader.js +22 -103
- package/dist/hosts/next/loaders/identity-loader.cjs +111 -65
- package/dist/hosts/next/loaders/loader-plugin.cjs +111 -65
- package/dist/hosts/next/manifest.d.ts +2 -16
- package/dist/hosts/next/manifest.js +18 -20
- package/dist/hosts/next/mount.d.ts +1 -11
- package/dist/hosts/next/mount.js +1 -11
- package/dist/hosts/next/repositoryScope.d.ts +2 -17
- package/dist/hosts/next/repositoryScope.js +2 -17
- package/dist/hosts/next/sidecar.d.ts +0 -13
- package/dist/hosts/next/sidecar.js +25 -110
- package/dist/hosts/next/wrapper.d.ts +0 -31
- package/dist/hosts/next/wrapper.js +14 -71
- package/dist/hosts/projectBridge.d.ts +0 -2
- package/dist/hosts/projectBridge.js +3 -19
- package/dist/hosts/reactRendererCapture.d.ts +2 -0
- package/dist/hosts/reactRendererCapture.js +12 -0
- package/dist/hosts/static/cli.d.ts +0 -4
- package/dist/hosts/static/cli.js +0 -3
- package/dist/hosts/static/html/bootstrap.d.ts +1 -18
- package/dist/hosts/static/html/bootstrap.js +2 -14
- package/dist/hosts/static/manifest.d.ts +2 -15
- package/dist/hosts/static/manifest.js +5 -18
- package/dist/hosts/static/server.d.ts +4 -38
- package/dist/hosts/static/server.js +17 -67
- package/dist/hosts/vite/index.d.ts +0 -10
- package/dist/hosts/vite/index.js +0 -10
- package/dist/hosts/vite/react.d.ts +4 -17
- package/dist/hosts/vite/react.js +18 -35
- package/dist/hosts/vite/tokens/activeStylesheets.d.ts +1 -10
- package/dist/hosts/vite/tokens/activeStylesheets.js +3 -8
- package/dist/hosts/vite/tokens/fileMap.d.ts +0 -1
- package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +2 -15
- package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +3 -10
- package/dist/hosts/vite/vite.d.ts +5 -26
- package/dist/hosts/vite/vite.js +44 -80
- package/dist/html/dom.d.ts +0 -1
- package/dist/html/dom.js +0 -1
- package/dist/html/identity.d.ts +1 -15
- package/dist/html/identity.js +1 -8
- package/dist/html/insertions.d.ts +2 -8
- package/dist/html/insertions.js +1 -1
- package/dist/inspector/agent/McpConnectionDialog.d.ts +1 -6
- package/dist/inspector/agent/McpConnectionDialog.js +8 -9
- package/dist/inspector/agent/activity.d.ts +2 -2
- package/dist/inspector/agent/activity.js +4 -3
- package/dist/inspector/agent/client.d.ts +3 -27
- package/dist/inspector/agent/client.js +43 -91
- package/dist/inspector/agent/connectionStatus.d.ts +3 -2
- package/dist/inspector/agent/connectionStatus.js +25 -1
- package/dist/inspector/agent/httpTransport.d.ts +0 -8
- package/dist/inspector/agent/httpTransport.js +42 -176
- package/dist/inspector/agent/protocol.d.ts +1 -10
- package/dist/inspector/agent/protocol.js +1 -9
- package/dist/inspector/agent/verification.d.ts +3 -20
- package/dist/inspector/agent/verification.js +10 -43
- package/dist/inspector/boot.d.ts +5 -0
- package/dist/inspector/boot.js +289 -0
- package/dist/inspector/canvas/AgentActivityOverlay.d.ts +3 -2
- package/dist/inspector/canvas/AgentActivityOverlay.js +7 -4
- package/dist/inspector/canvas/CanvasCard.js +26 -24
- package/dist/inspector/canvas/CanvasElementOverlay.js +196 -174
- package/dist/inspector/canvas/CanvasToolbar.js +2 -1
- package/dist/inspector/canvas/CanvasWorkspace.js +87 -124
- package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +3 -2
- package/dist/inspector/canvas/LockedWorkspaceNotice.js +10 -6
- package/dist/inspector/canvas/PageCard.d.ts +9 -0
- package/dist/inspector/canvas/PageCard.js +50 -0
- package/dist/inspector/canvas/SketchToolOptions.d.ts +4 -0
- package/dist/inspector/canvas/SketchToolOptions.js +80 -0
- package/dist/inspector/canvas/StaleChangeIndicator.d.ts +1 -1
- package/dist/inspector/canvas/StaleChangeIndicator.js +1 -1
- package/dist/inspector/canvas/ToolOptionsDrawer.d.ts +16 -0
- package/dist/inspector/canvas/ToolOptionsDrawer.js +71 -0
- package/dist/inspector/canvas/activeCanvasDocument.d.ts +3 -4
- package/dist/inspector/canvas/activeCanvasDocument.js +0 -2
- package/dist/inspector/canvas/agentPresentation.d.ts +2 -13
- package/dist/inspector/canvas/agentPresentation.js +3 -14
- package/dist/inspector/canvas/assets/eraser.svg +28 -0
- package/dist/inspector/canvas/assets/pen.svg +25 -0
- package/dist/inspector/canvas/canvasFrame.d.ts +12 -0
- package/dist/inspector/canvas/canvasFrame.js +9 -0
- package/dist/inspector/canvas/canvasGestures.d.ts +0 -1
- package/dist/inspector/canvas/canvasGestures.js +0 -6
- package/dist/inspector/canvas/canvasResize.d.ts +1 -6
- package/dist/inspector/canvas/canvasResize.js +1 -6
- package/dist/inspector/canvas/canvasStore.d.ts +5 -7
- package/dist/inspector/canvas/canvasStore.js +42 -21
- package/dist/inspector/canvas/frameConnection.d.ts +42 -0
- package/dist/inspector/canvas/frameConnection.js +73 -0
- package/dist/inspector/canvas/frameContent.d.ts +0 -1
- package/dist/inspector/canvas/frameLifecycle.d.ts +12 -0
- package/dist/inspector/canvas/frameLifecycle.js +11 -0
- package/dist/inspector/canvas/frameProtocol.d.ts +20 -38
- package/dist/inspector/canvas/frameProtocol.js +37 -24
- package/dist/inspector/canvas/frameScrollbarStyles.d.ts +0 -1
- package/dist/inspector/canvas/frameScrollbarStyles.js +0 -1
- package/dist/inspector/canvas/layout.d.ts +10 -22
- package/dist/inspector/canvas/layout.js +0 -3
- package/dist/inspector/canvas/normalizeUrl.js +1 -8
- package/dist/inspector/canvas/pageSurface.d.ts +6 -0
- package/dist/inspector/canvas/pageSurface.js +29 -0
- package/dist/inspector/canvas/projection.d.ts +14 -25
- package/dist/inspector/canvas/projection.js +64 -87
- package/dist/inspector/canvas/rendererBootstrap.d.ts +8 -1
- package/dist/inspector/canvas/rendererBootstrap.js +10 -15
- package/dist/inspector/canvas/rendererCidIndex.d.ts +0 -5
- package/dist/inspector/canvas/rendererCidIndex.js +0 -5
- package/dist/inspector/canvas/rendererElementSelector.js +38 -28
- package/dist/inspector/canvas/rendererMessageRouter.d.ts +4 -6
- package/dist/inspector/canvas/rendererMessageRouter.js +12 -17
- package/dist/inspector/canvas/rendererSelectionProxy.d.ts +3 -1
- package/dist/inspector/canvas/rendererSelectionProxy.js +7 -40
- package/dist/inspector/canvas/rendererStylesheet.d.ts +0 -1
- package/dist/inspector/canvas/rendererStylesheet.js +23 -1
- package/dist/inspector/canvas/resizeHandleScale.d.ts +1 -10
- package/dist/inspector/canvas/resizeHandleScale.js +1 -10
- package/dist/inspector/canvas/sessionStore.d.ts +3 -9
- package/dist/inspector/canvas/sessionStore.js +33 -43
- package/dist/inspector/canvas/staleChangeDetector.d.ts +1 -1
- package/dist/inspector/canvas/staleChangeDetector.js +11 -26
- package/dist/inspector/canvas/toolbarScale.d.ts +1 -4
- package/dist/inspector/canvas/toolbarScale.js +1 -4
- package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +0 -1
- package/dist/inspector/canvas/useCanvasLayoutAnimation.js +0 -1
- package/dist/inspector/canvas/viewStore.js +1 -1
- package/dist/inspector/canvas/wheelPan.d.ts +1 -1
- package/dist/inspector/canvas/wheelPan.js +1 -1
- package/dist/inspector/canvas/workspaceLease.d.ts +1 -5
- package/dist/inspector/canvas/workspaceLease.js +1 -7
- package/dist/inspector/changes/codecs.d.ts +1 -0
- package/dist/inspector/changes/codecs.js +21 -5
- package/dist/inspector/changes/draftPreview.d.ts +7 -0
- package/dist/inspector/changes/draftPreview.js +118 -0
- package/dist/inspector/changes/editModel.d.ts +11 -13
- package/dist/inspector/changes/editModel.js +9 -4
- package/dist/inspector/changes/managedStyleProjection.js +6 -15
- package/dist/inspector/changes/model.d.ts +0 -5
- package/dist/inspector/changes/model.js +1 -8
- package/dist/inspector/changes/previewDiagnostics.d.ts +2 -12
- package/dist/inspector/changes/previewDiagnostics.js +5 -21
- package/dist/inspector/changes/previewVerification.d.ts +25 -0
- package/dist/inspector/changes/previewVerification.js +34 -0
- package/dist/inspector/changes/structuralTypes.d.ts +2 -4
- package/dist/inspector/changes/types.d.ts +11 -8
- package/dist/inspector/clientManifest.d.ts +17 -6
- package/dist/inspector/clientManifest.js +16 -3
- package/dist/inspector/comments/CommentsOverlay.js +66 -23
- package/dist/inspector/comments/element.d.ts +1 -2
- package/dist/inspector/comments/element.js +1 -2
- package/dist/inspector/comments/store.d.ts +1 -1
- package/dist/inspector/comments/store.js +4 -3
- package/dist/inspector/comments/verification.d.ts +8 -2
- package/dist/inspector/comments/verification.js +19 -11
- package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +8 -0
- package/dist/inspector/componentSemantics/ComponentPropsSection.js +12 -8
- package/dist/inspector/componentSemantics/adapterRegistry.d.ts +2 -9
- package/dist/inspector/componentSemantics/adapterRegistry.js +2 -9
- package/dist/inspector/componentSemantics/changeAction.js +1 -1
- package/dist/inspector/componentSemantics/changeModel.js +2 -4
- package/dist/inspector/componentSemantics/react/callsites.d.ts +28 -0
- package/dist/inspector/componentSemantics/react/callsites.js +261 -0
- package/dist/inspector/componentSemantics/react/devtoolsHook.d.ts +23 -0
- package/dist/inspector/componentSemantics/react/devtoolsHook.js +71 -0
- package/dist/inspector/componentSemantics/react/fibers.d.ts +17 -0
- package/dist/inspector/componentSemantics/react/fibers.js +30 -0
- package/dist/inspector/componentSemantics/{reactRuntime.d.ts → react/runtime.d.ts} +3 -2
- package/dist/inspector/componentSemantics/{reactRuntime.js → react/runtime.js} +70 -53
- package/dist/inspector/componentSemantics/runtimeBridge.d.ts +2 -18
- package/dist/inspector/componentSemantics/runtimeBridge.js +5 -19
- package/dist/inspector/componentSemantics/textBinding.d.ts +2 -11
- package/dist/inspector/componentSemantics/textBinding.js +20 -87
- package/dist/inspector/componentSemantics/types.d.ts +8 -27
- package/dist/inspector/componentSemantics/types.js +0 -1
- package/dist/inspector/conformance/borderCases.d.ts +0 -5
- package/dist/inspector/conformance/borderCases.js +0 -5
- package/dist/inspector/conformance/colorCases.d.ts +0 -6
- package/dist/inspector/conformance/colorCases.js +0 -6
- package/dist/inspector/conformance/fixture.d.ts +1 -5
- package/dist/inspector/conformance/fixture.js +1 -5
- package/dist/inspector/conformance/spacingCases.d.ts +0 -4
- package/dist/inspector/conformance/spacingCases.js +0 -4
- package/dist/inspector/conformance/typographyCases.d.ts +0 -5
- package/dist/inspector/conformance/typographyCases.js +0 -5
- package/dist/inspector/drafts/draftStore.d.ts +95 -0
- package/dist/inspector/drafts/draftStore.js +461 -0
- package/dist/inspector/drafts/model.d.ts +14 -14
- package/dist/inspector/drafts/model.js +4 -2
- package/dist/inspector/drafts/store.d.ts +47 -16
- package/dist/inspector/drafts/store.js +137 -170
- package/dist/inspector/editScope.d.ts +0 -1
- package/dist/inspector/editScope.js +0 -1
- package/dist/inspector/index.d.ts +2 -4
- package/dist/inspector/index.js +2 -264
- package/dist/inspector/inline-text/inlineTextDiagnostics.d.ts +0 -2
- package/dist/inspector/inline-text/inlineTextDiagnostics.js +0 -2
- package/dist/inspector/inline-text/inlineTextEditor.d.ts +3 -9
- package/dist/inspector/inline-text/inlineTextEditor.js +27 -81
- package/dist/inspector/inline-text/inlineTextLifecycle.js +1 -6
- package/dist/inspector/inline-text/textEditChange.d.ts +1 -2
- package/dist/inspector/inspection/bridge.d.ts +3 -7
- package/dist/inspector/inspection/bridge.js +6 -13
- package/dist/inspector/inspection/browserCssInspection.d.ts +12 -11
- package/dist/inspector/inspection/browserCssInspection.js +32 -14
- package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +0 -7
- package/dist/inspector/inspection/browserCssInspectionRegistry.js +1 -16
- package/dist/inspector/inspection/inspectionSnapshot.d.ts +6 -0
- package/dist/inspector/inspection/inspectionSnapshot.js +10 -0
- package/dist/inspector/inspection/performanceDiagnostics.d.ts +18 -0
- package/dist/inspector/inspection/performanceDiagnostics.js +31 -0
- package/dist/inspector/inspection/selectionProperty.d.ts +1 -6
- package/dist/inspector/inspection/selectionProperty.js +1 -5
- package/dist/inspector/inspection/useBrowserCssInspection.d.ts +1 -5
- package/dist/inspector/inspection/useBrowserCssInspection.js +22 -59
- package/dist/inspector/iterations/capture.d.ts +2 -2
- package/dist/inspector/iterations/capture.js +4 -9
- package/dist/inspector/iterations/client.d.ts +2 -2
- package/dist/inspector/iterations/client.js +0 -1
- package/dist/inspector/iterations/coordinator.d.ts +4 -4
- package/dist/inspector/iterations/coordinator.js +5 -4
- package/dist/inspector/iterations/prompt.d.ts +0 -1
- package/dist/inspector/iterations/prompt.js +9 -9
- package/dist/inspector/overlay/DomNavigator.d.ts +3 -1
- package/dist/inspector/overlay/DomNavigator.js +39 -15
- package/dist/inspector/overlay/DropGuideOverlay.d.ts +0 -1
- package/dist/inspector/overlay/DropGuideOverlay.js +0 -1
- package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +1 -8
- package/dist/inspector/overlay/MeasurementGuideOverlay.js +1 -5
- package/dist/inspector/overlay/clickPolicy.d.ts +3 -14
- package/dist/inspector/overlay/clickPolicy.js +3 -14
- package/dist/inspector/overlay/dropGuide.d.ts +0 -3
- package/dist/inspector/overlay/dropGuide.js +0 -3
- package/dist/inspector/overlay/frameThrottle.d.ts +0 -1
- package/dist/inspector/overlay/frameThrottle.js +0 -1
- package/dist/inspector/overlay/interactionStyles.d.ts +1 -1
- package/dist/inspector/overlay/interactionStyles.js +19 -8
- package/dist/inspector/overlay/measurementGeometry.js +4 -12
- package/dist/inspector/overlay/selectedGeometry.d.ts +1 -6
- package/dist/inspector/overlay/selectedGeometry.js +1 -8
- package/dist/inspector/overlay/spacingGestures.d.ts +14 -21
- package/dist/inspector/overlay/spacingGestures.js +151 -31
- package/dist/inspector/overlay/structuralGestures.d.ts +2 -9
- package/dist/inspector/overlay/structuralGestures.js +1 -4
- package/dist/inspector/pageInspector.d.ts +33 -0
- package/dist/inspector/pageInspector.js +335 -0
- package/dist/inspector/projection/cssEscapes.d.ts +0 -1
- package/dist/inspector/projection/cssEscapes.js +2 -4
- package/dist/inspector/projection/draftProjection.d.ts +6 -10
- package/dist/inspector/projection/draftProjection.js +8 -7
- package/dist/inspector/projection/managedStylesheet.d.ts +1 -7
- package/dist/inspector/projection/managedStylesheet.js +28 -26
- package/dist/inspector/projection/renderedInstance.d.ts +5 -28
- package/dist/inspector/projection/renderedInstance.js +13 -33
- package/dist/inspector/projection/structuralProjection.d.ts +7 -48
- package/dist/inspector/projection/structuralProjection.js +31 -96
- package/dist/inspector/projection/textProjection.d.ts +7 -13
- package/dist/inspector/projection/textProjection.js +35 -80
- package/dist/inspector/prompt/PromptSettingsDialog.d.ts +0 -1
- package/dist/inspector/prompt/PromptSettingsDialog.js +0 -1
- package/dist/inspector/prompt/clipboardHandoff.d.ts +1 -0
- package/dist/inspector/prompt/clipboardHandoff.js +34 -16
- package/dist/inspector/prompt/generatePrompt.d.ts +2 -2
- package/dist/inspector/prompt/generatePrompt.js +247 -166
- package/dist/inspector/prompt/promptDocument.d.ts +3 -0
- package/dist/inspector/prompt/promptDocument.js +8 -0
- package/dist/inspector/prompt/promptSettings.d.ts +0 -3
- package/dist/inspector/prompt/promptSettings.js +7 -8
- package/dist/inspector/runtime/devFlag.d.ts +2 -25
- package/dist/inspector/runtime/devFlag.js +4 -31
- package/dist/inspector/runtime/documentStylesheetOrder.d.ts +0 -2
- package/dist/inspector/runtime/editorShell.d.ts +0 -1
- package/dist/inspector/runtime/editorShell.js +0 -1
- package/dist/inspector/runtime/inspectorStorage.d.ts +11 -0
- package/dist/inspector/runtime/inspectorStorage.js +37 -0
- package/dist/inspector/runtime/ownedStylesheets.d.ts +14 -0
- package/dist/inspector/runtime/ownedStylesheets.js +66 -0
- package/dist/inspector/runtime/runtimeConfig.d.ts +14 -84
- package/dist/inspector/runtime/runtimeConfig.js +18 -50
- package/dist/inspector/runtime/runtimeIdentityClaims.d.ts +19 -0
- package/dist/inspector/runtime/runtimeIdentityClaims.js +178 -0
- package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +6 -23
- package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +103 -52
- package/dist/inspector/runtime/useRuntimeConfig.d.ts +1 -8
- package/dist/inspector/runtime/useRuntimeConfig.js +1 -8
- package/dist/inspector/selection/editScope.d.ts +2 -7
- package/dist/inspector/selection/editScope.js +15 -14
- package/dist/inspector/selection/editTarget.d.ts +1 -5
- package/dist/inspector/selection/hierarchy.d.ts +11 -11
- package/dist/inspector/selection/hierarchy.js +42 -24
- package/dist/inspector/selection/selectionStore.d.ts +0 -3
- package/dist/inspector/selection/selectionStore.js +5 -16
- package/dist/inspector/selection/sourceSite.d.ts +1 -5
- package/dist/inspector/selection/sourceSite.js +2 -8
- package/dist/inspector/selection/styleSelection.d.ts +1 -5
- package/dist/inspector/selection/styleSelection.js +1 -5
- package/dist/inspector/session/lifecycle.d.ts +1 -9
- package/dist/inspector/session/lifecycle.js +0 -1
- package/dist/inspector/session/sessionContext.d.ts +0 -4
- package/dist/inspector/session/sessionContext.js +0 -4
- package/dist/inspector/session/sessionFactory.d.ts +0 -9
- package/dist/inspector/session/sessionFactory.js +0 -6
- package/dist/inspector/settings/SettingsDialog.d.ts +0 -1
- package/dist/inspector/settings/SettingsDialog.js +5 -3
- package/dist/inspector/shell/AgentStatusButton.d.ts +3 -2
- package/dist/inspector/shell/AgentStatusButton.js +7 -7
- package/dist/inspector/shell/AppShell.js +6 -2
- package/dist/inspector/shell/ChangesLog.js +29 -12
- package/dist/inspector/shell/CopyPromptButton.d.ts +2 -1
- package/dist/inspector/shell/CopyPromptButton.js +62 -55
- package/dist/inspector/shell/EmptyState.js +3 -3
- package/dist/inspector/shell/InspectorEditors.d.ts +16 -0
- package/dist/inspector/shell/InspectorEditors.js +14 -0
- package/dist/inspector/shell/InspectorPanel.d.ts +12 -0
- package/dist/inspector/shell/InspectorPanel.js +8 -0
- package/dist/inspector/shell/InspectorSelection.d.ts +24 -0
- package/dist/inspector/shell/InspectorSelection.js +20 -0
- package/dist/inspector/shell/InspectorShell.d.ts +0 -3
- package/dist/inspector/shell/InspectorShell.js +44 -58
- package/dist/inspector/shell/NudgeLogoIcon.d.ts +5 -0
- package/dist/inspector/shell/NudgeLogoIcon.js +5 -0
- package/dist/inspector/shell/PeekOriginalButton.d.ts +0 -5
- package/dist/inspector/shell/PeekOriginalButton.js +3 -8
- package/dist/inspector/shell/PeekOriginalIcon.d.ts +0 -5
- package/dist/inspector/shell/PeekOriginalIcon.js +0 -5
- package/dist/inspector/shell/PromptActionButton.d.ts +21 -0
- package/dist/inspector/shell/PromptActionButton.js +14 -0
- package/dist/inspector/shell/elementName.d.ts +5 -0
- package/dist/inspector/shell/elementName.js +29 -0
- package/dist/inspector/shell/interactionStatePreview.d.ts +6 -0
- package/dist/inspector/shell/interactionStatePreview.js +107 -0
- package/dist/inspector/shell/originalPreview.d.ts +1 -5
- package/dist/inspector/shell/originalPreview.js +5 -37
- package/dist/inspector/shell/stateValue.d.ts +1 -2
- package/dist/inspector/shell/stateValue.js +4 -8
- package/dist/inspector/shell/styleState.d.ts +1 -2
- package/dist/inspector/shell/styleState.js +1 -2
- package/dist/inspector/sketch/SketchEditor.js +5 -5
- package/dist/inspector/sketch/SketchFrameOverlay.d.ts +2 -1
- package/dist/inspector/sketch/SketchFrameOverlay.js +13 -16
- package/dist/inspector/sketch/SketchOverlay.d.ts +3 -5
- package/dist/inspector/sketch/SketchOverlay.js +138 -263
- package/dist/inspector/sketch/SketchPromptPanel.d.ts +1 -2
- package/dist/inspector/sketch/SketchPromptPanel.js +8 -2
- package/dist/inspector/sketch/SketchThumbnail.d.ts +5 -0
- package/dist/inspector/sketch/SketchThumbnail.js +18 -0
- package/dist/inspector/sketch/SketchWorkspace.d.ts +1 -2
- package/dist/inspector/sketch/SketchWorkspace.js +70 -37
- package/dist/inspector/sketch/capture.d.ts +12 -3
- package/dist/inspector/sketch/capture.js +31 -14
- package/dist/inspector/sketch/copySketch.d.ts +4 -0
- package/dist/inspector/sketch/copySketch.js +43 -0
- package/dist/inspector/sketch/drawingTools.d.ts +15 -0
- package/dist/inspector/sketch/drawingTools.js +46 -0
- package/dist/inspector/sketch/frameHeading.d.ts +3 -0
- package/dist/inspector/sketch/frameHeading.js +23 -0
- package/dist/inspector/sketch/freehand.d.ts +0 -1
- package/dist/inspector/sketch/freehand.js +3 -4
- package/dist/inspector/sketch/geometry.d.ts +2 -1
- package/dist/inspector/sketch/geometry.js +15 -1
- package/dist/inspector/sketch/handoff.js +0 -1
- package/dist/inspector/sketch/history.d.ts +26 -0
- package/dist/inspector/sketch/history.js +55 -0
- package/dist/inspector/sketch/interaction.d.ts +3 -5
- package/dist/inspector/sketch/interaction.js +8 -11
- package/dist/inspector/sketch/model.d.ts +33 -6
- package/dist/inspector/sketch/model.js +101 -63
- package/dist/inspector/sketch/persistence.d.ts +14 -1
- package/dist/inspector/sketch/persistence.js +64 -8
- package/dist/inspector/sketch/raster.d.ts +3 -2
- package/dist/inspector/sketch/raster.js +40 -20
- package/dist/inspector/sketch/store.d.ts +1 -1
- package/dist/inspector/sketch/store.js +3 -4
- package/dist/inspector/sketch/videoFrames.d.ts +6 -0
- package/dist/inspector/sketch/videoFrames.js +80 -0
- package/dist/inspector/spacing/projection.d.ts +0 -8
- package/dist/inspector/spacing/projection.js +38 -20
- package/dist/inspector/styleEditors/BackgroundEditor.js +3 -2
- package/dist/inspector/styleEditors/BorderEditor.js +30 -135
- package/dist/inspector/styleEditors/BorderRadiusEditor.js +8 -3
- package/dist/inspector/styleEditors/ChildPlacement.d.ts +12 -0
- package/dist/inspector/styleEditors/ChildPlacement.js +9 -0
- package/dist/inspector/styleEditors/FlexControls.d.ts +35 -0
- package/dist/inspector/styleEditors/FlexControls.js +158 -0
- package/dist/inspector/styleEditors/GapField.d.ts +5 -2
- package/dist/inspector/styleEditors/GapField.js +3 -4
- package/dist/inspector/styleEditors/GridChildSection.d.ts +0 -5
- package/dist/inspector/styleEditors/GridChildSection.js +0 -5
- package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
- package/dist/inspector/styleEditors/GridPicker.js +2 -4
- package/dist/inspector/styleEditors/GridSection.d.ts +10 -8
- package/dist/inspector/styleEditors/GridSection.js +22 -9
- package/dist/inspector/styleEditors/GridValueField.d.ts +1 -5
- package/dist/inspector/styleEditors/GridValueField.js +2 -8
- package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +0 -1
- package/dist/inspector/styleEditors/ImageBackgroundEditor.js +1 -2
- package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +0 -1
- package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +0 -1
- package/dist/inspector/styleEditors/LayoutComboField.js +0 -5
- package/dist/inspector/styleEditors/LayoutModeRow.d.ts +14 -0
- package/dist/inspector/styleEditors/LayoutModeRow.js +60 -0
- package/dist/inspector/styleEditors/LayoutSection.d.ts +2 -2
- package/dist/inspector/styleEditors/LayoutSection.js +30 -356
- package/dist/inspector/styleEditors/OpacityEditor.js +7 -5
- package/dist/inspector/styleEditors/PositionControls.d.ts +18 -0
- package/dist/inspector/styleEditors/PositionControls.js +16 -0
- package/dist/inspector/styleEditors/SizeSection.d.ts +18 -0
- package/dist/inspector/styleEditors/SizeSection.js +71 -0
- package/dist/inspector/styleEditors/{SpacingBox.d.ts → SpacingField.d.ts} +3 -10
- package/dist/inspector/styleEditors/{SpacingBox.js → SpacingField.js} +15 -29
- package/dist/inspector/styleEditors/Typography.js +2 -4
- package/dist/inspector/styleEditors/borderModel.d.ts +36 -0
- package/dist/inspector/styleEditors/borderModel.js +105 -0
- package/dist/inspector/styleEditors/completeCssValue.d.ts +1 -5
- package/dist/inspector/styleEditors/completeCssValue.js +3 -13
- package/dist/inspector/styleEditors/fieldValue.d.ts +20 -0
- package/dist/inspector/styleEditors/fieldValue.js +26 -0
- package/dist/inspector/styleEditors/gradientValue.d.ts +1 -1
- package/dist/inspector/styleEditors/gradientValue.js +3 -2
- package/dist/inspector/styleEditors/gridChildModel.d.ts +7 -47
- package/dist/inspector/styleEditors/gridChildModel.js +6 -37
- package/dist/inspector/styleEditors/hiddenSizeOverrides.d.ts +5 -0
- package/dist/inspector/styleEditors/hiddenSizeOverrides.js +42 -0
- package/dist/inspector/styleEditors/inlineAuthored.d.ts +1 -8
- package/dist/inspector/styleEditors/inlineAuthored.js +3 -17
- package/dist/inspector/styleEditors/layoutMode.d.ts +15 -0
- package/dist/inspector/styleEditors/layoutMode.js +33 -0
- package/dist/inspector/styleEditors/layoutPreviewState.d.ts +0 -1
- package/dist/inspector/styleEditors/layoutPreviewState.js +0 -1
- package/dist/inspector/styleEditors/layoutValue.d.ts +2 -8
- package/dist/inspector/styleEditors/layoutValue.js +6 -15
- package/dist/inspector/styleEditors/nudgeValue.d.ts +1 -13
- package/dist/inspector/styleEditors/nudgeValue.js +1 -13
- package/dist/inspector/styleEditors/rowLookup.d.ts +1 -5
- package/dist/inspector/styleEditors/rowLookup.js +1 -5
- package/dist/inspector/styleEditors/stringRecord.d.ts +1 -2
- package/dist/inspector/styleEditors/stylePresence.d.ts +0 -2
- package/dist/inspector/styleEditors/stylePresence.js +1 -4
- package/dist/inspector/styleEditors/textRelevance.d.ts +1 -1
- package/dist/inspector/styleEditors/textRelevance.js +1 -1
- package/dist/inspector/styleEditors/useFieldVisibility.js +1 -2
- package/dist/inspector/styleEditors/useLayoutContext.d.ts +13 -0
- package/dist/inspector/styleEditors/useLayoutContext.js +53 -0
- package/dist/inspector/styleEditors/valuePolicy.d.ts +1 -5
- package/dist/inspector/styleEditors/valuePolicy.js +0 -1
- package/dist/inspector/testing.d.ts +1 -4
- package/dist/inspector/testing.js +1 -4
- package/dist/inspector/tokens/TokenChip.d.ts +1 -4
- package/dist/inspector/tokens/TokenChip.js +1 -4
- package/dist/inspector/tokens/TokenField.d.ts +4 -3
- package/dist/inspector/tokens/TokenField.js +53 -32
- package/dist/inspector/tokens/TokensPanel.js +2 -1
- package/dist/inspector/tokens/catalog.d.ts +2 -10
- package/dist/inspector/tokens/catalog.js +5 -12
- package/dist/inspector/tokens/dragPointerLock.d.ts +0 -1
- package/dist/inspector/tokens/dragPointerLock.js +2 -3
- package/dist/inspector/tokens/editActions.d.ts +4 -4
- package/dist/inspector/tokens/editActions.js +11 -7
- package/dist/inspector/tokens/resolution/cascade.d.ts +1 -5
- package/dist/inspector/tokens/resolution/cascade.js +1 -5
- package/dist/inspector/tokens/resolution/containerQueryEvaluator.d.ts +11 -0
- package/dist/inspector/tokens/resolution/containerQueryEvaluator.js +82 -0
- package/dist/inspector/tokens/resolution/cssomCollector.d.ts +4 -19
- package/dist/inspector/tokens/resolution/cssomCollector.js +186 -122
- package/dist/inspector/tokens/resolution/nestedSelectors.d.ts +2 -0
- package/dist/inspector/tokens/resolution/nestedSelectors.js +63 -0
- package/dist/inspector/tokens/resolution/ruleMatching.d.ts +4 -14
- package/dist/inspector/tokens/resolution/ruleMatching.js +136 -63
- package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +3 -14
- package/dist/inspector/tokens/resolution/selectorSemantics.js +12 -27
- package/dist/inspector/tokens/resolution.d.ts +11 -27
- package/dist/inspector/tokens/resolution.js +105 -181
- package/dist/inspector/tokens/tokenAvailability.d.ts +2 -14
- package/dist/inspector/tokens/tokenAvailability.js +6 -38
- package/dist/inspector/tokens/tokenEdits.d.ts +1 -1
- package/dist/inspector/tokens/tokenEdits.js +1 -1
- package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +0 -1
- package/dist/inspector/tokens/valueSemanticsAdapter.js +18 -2
- package/dist/inspector/ui/AtRuleContext.d.ts +5 -5
- package/dist/inspector/ui/AtRuleContext.js +8 -6
- package/dist/inspector/ui/ControlSurface.d.ts +0 -4
- package/dist/inspector/ui/Disclosure.d.ts +0 -5
- package/dist/inspector/ui/Disclosure.js +0 -4
- package/dist/inspector/ui/InlineStyleWarning.d.ts +0 -1
- package/dist/inspector/ui/InlineStyleWarning.js +2 -2
- package/dist/inspector/ui/InspectorPopover.d.ts +1 -5
- package/dist/inspector/ui/InspectorPopover.js +1 -5
- package/dist/inspector/ui/InspectorStyle.d.ts +8 -0
- package/dist/inspector/ui/InspectorStyle.js +26 -0
- package/dist/inspector/ui/PopoverListbox.d.ts +2 -1
- package/dist/inspector/ui/PopoverListbox.js +3 -3
- package/dist/inspector/ui/SegmentedControl.d.ts +4 -4
- package/dist/inspector/ui/SegmentedControl.js +6 -4
- package/dist/inspector/ui/SideValuesField.d.ts +1 -6
- package/dist/inspector/ui/SideValuesField.js +2 -8
- package/dist/inspector/ui/Toast.d.ts +10 -0
- package/dist/inspector/ui/Toast.js +26 -0
- package/dist/inspector/ui/assets/canvasIllustration.d.ts +2 -0
- package/dist/inspector/ui/assets/canvasIllustration.js +21 -0
- package/dist/inspector/ui/assets/gridIllustration.d.ts +2 -0
- package/dist/inspector/ui/assets/{grid.svg → gridIllustration.js} +3 -2
- package/dist/inspector/ui/atRuleSegments.d.ts +13 -0
- package/dist/inspector/ui/atRuleSegments.js +34 -0
- package/dist/inspector/ui/classNames.d.ts +0 -1
- package/dist/inspector/ui/classNames.js +0 -1
- package/dist/inspector/ui/customCursors.d.ts +11 -0
- package/dist/inspector/ui/customCursors.js +29 -7
- package/dist/inspector/ui/styles.js +25 -25
- package/dist/inspector/workspace/commands.js +1 -2
- package/dist/inspector/workspace/controller.js +20 -2
- package/dist/inspector/workspace/handoff.d.ts +1 -5
- package/dist/inspector/workspace/handoff.js +4 -7
- package/dist/inspector/workspace/sentItems.d.ts +3 -6
- package/dist/inspector/workspace/sentItems.js +6 -24
- package/dist/inspector/workspace/timeline.d.ts +28 -11
- package/dist/inspector/workspace/timeline.js +117 -96
- package/dist/internal/agent-protocol.d.ts +53 -38
- package/dist/internal/agent-protocol.js +151 -42
- package/dist/nudge-ui.mjs +155 -92
- package/dist/project/artifacts.js +24 -21
- package/dist/project/files.d.ts +0 -1
- package/dist/project/files.js +2 -9
- package/dist/project/identity.d.ts +1 -5
- package/dist/project/identity.js +1 -5
- package/dist/project/mcpPackage.d.ts +3 -0
- package/dist/project/mcpPackage.js +55 -0
- package/dist/project/pathPolicy.d.ts +1 -6
- package/dist/project/pathPolicy.js +1 -6
- package/dist/project/tokens.d.ts +2 -12
- package/dist/project/tokens.js +4 -15
- package/dist/transport/editor.d.ts +1 -12
- package/dist/transport/editor.js +2 -13
- package/dist/transport/index.d.ts +0 -5
- package/dist/transport/index.js +0 -5
- package/dist/transport/routes.d.ts +0 -5
- package/dist/transport/routes.js +0 -5
- package/package.json +16 -5
- package/dist/inspector/canvas/measurementProjection.d.ts +0 -8
- package/dist/inspector/canvas/measurementProjection.js +0 -16
- package/dist/inspector/changes/changesLog.d.ts +0 -49
- package/dist/inspector/changes/changesLog.js +0 -255
- package/dist/inspector/changes/draftChanges.d.ts +0 -58
- package/dist/inspector/changes/draftChanges.js +0 -304
- package/dist/inspector/conformance/projection.d.ts +0 -2
- package/dist/inspector/conformance/projection.js +0 -3
- package/dist/inspector/inline-text/textChangeBoundary.d.ts +0 -6
- package/dist/inspector/inline-text/textChangeBoundary.js +0 -1
- package/dist/inspector/overlay/InspectorOverlay.d.ts +0 -5
- package/dist/inspector/overlay/InspectorOverlay.js +0 -332
- package/dist/inspector/overlay/elementSelector.d.ts +0 -1
- package/dist/inspector/overlay/elementSelector.js +0 -111
- package/dist/inspector/sketch/SketchChanges.d.ts +0 -2
- package/dist/inspector/sketch/SketchChanges.js +0 -72
- package/dist/inspector/sketch/SketchEntryButton.d.ts +0 -4
- package/dist/inspector/sketch/SketchEntryButton.js +0 -11
- package/dist/inspector/sketch/SketchLayersPanel.d.ts +0 -2
- package/dist/inspector/sketch/SketchLayersPanel.js +0 -71
- package/dist/inspector/styleEditors/InsetSection.d.ts +0 -15
- package/dist/inspector/styleEditors/InsetSection.js +0 -15
- package/dist/inspector/styleEditors/PositionInsets.d.ts +0 -15
- package/dist/inspector/styleEditors/PositionInsets.js +0 -12
- package/dist/inspector/tokens/TokenDropdown.d.ts +0 -13
- package/dist/inspector/tokens/TokenDropdown.js +0 -59
|
@@ -3,9 +3,8 @@ import { useEffect, useState } from "react";
|
|
|
3
3
|
import { IconBorderSides, IconBorderStyle2, IconCheck, IconMinus, IconPlus, } from "@tabler/icons-react";
|
|
4
4
|
import { findTokenRow } from "./rowLookup.js";
|
|
5
5
|
import { TokenField } from "../tokens/TokenField.js";
|
|
6
|
-
import {
|
|
6
|
+
import { setStyles } from "../tokens/editActions.js";
|
|
7
7
|
import { FieldRow } from "../ui/FieldRow.js";
|
|
8
|
-
import { SIDE_NAMES } from "../ui/SideValuesField.js";
|
|
9
8
|
import { IconButton } from "../ui/IconButton.js";
|
|
10
9
|
import { ToggleButton } from "../ui/ToggleButton.js";
|
|
11
10
|
import { formatInspectorLabel } from "../ui/labels.js";
|
|
@@ -13,107 +12,23 @@ import { getStateStyleValue } from "../shell/stateValue.js";
|
|
|
13
12
|
import { PopoverListbox } from "../ui/PopoverListbox.js";
|
|
14
13
|
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
15
14
|
import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
|
|
16
|
-
import { isZeroCssValue } from "./stylePresence.js";
|
|
17
15
|
import { useFieldVisibility } from "./useFieldVisibility.js";
|
|
18
16
|
import { Tooltip } from "../ui/Tooltip.js";
|
|
19
17
|
import { inlineStyleWarningContent } from "../ui/InlineStyleWarning.js";
|
|
20
18
|
import { inlineBlockedBy } from "./inlineAuthored.js";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
function borderStyleValue(el, rows, property) {
|
|
25
|
-
const row = findTokenRow(rows, property);
|
|
26
|
-
const structured = row?.structure?.style?.trim();
|
|
27
|
-
if (structured)
|
|
28
|
-
return structured.toLowerCase();
|
|
29
|
-
const authored = (row?.authored ?? row?.declaredValue ?? "").trim().toLowerCase();
|
|
30
|
-
if (authored && BORDER_STYLES.includes(authored))
|
|
31
|
-
return authored;
|
|
32
|
-
return (getStateStyleValue(el, property, "none") || "none").toLowerCase();
|
|
19
|
+
import { BORDER_SIDES, BORDER_STYLES, borderDeclarations, borderProperty, hasVisibleBorder, readBorderEditor, } from "./borderModel.js";
|
|
20
|
+
function stateStyleReader(el) {
|
|
21
|
+
return (property, fallback) => getStateStyleValue(el, property, fallback);
|
|
33
22
|
}
|
|
34
|
-
function
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|| getStateStyleValue(el, property, "0px")
|
|
42
|
-
|| "0px").trim();
|
|
23
|
+
function commitBorderIntent(target, source, intent, onAfterEdit) {
|
|
24
|
+
const declarations = borderDeclarations(source, intent);
|
|
25
|
+
if (declarations.length === 0)
|
|
26
|
+
return false;
|
|
27
|
+
setStyles(target, declarations);
|
|
28
|
+
onAfterEdit?.();
|
|
29
|
+
return true;
|
|
43
30
|
}
|
|
44
|
-
|
|
45
|
-
const row = findTokenRow(rows, property);
|
|
46
|
-
if (row?.structure?.color)
|
|
47
|
-
return row.structure.color.trim();
|
|
48
|
-
return (row?.authored
|
|
49
|
-
|| row?.declaredValue
|
|
50
|
-
|| row?.resolvedValue
|
|
51
|
-
|| getStateStyleValue(el, property, "currentcolor")
|
|
52
|
-
|| "currentcolor").trim();
|
|
53
|
-
}
|
|
54
|
-
/** Effective per-side value used to decide linked vs individual UI. */
|
|
55
|
-
function sideComponentSignature(el, rows, property) {
|
|
56
|
-
const row = findTokenRow(rows, property);
|
|
57
|
-
if (property.endsWith("-width")) {
|
|
58
|
-
return `w:${borderWidthValue(el, rows, property).toLowerCase()}|t:${row?.tokenName ?? ""}`;
|
|
59
|
-
}
|
|
60
|
-
if (property.endsWith("-style")) {
|
|
61
|
-
return `s:${borderStyleValue(el, rows, property)}`;
|
|
62
|
-
}
|
|
63
|
-
if (property.endsWith("-color")) {
|
|
64
|
-
return `c:${borderColorValue(el, rows, property).toLowerCase()}|t:${row?.tokenName ?? ""}`;
|
|
65
|
-
}
|
|
66
|
-
return `${row?.authored ?? ""}|${row?.resolvedValue ?? getStateStyleValue(el, property)}`;
|
|
67
|
-
}
|
|
68
|
-
function sideValueForLink(el, rows, property, fallback = "") {
|
|
69
|
-
if (property.endsWith("-width"))
|
|
70
|
-
return borderWidthValue(el, rows, property) || fallback;
|
|
71
|
-
if (property.endsWith("-style"))
|
|
72
|
-
return borderStyleValue(el, rows, property) || fallback;
|
|
73
|
-
if (property.endsWith("-color"))
|
|
74
|
-
return borderColorValue(el, rows, property) || fallback;
|
|
75
|
-
return fallback;
|
|
76
|
-
}
|
|
77
|
-
function borderLinkDeclaration(el, rows, shorthand, sideProperties) {
|
|
78
|
-
const sharedValue = sideValueForLink(el, rows, sideProperties[0], shorthand === "border-style" ? "solid" : "");
|
|
79
|
-
return sharedValue ? { property: shorthand, value: sharedValue } : null;
|
|
80
|
-
}
|
|
81
|
-
function linkedTokenRow(rows, shorthand, sideProperties) {
|
|
82
|
-
const direct = findTokenRow(rows, shorthand);
|
|
83
|
-
if (direct)
|
|
84
|
-
return direct;
|
|
85
|
-
const first = findTokenRow(rows, sideProperties[0]);
|
|
86
|
-
return first ? { ...first, property: shorthand } : null;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Sides are linked when every face shares the same effective component value.
|
|
90
|
-
* Uses structured width/style/color parts (not the full authored shorthand string)
|
|
91
|
-
* so four different `border-*` shorthands correctly expand the UI.
|
|
92
|
-
*/
|
|
93
|
-
function valuesAreLinked(el, rows, shorthand, sideProperties) {
|
|
94
|
-
const hasDirectRow = Boolean(findTokenRow(rows, shorthand));
|
|
95
|
-
const hasSideRows = sideProperties.some((property) => Boolean(findTokenRow(rows, property)));
|
|
96
|
-
// A lone shorthand with no per-side overrides is inherently linked.
|
|
97
|
-
if (hasDirectRow && !hasSideRows)
|
|
98
|
-
return true;
|
|
99
|
-
const signatures = sideProperties.map((property) => sideComponentSignature(el, rows, property));
|
|
100
|
-
return new Set(signatures).size === 1;
|
|
101
|
-
}
|
|
102
|
-
/** Initial visibility follows the effective border, including stylesheet resets. */
|
|
103
|
-
function hasBorderPresence(el) {
|
|
104
|
-
return SIDE_NAMES.some((side) => {
|
|
105
|
-
const style = getStateStyleValue(el, `border-${side}-style`, "none").toLowerCase();
|
|
106
|
-
if (INVISIBLE_BORDER_STYLES.has(style))
|
|
107
|
-
return false;
|
|
108
|
-
const width = getStateStyleValue(el, `border-${side}-width`, "0px");
|
|
109
|
-
return !isZeroCssValue(width);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Linked presentation from cascade data + optional user toggle.
|
|
114
|
-
* Divergent faces always open; equal faces start linked but can expand.
|
|
115
|
-
* Linking divergent faces is optimistic until cascade rows catch up.
|
|
116
|
-
*/
|
|
31
|
+
/** User toggle is optimistic: it holds until the cascade-derived state catches up. */
|
|
117
32
|
function useBorderLinkedState(dataLinked, resetKey) {
|
|
118
33
|
const [userUnlinked, setUserUnlinked] = useState(false);
|
|
119
34
|
const [userLinked, setUserLinked] = useState(false);
|
|
@@ -147,36 +62,25 @@ export function BorderEditor(props) {
|
|
|
147
62
|
const editTarget = selection?.target ?? el;
|
|
148
63
|
const isGroup = Boolean(selection && selection.elements.length > 1);
|
|
149
64
|
const allEntries = entries ?? getNudgeUiTokenEntries();
|
|
150
|
-
const borderWidthProperties = BORDER_SIDES.map((side) => `${side}-width`);
|
|
151
|
-
const borderStyleProperties = BORDER_SIDES.map((side) => `${side}-style`);
|
|
152
|
-
const borderColorProperties = BORDER_SIDES.map((side) => `${side}-color`);
|
|
153
65
|
const borderBlockedBy = inlineBlockedBy(selectedElements, "border", "border-width", "border-style", "border-color");
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
const
|
|
158
|
-
const
|
|
159
|
-
const borderRow = findTokenRow(tokenRows, "border");
|
|
160
|
-
const hasStructuredBorderRows = tokenRows.some((row) => Boolean(row.structure));
|
|
161
|
-
const rawBorderFallback = !isGroup && Boolean(borderRow && !borderRow.structure && !hasStructuredBorderRows);
|
|
162
|
-
const linkedBorderStyle = borderStyleValue(el, tokenRows, "border-style");
|
|
163
|
-
const showWidthAndColor = !(borderLinked && INVISIBLE_BORDER_STYLES.has(linkedBorderStyle));
|
|
164
|
-
const hasBorder = selectedElements.some(hasBorderPresence);
|
|
66
|
+
const source = { rows: tokenRows, computed: stateStyleReader(el) };
|
|
67
|
+
const border = readBorderEditor(source, { group: isGroup });
|
|
68
|
+
const [borderLinked, setBorderLinked] = useBorderLinkedState(border.sidesLinked, el);
|
|
69
|
+
const showWidthAndColor = !borderLinked || border.linkedStyleDraws;
|
|
70
|
+
const hasBorder = selectedElements.some((element) => hasVisibleBorder(stateStyleReader(element)));
|
|
165
71
|
const visibility = useFieldVisibility(selectedElements, "border", hasBorder);
|
|
166
72
|
const showBorderControls = visibility.visible;
|
|
167
73
|
function handleAddBorder() {
|
|
168
74
|
if (borderBlockedBy)
|
|
169
75
|
return;
|
|
170
|
-
|
|
76
|
+
commitBorderIntent(editTarget, source, { kind: "add" }, onAfterEdit);
|
|
171
77
|
visibility.show();
|
|
172
|
-
onAfterEdit?.();
|
|
173
78
|
}
|
|
174
79
|
function handleRemoveBorder() {
|
|
175
80
|
if (borderBlockedBy)
|
|
176
81
|
return;
|
|
177
|
-
|
|
82
|
+
commitBorderIntent(editTarget, source, { kind: "remove" }, onAfterEdit);
|
|
178
83
|
visibility.hide();
|
|
179
|
-
onAfterEdit?.();
|
|
180
84
|
}
|
|
181
85
|
function handleExpand() {
|
|
182
86
|
setBorderLinked(false);
|
|
@@ -185,23 +89,18 @@ export function BorderEditor(props) {
|
|
|
185
89
|
if (borderBlockedBy)
|
|
186
90
|
return;
|
|
187
91
|
setBorderLinked(true);
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
].filter((declaration) => declaration !== null);
|
|
193
|
-
if (declarations.length > 0) {
|
|
194
|
-
setStyles(editTarget, declarations);
|
|
195
|
-
onAfterEdit?.();
|
|
196
|
-
}
|
|
92
|
+
commitBorderIntent(editTarget, source, { kind: "link-sides" }, onAfterEdit);
|
|
93
|
+
}
|
|
94
|
+
function handleSelectStyle(property, style) {
|
|
95
|
+
return commitBorderIntent(editTarget, source, { kind: "set-style", property, style }, onAfterEdit);
|
|
197
96
|
}
|
|
198
|
-
const sideRows =
|
|
97
|
+
const sideRows = BORDER_SIDES.map((side) => ({
|
|
199
98
|
side,
|
|
200
|
-
color: (_jsx(ControlSurface, { children: _jsx(TokenField, { property:
|
|
201
|
-
width: (_jsx(ControlSurface, { children: _jsx(TokenField, { property:
|
|
202
|
-
style: (_jsx(BorderStyleSettingsMenu, { property:
|
|
99
|
+
color: (_jsx(ControlSurface, { children: _jsx(TokenField, { property: borderProperty("color", side), selection: selection, tokenRow: findTokenRow(tokenRows, borderProperty("color", side)), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) })),
|
|
100
|
+
width: (_jsx(ControlSurface, { children: _jsx(TokenField, { property: borderProperty("width", side), selection: selection, tokenRow: findTokenRow(tokenRows, borderProperty("width", side)), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }) })),
|
|
101
|
+
style: (_jsx(BorderStyleSettingsMenu, { property: borderProperty("style", side), tokenRow: findTokenRow(tokenRows, borderProperty("style", side)), domElement: el, selection: selection, dataTest: `border-style-${side}`, onSelectStyle: handleSelectStyle })),
|
|
203
102
|
}));
|
|
204
|
-
return (_jsxs("div", { className: `editor`, "data-test": "border-editor", children: [_jsxs("div", { className: "editor__title-row", children: [_jsx("div", { className: "editor__title", children: "Border" }), showBorderControls ? (_jsx(Tooltip, { content: inlineStyleWarningContent(borderBlockedBy), children: _jsx(IconButton, { variant: "quiet", label: "Remove Border", "data-test": "remove-border", className: "border__remove", disabled: borderBlockedBy !== null, onClick: handleRemoveBorder, children: _jsx(IconMinus, { size: 16, "aria-hidden": "true" }) }) })) : (_jsx(IconButton, { variant: "quiet", label: "Add Border", "data-test": "add-border", className: "border__add", disabled: borderBlockedBy !== null, onClick: handleAddBorder, children: _jsx(IconPlus, { size: 16, "aria-hidden": "true" }) }))] }), showBorderControls && (_jsx("div", { className: "border", "data-expanded": borderLinked ? "false" : "true", children:
|
|
103
|
+
return (_jsxs("div", { className: `editor`, "data-test": "border-editor", children: [_jsxs("div", { className: "editor__title-row", children: [_jsx("div", { className: "editor__title", children: "Border" }), showBorderControls ? (_jsx(Tooltip, { content: inlineStyleWarningContent(borderBlockedBy), children: _jsx(IconButton, { variant: "quiet", label: "Remove Border", "data-test": "remove-border", className: "border__remove", disabled: borderBlockedBy !== null, onClick: handleRemoveBorder, children: _jsx(IconMinus, { size: 16, "aria-hidden": "true" }) }) })) : (_jsx(IconButton, { variant: "quiet", label: "Add Border", "data-test": "add-border", className: "border__add", disabled: borderBlockedBy !== null, onClick: handleAddBorder, children: _jsx(IconPlus, { size: 16, "aria-hidden": "true" }) }))] }), showBorderControls && (_jsx("div", { className: "border", "data-expanded": borderLinked ? "false" : "true", children: border.rawShorthandRow ? (_jsx(FieldRow, { label: "Border", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border", selection: selection, tokenRow: border.rawShorthandRow, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) })) : borderLinked ? (_jsxs("div", { className: "border__linked-row", children: [showWidthAndColor ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "border__linked-control border__linked-control--color", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-color", selection: selection, tokenRow: border.linkedRows.color, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) }), _jsx("div", { className: "border__linked-control border__linked-control--width", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-width", selection: selection, tokenRow: border.linkedRows.width, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }) }) })] })) : null, _jsx(BorderStyleSettingsMenu, { property: "border-style", tokenRow: border.linkedRows.style, domElement: el, selection: selection, onSelectStyle: handleSelectStyle }), _jsx(ToggleButton, { variant: "quiet", size: "default", "data-test": "border-expand", label: "Edit Individual Border Sides", pressed: !borderLinked, onPressedChange: (pressed) => {
|
|
205
104
|
if (pressed)
|
|
206
105
|
handleExpand();
|
|
207
106
|
}, children: _jsx(IconBorderSides, { size: 16, "aria-hidden": "true" }) })] })) : (_jsxs("div", { className: "border__expanded", children: [_jsxs("div", { className: "border__expanded-header", children: [_jsx("span", { className: "side-values__label", children: formatInspectorLabel("Individual Sides") }), _jsx(ToggleButton, { variant: "quiet", size: "default", "data-test": "border-collapse", label: "Link All Border Sides", pressed: !borderLinked, disabled: borderBlockedBy !== null, onPressedChange: (pressed) => {
|
|
@@ -231,7 +130,7 @@ function BorderSideIndicator({ side }) {
|
|
|
231
130
|
const { outline, emphasis } = BORDER_SIDE_ICON_PATHS[side];
|
|
232
131
|
return (_jsxs("svg", { className: "side-values__icon side-values__side-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: outline, stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "square", strokeOpacity: "0.2" }), _jsx("line", { ...emphasis, stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
233
132
|
}
|
|
234
|
-
function BorderStyleSettingsMenu({ property, tokenRow, domElement: el,
|
|
133
|
+
function BorderStyleSettingsMenu({ property, tokenRow, domElement: el, selection, dataTest = "border-style-settings", onSelectStyle }) {
|
|
235
134
|
const structured = tokenRow?.structure?.style?.trim().toLowerCase() ?? "";
|
|
236
135
|
const selectedValue = selection?.getProperty(property)?.value;
|
|
237
136
|
const mixed = selectedValue?.kind === "mixed";
|
|
@@ -244,14 +143,10 @@ function BorderStyleSettingsMenu({ property, tokenRow, domElement: el, editTarge
|
|
|
244
143
|
setValue(mixed ? "Mixed" : commonValue || structured || getStateStyleValue(el, property, "none") || "none");
|
|
245
144
|
}, [commonValue, el, mixed, property, structured]);
|
|
246
145
|
function handleChange(next) {
|
|
247
|
-
if (blockedBy)
|
|
248
|
-
return;
|
|
249
|
-
if (!BORDER_STYLES.includes(next))
|
|
146
|
+
if (blockedBy || !onSelectStyle(property, next))
|
|
250
147
|
return;
|
|
251
148
|
setValue(next);
|
|
252
|
-
setStyle(editTarget ?? el, property, next);
|
|
253
149
|
setOpen(false);
|
|
254
|
-
onAfterEdit?.();
|
|
255
150
|
}
|
|
256
151
|
return (_jsx(PopoverListbox, { query: "", value: null, open: open, triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: `Border style: ${formatInspectorLabel(value)}`, "data-test": dataTest, "data-current-style": value, children: _jsx(IconBorderStyle2, { size: 16, "aria-hidden": "true" }) })), triggerDataTest: dataTest, triggerAriaLabel: "Border style settings", triggerTooltip: inlineStyleWarningContent(blockedBy), disabled: blockedBy !== null, items: BORDER_STYLES.map((style) => ({
|
|
257
152
|
value: style,
|
|
@@ -28,7 +28,13 @@ function cornerAuthoredSignature(rows, corner) {
|
|
|
28
28
|
const row = findTokenRow(rows, corner);
|
|
29
29
|
return `${row?.authored ?? row?.declaredValue ?? ""}|${row?.tokenName ?? ""}`;
|
|
30
30
|
}
|
|
31
|
-
function cornersAreLinked(rows) {
|
|
31
|
+
function cornersAreLinked(rows, selection) {
|
|
32
|
+
if (selection && selection.elements.length > 1) {
|
|
33
|
+
const values = BORDER_RADIUS_CORNERS.map((corner) => selection.getProperty(corner)?.value);
|
|
34
|
+
const first = values[0];
|
|
35
|
+
return first?.kind === "common"
|
|
36
|
+
&& values.every((value) => value?.kind === "common" && value.value === first.value);
|
|
37
|
+
}
|
|
32
38
|
const signatures = BORDER_RADIUS_CORNERS.map((corner) => cornerAuthoredSignature(rows, corner));
|
|
33
39
|
return new Set(signatures).size === 1;
|
|
34
40
|
}
|
|
@@ -50,9 +56,8 @@ export function BorderRadiusEditor(props) {
|
|
|
50
56
|
const { element, selection, entries, tokenRows = [], onAfterEdit, embedded = false } = props;
|
|
51
57
|
const el = element.domElement;
|
|
52
58
|
const editTarget = selection?.target ?? el;
|
|
53
|
-
const isGroup = Boolean(selection && selection.elements.length > 1);
|
|
54
59
|
const allEntries = entries ?? getNudgeUiTokenEntries();
|
|
55
|
-
const dataLinked =
|
|
60
|
+
const dataLinked = cornersAreLinked(tokenRows, selection);
|
|
56
61
|
const blockedBy = inlineBlockedBy(selection?.domElements ?? [el], "border-radius");
|
|
57
62
|
const [userUnlinked, setUserUnlinked] = useState(false);
|
|
58
63
|
const [userLinked, setUserLinked] = useState(false);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { EditTarget } from "../selection/editTarget.js";
|
|
3
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
4
|
+
export interface FlexChildControlsProps {
|
|
5
|
+
domElement: HTMLElement;
|
|
6
|
+
editTarget?: EditTarget;
|
|
7
|
+
selection?: StyleSelection | null;
|
|
8
|
+
revision?: number;
|
|
9
|
+
onAfterEdit?: () => void;
|
|
10
|
+
}
|
|
11
|
+
/** How a flex item shares its parent's space; shown behind the size expander. */
|
|
12
|
+
export declare function FlexChildControls(props: FlexChildControlsProps): ReactElement;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { FlexChildSettingsMenu, LayoutValueField } from "./FlexControls.js";
|
|
3
|
+
const FLEX_GROW_PRESETS = ["0", "1", "2", "3"];
|
|
4
|
+
const FLEX_SHRINK_PRESETS = ["0", "1"];
|
|
5
|
+
const FLEX_BASIS_PRESETS = ["auto", "0", "0%", "100%", "50%", "fit-content"];
|
|
6
|
+
/** How a flex item shares its parent's space; shown behind the size expander. */
|
|
7
|
+
export function FlexChildControls(props) {
|
|
8
|
+
return (_jsxs("div", { className: "layout__group layout__group--bottom-rule", "data-test": "layout-flex-child", children: [_jsxs("div", { className: "layout__flex-heading", children: [_jsx("div", { className: "editor__title", children: "Flex Child" }), _jsx(FlexChildSettingsMenu, { ...props })] }), _jsxs("div", { className: "layout__flex-child-fields", children: [_jsx(LayoutValueField, { label: "Grow", property: "flex-grow", presets: FLEX_GROW_PRESETS, inputOnly: true, ...props }), _jsx(LayoutValueField, { label: "Shrink", property: "flex-shrink", presets: FLEX_SHRINK_PRESETS, inputOnly: true, ...props }), _jsx(LayoutValueField, { label: "Basis", property: "flex-basis", presets: FLEX_BASIS_PRESETS, inputOnly: true, ...props })] })] }));
|
|
9
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { ResolvedProperty, TokenEntry } from "../../css/model/index.js";
|
|
3
|
+
import type { EditTarget } from "../selection/editTarget.js";
|
|
4
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
5
|
+
export interface FlexControlProps {
|
|
6
|
+
domElement: HTMLElement;
|
|
7
|
+
editTarget?: EditTarget;
|
|
8
|
+
selection?: StyleSelection | null;
|
|
9
|
+
revision?: number;
|
|
10
|
+
onAfterEdit?: () => void;
|
|
11
|
+
}
|
|
12
|
+
export interface LayoutValueFieldProps extends FlexControlProps {
|
|
13
|
+
label: string;
|
|
14
|
+
property: string;
|
|
15
|
+
presets: string[];
|
|
16
|
+
inputOnly?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function LayoutValueField({ label, property, presets, inputOnly, domElement, editTarget, selection, revision, onAfterEdit }: LayoutValueFieldProps): ReactElement;
|
|
19
|
+
export declare function FlexChildSettingsMenu({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
|
|
20
|
+
export interface FlexGapFieldProps extends FlexControlProps {
|
|
21
|
+
property: "row-gap" | "column-gap";
|
|
22
|
+
entries: TokenEntry[];
|
|
23
|
+
tokenRows: ResolvedProperty[];
|
|
24
|
+
}
|
|
25
|
+
export declare function FlexGapField({ property, domElement, editTarget, selection, entries, tokenRows, onAfterEdit }: FlexGapFieldProps): ReactElement;
|
|
26
|
+
export declare function FlexWrapToggle({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
|
|
27
|
+
/**
|
|
28
|
+
* The main-axis gap. Spreading the items (`justify-content: space-*`) replaces the fixed gap, so
|
|
29
|
+
* the field reads Auto, keeps the gap as a faint value, and typing `auto` spreads between.
|
|
30
|
+
*/
|
|
31
|
+
export declare function FlexMainGapField({ property, domElement, editTarget, selection, entries, tokenRows, revision, onAfterEdit }: FlexGapFieldProps & {
|
|
32
|
+
revision?: number;
|
|
33
|
+
}): ReactElement;
|
|
34
|
+
export declare function FlexAlignmentGrid({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
|
|
35
|
+
export declare function useComputedLayoutValue(domElement: HTMLElement, property: string, fallback: string, revision: number): [string, (value: string) => void];
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { IconCheck, IconChevronDown, IconSettings, IconSpacingHorizontal, IconSpacingVertical, IconTextWrap } from "@tabler/icons-react";
|
|
4
|
+
import { LayoutDropdown } from "./LayoutDropdown.js";
|
|
5
|
+
import { LayoutComboField } from "./LayoutComboField.js";
|
|
6
|
+
import { GapField } from "./GapField.js";
|
|
7
|
+
import { inlineBlockedBy } from "./inlineAuthored.js";
|
|
8
|
+
import { setStyle, setStyles } from "../tokens/editActions.js";
|
|
9
|
+
import { IconButton } from "../ui/IconButton.js";
|
|
10
|
+
import { InspectorPopover } from "../ui/InspectorPopover.js";
|
|
11
|
+
import { PopoverListbox } from "../ui/PopoverListbox.js";
|
|
12
|
+
import { getStateStyleValue } from "../shell/stateValue.js";
|
|
13
|
+
import { formatInspectorLabel } from "../ui/labels.js";
|
|
14
|
+
import { FieldRow } from "../ui/FieldRow.js";
|
|
15
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
16
|
+
import { Tooltip } from "../ui/Tooltip.js";
|
|
17
|
+
import { inlineStyleWarningContent } from "../ui/InlineStyleWarning.js";
|
|
18
|
+
const ALIGN_SELF_OPTIONS = ["auto", "stretch", "flex-start", "flex-end", "center", "baseline"];
|
|
19
|
+
const ORDER_PRESETS = ["-1", "0", "1", "2", "3"];
|
|
20
|
+
const FLEX_ALIGNMENT_OPTIONS = ["flex-start", "center", "flex-end"];
|
|
21
|
+
const FLEX_DISTRIBUTION_OPTIONS = ["space-between", "space-around", "space-evenly"];
|
|
22
|
+
export function LayoutValueField({ label, property, presets, inputOnly = false, domElement, editTarget, selection, revision = 0, onAfterEdit }) {
|
|
23
|
+
return (_jsx(FieldRow, { label: label, className: "layout__flex-child-field", children: _jsx(LayoutComboField, { property: property, presets: presets, domElement: domElement, editTarget: editTarget, selection: selection, inputOnly: inputOnly, revision: revision, onAfterEdit: onAfterEdit }) }));
|
|
24
|
+
}
|
|
25
|
+
export function FlexChildSettingsMenu({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
|
|
26
|
+
const [open, setOpen] = useState(false);
|
|
27
|
+
return (_jsx(InspectorPopover, { "data-test": "layout-flex-child-settings", side: "left", align: "start", triggerTooltip: "Flex child settings", triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: "Flex child settings", "data-test": "layout-flex-child-settings", children: _jsx(IconSettings, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), open: open, onOpenChange: setOpen, children: _jsxs("div", { className: "layout__flex-child-settings", "data-test": "layout-flex-child-settings-content", children: [_jsx("div", { className: "layout__flex-child-settings-title", children: "Flex Child Settings" }), _jsx(LayoutDropdown, { property: "align-self", options: ALIGN_SELF_OPTIONS, domElement: domElement, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutValueField, { label: "Order", property: "order", presets: ORDER_PRESETS, domElement: domElement, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit })] }) }));
|
|
28
|
+
}
|
|
29
|
+
export function FlexGapField({ property, domElement, editTarget, selection, entries, tokenRows, onAfterEdit }) {
|
|
30
|
+
const GapIcon = property === "column-gap" ? IconSpacingHorizontal : IconSpacingVertical;
|
|
31
|
+
return (_jsx(ControlSurface, { className: "layout__spacing-field", children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, leading: (_jsx(GapIcon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }));
|
|
32
|
+
}
|
|
33
|
+
export function FlexWrapToggle({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
|
|
34
|
+
const [wrap] = useComputedLayoutValue(domElement, "flex-wrap", "nowrap", revision);
|
|
35
|
+
const selectedWrap = selection?.getProperty("flex-wrap")?.value;
|
|
36
|
+
const mixed = selectedWrap?.kind === "mixed";
|
|
37
|
+
const sharedWrap = selectedWrap?.kind === "common" ? selectedWrap.value : wrap;
|
|
38
|
+
const isWrapped = !mixed && sharedWrap !== "nowrap";
|
|
39
|
+
const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "flex-wrap");
|
|
40
|
+
function toggleWrap() {
|
|
41
|
+
if (blockedBy)
|
|
42
|
+
return;
|
|
43
|
+
setStyle(editTarget ?? domElement, "flex-wrap", isWrapped ? "nowrap" : "wrap");
|
|
44
|
+
onAfterEdit?.();
|
|
45
|
+
}
|
|
46
|
+
return (_jsx(Tooltip, { content: inlineStyleWarningContent(blockedBy), children: _jsx(IconButton, { variant: "quiet", size: "default", "data-active": isWrapped, "data-test": "layout-flex-wrap-toggle", label: mixed ? "Set Flex Wrap" : isWrapped ? "Disable Flex Wrap" : "Enable Flex Wrap", "aria-pressed": mixed ? "mixed" : isWrapped, disabled: blockedBy !== null, onClick: toggleWrap, children: _jsx(IconTextWrap, { size: 16, stroke: 1.8, "aria-hidden": "true" }) }) }));
|
|
47
|
+
}
|
|
48
|
+
const DISTRIBUTION_ITEMS = [
|
|
49
|
+
{ value: "packed", label: "Keep grouped" },
|
|
50
|
+
{ value: "space-between", label: "Spread between" },
|
|
51
|
+
{ value: "space-around", label: "Spread around" },
|
|
52
|
+
{ value: "space-evenly", label: "Spread evenly" },
|
|
53
|
+
];
|
|
54
|
+
/**
|
|
55
|
+
* The main-axis gap. Spreading the items (`justify-content: space-*`) replaces the fixed gap, so
|
|
56
|
+
* the field reads Auto, keeps the gap as a faint value, and typing `auto` spreads between.
|
|
57
|
+
*/
|
|
58
|
+
export function FlexMainGapField({ property, domElement, editTarget, selection, entries, tokenRows, revision = 0, onAfterEdit }) {
|
|
59
|
+
const GapIcon = property === "column-gap" ? IconSpacingHorizontal : IconSpacingVertical;
|
|
60
|
+
const [computedJustify] = useComputedLayoutValue(domElement, "justify-content", "flex-start", revision);
|
|
61
|
+
const justify = normalizeFlexJustify(computedJustify);
|
|
62
|
+
const distributed = FLEX_DISTRIBUTION_OPTIONS.includes(justify);
|
|
63
|
+
const lastPlacement = useRef("flex-start");
|
|
64
|
+
const [open, setOpen] = useState(false);
|
|
65
|
+
const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "justify-content");
|
|
66
|
+
const target = editTarget ?? domElement;
|
|
67
|
+
const gapPixels = Number.parseFloat(getStateStyleValue(domElement, property));
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (FLEX_ALIGNMENT_OPTIONS.includes(justify))
|
|
70
|
+
lastPlacement.current = justify;
|
|
71
|
+
}, [justify]);
|
|
72
|
+
function setJustifyContent(value) {
|
|
73
|
+
if (blockedBy)
|
|
74
|
+
return;
|
|
75
|
+
setStyle(target, "justify-content", value);
|
|
76
|
+
onAfterEdit?.();
|
|
77
|
+
}
|
|
78
|
+
function interceptRaw(value) {
|
|
79
|
+
if (value.trim().toLowerCase() === "auto") {
|
|
80
|
+
if (!distributed)
|
|
81
|
+
setJustifyContent("space-between");
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
// A typed gap takes the items back out of a spread; the gap value itself is written by the field,
|
|
85
|
+
// which still saves it when justify-content is authored inline and cannot be changed here.
|
|
86
|
+
if (distributed)
|
|
87
|
+
setJustifyContent(lastPlacement.current);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const chevron = (_jsx(PopoverListbox, { query: "", value: distributed ? justify : "packed", open: open, triggerElement: (_jsx(IconButton, { variant: "quiet", size: "compact", label: "Item distribution", "data-test": "layout-flex-distribution", children: _jsx(IconChevronDown, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), triggerDataTest: "layout-flex-distribution", triggerAriaLabel: "Item distribution", triggerTooltip: inlineStyleWarningContent(blockedBy), disabled: blockedBy !== null, items: DISTRIBUTION_ITEMS.map((item) => ({
|
|
91
|
+
...item,
|
|
92
|
+
leading: (distributed ? justify : "packed") === item.value
|
|
93
|
+
? _jsx(IconCheck, { size: 14, stroke: 2, "aria-hidden": "true" })
|
|
94
|
+
: undefined,
|
|
95
|
+
"data-test": `layout-flex-distribution-${item.value}`,
|
|
96
|
+
})), onQueryChange: () => undefined, onOpenChange: setOpen, onSelect: (next) => {
|
|
97
|
+
setJustifyContent(next === "packed" ? lastPlacement.current : next);
|
|
98
|
+
setOpen(false);
|
|
99
|
+
} }));
|
|
100
|
+
return (_jsx(ControlSurface, { className: "layout__spacing-field", children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, ...(distributed ? { displayOverride: "Auto" } : {}), interceptRaw: interceptRaw, trailing: (_jsxs(_Fragment, { children: [distributed && Number.isFinite(gapPixels) ? (_jsx("span", { className: "layout__resolved", "data-test": "layout-gap-value", children: Math.round(gapPixels) })) : null, chevron] })), leading: (_jsx(GapIcon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }));
|
|
101
|
+
}
|
|
102
|
+
export function FlexAlignmentGrid({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
|
|
103
|
+
const [direction] = useComputedLayoutValue(domElement, "flex-direction", "row", revision);
|
|
104
|
+
const [computedJustify, setJustify] = useComputedLayoutValue(domElement, "justify-content", "flex-start", revision);
|
|
105
|
+
const [computedAlign, setAlign] = useComputedLayoutValue(domElement, "align-items", "stretch", revision);
|
|
106
|
+
const justify = normalizeFlexJustify(computedJustify);
|
|
107
|
+
const align = normalizeFlexAlign(computedAlign);
|
|
108
|
+
const isColumn = direction.startsWith("column");
|
|
109
|
+
const isReverse = direction.endsWith("-reverse");
|
|
110
|
+
const distributed = FLEX_DISTRIBUTION_OPTIONS.includes(justify);
|
|
111
|
+
const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "justify-content", "align-items");
|
|
112
|
+
// The grid shows physical positions: justify-content runs along the main axis, so column containers transpose the axes.
|
|
113
|
+
const rowValues = isColumn
|
|
114
|
+
? isReverse ? [...FLEX_ALIGNMENT_OPTIONS].reverse() : FLEX_ALIGNMENT_OPTIONS
|
|
115
|
+
: FLEX_ALIGNMENT_OPTIONS;
|
|
116
|
+
const columnValues = !isColumn && isReverse
|
|
117
|
+
? [...FLEX_ALIGNMENT_OPTIONS].reverse()
|
|
118
|
+
: FLEX_ALIGNMENT_OPTIONS;
|
|
119
|
+
function selectAlignment(nextJustify, nextAlign) {
|
|
120
|
+
if (blockedBy)
|
|
121
|
+
return;
|
|
122
|
+
// A grid click changing cross-axis alignment must not replace an explicit distribution choice.
|
|
123
|
+
const resolvedJustify = distributed ? justify : nextJustify;
|
|
124
|
+
setJustify(resolvedJustify);
|
|
125
|
+
setAlign(nextAlign);
|
|
126
|
+
setStyles(editTarget ?? domElement, [
|
|
127
|
+
{ property: "justify-content", value: resolvedJustify },
|
|
128
|
+
{ property: "align-items", value: nextAlign },
|
|
129
|
+
]);
|
|
130
|
+
onAfterEdit?.();
|
|
131
|
+
}
|
|
132
|
+
const grid = (_jsxs("div", { className: "layout__alignment-grid", role: "group", "aria-label": "Place flex items", "data-direction": isColumn ? "column" : "row", "data-justify": justify, "data-align": align, "data-distributed": distributed, children: [distributed ? (_jsxs("span", { className: "layout__distribution-preview", "aria-hidden": "true", children: [_jsx("span", {}), _jsx("span", {}), _jsx("span", {})] })) : null, rowValues.flatMap((rowValue) => columnValues.map((columnValue) => {
|
|
133
|
+
const justifyValue = isColumn ? rowValue : columnValue;
|
|
134
|
+
const alignValue = isColumn ? columnValue : rowValue;
|
|
135
|
+
const active = justify === justifyValue && align === alignValue;
|
|
136
|
+
const label = formatInspectorLabel(`Align ${alignValue.replace("flex-", "")} And Distribute ${justifyValue.replace("flex-", "")}`);
|
|
137
|
+
return (_jsx(Tooltip, { children: _jsx(IconButton, { size: "default", variant: "quiet", className: "layout__alignment-button", "data-active": active, "data-test": `layout-align-${alignValue}-${justifyValue}`, label: label, "aria-pressed": active, disabled: blockedBy !== null, onClick: () => selectAlignment(justifyValue, alignValue), children: _jsx("span", {}) }) }, `${alignValue}-${justifyValue}`));
|
|
138
|
+
}))] }));
|
|
139
|
+
return _jsx(Tooltip, { content: inlineStyleWarningContent(blockedBy), disabled: blockedBy === null, children: grid });
|
|
140
|
+
}
|
|
141
|
+
function normalizeFlexJustify(value) {
|
|
142
|
+
// Computed `normal` behaves as `flex-start` for flex containers, so show the physical placement.
|
|
143
|
+
return value === "normal" ? "flex-start" : value;
|
|
144
|
+
}
|
|
145
|
+
function normalizeFlexAlign(value) {
|
|
146
|
+
// `normal` resolves to stretch for flex items.
|
|
147
|
+
return value === "normal" ? "stretch" : value;
|
|
148
|
+
}
|
|
149
|
+
export function useComputedLayoutValue(domElement, property, fallback, revision) {
|
|
150
|
+
const [value, setValue] = useState(() => readLayoutValue(domElement, property, fallback));
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
setValue(readLayoutValue(domElement, property, fallback));
|
|
153
|
+
}, [domElement, property, fallback, revision]);
|
|
154
|
+
return [value, setValue];
|
|
155
|
+
}
|
|
156
|
+
function readLayoutValue(domElement, property, fallback) {
|
|
157
|
+
return getStateStyleValue(domElement, property, fallback);
|
|
158
|
+
}
|
|
@@ -12,7 +12,10 @@ export interface GapFieldProps {
|
|
|
12
12
|
entries: TokenEntry[];
|
|
13
13
|
tokenRows: ResolvedProperty[];
|
|
14
14
|
leading?: ReactNode;
|
|
15
|
+
trailing?: ReactNode;
|
|
16
|
+
/** Replaces the shown value (and ignores the token) while another property overrides the gap, such as `Auto`. */
|
|
17
|
+
displayOverride?: string;
|
|
18
|
+
interceptRaw?: (value: string) => boolean;
|
|
15
19
|
onAfterEdit?: () => void;
|
|
16
20
|
}
|
|
17
|
-
|
|
18
|
-
export declare function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, onAfterEdit, }: GapFieldProps): ReactElement;
|
|
21
|
+
export declare function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, trailing, displayOverride, interceptRaw, onAfterEdit, }: GapFieldProps): ReactElement;
|
|
@@ -3,8 +3,7 @@ import { TokenField } from "../tokens/TokenField.js";
|
|
|
3
3
|
import { formatInspectorLabel } from "../ui/labels.js";
|
|
4
4
|
import { meaningfulLayoutValue } from "./layoutValue.js";
|
|
5
5
|
export const GAP_PRESETS = ["0", "0.25rem", "0.5rem", "0.75rem", "1rem", "1.5rem", "2rem", "3rem"];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return (_jsx("span", { className: "layout-combo", "data-test": "layout-combo", "data-property": property, children: _jsx(TokenField, { property: property, selection: selection, tokenRow: tokenRow, initialValue: meaningfulLayoutValue(el, property), domElement: el, editTarget: editTarget, entries: entries, suggestions: GAP_PRESETS, leading: leading, inputDataTest: `layout-combo-input-${property}`, label: formatInspectorLabel(property), chipVariant: "small", inlineWarningDataTest: "layout-combo-blocked", inlineWarningTooltipDataTest: "layout-combo-blocked-tooltip", onAfterEdit: onAfterEdit }) }));
|
|
6
|
+
export function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, trailing, displayOverride, interceptRaw, onAfterEdit, }) {
|
|
7
|
+
const tokenRow = displayOverride !== undefined ? null : tokenRows.find((row) => row.property === property) ?? null;
|
|
8
|
+
return (_jsx("span", { className: "layout-combo", "data-test": "layout-combo", "data-property": property, children: _jsx(TokenField, { property: property, selection: selection, tokenRow: tokenRow, initialValue: meaningfulLayoutValue(el, property), displayValue: displayOverride, domElement: el, editTarget: editTarget, entries: entries, suggestions: GAP_PRESETS, leading: leading, trailing: trailing, interceptRaw: interceptRaw, inputDataTest: `layout-combo-input-${property}`, label: formatInspectorLabel(property), chipVariant: "small", inlineWarningDataTest: "layout-combo-blocked", inlineWarningTooltipDataTest: "layout-combo-blocked-tooltip", onAfterEdit: onAfterEdit }) }));
|
|
10
9
|
}
|
|
@@ -6,9 +6,4 @@ export interface GridChildSectionProps {
|
|
|
6
6
|
revision?: number;
|
|
7
7
|
onAfterEdit?: () => void;
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
* Grid child controls expose only placement starts and per-axis alignment.
|
|
11
|
-
* All edits commit as managed CSS declarations. Moving a start line preserves
|
|
12
|
-
* an existing span where CSS makes that span unambiguous.
|
|
13
|
-
*/
|
|
14
9
|
export declare function GridChildSection({ domElement: el, editTarget, revision, onAfterEdit, }: GridChildSectionProps): ReactElement;
|
|
@@ -67,11 +67,6 @@ function AlignmentControl({ axis, value, elements, onChange }) {
|
|
|
67
67
|
testId: `layout-grid-child-align-${axis}-${option.value}`,
|
|
68
68
|
})), onChange: onChange, allowDeselect: true, onDeselect: () => onChange("auto") }), _jsx(InlineStyleWarning, { blockedBy: blockedBy })] }));
|
|
69
69
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Grid child controls expose only placement starts and per-axis alignment.
|
|
72
|
-
* All edits commit as managed CSS declarations. Moving a start line preserves
|
|
73
|
-
* an existing span where CSS makes that span unambiguous.
|
|
74
|
-
*/
|
|
75
70
|
export function GridChildSection({ domElement: el, editTarget, revision = 0, onAfterEdit, }) {
|
|
76
71
|
const target = editTarget ?? el;
|
|
77
72
|
const elements = targetElements(target);
|
|
@@ -8,6 +8,6 @@ export interface GridPickerProps {
|
|
|
8
8
|
revision?: number;
|
|
9
9
|
onAfterEdit?: () => void;
|
|
10
10
|
}
|
|
11
|
-
/**
|
|
11
|
+
/** Null when the browser determines the track count (auto-fill/auto-fit, none, subgrid). */
|
|
12
12
|
export declare function countGridTracks(value: string): number | null;
|
|
13
13
|
export declare function GridPicker({ domElement: el, editTarget, revision, onAfterEdit }: GridPickerProps): ReactElement;
|
|
@@ -47,7 +47,7 @@ function splitTrackList(value) {
|
|
|
47
47
|
parts.push(value.slice(start).trim());
|
|
48
48
|
return parts;
|
|
49
49
|
}
|
|
50
|
-
/**
|
|
50
|
+
/** Null when the browser determines the track count (auto-fill/auto-fit, none, subgrid). */
|
|
51
51
|
export function countGridTracks(value) {
|
|
52
52
|
const trimmed = value.trim();
|
|
53
53
|
if (!trimmed || /^(?:none|subgrid)$/i.test(trimmed))
|
|
@@ -112,9 +112,7 @@ export function GridPicker({ domElement: el, editTarget, revision = 0, onAfterEd
|
|
|
112
112
|
if (!picker)
|
|
113
113
|
return;
|
|
114
114
|
const target = event.target;
|
|
115
|
-
//
|
|
116
|
-
// retargeted `event.target`. Use the composed path so pointer-downs on
|
|
117
|
-
// the grid cells are not mistaken for outside clicks.
|
|
115
|
+
// Shadow-root events are retargeted to the host for document listeners, so use the composed path.
|
|
118
116
|
if (event.composedPath().includes(picker))
|
|
119
117
|
return;
|
|
120
118
|
if (target instanceof Node && picker.contains(target))
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import type { ReactElement } from "react";
|
|
2
|
-
import type { TokenEntry } from "../../css/model/index.js";
|
|
3
|
-
import type { ResolvedProperty } from "../../css/model/index.js";
|
|
2
|
+
import type { ResolvedProperty, TokenEntry } from "../../css/model/index.js";
|
|
4
3
|
import type { EditTarget } from "../selection/editTarget.js";
|
|
5
4
|
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
6
|
-
export interface
|
|
5
|
+
export interface GridControlProps {
|
|
7
6
|
domElement: HTMLElement;
|
|
8
7
|
editTarget?: EditTarget;
|
|
9
8
|
selection?: StyleSelection | null;
|
|
10
|
-
entries: TokenEntry[];
|
|
11
|
-
tokenRows: ResolvedProperty[];
|
|
12
|
-
showContainer: boolean;
|
|
13
|
-
showChild: boolean;
|
|
14
9
|
revision?: number;
|
|
15
10
|
onAfterEdit?: () => void;
|
|
16
11
|
}
|
|
17
|
-
export
|
|
12
|
+
export interface GridContainerControlsProps extends GridControlProps {
|
|
13
|
+
entries: TokenEntry[];
|
|
14
|
+
tokenRows: ResolvedProperty[];
|
|
15
|
+
}
|
|
16
|
+
/** Track templates, flow and content alignment: the grid container settings the cell picker does not cover. */
|
|
17
|
+
export declare function GridAdvancedFields({ domElement, editTarget, selection, revision, onAfterEdit, }: GridControlProps): ReactElement;
|
|
18
|
+
/** The cell picker beside the row and column gap fields. */
|
|
19
|
+
export declare function GridContainerControls({ domElement, editTarget, selection, entries, tokenRows, revision, onAfterEdit, }: GridContainerControlsProps): ReactElement;
|