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.
Files changed (510) hide show
  1. package/README.md +66 -0
  2. package/bin/nudge-ui.mjs +7 -0
  3. package/dist/LICENSE +21 -0
  4. package/dist/client.mjs +261 -0
  5. package/dist/compiler/ast.d.ts +18 -0
  6. package/dist/compiler/ast.js +75 -0
  7. package/dist/compiler/componentContractTypes.d.ts +19 -0
  8. package/dist/compiler/componentContractTypes.js +1 -0
  9. package/dist/compiler/componentContracts.d.ts +2 -0
  10. package/dist/compiler/componentContracts.js +260 -0
  11. package/dist/compiler/componentInstrumentation.d.ts +32 -0
  12. package/dist/compiler/componentInstrumentation.js +140 -0
  13. package/dist/compiler/componentPolicyResolution.d.ts +71 -0
  14. package/dist/compiler/componentPolicyResolution.js +388 -0
  15. package/dist/compiler/index.d.ts +9 -0
  16. package/dist/compiler/index.js +9 -0
  17. package/dist/compiler/packageComponentContracts.d.ts +32 -0
  18. package/dist/compiler/packageComponentContracts.js +308 -0
  19. package/dist/compiler/reactComponentProtocols.d.ts +145 -0
  20. package/dist/compiler/reactComponentProtocols.js +47 -0
  21. package/dist/compiler/reactIdentity.d.ts +15 -0
  22. package/dist/compiler/reactIdentity.js +339 -0
  23. package/dist/compiler/sourcePaths.d.ts +12 -0
  24. package/dist/compiler/sourcePaths.js +27 -0
  25. package/dist/css/dialects/index.d.ts +62 -0
  26. package/dist/css/dialects/index.js +103 -0
  27. package/dist/css/dialects/tailwind.d.ts +46 -0
  28. package/dist/css/dialects/tailwind.js +119 -0
  29. package/dist/css/dialects/vanillaExtract.d.ts +20 -0
  30. package/dist/css/dialects/vanillaExtract.js +32 -0
  31. package/dist/css/index.d.ts +10 -0
  32. package/dist/css/index.js +10 -0
  33. package/dist/css/model/index.d.ts +190 -0
  34. package/dist/css/model/index.js +10 -0
  35. package/dist/css/token-inventory/index.d.ts +26 -0
  36. package/dist/css/token-inventory/index.js +24 -0
  37. package/dist/css/token-inventory/inventory.d.ts +8 -0
  38. package/dist/css/token-inventory/inventory.js +421 -0
  39. package/dist/css/token-inventory/parseStylesheet.d.ts +16 -0
  40. package/dist/css/token-inventory/parseStylesheet.js +155 -0
  41. package/dist/css/token-inventory/policy.d.ts +47 -0
  42. package/dist/css/token-inventory/policy.js +50 -0
  43. package/dist/css/token-inventory/types.d.ts +97 -0
  44. package/dist/css/token-inventory/types.js +1 -0
  45. package/dist/css/value-semantics/borderSemantics.d.ts +28 -0
  46. package/dist/css/value-semantics/borderSemantics.js +91 -0
  47. package/dist/css/value-semantics/boxSemantics.d.ts +37 -0
  48. package/dist/css/value-semantics/boxSemantics.js +71 -0
  49. package/dist/css/value-semantics/colorSemantics.d.ts +99 -0
  50. package/dist/css/value-semantics/colorSemantics.js +526 -0
  51. package/dist/css/value-semantics/cssSyntax.d.ts +19 -0
  52. package/dist/css/value-semantics/cssSyntax.js +111 -0
  53. package/dist/css/value-semantics/fontSemantics.d.ts +35 -0
  54. package/dist/css/value-semantics/fontSemantics.js +131 -0
  55. package/dist/css/value-semantics/index.d.ts +20 -0
  56. package/dist/css/value-semantics/index.js +15 -0
  57. package/dist/css/value-semantics/propertyPolicy.d.ts +118 -0
  58. package/dist/css/value-semantics/propertyPolicy.js +356 -0
  59. package/dist/css/value-semantics/stringMaps.d.ts +2 -0
  60. package/dist/css/value-semantics/stringMaps.js +1 -0
  61. package/dist/css/value-semantics/structuredValues.d.ts +64 -0
  62. package/dist/css/value-semantics/structuredValues.js +250 -0
  63. package/dist/css/value-semantics/tokenInterpretation.d.ts +90 -0
  64. package/dist/css/value-semantics/tokenInterpretation.js +193 -0
  65. package/dist/css/virtual-design-tokens.d.ts +17 -0
  66. package/dist/hosts/astro/astroRuntimeConfig.d.ts +12 -0
  67. package/dist/hosts/astro/astroRuntimeConfig.js +26 -0
  68. package/dist/hosts/astro/clientAsset.d.ts +12 -0
  69. package/dist/hosts/astro/clientAsset.js +51 -0
  70. package/dist/hosts/astro/clientTransport.d.ts +3 -0
  71. package/dist/hosts/astro/clientTransport.js +57 -0
  72. package/dist/hosts/astro/index.d.ts +3 -0
  73. package/dist/hosts/astro/index.js +2 -0
  74. package/dist/hosts/astro/integration.d.ts +35 -0
  75. package/dist/hosts/astro/integration.js +96 -0
  76. package/dist/hosts/astro/middleware.d.ts +13 -0
  77. package/dist/hosts/astro/middleware.js +22 -0
  78. package/dist/hosts/astro/projectContext.d.ts +11 -0
  79. package/dist/hosts/astro/projectContext.js +34 -0
  80. package/dist/hosts/astro/responseInstrumentation.d.ts +41 -0
  81. package/dist/hosts/astro/responseInstrumentation.js +80 -0
  82. package/dist/hosts/next/index.d.ts +4 -0
  83. package/dist/hosts/next/index.js +7 -0
  84. package/dist/hosts/next/loader.d.ts +66 -0
  85. package/dist/hosts/next/loader.js +346 -0
  86. package/dist/hosts/next/loaders/identity-loader.cjs +228257 -0
  87. package/dist/hosts/next/loaders/loader-plugin.cjs +228257 -0
  88. package/dist/hosts/next/manifest.d.ts +38 -0
  89. package/dist/hosts/next/manifest.js +30 -0
  90. package/dist/hosts/next/mount.d.ts +12 -0
  91. package/dist/hosts/next/mount.js +23 -0
  92. package/dist/hosts/next/repositoryScope.d.ts +20 -0
  93. package/dist/hosts/next/repositoryScope.js +33 -0
  94. package/dist/hosts/next/sidecar.d.ts +27 -0
  95. package/dist/hosts/next/sidecar.js +526 -0
  96. package/dist/hosts/next/wrapper.d.ts +67 -0
  97. package/dist/hosts/next/wrapper.js +310 -0
  98. package/dist/hosts/static/cli.d.ts +12 -0
  99. package/dist/hosts/static/cli.js +77 -0
  100. package/dist/hosts/static/html/bootstrap.d.ts +27 -0
  101. package/dist/hosts/static/html/bootstrap.js +93 -0
  102. package/dist/hosts/static/index.d.ts +4 -0
  103. package/dist/hosts/static/index.js +4 -0
  104. package/dist/hosts/static/manifest.d.ts +18 -0
  105. package/dist/hosts/static/manifest.js +51 -0
  106. package/dist/hosts/static/server.d.ts +72 -0
  107. package/dist/hosts/static/server.js +554 -0
  108. package/dist/hosts/vite/index.d.ts +20 -0
  109. package/dist/hosts/vite/index.js +48 -0
  110. package/dist/hosts/vite/react.d.ts +67 -0
  111. package/dist/hosts/vite/react.js +231 -0
  112. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +28 -0
  113. package/dist/hosts/vite/tokens/activeStylesheets.js +70 -0
  114. package/dist/hosts/vite/tokens/fileMap.d.ts +2 -0
  115. package/dist/hosts/vite/tokens/fileMap.js +1 -0
  116. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +46 -0
  117. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +104 -0
  118. package/dist/hosts/vite/virtual/design-tokens.d.ts +9 -0
  119. package/dist/hosts/vite/virtual/design-tokens.js +7 -0
  120. package/dist/hosts/vite/virtual-design-tokens.d.ts +1 -0
  121. package/dist/hosts/vite/vite.d.ts +62 -0
  122. package/dist/hosts/vite/vite.js +854 -0
  123. package/dist/html/dom.d.ts +13 -0
  124. package/dist/html/dom.js +46 -0
  125. package/dist/html/identity.d.ts +40 -0
  126. package/dist/html/identity.js +196 -0
  127. package/dist/html/insertions.d.ts +26 -0
  128. package/dist/html/insertions.js +59 -0
  129. package/dist/inspector/agent/McpConnectionDialog.d.ts +26 -0
  130. package/dist/inspector/agent/McpConnectionDialog.js +135 -0
  131. package/dist/inspector/agent/client.d.ts +98 -0
  132. package/dist/inspector/agent/client.js +728 -0
  133. package/dist/inspector/agent/connectionStatus.d.ts +13 -0
  134. package/dist/inspector/agent/connectionStatus.js +35 -0
  135. package/dist/inspector/agent/httpTransport.d.ts +21 -0
  136. package/dist/inspector/agent/httpTransport.js +347 -0
  137. package/dist/inspector/agent/protocol.d.ts +95 -0
  138. package/dist/inspector/agent/protocol.js +9 -0
  139. package/dist/inspector/agent/verification.d.ts +39 -0
  140. package/dist/inspector/agent/verification.js +207 -0
  141. package/dist/inspector/canvas/CanvasCard.d.ts +10 -0
  142. package/dist/inspector/canvas/CanvasCard.js +275 -0
  143. package/dist/inspector/canvas/CanvasElementOverlay.d.ts +2 -0
  144. package/dist/inspector/canvas/CanvasElementOverlay.js +301 -0
  145. package/dist/inspector/canvas/CanvasWorkspace.d.ts +2 -0
  146. package/dist/inspector/canvas/CanvasWorkspace.js +301 -0
  147. package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +6 -0
  148. package/dist/inspector/canvas/LockedWorkspaceNotice.js +17 -0
  149. package/dist/inspector/canvas/StaleChangeIndicator.d.ts +7 -0
  150. package/dist/inspector/canvas/StaleChangeIndicator.js +43 -0
  151. package/dist/inspector/canvas/agentPresentation.d.ts +87 -0
  152. package/dist/inspector/canvas/agentPresentation.js +421 -0
  153. package/dist/inspector/canvas/canvasGestures.d.ts +12 -0
  154. package/dist/inspector/canvas/canvasGestures.js +21 -0
  155. package/dist/inspector/canvas/canvasStore.d.ts +108 -0
  156. package/dist/inspector/canvas/canvasStore.js +448 -0
  157. package/dist/inspector/canvas/frameProtocol.d.ts +231 -0
  158. package/dist/inspector/canvas/frameProtocol.js +165 -0
  159. package/dist/inspector/canvas/linkEligibility.d.ts +8 -0
  160. package/dist/inspector/canvas/linkEligibility.js +68 -0
  161. package/dist/inspector/canvas/measurementProjection.d.ts +8 -0
  162. package/dist/inspector/canvas/measurementProjection.js +16 -0
  163. package/dist/inspector/canvas/normalizeUrl.d.ts +7 -0
  164. package/dist/inspector/canvas/normalizeUrl.js +27 -0
  165. package/dist/inspector/canvas/projection.d.ts +41 -0
  166. package/dist/inspector/canvas/projection.js +232 -0
  167. package/dist/inspector/canvas/rendererBootstrap.d.ts +4 -0
  168. package/dist/inspector/canvas/rendererBootstrap.js +410 -0
  169. package/dist/inspector/canvas/rendererCidIndex.d.ts +11 -0
  170. package/dist/inspector/canvas/rendererCidIndex.js +21 -0
  171. package/dist/inspector/canvas/rendererElementSelector.d.ts +2 -0
  172. package/dist/inspector/canvas/rendererElementSelector.js +378 -0
  173. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +2 -0
  174. package/dist/inspector/canvas/rendererSelectionProxy.js +61 -0
  175. package/dist/inspector/canvas/rendererStylesheet.d.ts +16 -0
  176. package/dist/inspector/canvas/rendererStylesheet.js +221 -0
  177. package/dist/inspector/canvas/resizeHandleScale.d.ts +13 -0
  178. package/dist/inspector/canvas/resizeHandleScale.js +20 -0
  179. package/dist/inspector/canvas/roleDetection.d.ts +5 -0
  180. package/dist/inspector/canvas/roleDetection.js +21 -0
  181. package/dist/inspector/canvas/sessionStore.d.ts +71 -0
  182. package/dist/inspector/canvas/sessionStore.js +453 -0
  183. package/dist/inspector/canvas/staleChangeDetector.d.ts +11 -0
  184. package/dist/inspector/canvas/staleChangeDetector.js +217 -0
  185. package/dist/inspector/canvas/toolbarScale.d.ts +7 -0
  186. package/dist/inspector/canvas/toolbarScale.js +11 -0
  187. package/dist/inspector/canvas/workspaceLease.d.ts +26 -0
  188. package/dist/inspector/canvas/workspaceLease.js +214 -0
  189. package/dist/inspector/changes/changesLog.d.ts +46 -0
  190. package/dist/inspector/changes/changesLog.js +209 -0
  191. package/dist/inspector/changes/codecs.d.ts +98 -0
  192. package/dist/inspector/changes/codecs.js +389 -0
  193. package/dist/inspector/changes/editModel.d.ts +74 -0
  194. package/dist/inspector/changes/editModel.js +120 -0
  195. package/dist/inspector/changes/managedStyleProjection.d.ts +6 -0
  196. package/dist/inspector/changes/managedStyleProjection.js +109 -0
  197. package/dist/inspector/changes/model.d.ts +13 -0
  198. package/dist/inspector/changes/model.js +163 -0
  199. package/dist/inspector/changes/presentation.d.ts +14 -0
  200. package/dist/inspector/changes/presentation.js +81 -0
  201. package/dist/inspector/changes/previewDiagnostics.d.ts +39 -0
  202. package/dist/inspector/changes/previewDiagnostics.js +172 -0
  203. package/dist/inspector/changes/structuralTypes.d.ts +35 -0
  204. package/dist/inspector/changes/structuralTypes.js +1 -0
  205. package/dist/inspector/changes/types.d.ts +76 -0
  206. package/dist/inspector/changes/types.js +16 -0
  207. package/dist/inspector/changes/workspaceChanges.d.ts +43 -0
  208. package/dist/inspector/changes/workspaceChanges.js +239 -0
  209. package/dist/inspector/clientManifest.d.ts +24 -0
  210. package/dist/inspector/clientManifest.js +69 -0
  211. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +5 -0
  212. package/dist/inspector/componentSemantics/ComponentPropsSection.js +44 -0
  213. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +11 -0
  214. package/dist/inspector/componentSemantics/adapterRegistry.js +75 -0
  215. package/dist/inspector/componentSemantics/boundaries.d.ts +2 -0
  216. package/dist/inspector/componentSemantics/boundaries.js +10 -0
  217. package/dist/inspector/componentSemantics/changeAction.d.ts +3 -0
  218. package/dist/inspector/componentSemantics/changeAction.js +6 -0
  219. package/dist/inspector/componentSemantics/changeModel.d.ts +8 -0
  220. package/dist/inspector/componentSemantics/changeModel.js +60 -0
  221. package/dist/inspector/componentSemantics/index.d.ts +4 -0
  222. package/dist/inspector/componentSemantics/index.js +2 -0
  223. package/dist/inspector/componentSemantics/reactRuntime.d.ts +10 -0
  224. package/dist/inspector/componentSemantics/reactRuntime.js +186 -0
  225. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +25 -0
  226. package/dist/inspector/componentSemantics/runtimeBridge.js +161 -0
  227. package/dist/inspector/componentSemantics/runtimeTypes.d.ts +2 -0
  228. package/dist/inspector/componentSemantics/runtimeTypes.js +1 -0
  229. package/dist/inspector/componentSemantics/textBinding.d.ts +69 -0
  230. package/dist/inspector/componentSemantics/textBinding.js +514 -0
  231. package/dist/inspector/componentSemantics/types.d.ts +96 -0
  232. package/dist/inspector/componentSemantics/types.js +5 -0
  233. package/dist/inspector/conformance/borderCases.d.ts +7 -0
  234. package/dist/inspector/conformance/borderCases.js +428 -0
  235. package/dist/inspector/conformance/colorCases.d.ts +8 -0
  236. package/dist/inspector/conformance/colorCases.js +470 -0
  237. package/dist/inspector/conformance/fixture.d.ts +68 -0
  238. package/dist/inspector/conformance/fixture.js +153 -0
  239. package/dist/inspector/conformance/projection.d.ts +2 -0
  240. package/dist/inspector/conformance/projection.js +3 -0
  241. package/dist/inspector/conformance/spacingCases.d.ts +6 -0
  242. package/dist/inspector/conformance/spacingCases.js +417 -0
  243. package/dist/inspector/conformance/typographyCases.d.ts +7 -0
  244. package/dist/inspector/conformance/typographyCases.js +174 -0
  245. package/dist/inspector/editScope.d.ts +4 -0
  246. package/dist/inspector/editScope.js +5 -0
  247. package/dist/inspector/index.d.ts +20 -0
  248. package/dist/inspector/index.js +236 -0
  249. package/dist/inspector/inline-text/inlineTextEditor.d.ts +74 -0
  250. package/dist/inspector/inline-text/inlineTextEditor.js +1207 -0
  251. package/dist/inspector/inline-text/inlineTextLifecycle.d.ts +2 -0
  252. package/dist/inspector/inline-text/inlineTextLifecycle.js +17 -0
  253. package/dist/inspector/inline-text/textChangeBoundary.d.ts +6 -0
  254. package/dist/inspector/inline-text/textChangeBoundary.js +1 -0
  255. package/dist/inspector/inspection/bridge.d.ts +72 -0
  256. package/dist/inspector/inspection/bridge.js +134 -0
  257. package/dist/inspector/inspection/browserCssInspection.d.ts +74 -0
  258. package/dist/inspector/inspection/browserCssInspection.js +317 -0
  259. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +12 -0
  260. package/dist/inspector/inspection/browserCssInspectionRegistry.js +66 -0
  261. package/dist/inspector/inspection/selectionProperty.d.ts +32 -0
  262. package/dist/inspector/inspection/selectionProperty.js +33 -0
  263. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +20 -0
  264. package/dist/inspector/inspection/useBrowserCssInspection.js +159 -0
  265. package/dist/inspector/overlay/DropGuideOverlay.d.ts +17 -0
  266. package/dist/inspector/overlay/DropGuideOverlay.js +17 -0
  267. package/dist/inspector/overlay/InspectorOverlay.d.ts +5 -0
  268. package/dist/inspector/overlay/InspectorOverlay.js +328 -0
  269. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +19 -0
  270. package/dist/inspector/overlay/MeasurementGuideOverlay.js +40 -0
  271. package/dist/inspector/overlay/clickPolicy.d.ts +7 -0
  272. package/dist/inspector/overlay/clickPolicy.js +13 -0
  273. package/dist/inspector/overlay/dropGuide.d.ts +22 -0
  274. package/dist/inspector/overlay/dropGuide.js +48 -0
  275. package/dist/inspector/overlay/elementSelector.d.ts +1 -0
  276. package/dist/inspector/overlay/elementSelector.js +100 -0
  277. package/dist/inspector/overlay/frameThrottle.d.ts +10 -0
  278. package/dist/inspector/overlay/frameThrottle.js +38 -0
  279. package/dist/inspector/overlay/interactionStyles.d.ts +3 -0
  280. package/dist/inspector/overlay/interactionStyles.js +70 -0
  281. package/dist/inspector/overlay/measurementGeometry.d.ts +25 -0
  282. package/dist/inspector/overlay/measurementGeometry.js +104 -0
  283. package/dist/inspector/overlay/overlayGeometry.d.ts +40 -0
  284. package/dist/inspector/overlay/overlayGeometry.js +59 -0
  285. package/dist/inspector/overlay/selectedGeometry.d.ts +7 -0
  286. package/dist/inspector/overlay/selectedGeometry.js +51 -0
  287. package/dist/inspector/overlay/structuralGestures.d.ts +28 -0
  288. package/dist/inspector/overlay/structuralGestures.js +180 -0
  289. package/dist/inspector/projection/cssEscapes.d.ts +3 -0
  290. package/dist/inspector/projection/cssEscapes.js +20 -0
  291. package/dist/inspector/projection/managedStylesheet.d.ts +33 -0
  292. package/dist/inspector/projection/managedStylesheet.js +240 -0
  293. package/dist/inspector/projection/renderedInstance.d.ts +56 -0
  294. package/dist/inspector/projection/renderedInstance.js +306 -0
  295. package/dist/inspector/projection/structuralProjection.d.ts +93 -0
  296. package/dist/inspector/projection/structuralProjection.js +560 -0
  297. package/dist/inspector/projection/structuralProjectionBoundary.d.ts +5 -0
  298. package/dist/inspector/projection/structuralProjectionBoundary.js +65 -0
  299. package/dist/inspector/projection/textProjection.d.ts +53 -0
  300. package/dist/inspector/projection/textProjection.js +705 -0
  301. package/dist/inspector/projection/workspaceProjection.d.ts +43 -0
  302. package/dist/inspector/projection/workspaceProjection.js +58 -0
  303. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +15 -0
  304. package/dist/inspector/prompt/PromptSettingsDialog.js +17 -0
  305. package/dist/inspector/prompt/clipboardHandoff.d.ts +34 -0
  306. package/dist/inspector/prompt/clipboardHandoff.js +212 -0
  307. package/dist/inspector/prompt/copyToClipboard.d.ts +1 -0
  308. package/dist/inspector/prompt/copyToClipboard.js +34 -0
  309. package/dist/inspector/prompt/detectFramework.d.ts +6 -0
  310. package/dist/inspector/prompt/detectFramework.js +4 -0
  311. package/dist/inspector/prompt/generatePrompt.d.ts +7 -0
  312. package/dist/inspector/prompt/generatePrompt.js +391 -0
  313. package/dist/inspector/prompt/promptSettings.d.ts +8 -0
  314. package/dist/inspector/prompt/promptSettings.js +28 -0
  315. package/dist/inspector/runtime/devFlag.d.ts +28 -0
  316. package/dist/inspector/runtime/devFlag.js +50 -0
  317. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +19 -0
  318. package/dist/inspector/runtime/documentStylesheetOrder.js +89 -0
  319. package/dist/inspector/runtime/domRealm.d.ts +4 -0
  320. package/dist/inspector/runtime/domRealm.js +11 -0
  321. package/dist/inspector/runtime/runtimeConfig.d.ts +119 -0
  322. package/dist/inspector/runtime/runtimeConfig.js +276 -0
  323. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +32 -0
  324. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +149 -0
  325. package/dist/inspector/runtime/useRuntimeConfig.d.ts +10 -0
  326. package/dist/inspector/runtime/useRuntimeConfig.js +13 -0
  327. package/dist/inspector/selection/editScope.d.ts +32 -0
  328. package/dist/inspector/selection/editScope.js +140 -0
  329. package/dist/inspector/selection/editTarget.d.ts +8 -0
  330. package/dist/inspector/selection/editTarget.js +11 -0
  331. package/dist/inspector/selection/hierarchy.d.ts +7 -0
  332. package/dist/inspector/selection/hierarchy.js +42 -0
  333. package/dist/inspector/selection/resolveSelection.d.ts +10 -0
  334. package/dist/inspector/selection/resolveSelection.js +60 -0
  335. package/dist/inspector/selection/selectionStore.d.ts +41 -0
  336. package/dist/inspector/selection/selectionStore.js +262 -0
  337. package/dist/inspector/selection/selectionTarget.d.ts +5 -0
  338. package/dist/inspector/selection/selectionTarget.js +50 -0
  339. package/dist/inspector/selection/sourceSite.d.ts +2 -0
  340. package/dist/inspector/selection/sourceSite.js +12 -0
  341. package/dist/inspector/selection/styleSelection.d.ts +22 -0
  342. package/dist/inspector/selection/styleSelection.js +104 -0
  343. package/dist/inspector/session/index.d.ts +3 -0
  344. package/dist/inspector/session/index.js +2 -0
  345. package/dist/inspector/session/lifecycle.d.ts +22 -0
  346. package/dist/inspector/session/lifecycle.js +63 -0
  347. package/dist/inspector/session/sessionContext.d.ts +21 -0
  348. package/dist/inspector/session/sessionContext.js +28 -0
  349. package/dist/inspector/session/sessionFactory.d.ts +29 -0
  350. package/dist/inspector/session/sessionFactory.js +73 -0
  351. package/dist/inspector/settings/SettingsDialog.d.ts +12 -0
  352. package/dist/inspector/settings/SettingsDialog.js +46 -0
  353. package/dist/inspector/shell/AppShell.d.ts +2 -0
  354. package/dist/inspector/shell/AppShell.js +9 -0
  355. package/dist/inspector/shell/ChangesLog.d.ts +6 -0
  356. package/dist/inspector/shell/ChangesLog.js +92 -0
  357. package/dist/inspector/shell/CopyPromptButton.d.ts +9 -0
  358. package/dist/inspector/shell/CopyPromptButton.js +159 -0
  359. package/dist/inspector/shell/DomNavigation.d.ts +8 -0
  360. package/dist/inspector/shell/DomNavigation.js +30 -0
  361. package/dist/inspector/shell/EmptyState.d.ts +2 -0
  362. package/dist/inspector/shell/EmptyState.js +15 -0
  363. package/dist/inspector/shell/InspectorShell.d.ts +11 -0
  364. package/dist/inspector/shell/InspectorShell.js +268 -0
  365. package/dist/inspector/shell/openStore.d.ts +6 -0
  366. package/dist/inspector/shell/openStore.js +29 -0
  367. package/dist/inspector/shell/panelLayout.d.ts +2 -0
  368. package/dist/inspector/shell/panelLayout.js +29 -0
  369. package/dist/inspector/shell/shortcuts.d.ts +3 -0
  370. package/dist/inspector/shell/shortcuts.js +25 -0
  371. package/dist/inspector/shell/stateValue.d.ts +3 -0
  372. package/dist/inspector/shell/stateValue.js +34 -0
  373. package/dist/inspector/shell/styleState.d.ts +7 -0
  374. package/dist/inspector/shell/styleState.js +13 -0
  375. package/dist/inspector/spacing/projection.d.ts +43 -0
  376. package/dist/inspector/spacing/projection.js +136 -0
  377. package/dist/inspector/styleEditors/AppearanceSection.d.ts +13 -0
  378. package/dist/inspector/styleEditors/AppearanceSection.js +6 -0
  379. package/dist/inspector/styleEditors/AspectRatioField.d.ts +17 -0
  380. package/dist/inspector/styleEditors/AspectRatioField.js +10 -0
  381. package/dist/inspector/styleEditors/BorderEditor.d.ts +13 -0
  382. package/dist/inspector/styleEditors/BorderEditor.js +295 -0
  383. package/dist/inspector/styleEditors/BorderRadiusEditor.d.ts +14 -0
  384. package/dist/inspector/styleEditors/BorderRadiusEditor.js +108 -0
  385. package/dist/inspector/styleEditors/BoxShadowEditor.d.ts +13 -0
  386. package/dist/inspector/styleEditors/BoxShadowEditor.js +13 -0
  387. package/dist/inspector/styleEditors/ColorPicker.d.ts +15 -0
  388. package/dist/inspector/styleEditors/ColorPicker.js +73 -0
  389. package/dist/inspector/styleEditors/GapField.d.ts +17 -0
  390. package/dist/inspector/styleEditors/GapField.js +12 -0
  391. package/dist/inspector/styleEditors/GridChildSection.d.ts +14 -0
  392. package/dist/inspector/styleEditors/GridChildSection.js +91 -0
  393. package/dist/inspector/styleEditors/GridPicker.d.ts +13 -0
  394. package/dist/inspector/styleEditors/GridPicker.js +179 -0
  395. package/dist/inspector/styleEditors/GridSection.d.ts +17 -0
  396. package/dist/inspector/styleEditors/GridSection.js +27 -0
  397. package/dist/inspector/styleEditors/GridValueField.d.ts +17 -0
  398. package/dist/inspector/styleEditors/GridValueField.js +70 -0
  399. package/dist/inspector/styleEditors/InsetSection.d.ts +15 -0
  400. package/dist/inspector/styleEditors/InsetSection.js +15 -0
  401. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +6 -0
  402. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +6 -0
  403. package/dist/inspector/styleEditors/LayoutComboField.d.ts +18 -0
  404. package/dist/inspector/styleEditors/LayoutComboField.js +138 -0
  405. package/dist/inspector/styleEditors/LayoutDropdown.d.ts +14 -0
  406. package/dist/inspector/styleEditors/LayoutDropdown.js +34 -0
  407. package/dist/inspector/styleEditors/LayoutSection.d.ts +13 -0
  408. package/dist/inspector/styleEditors/LayoutSection.js +342 -0
  409. package/dist/inspector/styleEditors/OpacityEditor.d.ts +13 -0
  410. package/dist/inspector/styleEditors/OpacityEditor.js +34 -0
  411. package/dist/inspector/styleEditors/PositionInsets.d.ts +15 -0
  412. package/dist/inspector/styleEditors/PositionInsets.js +12 -0
  413. package/dist/inspector/styleEditors/SpacingBox.d.ts +29 -0
  414. package/dist/inspector/styleEditors/SpacingBox.js +189 -0
  415. package/dist/inspector/styleEditors/Typography.d.ts +13 -0
  416. package/dist/inspector/styleEditors/Typography.js +137 -0
  417. package/dist/inspector/styleEditors/completeCssValue.d.ts +8 -0
  418. package/dist/inspector/styleEditors/completeCssValue.js +34 -0
  419. package/dist/inspector/styleEditors/gridChildModel.d.ts +74 -0
  420. package/dist/inspector/styleEditors/gridChildModel.js +138 -0
  421. package/dist/inspector/styleEditors/layoutValue.d.ts +24 -0
  422. package/dist/inspector/styleEditors/layoutValue.js +103 -0
  423. package/dist/inspector/styleEditors/nudgeValue.d.ts +8 -0
  424. package/dist/inspector/styleEditors/nudgeValue.js +71 -0
  425. package/dist/inspector/styleEditors/rowLookup.d.ts +11 -0
  426. package/dist/inspector/styleEditors/rowLookup.js +13 -0
  427. package/dist/inspector/styleEditors/stringRecord.d.ts +4 -0
  428. package/dist/inspector/styleEditors/stringRecord.js +1 -0
  429. package/dist/inspector/styleEditors/valuePolicy.d.ts +20 -0
  430. package/dist/inspector/styleEditors/valuePolicy.js +82 -0
  431. package/dist/inspector/testing.d.ts +10 -0
  432. package/dist/inspector/testing.js +9 -0
  433. package/dist/inspector/tokens/TokenChip.d.ts +24 -0
  434. package/dist/inspector/tokens/TokenChip.js +23 -0
  435. package/dist/inspector/tokens/TokenDropdown.d.ts +13 -0
  436. package/dist/inspector/tokens/TokenDropdown.js +59 -0
  437. package/dist/inspector/tokens/TokenField.d.ts +68 -0
  438. package/dist/inspector/tokens/TokenField.js +485 -0
  439. package/dist/inspector/tokens/TokenLabel.d.ts +7 -0
  440. package/dist/inspector/tokens/TokenLabel.js +23 -0
  441. package/dist/inspector/tokens/TokensPanel.d.ts +5 -0
  442. package/dist/inspector/tokens/TokensPanel.js +47 -0
  443. package/dist/inspector/tokens/catalog.d.ts +51 -0
  444. package/dist/inspector/tokens/catalog.js +184 -0
  445. package/dist/inspector/tokens/editActions.d.ts +35 -0
  446. package/dist/inspector/tokens/editActions.js +164 -0
  447. package/dist/inspector/tokens/resolution/cascade.d.ts +14 -0
  448. package/dist/inspector/tokens/resolution/cascade.js +31 -0
  449. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +43 -0
  450. package/dist/inspector/tokens/resolution/cssomCollector.js +528 -0
  451. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +12 -0
  452. package/dist/inspector/tokens/resolution/selectorSemantics.js +106 -0
  453. package/dist/inspector/tokens/resolution.d.ts +56 -0
  454. package/dist/inspector/tokens/resolution.js +1401 -0
  455. package/dist/inspector/tokens/tokenEdits.d.ts +3 -0
  456. package/dist/inspector/tokens/tokenEdits.js +22 -0
  457. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +6 -0
  458. package/dist/inspector/tokens/valueSemanticsAdapter.js +68 -0
  459. package/dist/inspector/ui/AtRuleContext.d.ts +18 -0
  460. package/dist/inspector/ui/AtRuleContext.js +54 -0
  461. package/dist/inspector/ui/Button.d.ts +9 -0
  462. package/dist/inspector/ui/Button.js +4 -0
  463. package/dist/inspector/ui/ColorSwatch.d.ts +7 -0
  464. package/dist/inspector/ui/ColorSwatch.js +6 -0
  465. package/dist/inspector/ui/ControlSurface.d.ts +14 -0
  466. package/dist/inspector/ui/ControlSurface.js +10 -0
  467. package/dist/inspector/ui/FieldRow.d.ts +14 -0
  468. package/dist/inspector/ui/FieldRow.js +15 -0
  469. package/dist/inspector/ui/IconButton.d.ts +14 -0
  470. package/dist/inspector/ui/IconButton.js +5 -0
  471. package/dist/inspector/ui/InspectorPopover.d.ts +17 -0
  472. package/dist/inspector/ui/InspectorPopover.js +13 -0
  473. package/dist/inspector/ui/PopoverListbox.d.ts +37 -0
  474. package/dist/inspector/ui/PopoverListbox.js +21 -0
  475. package/dist/inspector/ui/SegmentedControl.d.ts +24 -0
  476. package/dist/inspector/ui/SegmentedControl.js +16 -0
  477. package/dist/inspector/ui/Select.d.ts +25 -0
  478. package/dist/inspector/ui/Select.js +56 -0
  479. package/dist/inspector/ui/SideValuesField.d.ts +44 -0
  480. package/dist/inspector/ui/SideValuesField.js +76 -0
  481. package/dist/inspector/ui/StatusCallout.d.ts +9 -0
  482. package/dist/inspector/ui/StatusCallout.js +4 -0
  483. package/dist/inspector/ui/TextInput.d.ts +12 -0
  484. package/dist/inspector/ui/TextInput.js +5 -0
  485. package/dist/inspector/ui/ToggleButton.d.ts +11 -0
  486. package/dist/inspector/ui/ToggleButton.js +6 -0
  487. package/dist/inspector/ui/assets/grid.svg +14 -0
  488. package/dist/inspector/ui/css.d.ts +9 -0
  489. package/dist/inspector/ui/labels.d.ts +1 -0
  490. package/dist/inspector/ui/labels.js +7 -0
  491. package/dist/inspector/ui/styles.d.ts +1 -0
  492. package/dist/inspector/ui/styles.js +68 -0
  493. package/dist/inspector/virtual-modules.d.ts +7 -0
  494. package/dist/inspector/vite-env.d.ts +10 -0
  495. package/dist/internal/agent-protocol.d.ts +232 -0
  496. package/dist/internal/agent-protocol.js +237 -0
  497. package/dist/nudge-ui.mjs +15722 -0
  498. package/dist/project/files.d.ts +19 -0
  499. package/dist/project/files.js +226 -0
  500. package/dist/project/identity.d.ts +6 -0
  501. package/dist/project/identity.js +19 -0
  502. package/dist/project/pathPolicy.d.ts +8 -0
  503. package/dist/project/pathPolicy.js +12 -0
  504. package/dist/project/tokens.d.ts +36 -0
  505. package/dist/project/tokens.js +223 -0
  506. package/dist/transport/index.d.ts +8 -0
  507. package/dist/transport/index.js +8 -0
  508. package/dist/transport/routes.d.ts +13 -0
  509. package/dist/transport/routes.js +16 -0
  510. 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;