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,189 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { IconPlus } from "@tabler/icons-react";
|
|
4
|
+
import { findTokenRow, metadataFor } from "./rowLookup.js";
|
|
5
|
+
import { TokenField, TokenValueField } from "../tokens/TokenField.js";
|
|
6
|
+
import { IconButton } from "../ui/IconButton.js";
|
|
7
|
+
import { SideValuesField, SIDE_NAMES, MarginSideIndicator, } from "../ui/SideValuesField.js";
|
|
8
|
+
import { setStyles, swapTokens } from "../tokens/editActions.js";
|
|
9
|
+
import { completeCssValue } from "./completeCssValue.js";
|
|
10
|
+
import { valuePolicyFor } from "./valuePolicy.js";
|
|
11
|
+
import { projectInspectorValues, projectInspectorValuesForSelection, } from "../spacing/projection.js";
|
|
12
|
+
import { getStateStyleValue } from "../shell/stateValue.js";
|
|
13
|
+
export function SpacingBox(props) {
|
|
14
|
+
const { element, selection, entries, tokenRows = [], onAfterEdit } = props;
|
|
15
|
+
const el = element.domElement;
|
|
16
|
+
const allEntries = entries ?? [];
|
|
17
|
+
const projection = selection
|
|
18
|
+
? projectInspectorValuesForSelection(selection)
|
|
19
|
+
: projectInspectorValues(el, tokenRows);
|
|
20
|
+
const showRelativeInset = selection
|
|
21
|
+
? selection.supportsRole("relative-position")
|
|
22
|
+
: (() => {
|
|
23
|
+
const value = getStateStyleValue(el, "position", "static").trim().toLowerCase();
|
|
24
|
+
return value === "relative" || value === "sticky";
|
|
25
|
+
})();
|
|
26
|
+
const editTarget = selection?.target ?? el;
|
|
27
|
+
return (_jsxs("div", { className: "editor", "data-test": "spacing-box", children: [_jsx("div", { className: "editor__title", children: "Spacing" }), _jsxs("div", { className: "spacing", children: [_jsx(SpacingField, { property: "padding", projection: projection.spacing.padding, domElement: el, editTarget: editTarget, selection: selection, entries: allEntries, tokenRows: tokenRows, onAfterEdit: onAfterEdit }), _jsx(SpacingField, { property: "margin", projection: projection.spacing.margin, domElement: el, editTarget: editTarget, selection: selection, entries: allEntries, tokenRows: tokenRows, onAfterEdit: onAfterEdit }), showRelativeInset ? _jsx(SpacingField, { property: "inset", projection: projection.spacing.inset, domElement: el, editTarget: editTarget, selection: selection, entries: allEntries, tokenRows: tokenRows, onAfterEdit: onAfterEdit }) : null] })] }));
|
|
28
|
+
}
|
|
29
|
+
export function SpacingField({ property, projection: spacingProjection, domElement: el, editTarget, selection, entries, tokenRows, onAfterEdit, showLabel = true, showEmptyState = true, suggestions, }) {
|
|
30
|
+
const [fieldsAdded, setFieldsAdded] = useState(false);
|
|
31
|
+
const pairDefinitions = [
|
|
32
|
+
{ axis: "horizontal", sideProperties: [sideProperty(property, "right"), sideProperty(property, "left")] },
|
|
33
|
+
{ axis: "vertical", sideProperties: [sideProperty(property, "top"), sideProperty(property, "bottom")] },
|
|
34
|
+
];
|
|
35
|
+
const sideSlots = SIDE_NAMES.map((side) => ({
|
|
36
|
+
side,
|
|
37
|
+
icon: property === "padding" ? _jsx(PaddingSideIndicator, { side: side }) : _jsx(MarginSideIndicator, { side: side }),
|
|
38
|
+
control: (_jsx(TokenField, { property: sideProperty(property, side), selection: selection, tokenRow: findTokenRow(tokenRows, sideProperty(property, side)), domElement: el, editTarget: editTarget, entries: entries, suggestions: suggestions, editMetadata: metadataFor(findTokenRow(tokenRows, sideProperty(property, side))), onAfterEdit: onAfterEdit, chipVariant: "small" })),
|
|
39
|
+
}));
|
|
40
|
+
const spacingIsEmpty = SIDE_NAMES.every((side) => property === "inset"
|
|
41
|
+
? isEmptyInsetValue(spacingProjection.fields[side].value)
|
|
42
|
+
: isZeroSpacingValue(spacingProjection.fields[side].value));
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
setFieldsAdded(false);
|
|
45
|
+
}, [el]);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!spacingIsEmpty)
|
|
48
|
+
setFieldsAdded(false);
|
|
49
|
+
}, [spacingIsEmpty]);
|
|
50
|
+
const pairSlots = pairDefinitions.map(({ axis, sideProperties }) => ({
|
|
51
|
+
axis,
|
|
52
|
+
icon: _jsx(SpacingAxisIndicator, { property: property, axis: axis }),
|
|
53
|
+
control: (_jsx(PairedTokenField, { displayProperty: `${property}-${axis}`, sideProperties: sideProperties, domElement: el, editTarget: editTarget, axisProjection: spacingProjection.axes[axis], entries: entries, suggestions: suggestions, onAfterEdit: onAfterEdit, chipVariant: "small" })),
|
|
54
|
+
}));
|
|
55
|
+
return (_jsx(SideValuesField, { label: property, "data-test": property === "inset" ? "layout-inset" : `spacing-${property}`, "data-property": property, resetKey: el, pairedControls: pairSlots, showLabel: showLabel, empty: showEmptyState && spacingIsEmpty && !fieldsAdded, onAdd: () => setFieldsAdded(true), emptyAction: property === "inset" ? (_jsx(IconButton, { variant: "quiet", size: "default", "data-test": "add-inset", label: "Add Inset Values", title: "Add Inset Values", onClick: () => setFieldsAdded(true), children: _jsx(IconPlus, { size: 16, "aria-hidden": "true" }) })) : undefined, sides: sideSlots }));
|
|
56
|
+
}
|
|
57
|
+
function sideProperty(property, side) {
|
|
58
|
+
return property === "inset" ? side : `${property}-${side}`;
|
|
59
|
+
}
|
|
60
|
+
function isZeroSpacingValue(value) {
|
|
61
|
+
const normalized = value.trim().toLowerCase();
|
|
62
|
+
return !normalized || /^-?0(?:\.0+)?(?:[a-z%]+)?$/.test(normalized);
|
|
63
|
+
}
|
|
64
|
+
function isEmptyInsetValue(value) {
|
|
65
|
+
const normalized = value.trim().toLowerCase();
|
|
66
|
+
return !normalized || normalized === "auto" || /^-?0(?:\.0+)?(?:[a-z%]+)?$/.test(normalized);
|
|
67
|
+
}
|
|
68
|
+
function PaddingSideIndicator({ side }) {
|
|
69
|
+
if (side === "left") {
|
|
70
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__side-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "6.75", y1: "7", x2: "6.75", y2: "17", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
71
|
+
}
|
|
72
|
+
if (side === "right") {
|
|
73
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__side-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "17", y1: "7", x2: "17", y2: "17", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
74
|
+
}
|
|
75
|
+
if (side === "bottom") {
|
|
76
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__side-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "21", y: "3", width: "18", height: "18", rx: "2", transform: "rotate(90 21 3)", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "17", y1: "17", x2: "7", y2: "17", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
77
|
+
}
|
|
78
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__side-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "21", width: "18", height: "18", rx: "2", transform: "rotate(-90 3 21)", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "7", y1: "7", x2: "17", y2: "7", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
79
|
+
}
|
|
80
|
+
function SpacingAxisIndicator({ property, axis, }) {
|
|
81
|
+
if (property === "padding" && axis === "horizontal") {
|
|
82
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__axis-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "6.75", y1: "7", x2: "6.75", y2: "17", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" }), _jsx("line", { x1: "17", y1: "7", x2: "17", y2: "17", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
83
|
+
}
|
|
84
|
+
if (property === "padding" && axis === "vertical") {
|
|
85
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__axis-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "21", y: "3", width: "18", height: "18", rx: "2", transform: "rotate(90 21 3)", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "17", y1: "6.75", x2: "7", y2: "6.75", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" }), _jsx("line", { x1: "17", y1: "17", x2: "7", y2: "17", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
86
|
+
}
|
|
87
|
+
if (property !== "padding" && axis === "horizontal") {
|
|
88
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__axis-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "6", y: "5", width: "12", height: "14", rx: "2", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "2", y1: "5", x2: "2", y2: "19", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" }), _jsx("line", { x1: "22", y1: "5", x2: "22", y2: "19", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
89
|
+
}
|
|
90
|
+
return (_jsxs("svg", { className: "side-values__icon side-values__axis-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "19", y: "6", width: "12", height: "14", rx: "2", transform: "rotate(90 19 6)", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "19", y1: "2", x2: "5", y2: "2", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" }), _jsx("line", { x1: "19", y1: "22", x2: "5", y2: "22", stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
|
|
91
|
+
}
|
|
92
|
+
function PairedTokenField({ displayProperty, sideProperties, domElement: el, editTarget, axisProjection, entries, suggestions, onAfterEdit, chipVariant, }) {
|
|
93
|
+
const row = pairTokenRow(displayProperty, axisProjection);
|
|
94
|
+
const groupMixed = axisProjection.fields.some((field) => field.value === "Mixed");
|
|
95
|
+
const valuesMatch = axisProjection.state === "shared" && !groupMixed;
|
|
96
|
+
const expression = Boolean(row && (row.capability === "raw" || row.capability === "composite"
|
|
97
|
+
|| row.modifiers?.some((modifier) => modifier.kind === "alpha")));
|
|
98
|
+
const calcAuthored = row?.authored ?? row?.declaredValue ?? "";
|
|
99
|
+
const activeTokenName = !valuesMatch || expression || /\bcalc\s*\(/i.test(calcAuthored) ? null : row.tokenName;
|
|
100
|
+
// Some browsers expose the used pixel size for horizontal auto margins.
|
|
101
|
+
// Keep the authored keyword visible because replacing it with that transient
|
|
102
|
+
// size would misrepresent the declaration and change the edit semantics.
|
|
103
|
+
const committedValue = groupMixed
|
|
104
|
+
? "Mixed"
|
|
105
|
+
: valuesMatch
|
|
106
|
+
? calcAuthored.trim().toLowerCase() === "auto"
|
|
107
|
+
? calcAuthored.trim()
|
|
108
|
+
: expression ? row.authored || row.declaredValue || row.resolvedValue : row.resolvedValue
|
|
109
|
+
: axisProjection.fields.map(fieldDisplayValue).join(", ");
|
|
110
|
+
const resolvedValue = valuesMatch
|
|
111
|
+
? row.resolvedValue
|
|
112
|
+
: axisProjection.fields.map((field) => field.value).join(", ");
|
|
113
|
+
const currentToken = activeTokenName
|
|
114
|
+
? entries.find((entry) => entry.name === activeTokenName) ?? null
|
|
115
|
+
: null;
|
|
116
|
+
function commitAxisValue(value) {
|
|
117
|
+
const pair = splitAxisValue(value);
|
|
118
|
+
const records = setStyles(editTarget ?? el, sideProperties.map((property, index) => ({
|
|
119
|
+
property,
|
|
120
|
+
value: pair?.[index] ?? value,
|
|
121
|
+
})));
|
|
122
|
+
if (records.some(Boolean))
|
|
123
|
+
onAfterEdit?.();
|
|
124
|
+
}
|
|
125
|
+
return (_jsx(TokenValueField, { property: displayProperty, committedValue: committedValue, resolvedValue: resolvedValue, activeTokenName: activeTokenName, mixed: groupMixed, atRules: row.atRuleCandidates ?? row.atRules, entries: entries, suggestions: suggestions, chipVariant: chipVariant, formatRawValue: (value) => formatAxisValue(value, displayProperty), onCommitRaw: commitAxisValue, onSelectToken: (chosen) => {
|
|
126
|
+
const records = swapTokens(editTarget ?? el, sideProperties.map((property) => ({
|
|
127
|
+
property,
|
|
128
|
+
newToken: chosen,
|
|
129
|
+
oldToken: activeTokenName ? currentToken : null,
|
|
130
|
+
})));
|
|
131
|
+
if (records.some(Boolean))
|
|
132
|
+
onAfterEdit?.();
|
|
133
|
+
}, onUnlink: commitAxisValue }));
|
|
134
|
+
}
|
|
135
|
+
function fieldDisplayValue(field) {
|
|
136
|
+
return field.authoredValue.trim() || field.value;
|
|
137
|
+
}
|
|
138
|
+
function splitAxisValue(value) {
|
|
139
|
+
let depth = 0;
|
|
140
|
+
let quote = null;
|
|
141
|
+
let separator = -1;
|
|
142
|
+
for (let index = 0; index < value.length; index++) {
|
|
143
|
+
const character = value[index];
|
|
144
|
+
if (quote) {
|
|
145
|
+
if (character === quote && value[index - 1] !== "\\")
|
|
146
|
+
quote = null;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (character === "\"" || character === "'")
|
|
150
|
+
quote = character;
|
|
151
|
+
else if (character === "(" || character === "[")
|
|
152
|
+
depth++;
|
|
153
|
+
else if (character === ")" || character === "]")
|
|
154
|
+
depth = Math.max(0, depth - 1);
|
|
155
|
+
else if (character === "," && depth === 0) {
|
|
156
|
+
if (separator >= 0)
|
|
157
|
+
return null;
|
|
158
|
+
separator = index;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (separator < 0)
|
|
162
|
+
return null;
|
|
163
|
+
const first = value.slice(0, separator).trim();
|
|
164
|
+
const second = value.slice(separator + 1).trim();
|
|
165
|
+
return first && second ? [first, second] : null;
|
|
166
|
+
}
|
|
167
|
+
function formatAxisValue(value, property) {
|
|
168
|
+
const pair = splitAxisValue(value);
|
|
169
|
+
const policy = valuePolicyFor(property);
|
|
170
|
+
return pair
|
|
171
|
+
? pair.map((part) => completeCssValue(part, policy)).join(", ")
|
|
172
|
+
: completeCssValue(value.trim(), policy);
|
|
173
|
+
}
|
|
174
|
+
function pairTokenRow(displayProperty, axisProjection) {
|
|
175
|
+
const firstField = axisProjection.fields[0];
|
|
176
|
+
const first = firstField.row;
|
|
177
|
+
const valuesMatch = axisProjection.state === "shared";
|
|
178
|
+
return {
|
|
179
|
+
...(first ?? {}),
|
|
180
|
+
property: displayProperty,
|
|
181
|
+
tokenName: valuesMatch ? firstField.tokenName : null,
|
|
182
|
+
declaredValue: firstField.authoredValue,
|
|
183
|
+
authored: firstField.authoredValue,
|
|
184
|
+
resolvedValue: firstField.value,
|
|
185
|
+
capability: first?.capability ?? "box-sides",
|
|
186
|
+
confidence: valuesMatch ? first?.confidence ?? "unknown" : "unknown",
|
|
187
|
+
evidence: first?.evidence ?? { reason: "paired physical side values" },
|
|
188
|
+
};
|
|
189
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { ResolvedProperty } from "../../css/model/index.js";
|
|
3
|
+
import type { TokenEntry } from "../../css/model/index.js";
|
|
4
|
+
import type { SelectedElement } from "../selection/selectionStore.js";
|
|
5
|
+
import type { StyleSelection } from "../selection/styleSelection.js";
|
|
6
|
+
export interface TypographyProps {
|
|
7
|
+
element: SelectedElement;
|
|
8
|
+
selection?: StyleSelection | null;
|
|
9
|
+
entries?: TokenEntry[];
|
|
10
|
+
tokenRows?: readonly ResolvedProperty[];
|
|
11
|
+
onAfterEdit?: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function Typography(props: TypographyProps): ReactElement;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { IconTextSize, IconAlignCenter, IconAlignLeft, IconAlignRight, IconLayoutAlignMiddle, IconLayoutAlignBottom, IconLayoutAlignTop, IconBaseline, IconChevronDown, IconItalic, IconLetterSpacing, IconTypography, } from "@tabler/icons-react";
|
|
4
|
+
import { findTokenRow, metadataFor } from "./rowLookup.js";
|
|
5
|
+
import { TokenField } from "../tokens/TokenField.js";
|
|
6
|
+
import { Select } from "../ui/Select.js";
|
|
7
|
+
import { SegmentedControl } from "../ui/SegmentedControl.js";
|
|
8
|
+
import { getStateStyleValue } from "../shell/stateValue.js";
|
|
9
|
+
import { setStyle, setStyles } from "../tokens/editActions.js";
|
|
10
|
+
import { AtRuleIndicator, useFieldAtRules } from "../ui/AtRuleContext.js";
|
|
11
|
+
import { ControlSurface } from "../ui/ControlSurface.js";
|
|
12
|
+
export function Typography(props) {
|
|
13
|
+
const { element, selection, entries, tokenRows = [], onAfterEdit } = props;
|
|
14
|
+
const el = element.domElement;
|
|
15
|
+
const target = selection?.target ?? el;
|
|
16
|
+
const targetElements = selection?.domElements ?? [el];
|
|
17
|
+
const allEntries = entries ?? [];
|
|
18
|
+
return (_jsxs("div", { className: "editor editor--typography", "data-test": "typography", children: [_jsx("div", { className: "editor__title-row", children: _jsx("div", { className: "editor__title", children: "Text" }) }), _jsxs("div", { className: "typography", children: [_jsx(TypographyTokenField, { property: "font-family", label: "Font family", icon: _jsx(IconItalic, { size: "var(--icon-size-small)", stroke: 1.35, "aria-hidden": "true" }), tokenRow: findTokenRow(tokenRows, "font-family"), selection: selection, domElement: el, editTarget: target, entries: allEntries, onAfterEdit: onAfterEdit }), _jsx(FontStyleField, { element: el, elements: targetElements, editTarget: target, fontStyleRow: findTokenRow(tokenRows, "font-style"), fontWeightRow: findTokenRow(tokenRows, "font-weight"), onAfterEdit: onAfterEdit }), _jsxs("div", { className: "typography__metrics", "data-test": "typography-metrics", children: [_jsx(TypographyTokenField, { property: "font-size", label: "Font size", icon: _jsx(IconTextSize, { size: "var(--icon-size-small)", stroke: 1.55, "aria-hidden": "true" }), tokenRow: findTokenRow(tokenRows, "font-size"), selection: selection, domElement: el, editTarget: target, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }), _jsx(TypographyTokenField, { property: "line-height", label: "Line height", icon: _jsx(IconBaseline, { size: "var(--icon-size-small)", stroke: 1.5, "aria-hidden": "true" }), tokenRow: findTokenRow(tokenRows, "line-height"), selection: selection, domElement: el, editTarget: target, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }), _jsx(TypographyTokenField, { property: "letter-spacing", label: "Letter spacing", icon: _jsx(IconLetterSpacing, { size: "var(--icon-size-small)", stroke: 1.5, "aria-hidden": "true" }), tokenRow: findTokenRow(tokenRows, "letter-spacing"), selection: selection, domElement: el, editTarget: target, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" })] }), _jsxs("div", { className: "typography__alignment", "data-test": "typography-alignment", children: [_jsx(AlignmentField, { property: "text-align", label: "Horizontal alignment", element: el, elements: targetElements, editTarget: target, defaultValue: "left", options: [
|
|
19
|
+
{ value: "left", label: "Align left", icon: _jsx(IconAlignLeft, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
20
|
+
{ value: "center", label: "Align center", icon: _jsx(IconAlignCenter, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
21
|
+
{ value: "right", label: "Align right", icon: _jsx(IconAlignRight, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
22
|
+
], onAfterEdit: onAfterEdit }), _jsx(AlignmentField, { property: "vertical-align", label: "Vertical alignment", element: el, elements: targetElements, editTarget: target, defaultValue: "baseline", options: [
|
|
23
|
+
{ value: "top", label: "Align top", icon: _jsx(IconLayoutAlignTop, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
24
|
+
{ value: "middle", label: "Align middle", icon: _jsx(IconLayoutAlignMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
25
|
+
{ value: "bottom", label: "Align bottom", icon: _jsx(IconLayoutAlignBottom, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
|
|
26
|
+
], onAfterEdit: onAfterEdit })] })] })] }));
|
|
27
|
+
}
|
|
28
|
+
function TypographyTokenField(props) {
|
|
29
|
+
const { property, label, icon, tokenRow, selection, domElement, editTarget, entries, onAfterEdit, chipVariant } = props;
|
|
30
|
+
const metric = property === "font-size" || property === "line-height" || property === "letter-spacing";
|
|
31
|
+
const selectedProperty = selection && selection.elements.length > 1
|
|
32
|
+
? selection.getProperty(property)
|
|
33
|
+
: null;
|
|
34
|
+
const tokenName = selectedProperty
|
|
35
|
+
? selectedProperty.token.kind === "common" ? selectedProperty.token.name : null
|
|
36
|
+
: tokenRow?.tokenName;
|
|
37
|
+
const hasTokenChip = Boolean(tokenName
|
|
38
|
+
&& tokenRow?.capability !== "raw"
|
|
39
|
+
&& tokenRow?.capability !== "composite"
|
|
40
|
+
&& !tokenRow?.modifiers?.some((modifier) => modifier.kind === "alpha"));
|
|
41
|
+
return (_jsx(ControlSurface, { className: `typography__field typography__field--${property}`, children: _jsx(TokenField, { property: property, tokenRow: tokenRow, selection: selection, domElement: domElement, editTarget: editTarget, entries: entries, editMetadata: metadataFor(tokenRow), leading: icon, trailing: metric || hasTokenChip ? undefined : _jsx(IconChevronDown, { size: 17, stroke: 1.8, "aria-hidden": "true" }), label: label, chipVariant: chipVariant, onAfterEdit: onAfterEdit }) }));
|
|
42
|
+
}
|
|
43
|
+
const FONT_STYLE_OPTIONS = [
|
|
44
|
+
{ value: "300-normal", label: "Light", weight: "300", style: "normal" },
|
|
45
|
+
{ value: "400-normal", label: "Regular", weight: "400", style: "normal" },
|
|
46
|
+
{ value: "500-normal", label: "Medium", weight: "500", style: "normal" },
|
|
47
|
+
{ value: "600-normal", label: "Semibold", weight: "600", style: "normal" },
|
|
48
|
+
{ value: "700-normal", label: "Bold", weight: "700", style: "normal" },
|
|
49
|
+
{ value: "400-italic", label: "Italic", weight: "400", style: "italic" },
|
|
50
|
+
{ value: "700-italic", label: "Bold Italic", weight: "700", style: "italic" },
|
|
51
|
+
{ value: "400-oblique", label: "Oblique", weight: "400", style: "oblique" },
|
|
52
|
+
];
|
|
53
|
+
function FontStyleField({ element, elements, editTarget, fontStyleRow, fontWeightRow, onAfterEdit }) {
|
|
54
|
+
const fontStyleAtRules = useFieldAtRules("font-style");
|
|
55
|
+
const fontWeightAtRules = useFieldAtRules("font-weight");
|
|
56
|
+
const atRules = fontStyleRow?.atRuleCandidates ?? fontStyleRow?.atRules
|
|
57
|
+
?? fontWeightRow?.atRuleCandidates ?? fontWeightRow?.atRules
|
|
58
|
+
?? (fontStyleAtRules.length > 0 ? fontStyleAtRules : fontWeightAtRules);
|
|
59
|
+
const readValue = () => readFontStyle(element);
|
|
60
|
+
const values = elements.map(readFontStyle);
|
|
61
|
+
const isMixed = values.some((value) => value.weight !== values[0]?.weight || value.style !== values[0]?.style);
|
|
62
|
+
const [current, setCurrent] = useState(readValue);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
setCurrent(readValue());
|
|
65
|
+
}, [element, elements]);
|
|
66
|
+
const currentOption = FONT_STYLE_OPTIONS.find((option) => option.value === `${current.weight}-${current.style}`);
|
|
67
|
+
const currentKey = currentOption?.value ?? `${current.weight}-${current.style}`;
|
|
68
|
+
const currentLabel = isMixed ? "Mixed" : currentOption?.label ?? formatCustomFontStyle(current.weight, current.style);
|
|
69
|
+
const options = isMixed
|
|
70
|
+
? [{ value: "mixed", label: "Mixed", disabled: true }, ...FONT_STYLE_OPTIONS]
|
|
71
|
+
: currentOption
|
|
72
|
+
? FONT_STYLE_OPTIONS
|
|
73
|
+
: [...FONT_STYLE_OPTIONS, { value: currentKey, label: currentLabel, ...current }];
|
|
74
|
+
function handleChange(value) {
|
|
75
|
+
const option = options.find((candidate) => candidate.value === value);
|
|
76
|
+
if (!option || option.value === "mixed" || !("weight" in option) || !("style" in option))
|
|
77
|
+
return;
|
|
78
|
+
setCurrent({ weight: option.weight, style: option.style });
|
|
79
|
+
setStyles(editTarget, [
|
|
80
|
+
{ property: "font-style", value: option.style, metadata: metadataFor(fontStyleRow ?? fontWeightRow) },
|
|
81
|
+
{ property: "font-weight", value: option.weight, metadata: metadataFor(fontWeightRow ?? fontStyleRow) },
|
|
82
|
+
]);
|
|
83
|
+
onAfterEdit?.();
|
|
84
|
+
}
|
|
85
|
+
return (_jsxs(ControlSurface, { className: "typography__field typography__field--font-style", "data-test": "typography-field", "data-property": "font-style", "aria-label": "Font style", title: "Font style", children: [_jsx("span", { className: "typography__field-icon", "aria-hidden": "true", children: _jsx(IconTypography, { size: "var(--icon-size-small)", stroke: 1.45 }) }), _jsx(Select, { appearance: "embedded", value: isMixed ? "mixed" : currentKey, options: options.map(({ value, label }) => ({ value, label })), onValueChange: handleChange, "data-test": "font-style-field" }), _jsx(AtRuleIndicator, { atRules: atRules })] }));
|
|
86
|
+
}
|
|
87
|
+
function readFontStyle(element) {
|
|
88
|
+
return {
|
|
89
|
+
weight: normalizeFontWeight(getStateStyleValue(element, "font-weight", "400") || "400"),
|
|
90
|
+
style: getStateStyleValue(element, "font-style", "normal") || "normal",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function normalizeFontWeight(value) {
|
|
94
|
+
if (value === "normal")
|
|
95
|
+
return "400";
|
|
96
|
+
if (value === "bold")
|
|
97
|
+
return "700";
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
function formatCustomFontStyle(weight, style) {
|
|
101
|
+
const italic = style === "italic" || style.startsWith("oblique");
|
|
102
|
+
const weightLabel = weight === "400" ? "Regular" : weight;
|
|
103
|
+
return italic ? `${weightLabel} ${style}` : weightLabel;
|
|
104
|
+
}
|
|
105
|
+
function AlignmentField({ property, label, element, elements, editTarget, defaultValue, options, onAfterEdit }) {
|
|
106
|
+
const atRules = useFieldAtRules(property);
|
|
107
|
+
const readValues = () => elements.map((target) => getStateStyleValue(target, property, defaultValue));
|
|
108
|
+
const initialValues = readValues();
|
|
109
|
+
const isMixed = initialValues.some((value) => value !== initialValues[0]);
|
|
110
|
+
const [initialValue] = useState(() => getStateStyleValue(element, property, defaultValue));
|
|
111
|
+
const [current, setCurrent] = useState(() => isMixed ? null : normalizeAlignment(property, initialValue));
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
const next = getStateStyleValue(element, property, defaultValue);
|
|
114
|
+
const values = readValues();
|
|
115
|
+
setCurrent(values.some((value) => value !== values[0]) ? null : normalizeAlignment(property, next));
|
|
116
|
+
}, [defaultValue, element, elements, property]);
|
|
117
|
+
function handleChange(value) {
|
|
118
|
+
setCurrent(value);
|
|
119
|
+
setStyle(editTarget, property, value);
|
|
120
|
+
onAfterEdit?.();
|
|
121
|
+
}
|
|
122
|
+
return (_jsxs("div", { className: "typography__alignment-field", children: [isMixed || current === null && elements.length > 1 ? (_jsx("span", { className: "typography__mixed", "data-test": `typography-mixed-${property}`, children: "Mixed" })) : null, _jsx(SegmentedControl, { value: current, "aria-label": label, "data-property": property, options: options.map((option) => ({
|
|
123
|
+
value: option.value,
|
|
124
|
+
label: option.label,
|
|
125
|
+
icon: option.icon,
|
|
126
|
+
testId: `typography-align-${property}-${option.value}`,
|
|
127
|
+
})), onChange: handleChange }), _jsx(AtRuleIndicator, { atRules: atRules })] }));
|
|
128
|
+
}
|
|
129
|
+
function normalizeAlignment(property, value) {
|
|
130
|
+
if (property !== "text-align")
|
|
131
|
+
return value;
|
|
132
|
+
if (value === "start")
|
|
133
|
+
return "left";
|
|
134
|
+
if (value === "end")
|
|
135
|
+
return "right";
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ValuePolicy } from "./valuePolicy.js";
|
|
2
|
+
export declare const CSS_NUMBER_SOURCE = "[+-]?(?:(?:\\d+\\.?\\d*)|(?:\\.\\d+))(?:e[+-]?\\d+)?";
|
|
3
|
+
/**
|
|
4
|
+
* Completes a bare numeric entry with its property's default unit. This is a
|
|
5
|
+
* commit-time formatter; it deliberately does not validate or reinterpret
|
|
6
|
+
* arbitrary CSS supplied by the user.
|
|
7
|
+
*/
|
|
8
|
+
export declare function completeCssValue(rawValue: string, policy: ValuePolicy): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// CSS <number>, including values such as .5 and 1e3. This intentionally only
|
|
2
|
+
// matches the entire value: units, functions, keywords, and compound values
|
|
3
|
+
// are all valid raw CSS and must be passed through unchanged.
|
|
4
|
+
// Exported as a source fragment so other editors (e.g. nudgeValue) build
|
|
5
|
+
// their number-aware patterns from the same single grammar definition.
|
|
6
|
+
export const CSS_NUMBER_SOURCE = "[+-]?(?:(?:\\d+\\.?\\d*)|(?:\\.\\d+))(?:e[+-]?\\d+)?";
|
|
7
|
+
const BARE_NUMBER = new RegExp(`^(?:${CSS_NUMBER_SOURCE})$`, "i");
|
|
8
|
+
/**
|
|
9
|
+
* Completes a bare numeric entry with its property's default unit. This is a
|
|
10
|
+
* commit-time formatter; it deliberately does not validate or reinterpret
|
|
11
|
+
* arbitrary CSS supplied by the user.
|
|
12
|
+
*/
|
|
13
|
+
export function completeCssValue(rawValue, policy) {
|
|
14
|
+
const value = rawValue.trim();
|
|
15
|
+
if (!BARE_NUMBER.test(value) || Number(value) === 0) {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
if (policy.kind === "line-height") {
|
|
19
|
+
const multiplier = Number(value);
|
|
20
|
+
// People commonly enter line-height as its CSS multiplier (1.6), while
|
|
21
|
+
// larger whole values conventionally represent a percentage (120). Keep
|
|
22
|
+
// both convenient forms while committing a single percentage value.
|
|
23
|
+
if (multiplier > 0 && multiplier <= 10) {
|
|
24
|
+
return `${formatPercentage(multiplier * 100)}%`;
|
|
25
|
+
}
|
|
26
|
+
return `${value}%`;
|
|
27
|
+
}
|
|
28
|
+
if (policy.kind !== "unit")
|
|
29
|
+
return value;
|
|
30
|
+
return `${value}${policy.defaultUnit}`;
|
|
31
|
+
}
|
|
32
|
+
function formatPercentage(value) {
|
|
33
|
+
return Number(value.toPrecision(15)).toString();
|
|
34
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ChangeRecord } from "../tokens/editActions.js";
|
|
2
|
+
import { type EditTarget } from "../selection/editTarget.js";
|
|
3
|
+
/** One grid axis of a grid item: `column` maps to grid-column-*, `row` to grid-row-*. */
|
|
4
|
+
export type GridAxis = "column" | "row";
|
|
5
|
+
/**
|
|
6
|
+
* Alignment vocabulary for grid children. `default` defers to the container's
|
|
7
|
+
* `justify-items` / `align-items` (authored as `auto`); `fill` is `stretch`.
|
|
8
|
+
*/
|
|
9
|
+
export type GridChildAlignment = "auto" | "stretch" | "start" | "center" | "end";
|
|
10
|
+
export interface GridAxisPlacement {
|
|
11
|
+
/** Authored or computed start line token: "auto", a line number, or a named line. */
|
|
12
|
+
start: string;
|
|
13
|
+
/**
|
|
14
|
+
* Span when the placement is expressible as start + span N: the end side is
|
|
15
|
+
* `span N`, or both sides are definite positive line numbers. Null when the
|
|
16
|
+
* end side is auto, a negative line, or not derivable.
|
|
17
|
+
*/
|
|
18
|
+
span: number | null;
|
|
19
|
+
}
|
|
20
|
+
export declare const GRID_CHILD_MAX_TRACKS = 12;
|
|
21
|
+
/** Parses a `span N` end-side token into N. */
|
|
22
|
+
export declare function parseSpanToken(value: string): number | null;
|
|
23
|
+
/**
|
|
24
|
+
* Reads one placement axis from authored CSS (preferred) falling back to
|
|
25
|
+
* computed CSS, which stays correct even when the authored rule uses the
|
|
26
|
+
* `grid-column` / `grid-row` shorthand.
|
|
27
|
+
*/
|
|
28
|
+
export declare function readGridAxisPlacement(el: HTMLElement, axis: GridAxis): GridAxisPlacement;
|
|
29
|
+
/**
|
|
30
|
+
* Commits one placement axis as managed longhands. The UI model is
|
|
31
|
+
* "start line + span", so editing either side recomposes both:
|
|
32
|
+
* a simple span is rewritten as `span N` (or `auto` for 1), while a negative
|
|
33
|
+
* end line ("to the last line") and plain auto ends are preserved untouched.
|
|
34
|
+
* `span: "keep"` re-commits the currently derived span, if any, so moving the
|
|
35
|
+
* start line keeps the item's size.
|
|
36
|
+
*/
|
|
37
|
+
export declare function commitGridAxisPlacement(target: EditTarget, axis: GridAxis, commit: {
|
|
38
|
+
start?: string;
|
|
39
|
+
span?: number | "keep";
|
|
40
|
+
}): ChangeRecord[];
|
|
41
|
+
/**
|
|
42
|
+
* Reads one self-alignment axis as a raw CSS token with `normal` mapped to
|
|
43
|
+
* `stretch`: on grid items `normal` has stretch behavior (except replaced
|
|
44
|
+
* elements), so labeling it "Parent default" would misdescribe the rendering
|
|
45
|
+
* and re-committing `auto` for it could change the layout. `auto` alone means
|
|
46
|
+
* the item defers to the container's `justify-items` / `align-items`.
|
|
47
|
+
*/
|
|
48
|
+
export declare function readGridChildAlignment(el: HTMLElement, axis: "h" | "v"): string;
|
|
49
|
+
/** Friendly alignment labels; `auto` resolves to the container's items alignment. */
|
|
50
|
+
export declare const GRID_CHILD_ALIGNMENT_OPTIONS: Array<{
|
|
51
|
+
value: GridChildAlignment;
|
|
52
|
+
label: string;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Commits one self-alignment axis. The alignment vocabulary is an open CSS
|
|
56
|
+
* set — the friendly pickers cover the common keywords while authored values
|
|
57
|
+
* such as `self-start` or `normal` round-trip verbatim — so this accepts any
|
|
58
|
+
* self-alignment token the UI puts in its options.
|
|
59
|
+
*/
|
|
60
|
+
export declare function commitGridChildAlignment(target: EditTarget, axis: "h" | "v", alignment: string): ChangeRecord[];
|
|
61
|
+
/**
|
|
62
|
+
* Resolved track count of the parent grid on one axis, when CSS makes it
|
|
63
|
+
* definite (auto-fill/auto-fit tracks cannot be counted). Caps at
|
|
64
|
+
* GRID_CHILD_MAX_TRACKS to bound generated line options.
|
|
65
|
+
*/
|
|
66
|
+
export declare function parentTrackCount(el: HTMLElement, axis: GridAxis): number | null;
|
|
67
|
+
/**
|
|
68
|
+
* Start-line options for one axis: Auto plus explicit line numbers. A grid
|
|
69
|
+
* with N tracks has N+1 lines, so the final start line is count + 1.
|
|
70
|
+
*/
|
|
71
|
+
export declare function startLineOptions(trackCount: number | null): Array<{
|
|
72
|
+
value: string;
|
|
73
|
+
label: string;
|
|
74
|
+
}>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { getLayoutValue } from "./layoutValue.js";
|
|
2
|
+
import { setElementStyles, setStyle, setStyles } from "../tokens/editActions.js";
|
|
3
|
+
import { countGridTracks } from "./GridPicker.js";
|
|
4
|
+
import { targetElements } from "../selection/editTarget.js";
|
|
5
|
+
const LINE_NUMBER = /^-?\d+$/;
|
|
6
|
+
const SPAN_TOKEN = /^span\s+(\d+)$/i;
|
|
7
|
+
export const GRID_CHILD_MAX_TRACKS = 12;
|
|
8
|
+
function normalizeToken(value) {
|
|
9
|
+
const trimmed = value?.trim();
|
|
10
|
+
return trimmed ? trimmed : "auto";
|
|
11
|
+
}
|
|
12
|
+
function isLineNumber(value) {
|
|
13
|
+
return LINE_NUMBER.test(value);
|
|
14
|
+
}
|
|
15
|
+
/** Parses a `span N` end-side token into N. */
|
|
16
|
+
export function parseSpanToken(value) {
|
|
17
|
+
const match = SPAN_TOKEN.exec(value.trim());
|
|
18
|
+
return match ? Number(match[1]) : null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Reads one placement axis from authored CSS (preferred) falling back to
|
|
22
|
+
* computed CSS, which stays correct even when the authored rule uses the
|
|
23
|
+
* `grid-column` / `grid-row` shorthand.
|
|
24
|
+
*/
|
|
25
|
+
export function readGridAxisPlacement(el, axis) {
|
|
26
|
+
const start = getLayoutValue(el, `grid-${axis}-start`);
|
|
27
|
+
const end = getLayoutValue(el, `grid-${axis}-end`);
|
|
28
|
+
const startToken = normalizeToken(start.authored ?? start.computed);
|
|
29
|
+
const endToken = normalizeToken(end.authored ?? end.computed);
|
|
30
|
+
let span = null;
|
|
31
|
+
const spanToken = parseSpanToken(endToken);
|
|
32
|
+
if (spanToken !== null) {
|
|
33
|
+
span = spanToken;
|
|
34
|
+
}
|
|
35
|
+
else if (isLineNumber(endToken)) {
|
|
36
|
+
const endLine = Number(endToken);
|
|
37
|
+
if (endLine >= 1 && isLineNumber(startToken)) {
|
|
38
|
+
const derived = endLine - Number(startToken);
|
|
39
|
+
if (derived >= 1)
|
|
40
|
+
span = derived;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { start: startToken, span };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Commits one placement axis as managed longhands. The UI model is
|
|
47
|
+
* "start line + span", so editing either side recomposes both:
|
|
48
|
+
* a simple span is rewritten as `span N` (or `auto` for 1), while a negative
|
|
49
|
+
* end line ("to the last line") and plain auto ends are preserved untouched.
|
|
50
|
+
* `span: "keep"` re-commits the currently derived span, if any, so moving the
|
|
51
|
+
* start line keeps the item's size.
|
|
52
|
+
*/
|
|
53
|
+
export function commitGridAxisPlacement(target, axis, commit) {
|
|
54
|
+
const elements = targetElements(target);
|
|
55
|
+
const declarations = [];
|
|
56
|
+
if (commit.start !== undefined) {
|
|
57
|
+
declarations.push({ property: `grid-${axis}-start`, value: commit.start });
|
|
58
|
+
}
|
|
59
|
+
let endValue = null;
|
|
60
|
+
if (commit.span === "keep") {
|
|
61
|
+
return setElementStyles(elements.map((element) => {
|
|
62
|
+
const elementDeclarations = [...declarations];
|
|
63
|
+
const current = readGridAxisPlacement(element, axis);
|
|
64
|
+
if (current.span !== null) {
|
|
65
|
+
elementDeclarations.push({
|
|
66
|
+
property: `grid-${axis}-end`,
|
|
67
|
+
value: current.span >= 2 ? `span ${current.span}` : "auto",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return { element, declarations: elementDeclarations };
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
else if (typeof commit.span === "number") {
|
|
74
|
+
endValue = commit.span >= 2 ? `span ${commit.span}` : "auto";
|
|
75
|
+
}
|
|
76
|
+
if (endValue !== null)
|
|
77
|
+
declarations.push({ property: `grid-${axis}-end`, value: endValue });
|
|
78
|
+
return declarations.length > 0 ? setStyles(target, declarations) : [];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Reads one self-alignment axis as a raw CSS token with `normal` mapped to
|
|
82
|
+
* `stretch`: on grid items `normal` has stretch behavior (except replaced
|
|
83
|
+
* elements), so labeling it "Parent default" would misdescribe the rendering
|
|
84
|
+
* and re-committing `auto` for it could change the layout. `auto` alone means
|
|
85
|
+
* the item defers to the container's `justify-items` / `align-items`.
|
|
86
|
+
*/
|
|
87
|
+
export function readGridChildAlignment(el, axis) {
|
|
88
|
+
const property = axis === "h" ? "justify-self" : "align-self";
|
|
89
|
+
const value = getLayoutValue(el, property);
|
|
90
|
+
const token = normalizeToken(value.authored ?? value.computed);
|
|
91
|
+
return token === "normal" ? "stretch" : token;
|
|
92
|
+
}
|
|
93
|
+
/** Friendly alignment labels; `auto` resolves to the container's items alignment. */
|
|
94
|
+
export const GRID_CHILD_ALIGNMENT_OPTIONS = [
|
|
95
|
+
{ value: "auto", label: "Parent default" },
|
|
96
|
+
{ value: "stretch", label: "Fill" },
|
|
97
|
+
{ value: "start", label: "Start" },
|
|
98
|
+
{ value: "center", label: "Center" },
|
|
99
|
+
{ value: "end", label: "End" },
|
|
100
|
+
];
|
|
101
|
+
/**
|
|
102
|
+
* Commits one self-alignment axis. The alignment vocabulary is an open CSS
|
|
103
|
+
* set — the friendly pickers cover the common keywords while authored values
|
|
104
|
+
* such as `self-start` or `normal` round-trip verbatim — so this accepts any
|
|
105
|
+
* self-alignment token the UI puts in its options.
|
|
106
|
+
*/
|
|
107
|
+
export function commitGridChildAlignment(target, axis, alignment) {
|
|
108
|
+
const property = axis === "h" ? "justify-self" : "align-self";
|
|
109
|
+
const record = setStyle(target, property, alignment);
|
|
110
|
+
return record ? [record] : [];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Resolved track count of the parent grid on one axis, when CSS makes it
|
|
114
|
+
* definite (auto-fill/auto-fit tracks cannot be counted). Caps at
|
|
115
|
+
* GRID_CHILD_MAX_TRACKS to bound generated line options.
|
|
116
|
+
*/
|
|
117
|
+
export function parentTrackCount(el, axis) {
|
|
118
|
+
const parent = el.parentElement;
|
|
119
|
+
if (!parent)
|
|
120
|
+
return null;
|
|
121
|
+
const template = getLayoutValue(parent, `grid-template-${axis}s`);
|
|
122
|
+
const count = countGridTracks(template.authored ?? template.computed ?? "");
|
|
123
|
+
if (count === null)
|
|
124
|
+
return null;
|
|
125
|
+
return Math.min(count, GRID_CHILD_MAX_TRACKS);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Start-line options for one axis: Auto plus explicit line numbers. A grid
|
|
129
|
+
* with N tracks has N+1 lines, so the final start line is count + 1.
|
|
130
|
+
*/
|
|
131
|
+
export function startLineOptions(trackCount) {
|
|
132
|
+
const lineCount = (trackCount ?? GRID_CHILD_MAX_TRACKS) + 1;
|
|
133
|
+
const options = [{ value: "auto", label: "Auto" }];
|
|
134
|
+
for (let line = 1; line <= Math.max(2, lineCount); line++) {
|
|
135
|
+
options.push({ value: String(line), label: String(line) });
|
|
136
|
+
}
|
|
137
|
+
return options;
|
|
138
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the authored CSS value when one is available, without replacing
|
|
3
|
+
* keywords such as `auto` with the browser's used pixel value.
|
|
4
|
+
*/
|
|
5
|
+
export declare function meaningfulLayoutValue(el: HTMLElement, property: string): string;
|
|
6
|
+
export declare function readAuthoredStyleValue(el: HTMLElement, property: string): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Returns the inline-authored source when `el` carries the property — or a
|
|
9
|
+
* shorthand that sets it — in its `style` attribute. Managed previews can
|
|
10
|
+
* never beat inline styles in the cascade, so a non-null result means the
|
|
11
|
+
* field must present as blocked instead of accepting edits that silently
|
|
12
|
+
* revert (see `verifyPreview`'s "inline-style" conflict).
|
|
13
|
+
*/
|
|
14
|
+
export declare function inlineAuthoredValue(el: HTMLElement, property: string): string | null;
|
|
15
|
+
export interface LayoutValue {
|
|
16
|
+
property: string;
|
|
17
|
+
authored: string | null;
|
|
18
|
+
computed: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Reads both representations needed by a layout editor. Authored CSS is the
|
|
22
|
+
* editable source of truth; computed CSS is only the browser preview/fallback.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getLayoutValue(el: HTMLElement, property: string): LayoutValue;
|