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,108 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { IconBorderCorners, IconRadiusBottomLeft, IconRadiusBottomRight, IconRadiusTopLeft, IconRadiusTopRight, } from "@tabler/icons-react";
|
|
4
|
+
import { ToggleButton } from "../ui/ToggleButton.js";
|
|
5
|
+
import { findTokenRow, metadataFor } from "./rowLookup.js";
|
|
6
|
+
import { TokenField } from "../tokens/TokenField.js";
|
|
7
|
+
import { setStyle } from "../tokens/editActions.js";
|
|
8
|
+
import { SideControls, SIDE_NAMES } from "../ui/SideValuesField.js";
|
|
9
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
10
|
+
import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
|
|
11
|
+
import { completeCssValue } from "./completeCssValue.js";
|
|
12
|
+
import { valuePolicyFor } from "./valuePolicy.js";
|
|
13
|
+
const BORDER_RADIUS_CORNERS = [
|
|
14
|
+
"border-top-left-radius",
|
|
15
|
+
"border-top-right-radius",
|
|
16
|
+
"border-bottom-right-radius",
|
|
17
|
+
"border-bottom-left-radius",
|
|
18
|
+
];
|
|
19
|
+
const BORDER_RADIUS_ICONS = [
|
|
20
|
+
IconRadiusTopLeft,
|
|
21
|
+
IconRadiusTopRight,
|
|
22
|
+
IconRadiusBottomRight,
|
|
23
|
+
IconRadiusBottomLeft,
|
|
24
|
+
];
|
|
25
|
+
const BORDER_RADIUS_LABELS = ["Top Left", "Top Right", "Bottom Right", "Bottom Left"];
|
|
26
|
+
function cornerAuthoredSignature(rows, corner) {
|
|
27
|
+
const row = findTokenRow(rows, corner);
|
|
28
|
+
return `${row?.authored ?? row?.declaredValue ?? ""}|${row?.tokenName ?? ""}`;
|
|
29
|
+
}
|
|
30
|
+
function cornersAreLinked(rows) {
|
|
31
|
+
const signatures = BORDER_RADIUS_CORNERS.map((corner) => cornerAuthoredSignature(rows, corner));
|
|
32
|
+
return new Set(signatures).size === 1;
|
|
33
|
+
}
|
|
34
|
+
function linkAllCorners(target, rows, selection, onAfterEdit) {
|
|
35
|
+
const firstRow = findTokenRow(rows, BORDER_RADIUS_CORNERS[0]);
|
|
36
|
+
const selectedValue = selection && selection.elements.length > 1
|
|
37
|
+
? selection.getProperty(BORDER_RADIUS_CORNERS[0])?.value
|
|
38
|
+
: null;
|
|
39
|
+
const sharedValue = (selectedValue?.kind === "common" ? selectedValue.value : undefined)
|
|
40
|
+
?? firstRow?.authored
|
|
41
|
+
?? firstRow?.declaredValue
|
|
42
|
+
?? "";
|
|
43
|
+
if (!sharedValue)
|
|
44
|
+
return;
|
|
45
|
+
setStyle(target, "border-radius", sharedValue);
|
|
46
|
+
onAfterEdit?.();
|
|
47
|
+
}
|
|
48
|
+
export function BorderRadiusEditor(props) {
|
|
49
|
+
const { element, selection, entries, tokenRows = [], onAfterEdit, embedded = false } = props;
|
|
50
|
+
const el = element.domElement;
|
|
51
|
+
const editTarget = selection?.target ?? el;
|
|
52
|
+
const isGroup = Boolean(selection && selection.elements.length > 1);
|
|
53
|
+
const allEntries = entries ?? getNudgeUiTokenEntries();
|
|
54
|
+
const dataLinked = !isGroup && cornersAreLinked(tokenRows);
|
|
55
|
+
const [userUnlinked, setUserUnlinked] = useState(false);
|
|
56
|
+
const [userLinked, setUserLinked] = useState(false);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
setUserUnlinked(false);
|
|
59
|
+
setUserLinked(false);
|
|
60
|
+
}, [el]);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (dataLinked)
|
|
63
|
+
setUserLinked(false);
|
|
64
|
+
else
|
|
65
|
+
setUserUnlinked(false);
|
|
66
|
+
}, [dataLinked]);
|
|
67
|
+
const isLinked = dataLinked ? !userUnlinked : userLinked;
|
|
68
|
+
function handleExpand() {
|
|
69
|
+
setUserUnlinked(true);
|
|
70
|
+
setUserLinked(false);
|
|
71
|
+
}
|
|
72
|
+
function handleCollapse() {
|
|
73
|
+
setUserLinked(true);
|
|
74
|
+
setUserUnlinked(false);
|
|
75
|
+
linkAllCorners(editTarget, tokenRows, selection, onAfterEdit);
|
|
76
|
+
}
|
|
77
|
+
const cornerSides = BORDER_RADIUS_CORNERS.map((corner, index) => ({
|
|
78
|
+
side: SIDE_NAMES[index],
|
|
79
|
+
sideLabel: BORDER_RADIUS_LABELS[index],
|
|
80
|
+
icon: (() => {
|
|
81
|
+
const Icon = BORDER_RADIUS_ICONS[index];
|
|
82
|
+
return _jsx(Icon, { className: "side-values__icon side-values__side-icon", size: 16, "aria-hidden": "true" });
|
|
83
|
+
})(),
|
|
84
|
+
control: (_jsx(TokenField, { property: corner, selection: selection, tokenRow: findTokenRow(tokenRows, corner), domElement: el, editTarget: editTarget, entries: allEntries, editMetadata: metadataFor(findTokenRow(tokenRows, corner)), onAfterEdit: onAfterEdit, chipVariant: "small" })),
|
|
85
|
+
}));
|
|
86
|
+
const linkedTokenRow = () => {
|
|
87
|
+
const first = findTokenRow(tokenRows, BORDER_RADIUS_CORNERS[0]);
|
|
88
|
+
if (!first)
|
|
89
|
+
return null;
|
|
90
|
+
return { ...first, property: "border-radius" };
|
|
91
|
+
};
|
|
92
|
+
const borderRadiusRow = findTokenRow(tokenRows, "border-radius") ?? linkedTokenRow();
|
|
93
|
+
const mixed = !dataLinked;
|
|
94
|
+
const groupedControl = (_jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-radius", selection: selection, tokenRow: mixed ? null : borderRadiusRow, initialValue: mixed ? "Mix" : undefined, displayValue: mixed ? "Mix" : undefined, domElement: el, editTarget: editTarget, entries: allEntries, editMetadata: metadataFor(borderRadiusRow), mixed: mixed, formatRawValue: (value) => mixed && value.trim().toLowerCase() === "mix"
|
|
95
|
+
? ""
|
|
96
|
+
: completeCssValue(value.trim(), valuePolicyFor("border-radius")), onAfterEdit: onAfterEdit, chipVariant: "small" }) }));
|
|
97
|
+
const toggleButton = (_jsx(ToggleButton, { className: embedded ? "border-radius-editor__toggle" : undefined, variant: "quiet", size: "default", "data-test": isLinked ? "border-radius-expand" : "border-radius-collapse", label: isLinked ? "Edit Individual Corners" : "Link All Corners", title: isLinked ? "Edit Individual Corners" : "Link All Corners", pressed: !isLinked, onPressedChange: (pressed) => {
|
|
98
|
+
if (pressed)
|
|
99
|
+
handleExpand();
|
|
100
|
+
else
|
|
101
|
+
handleCollapse();
|
|
102
|
+
}, children: _jsx(IconBorderCorners, { size: "var(--icon-size-small)", "aria-hidden": "true" }) }));
|
|
103
|
+
const individuals = !isLinked ? (_jsx("div", { className: "border-radius-editor__individuals", children: _jsx(SideControls, { label: "Border Radius Corners", layout: "corners", sides: cornerSides }) })) : null;
|
|
104
|
+
if (embedded) {
|
|
105
|
+
return (_jsxs("div", { className: "border-radius-editor border-radius-editor--embedded", "data-test": "border-radius-editor", "data-expanded": !isLinked ? "true" : "false", children: [_jsxs("div", { className: "border-radius-editor__main", children: [_jsx("div", { className: "appearance__field-header", children: _jsx("div", { className: "appearance__field-label", children: "Corner Radius" }) }), groupedControl] }), toggleButton, individuals] }));
|
|
106
|
+
}
|
|
107
|
+
return (_jsxs("div", { className: "editor border-radius-editor", "data-test": "border-radius-editor", "data-expanded": !isLinked ? "true" : "false", children: [_jsxs("div", { className: "border-radius-editor__main", children: [_jsx("div", { className: "editor__title-row", children: _jsx("div", { className: "editor__title", children: "Border Radius" }) }), _jsxs("div", { className: "border-radius__grouped-row", children: [groupedControl, toggleButton] })] }), individuals] }));
|
|
108
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { TokenEntry } from "../../css/model/index.js";
|
|
3
|
+
import type { ResolvedProperty } from "../../css/model/index.js";
|
|
4
|
+
import type { SelectedElement } from "../selection/selectionStore.js";
|
|
5
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
6
|
+
export interface BoxShadowEditorProps {
|
|
7
|
+
element: SelectedElement;
|
|
8
|
+
selection?: StyleSelection | null;
|
|
9
|
+
entries?: TokenEntry[];
|
|
10
|
+
tokenRows?: ResolvedProperty[];
|
|
11
|
+
onAfterEdit?: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function BoxShadowEditor(props: BoxShadowEditorProps): ReactElement;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { TokenField } from "../tokens/TokenField.js";
|
|
3
|
+
import { FieldRow } from "../ui/FieldRow.js";
|
|
4
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
5
|
+
import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
|
|
6
|
+
export function BoxShadowEditor(props) {
|
|
7
|
+
const { element, selection, entries, tokenRows = [], onAfterEdit } = props;
|
|
8
|
+
const el = element.domElement;
|
|
9
|
+
const editTarget = selection?.target ?? el;
|
|
10
|
+
const allEntries = entries ?? getNudgeUiTokenEntries();
|
|
11
|
+
const tokenRow = tokenRows.find((row) => row.property === "box-shadow") ?? null;
|
|
12
|
+
return (_jsxs("div", { className: "editor", "data-test": "box-shadow-editor", children: [_jsx("div", { className: "editor__title", children: "Box Shadow" }), _jsx("div", { className: "property", children: _jsx(FieldRow, { label: "Box Shadow", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "box-shadow", selection: selection, tokenRow: tokenRow, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) }) })] }));
|
|
13
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { TokenEntry } from "../../css/model/index.js";
|
|
3
|
+
import type { SelectedElement } from "../selection/selectionStore.js";
|
|
4
|
+
import type { ResolvedProperty } from "../../css/model/index.js";
|
|
5
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
6
|
+
export interface ColorPickerProps {
|
|
7
|
+
element: SelectedElement;
|
|
8
|
+
selection?: StyleSelection | null;
|
|
9
|
+
property?: string;
|
|
10
|
+
entries?: TokenEntry[];
|
|
11
|
+
tokenRow?: ResolvedProperty | null;
|
|
12
|
+
onAfterEdit?: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function isEmptyColorValue(value: string): boolean;
|
|
15
|
+
export declare function ColorPicker(props: ColorPickerProps): ReactElement;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { IconMinus, IconPlus } from "@tabler/icons-react";
|
|
4
|
+
import { getStateStyleValue } from "../shell/stateValue.js";
|
|
5
|
+
import { TokenField } from "../tokens/TokenField.js";
|
|
6
|
+
import { formatInspectorLabel } from "../ui/labels.js";
|
|
7
|
+
import { IconButton } from "../ui/IconButton.js";
|
|
8
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
9
|
+
import { setStyle } from "../tokens/editActions.js";
|
|
10
|
+
import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
|
|
11
|
+
function colorSectionTitle(property) {
|
|
12
|
+
if (property === "background-color")
|
|
13
|
+
return "Background Color";
|
|
14
|
+
if (property === "color")
|
|
15
|
+
return "Color";
|
|
16
|
+
return formatInspectorLabel(property);
|
|
17
|
+
}
|
|
18
|
+
function isZeroColorComponent(value) {
|
|
19
|
+
return /^0(?:\.0+)?%?$/.test(value.trim());
|
|
20
|
+
}
|
|
21
|
+
export function isEmptyColorValue(value) {
|
|
22
|
+
const normalized = value.trim().toLowerCase();
|
|
23
|
+
if (!normalized || normalized === "none" || normalized === "transparent")
|
|
24
|
+
return true;
|
|
25
|
+
if (/^#(?:0000|00000000)$/.test(normalized))
|
|
26
|
+
return true;
|
|
27
|
+
const match = normalized.match(/^rgba?\((.*)\)$/);
|
|
28
|
+
if (!match)
|
|
29
|
+
return false;
|
|
30
|
+
const components = match[1].split(/[\s,/]+/).filter(Boolean);
|
|
31
|
+
return components.length === 4
|
|
32
|
+
&& components.slice(0, 3).every(isZeroColorComponent)
|
|
33
|
+
&& isZeroColorComponent(components[3]);
|
|
34
|
+
}
|
|
35
|
+
export function ColorPicker(props) {
|
|
36
|
+
const { element, selection, property = "color", entries, tokenRow, onAfterEdit } = props;
|
|
37
|
+
const el = element.domElement;
|
|
38
|
+
const selectedElements = useMemo(() => selection?.elements ?? [element], [element, selection]);
|
|
39
|
+
const target = selection?.target ?? el;
|
|
40
|
+
const allEntries = entries ?? getNudgeUiTokenEntries();
|
|
41
|
+
const declaredValue = tokenRow?.declaredValue?.trim() ?? "";
|
|
42
|
+
const paintedValue = getStateStyleValue(el, property);
|
|
43
|
+
const resolvedValue = tokenRow?.resolvedValue ?? paintedValue;
|
|
44
|
+
// An explicit declaration remains meaningful even when it paints as empty
|
|
45
|
+
// for text color (for example `transparent` or `var(--missing, transparent)`).
|
|
46
|
+
// A transparent background, however, is the empty state represented by the
|
|
47
|
+
// remove action and should not remain visible as an authored value.
|
|
48
|
+
const emptyValues = selectedElements.map((selected) => getStateStyleValue(selected.domElement, property));
|
|
49
|
+
const isEmpty = selectedElements.length > 1
|
|
50
|
+
? emptyValues.every((value) => isEmptyColorValue(value))
|
|
51
|
+
: property === "background-color"
|
|
52
|
+
? isEmptyColorValue(declaredValue) || isEmptyColorValue(resolvedValue) || isEmptyColorValue(paintedValue)
|
|
53
|
+
: declaredValue.length === 0 && isEmptyColorValue(resolvedValue);
|
|
54
|
+
const [fieldAdded, setFieldAdded] = useState(false);
|
|
55
|
+
const [backgroundRemoved, setBackgroundRemoved] = useState(false);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
setFieldAdded(false);
|
|
58
|
+
setBackgroundRemoved(false);
|
|
59
|
+
}, [el, property, selectedElements]);
|
|
60
|
+
function handleAfterEdit() {
|
|
61
|
+
setFieldAdded(false);
|
|
62
|
+
setBackgroundRemoved(false);
|
|
63
|
+
onAfterEdit?.();
|
|
64
|
+
}
|
|
65
|
+
const showTokenField = (!isEmpty && !backgroundRemoved) || fieldAdded;
|
|
66
|
+
function handleRemoveColor() {
|
|
67
|
+
setStyle(target, property, "transparent");
|
|
68
|
+
setFieldAdded(false);
|
|
69
|
+
setBackgroundRemoved(property === "background-color");
|
|
70
|
+
onAfterEdit?.();
|
|
71
|
+
}
|
|
72
|
+
return (_jsxs("div", { className: `editor`, "data-test": "color-picker", "data-property": property, children: [_jsxs("div", { className: "editor__title-row", children: [_jsx("div", { className: "editor__title", children: colorSectionTitle(property) }), showTokenField ? (_jsx(IconButton, { variant: "quiet", label: `Remove ${colorSectionTitle(property)}`, "data-test": "remove-color", className: "color__remove", onClick: handleRemoveColor, children: _jsx(IconMinus, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) })) : (_jsx(IconButton, { variant: "quiet", label: `Add ${colorSectionTitle(property)}`, "data-test": "add-color", className: "color__add", onClick: () => setFieldAdded(true), children: _jsx(IconPlus, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) }))] }), showTokenField && (_jsx("div", { className: "color", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: property, tokenRow: isEmpty ? null : tokenRow, selection: selection, initialValue: isEmpty ? "" : undefined, domElement: el, editTarget: target, entries: allEntries, onAfterEdit: handleAfterEdit }) }) }))] }));
|
|
73
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { TokenEntry } from "../../css/model/index.js";
|
|
3
|
+
import type { ResolvedProperty } from "../../css/model/index.js";
|
|
4
|
+
import type { EditTarget } from "../selection/editTarget.js";
|
|
5
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
6
|
+
export declare const GAP_PRESETS: string[];
|
|
7
|
+
export interface GapFieldProps {
|
|
8
|
+
property: "row-gap" | "column-gap";
|
|
9
|
+
domElement: HTMLElement;
|
|
10
|
+
editTarget?: EditTarget;
|
|
11
|
+
selection?: StyleSelection | null;
|
|
12
|
+
entries: TokenEntry[];
|
|
13
|
+
tokenRows: ResolvedProperty[];
|
|
14
|
+
onAfterEdit?: () => void;
|
|
15
|
+
}
|
|
16
|
+
/** Renders a gap value with a token chip or the legacy raw-value fallback. */
|
|
17
|
+
export declare function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, onAfterEdit, }: GapFieldProps): ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { TokenField } from "../tokens/TokenField.js";
|
|
3
|
+
import { formatInspectorLabel } from "../ui/labels.js";
|
|
4
|
+
import { inlineAuthoredValue, meaningfulLayoutValue } from "./layoutValue.js";
|
|
5
|
+
import { LayoutBlockedIndicator } from "./LayoutBlockedIndicator.js";
|
|
6
|
+
export const GAP_PRESETS = ["0", "0.25rem", "0.5rem", "0.75rem", "1rem", "1.5rem", "2rem", "3rem"];
|
|
7
|
+
/** Renders a gap value with a token chip or the legacy raw-value fallback. */
|
|
8
|
+
export function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, onAfterEdit, }) {
|
|
9
|
+
const tokenRow = tokenRows.find((row) => row.property === property) ?? null;
|
|
10
|
+
const blockedBy = inlineAuthoredValue(el, property);
|
|
11
|
+
return (_jsxs("span", { className: `layout-combo${blockedBy ? " layout-combo--blocked" : ""}`, "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, inputDataTest: `layout-combo-input-${property}`, label: formatInspectorLabel(property), chipVariant: "small", disabled: blockedBy !== null, onAfterEdit: onAfterEdit }), blockedBy ? _jsx(LayoutBlockedIndicator, { blockedBy: blockedBy }) : null] }));
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { EditTarget } from "../selection/editTarget.js";
|
|
3
|
+
export interface GridChildSectionProps {
|
|
4
|
+
domElement: HTMLElement;
|
|
5
|
+
editTarget?: EditTarget;
|
|
6
|
+
revision?: number;
|
|
7
|
+
onAfterEdit?: () => void;
|
|
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
|
+
export declare function GridChildSection({ domElement: el, editTarget, revision, onAfterEdit, }: GridChildSectionProps): ReactElement;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { IconAlignBoxCenterBottom, IconAlignBoxCenterMiddle, IconAlignBoxCenterStretch, IconAlignBoxCenterTop, IconAlignBoxLeftMiddle, IconAlignBoxRightMiddle, IconColumns2, IconLayoutRows, } from "@tabler/icons-react";
|
|
4
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
5
|
+
import { FieldRow } from "../ui/FieldRow.js";
|
|
6
|
+
import { SegmentedControl } from "../ui/SegmentedControl.js";
|
|
7
|
+
import { TextInput } from "../ui/TextInput.js";
|
|
8
|
+
import { commitGridAxisPlacement, commitGridChildAlignment, readGridAxisPlacement, readGridChildAlignment, } from "./gridChildModel.js";
|
|
9
|
+
function readAxis(el, axis) {
|
|
10
|
+
return { placement: readGridAxisPlacement(el, axis) };
|
|
11
|
+
}
|
|
12
|
+
function AxisPlacementRow({ axis, label, state, onStart }) {
|
|
13
|
+
const [draft, setDraft] = useState(state.placement.start);
|
|
14
|
+
const draftRef = useRef(draft);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
draftRef.current = state.placement.start;
|
|
17
|
+
setDraft(state.placement.start);
|
|
18
|
+
}, [state.placement.start]);
|
|
19
|
+
function updateDraft(next) {
|
|
20
|
+
draftRef.current = next;
|
|
21
|
+
setDraft(next);
|
|
22
|
+
}
|
|
23
|
+
function commit() {
|
|
24
|
+
const next = draftRef.current.trim() || "auto";
|
|
25
|
+
updateDraft(next);
|
|
26
|
+
if (next !== state.placement.start)
|
|
27
|
+
onStart(next);
|
|
28
|
+
}
|
|
29
|
+
const AxisIcon = axis === "column" ? IconColumns2 : IconLayoutRows;
|
|
30
|
+
return (_jsx(FieldRow, { label: label, className: `field-row--stacked layout__grid-child-placement layout__grid-child-placement--${axis}`, "data-test": `layout-grid-child-${axis}`, children: _jsxs(ControlSurface, { children: [_jsx(AxisIcon, { className: "layout__grid-child-placement-icon", size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }), _jsx(TextInput, { appearance: "embedded", value: draft, "data-test": `layout-grid-child-${axis}-start`, "aria-label": label, onChange: (event) => updateDraft(event.target.value), onBlur: commit, onKeyDown: (event) => {
|
|
31
|
+
if (event.key === "Escape") {
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
updateDraft(state.placement.start);
|
|
34
|
+
event.currentTarget.blur();
|
|
35
|
+
}
|
|
36
|
+
else if (event.key === "Enter") {
|
|
37
|
+
event.preventDefault();
|
|
38
|
+
event.currentTarget.blur();
|
|
39
|
+
}
|
|
40
|
+
} })] }) }));
|
|
41
|
+
}
|
|
42
|
+
function AlignmentControl({ axis, value, onChange }) {
|
|
43
|
+
const horizontal = axis === "h";
|
|
44
|
+
const options = horizontal
|
|
45
|
+
? [
|
|
46
|
+
{ value: "start", label: "Align left", icon: _jsx(IconAlignBoxLeftMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
47
|
+
{ value: "center", label: "Align center", icon: _jsx(IconAlignBoxCenterMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
48
|
+
{ value: "end", label: "Align right", icon: _jsx(IconAlignBoxRightMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
49
|
+
{ value: "stretch", label: "Stretch horizontally", icon: _jsx(IconAlignBoxCenterStretch, { className: "layout__grid-child-align-icon--horizontal", size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
50
|
+
]
|
|
51
|
+
: [
|
|
52
|
+
{ value: "start", label: "Align top", icon: _jsx(IconAlignBoxCenterTop, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
53
|
+
{ value: "center", label: "Align middle", icon: _jsx(IconAlignBoxCenterMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
54
|
+
{ value: "end", label: "Align bottom", icon: _jsx(IconAlignBoxCenterBottom, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
55
|
+
{ value: "stretch", label: "Stretch vertically", icon: _jsx(IconAlignBoxCenterStretch, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
56
|
+
];
|
|
57
|
+
return (_jsx(FieldRow, { label: horizontal ? "Horizontal alignment" : "Vertical alignment", hideLabel: true, className: `field-row--stacked layout__grid-child-alignment layout__grid-child-alignment--${axis}`, "data-test": `layout-grid-child-align-${axis}`, children: _jsx(SegmentedControl, { value: value === "auto" ? null : value, "aria-label": horizontal ? "Horizontal alignment" : "Vertical alignment", "data-test": `layout-grid-child-select-${horizontal ? "justify-self" : "align-self"}`, className: "layout__grid-child-alignment-control", options: options.map((option) => ({
|
|
58
|
+
...option,
|
|
59
|
+
testId: `layout-grid-child-align-${axis}-${option.value}`,
|
|
60
|
+
})), onChange: onChange, allowDeselect: true, onDeselect: () => onChange("auto") }) }));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Grid child controls expose only placement starts and per-axis alignment.
|
|
64
|
+
* All edits commit as managed CSS declarations. Moving a start line preserves
|
|
65
|
+
* an existing span where CSS makes that span unambiguous.
|
|
66
|
+
*/
|
|
67
|
+
export function GridChildSection({ domElement: el, editTarget, revision = 0, onAfterEdit, }) {
|
|
68
|
+
const target = editTarget ?? el;
|
|
69
|
+
const [column, setColumn] = useState(() => readAxis(el, "column"));
|
|
70
|
+
const [row, setRow] = useState(() => readAxis(el, "row"));
|
|
71
|
+
const [alignH, setAlignH] = useState(() => readGridChildAlignment(el, "h"));
|
|
72
|
+
const [alignV, setAlignV] = useState(() => readGridChildAlignment(el, "v"));
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
setColumn(readAxis(el, "column"));
|
|
75
|
+
setRow(readAxis(el, "row"));
|
|
76
|
+
setAlignH(readGridChildAlignment(el, "h"));
|
|
77
|
+
setAlignV(readGridChildAlignment(el, "v"));
|
|
78
|
+
}, [el, revision]);
|
|
79
|
+
function handleAfterEdit() {
|
|
80
|
+
onAfterEdit?.();
|
|
81
|
+
}
|
|
82
|
+
function handleStart(axis, start) {
|
|
83
|
+
if (commitGridAxisPlacement(target, axis, { start, span: "keep" }).length > 0)
|
|
84
|
+
handleAfterEdit();
|
|
85
|
+
}
|
|
86
|
+
function handleAlignment(axis, value) {
|
|
87
|
+
if (commitGridChildAlignment(target, axis, value).length > 0)
|
|
88
|
+
handleAfterEdit();
|
|
89
|
+
}
|
|
90
|
+
return (_jsxs("div", { className: "layout__group layout__grid-child", "data-test": "layout-grid-child", children: [_jsx("div", { className: "editor__title", children: "Grid Child" }), _jsxs("div", { className: "layout__grid-child-fields", "data-test": "layout-grid-child-fields", children: [_jsx(AxisPlacementRow, { axis: "column", label: "Column", state: column, onStart: (start) => handleStart("column", start) }), _jsx(AxisPlacementRow, { axis: "row", label: "Row", state: row, onStart: (start) => handleStart("row", start) }), _jsx(AlignmentControl, { axis: "v", value: alignV, onChange: (value) => handleAlignment("v", value) }), _jsx(AlignmentControl, { axis: "h", value: alignH, onChange: (value) => handleAlignment("h", value) })] })] }));
|
|
91
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { EditTarget } from "../selection/editTarget.js";
|
|
3
|
+
export declare const GRID_PICKER_MAX_COLUMNS = 12;
|
|
4
|
+
export declare const GRID_PICKER_MAX_ROWS = 8;
|
|
5
|
+
export interface GridPickerProps {
|
|
6
|
+
domElement: HTMLElement;
|
|
7
|
+
editTarget?: EditTarget;
|
|
8
|
+
revision?: number;
|
|
9
|
+
onAfterEdit?: () => void;
|
|
10
|
+
}
|
|
11
|
+
/** Returns a definite track count, or null when CSS itself determines it. */
|
|
12
|
+
export declare function countGridTracks(value: string): number | null;
|
|
13
|
+
export declare function GridPicker({ domElement: el, editTarget, revision, onAfterEdit }: GridPickerProps): ReactElement;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
3
|
+
import { getLayoutValue } from "./layoutValue.js";
|
|
4
|
+
import { setStyles } from "../tokens/editActions.js";
|
|
5
|
+
export const GRID_PICKER_MAX_COLUMNS = 12;
|
|
6
|
+
export const GRID_PICKER_MAX_ROWS = 8;
|
|
7
|
+
function clampDimension(value, max) {
|
|
8
|
+
return Math.max(1, Math.min(max, Math.round(value)));
|
|
9
|
+
}
|
|
10
|
+
function splitTrackList(value) {
|
|
11
|
+
const parts = [];
|
|
12
|
+
let start = 0;
|
|
13
|
+
let depth = 0;
|
|
14
|
+
let quote = null;
|
|
15
|
+
let escaped = false;
|
|
16
|
+
for (let index = 0; index < value.length; index++) {
|
|
17
|
+
const char = value[index];
|
|
18
|
+
if (quote) {
|
|
19
|
+
if (escaped)
|
|
20
|
+
escaped = false;
|
|
21
|
+
else if (char === "\\")
|
|
22
|
+
escaped = true;
|
|
23
|
+
else if (char === quote)
|
|
24
|
+
quote = null;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (char === "\"" || char === "'") {
|
|
28
|
+
quote = char;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (char === "(")
|
|
32
|
+
depth++;
|
|
33
|
+
else if (char === ")")
|
|
34
|
+
depth = Math.max(0, depth - 1);
|
|
35
|
+
else if (/\s/.test(char) && depth === 0) {
|
|
36
|
+
if (value.slice(start, index).trim())
|
|
37
|
+
parts.push(value.slice(start, index).trim());
|
|
38
|
+
while (/\s/.test(value[index + 1] ?? ""))
|
|
39
|
+
index++;
|
|
40
|
+
start = index + 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (value.slice(start).trim())
|
|
44
|
+
parts.push(value.slice(start).trim());
|
|
45
|
+
return parts;
|
|
46
|
+
}
|
|
47
|
+
/** Returns a definite track count, or null when CSS itself determines it. */
|
|
48
|
+
export function countGridTracks(value) {
|
|
49
|
+
const trimmed = value.trim();
|
|
50
|
+
if (!trimmed || /^(?:none|subgrid)$/i.test(trimmed))
|
|
51
|
+
return null;
|
|
52
|
+
let count = 0;
|
|
53
|
+
for (const token of splitTrackList(trimmed)) {
|
|
54
|
+
const repeat = /^repeat\(\s*(\d+)\s*,/i.exec(token);
|
|
55
|
+
if (repeat) {
|
|
56
|
+
count += Number(repeat[1]);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (/^repeat\(/i.test(token))
|
|
60
|
+
return null;
|
|
61
|
+
if (/^\[.*\]$/s.test(token))
|
|
62
|
+
continue;
|
|
63
|
+
count++;
|
|
64
|
+
}
|
|
65
|
+
return count > 0 ? count : null;
|
|
66
|
+
}
|
|
67
|
+
function readDimensions(el) {
|
|
68
|
+
const columns = getLayoutValue(el, "grid-template-columns");
|
|
69
|
+
const rows = getLayoutValue(el, "grid-template-rows");
|
|
70
|
+
const authoredColumns = countGridTracks(columns.authored ?? "");
|
|
71
|
+
const authoredRows = countGridTracks(rows.authored ?? "");
|
|
72
|
+
const computedColumns = countGridTracks(columns.computed);
|
|
73
|
+
const computedRows = countGridTracks(rows.computed);
|
|
74
|
+
return {
|
|
75
|
+
columns: clampDimension(authoredColumns ?? computedColumns ?? 1, GRID_PICKER_MAX_COLUMNS),
|
|
76
|
+
rows: clampDimension(authoredRows ?? computedRows ?? 1, GRID_PICKER_MAX_ROWS),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function gridStyle(columns, rows) {
|
|
80
|
+
// SAFETY: CSSProperties allows custom properties through index signatures; the object only sets known custom properties.
|
|
81
|
+
return {
|
|
82
|
+
"--grid-picker-columns": columns,
|
|
83
|
+
"--grid-picker-rows": rows,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function cells(columns, rows) {
|
|
87
|
+
return Array.from({ length: columns * rows }, (_, index) => ({
|
|
88
|
+
column: (index % columns) + 1,
|
|
89
|
+
row: Math.floor(index / columns) + 1,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
export function GridPicker({ domElement: el, editTarget, revision = 0, onAfterEdit }) {
|
|
93
|
+
const [dimensions, setDimensions] = useState(() => readDimensions(el));
|
|
94
|
+
const [hovered, setHovered] = useState(null);
|
|
95
|
+
const [open, setOpen] = useState(false);
|
|
96
|
+
const [popoverPosition, setPopoverPosition] = useState(null);
|
|
97
|
+
const pickerRef = useRef(null);
|
|
98
|
+
const triggerRef = useRef(null);
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
setDimensions(readDimensions(el));
|
|
101
|
+
setHovered(null);
|
|
102
|
+
}, [el, revision]);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (!open)
|
|
105
|
+
return;
|
|
106
|
+
function closeOnOutsidePointer(event) {
|
|
107
|
+
const picker = pickerRef.current;
|
|
108
|
+
if (!picker)
|
|
109
|
+
return;
|
|
110
|
+
const target = event.target;
|
|
111
|
+
// Document listeners see a shadow-root event through its host as the
|
|
112
|
+
// retargeted `event.target`. Use the composed path so pointer-downs on
|
|
113
|
+
// the grid cells are not mistaken for outside clicks.
|
|
114
|
+
if (event.composedPath().includes(picker))
|
|
115
|
+
return;
|
|
116
|
+
if (target instanceof Node && picker.contains(target))
|
|
117
|
+
return;
|
|
118
|
+
setOpen(false);
|
|
119
|
+
setHovered(null);
|
|
120
|
+
}
|
|
121
|
+
document.addEventListener("pointerdown", closeOnOutsidePointer);
|
|
122
|
+
return () => document.removeEventListener("pointerdown", closeOnOutsidePointer);
|
|
123
|
+
}, [open]);
|
|
124
|
+
useLayoutEffect(() => {
|
|
125
|
+
if (!open)
|
|
126
|
+
return;
|
|
127
|
+
function updatePopoverPosition() {
|
|
128
|
+
const trigger = triggerRef.current;
|
|
129
|
+
if (!trigger)
|
|
130
|
+
return;
|
|
131
|
+
const rect = trigger.getBoundingClientRect();
|
|
132
|
+
setPopoverPosition({
|
|
133
|
+
left: rect.left + (rect.width / 2),
|
|
134
|
+
top: rect.bottom + 6,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
updatePopoverPosition();
|
|
138
|
+
window.addEventListener("resize", updatePopoverPosition);
|
|
139
|
+
window.addEventListener("scroll", updatePopoverPosition, true);
|
|
140
|
+
return () => {
|
|
141
|
+
window.removeEventListener("resize", updatePopoverPosition);
|
|
142
|
+
window.removeEventListener("scroll", updatePopoverPosition, true);
|
|
143
|
+
};
|
|
144
|
+
}, [open]);
|
|
145
|
+
function choose(columns, rows) {
|
|
146
|
+
const next = {
|
|
147
|
+
columns: clampDimension(columns, GRID_PICKER_MAX_COLUMNS),
|
|
148
|
+
rows: clampDimension(rows, GRID_PICKER_MAX_ROWS),
|
|
149
|
+
};
|
|
150
|
+
setDimensions(next);
|
|
151
|
+
setHovered(null);
|
|
152
|
+
setOpen(false);
|
|
153
|
+
if (setStyles(editTarget ?? el, [
|
|
154
|
+
{ property: "grid-template-columns", value: `repeat(${next.columns}, minmax(0, 1fr))` },
|
|
155
|
+
{ property: "grid-template-rows", value: `repeat(${next.rows}, minmax(0, 1fr))` },
|
|
156
|
+
]).length > 0) {
|
|
157
|
+
onAfterEdit?.();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const previewCells = cells(dimensions.columns, dimensions.rows);
|
|
161
|
+
const pickerCells = cells(GRID_PICKER_MAX_COLUMNS, GRID_PICKER_MAX_ROWS);
|
|
162
|
+
const visible = hovered ?? dimensions;
|
|
163
|
+
return (_jsxs("div", { ref: pickerRef, className: "grid-picker", "data-test": "layout-grid-picker", onKeyDown: (event) => {
|
|
164
|
+
if (event.key === "Escape") {
|
|
165
|
+
setOpen(false);
|
|
166
|
+
setHovered(null);
|
|
167
|
+
}
|
|
168
|
+
}, children: [_jsx("button", { type: "button", className: "grid-picker__trigger", "data-test": "layout-grid-picker-trigger", ref: triggerRef, "aria-label": `Grid ${dimensions.columns} by ${dimensions.rows}`, "aria-expanded": open, "aria-haspopup": "dialog", onClick: () => {
|
|
169
|
+
setPopoverPosition(null);
|
|
170
|
+
setOpen((current) => !current);
|
|
171
|
+
}, children: _jsxs("span", { className: "grid-picker__preview", style: gridStyle(dimensions.columns, dimensions.rows), "aria-hidden": "true", children: [previewCells.map(({ column, row }) => (_jsx("span", { className: "grid-picker__preview-cell" }, `${column}-${row}`))), _jsxs("span", { className: "grid-picker__preview-label", children: [dimensions.columns, " \u00D7 ", dimensions.rows] })] }) }), open ? (_jsxs("div", { className: "grid-picker__popover", "data-test": "layout-grid-picker-popover", role: "dialog", "aria-label": "Choose grid size", style: popoverPosition ? {
|
|
172
|
+
left: popoverPosition.left,
|
|
173
|
+
top: popoverPosition.top,
|
|
174
|
+
visibility: "visible",
|
|
175
|
+
} : undefined, children: [_jsx("div", { className: "grid-picker__cell-grid", style: gridStyle(GRID_PICKER_MAX_COLUMNS, GRID_PICKER_MAX_ROWS), children: pickerCells.map(({ column, row }) => {
|
|
176
|
+
const active = column <= visible.columns && row <= visible.rows;
|
|
177
|
+
return (_jsx("button", { type: "button", className: `grid-picker__cell${active ? " grid-picker__cell--active" : ""}`, "data-test": `layout-grid-cell-${column}-${row}`, "aria-label": `${column} columns by ${row} rows`, onMouseEnter: () => setHovered({ columns: column, rows: row }), onFocus: () => setHovered({ columns: column, rows: row }), onClick: () => choose(column, row) }, `${column}-${row}`));
|
|
178
|
+
}) }), _jsxs("div", { className: "grid-picker__popover-value", "aria-live": "polite", children: [visible.columns, " \u00D7 ", visible.rows] })] })) : null] }));
|
|
179
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { TokenEntry } from "../../css/model/index.js";
|
|
3
|
+
import type { ResolvedProperty } from "../../css/model/index.js";
|
|
4
|
+
import type { EditTarget } from "../selection/editTarget.js";
|
|
5
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
6
|
+
export interface GridSectionProps {
|
|
7
|
+
domElement: HTMLElement;
|
|
8
|
+
editTarget?: EditTarget;
|
|
9
|
+
selection?: StyleSelection | null;
|
|
10
|
+
entries: TokenEntry[];
|
|
11
|
+
tokenRows: ResolvedProperty[];
|
|
12
|
+
showContainer: boolean;
|
|
13
|
+
showChild: boolean;
|
|
14
|
+
revision?: number;
|
|
15
|
+
onAfterEdit?: () => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function GridSection({ domElement: el, editTarget, selection, entries, tokenRows, showContainer, showChild, revision, onAfterEdit, }: GridSectionProps): ReactElement;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { IconSettings, IconSpacingHorizontal, IconSpacingVertical } from "@tabler/icons-react";
|
|
4
|
+
import { GridPicker } from "./GridPicker.js";
|
|
5
|
+
import { GapField } from "./GapField.js";
|
|
6
|
+
import { LayoutDropdown } from "./LayoutDropdown.js";
|
|
7
|
+
import { GridValueField } from "./GridValueField.js";
|
|
8
|
+
import { GridChildSection } from "./GridChildSection.js";
|
|
9
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
10
|
+
import { IconButton } from "../ui/IconButton.js";
|
|
11
|
+
import { InspectorPopover } from "../ui/InspectorPopover.js";
|
|
12
|
+
const GRID_AUTO_FLOW_OPTIONS = ["row", "column", "row dense", "column dense"];
|
|
13
|
+
const GRID_CONTENT_ALIGNMENT_OPTIONS = [
|
|
14
|
+
"normal",
|
|
15
|
+
"start",
|
|
16
|
+
"end",
|
|
17
|
+
"center",
|
|
18
|
+
"stretch",
|
|
19
|
+
"space-between",
|
|
20
|
+
"space-around",
|
|
21
|
+
"space-evenly",
|
|
22
|
+
];
|
|
23
|
+
const GRID_ITEM_ALIGNMENT_OPTIONS = ["normal", "stretch", "start", "end", "center", "self-start", "self-end"];
|
|
24
|
+
export function GridSection({ domElement: el, editTarget, selection, entries, tokenRows, showContainer, showChild, revision = 0, onAfterEdit, }) {
|
|
25
|
+
const [advancedOpen, setAdvancedOpen] = useState(false);
|
|
26
|
+
return (_jsxs(_Fragment, { children: [showContainer ? _jsx("div", { className: "layout__group layout__grid", "data-test": "layout-grid-container", children: _jsxs("div", { className: "layout__grid-primary", children: [_jsxs("div", { className: "layout__grid-picker-column", children: [_jsxs("div", { className: "layout__grid-heading", children: [_jsx("div", { className: "editor__title", children: "Grid" }), _jsx(InspectorPopover, { "data-test": "layout-grid-settings", side: "bottom", align: "end", triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: "Grid settings", title: "Grid settings", "data-active": advancedOpen, "data-test": "layout-grid-settings", children: _jsx(IconSettings, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), open: advancedOpen, onOpenChange: setAdvancedOpen, children: _jsxs("div", { className: "layout__grid-advanced", "data-test": "layout-grid-advanced", children: [_jsx("div", { className: "editor__title", children: "Advanced grid CSS" }), _jsxs("div", { className: "layout__grid-fields", children: [_jsx(GridValueField, { property: "grid-template-columns", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-template-rows", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "grid-auto-flow", options: GRID_AUTO_FLOW_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-auto-columns", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-auto-rows", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit })] }), _jsxs("div", { className: "layout__grid-alignment", "data-test": "layout-grid-alignment", children: [_jsx(LayoutDropdown, { property: "justify-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "align-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "justify-items", options: GRID_ITEM_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "align-items", options: GRID_ITEM_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit })] })] }) })] }), _jsx(GridPicker, { domElement: el, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit })] }), _jsxs("div", { className: "layout__grid-gap", "data-test": "layout-grid-gap", children: [_jsx("div", { className: "editor__title", children: "Gap" }), _jsxs("div", { className: "layout__grid-gap-fields", children: [_jsxs(ControlSurface, { className: "layout__spacing-field", "data-test": "layout-grid-row-gap", children: [_jsx(IconSpacingVertical, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": "layout-spacing-icon-row-gap" }), _jsx(GapField, { property: "row-gap", domElement: el, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, onAfterEdit: onAfterEdit })] }), _jsxs(ControlSurface, { className: "layout__spacing-field", "data-test": "layout-grid-column-gap", children: [_jsx(IconSpacingHorizontal, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": "layout-spacing-icon-column-gap" }), _jsx(GapField, { property: "column-gap", domElement: el, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, onAfterEdit: onAfterEdit })] })] })] })] }) }) : null, showChild ? _jsx(GridChildSection, { domElement: el, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit }) : null] }));
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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 GridValueFieldProps {
|
|
5
|
+
property: string;
|
|
6
|
+
domElement: HTMLElement;
|
|
7
|
+
editTarget?: EditTarget;
|
|
8
|
+
selection?: StyleSelection | null;
|
|
9
|
+
revision?: number;
|
|
10
|
+
onAfterEdit?: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Raw CSS editor for Grid grammar. Track lists and line placement are not
|
|
14
|
+
* safely decomposable into numeric controls, so the authored expression is
|
|
15
|
+
* retained verbatim and committed as one managed longhand.
|
|
16
|
+
*/
|
|
17
|
+
export declare function GridValueField({ property, domElement: el, editTarget, selection, revision, onAfterEdit, }: GridValueFieldProps): ReactElement;
|