nudge-ui 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. package/dist/cli/agentCommand.d.ts +0 -1
  2. package/dist/cli/agentCommand.js +0 -1
  3. package/dist/client.mjs +238 -122
  4. package/dist/compiler/ast.d.ts +0 -6
  5. package/dist/compiler/ast.js +0 -5
  6. package/dist/compiler/componentContractTypes.d.ts +11 -5
  7. package/dist/compiler/componentContracts.js +3 -9
  8. package/dist/compiler/componentInstrumentation.d.ts +2 -13
  9. package/dist/compiler/componentInstrumentation.js +3 -12
  10. package/dist/compiler/componentPolicyResolution.d.ts +3 -22
  11. package/dist/compiler/componentPolicyResolution.js +6 -38
  12. package/dist/compiler/identityAttributes.d.ts +2 -0
  13. package/dist/compiler/identityAttributes.js +2 -0
  14. package/dist/compiler/index.d.ts +0 -1
  15. package/dist/compiler/index.js +0 -1
  16. package/dist/compiler/packageComponentContracts.d.ts +10 -19
  17. package/dist/compiler/packageComponentContracts.js +60 -43
  18. package/dist/compiler/reactComponentProtocols.d.ts +0 -7
  19. package/dist/compiler/reactComponentProtocols.js +0 -7
  20. package/dist/compiler/reactIdentity.d.ts +2 -2
  21. package/dist/compiler/reactIdentity.js +41 -43
  22. package/dist/compiler/sourcePaths.d.ts +4 -8
  23. package/dist/compiler/sourcePaths.js +6 -8
  24. package/dist/css/dialects/index.d.ts +2 -21
  25. package/dist/css/dialects/index.js +2 -9
  26. package/dist/css/dialects/tailwind.d.ts +2 -16
  27. package/dist/css/dialects/tailwind.js +2 -25
  28. package/dist/css/dialects/vanillaExtract.d.ts +1 -9
  29. package/dist/css/dialects/vanillaExtract.js +0 -1
  30. package/dist/css/index.d.ts +0 -8
  31. package/dist/css/index.js +0 -8
  32. package/dist/css/model/index.d.ts +6 -38
  33. package/dist/css/model/index.js +0 -9
  34. package/dist/css/token-inventory/index.d.ts +0 -23
  35. package/dist/css/token-inventory/index.js +0 -23
  36. package/dist/css/token-inventory/inventory.js +4 -16
  37. package/dist/css/token-inventory/parseStylesheet.d.ts +1 -9
  38. package/dist/css/token-inventory/parseStylesheet.js +5 -42
  39. package/dist/css/token-inventory/policy.d.ts +2 -39
  40. package/dist/css/token-inventory/policy.js +2 -39
  41. package/dist/css/token-inventory/types.d.ts +2 -15
  42. package/dist/css/value-semantics/borderSemantics.d.ts +1 -8
  43. package/dist/css/value-semantics/borderSemantics.js +5 -23
  44. package/dist/css/value-semantics/boxSemantics.d.ts +2 -25
  45. package/dist/css/value-semantics/boxSemantics.js +1 -7
  46. package/dist/css/value-semantics/colorSemantics.d.ts +6 -60
  47. package/dist/css/value-semantics/colorSemantics.js +9 -40
  48. package/dist/css/value-semantics/cssSyntax.d.ts +10 -10
  49. package/dist/css/value-semantics/cssSyntax.js +39 -11
  50. package/dist/css/value-semantics/fontSemantics.d.ts +3 -19
  51. package/dist/css/value-semantics/fontSemantics.js +7 -25
  52. package/dist/css/value-semantics/index.d.ts +1 -12
  53. package/dist/css/value-semantics/index.js +1 -12
  54. package/dist/css/value-semantics/propertyPolicy.d.ts +6 -53
  55. package/dist/css/value-semantics/propertyPolicy.js +47 -59
  56. package/dist/css/value-semantics/stringMaps.d.ts +0 -1
  57. package/dist/css/value-semantics/structuredValues.d.ts +3 -37
  58. package/dist/css/value-semantics/structuredValues.js +6 -17
  59. package/dist/css/value-semantics/tokenInterpretation.d.ts +8 -50
  60. package/dist/css/value-semantics/tokenInterpretation.js +7 -21
  61. package/dist/hosts/astro/astroRuntimeConfig.d.ts +0 -1
  62. package/dist/hosts/astro/astroRuntimeConfig.js +0 -1
  63. package/dist/hosts/astro/clientAsset.d.ts +1 -5
  64. package/dist/hosts/astro/clientAsset.js +1 -5
  65. package/dist/hosts/astro/clientTransport.d.ts +0 -1
  66. package/dist/hosts/astro/clientTransport.js +4 -9
  67. package/dist/hosts/astro/integration.d.ts +2 -28
  68. package/dist/hosts/astro/integration.js +7 -36
  69. package/dist/hosts/astro/markdownIdentity.d.ts +0 -3
  70. package/dist/hosts/astro/markdownIdentity.js +0 -3
  71. package/dist/hosts/astro/middleware.d.ts +1 -12
  72. package/dist/hosts/astro/middleware.js +1 -12
  73. package/dist/hosts/astro/projectContext.d.ts +1 -9
  74. package/dist/hosts/astro/projectContext.js +2 -11
  75. package/dist/hosts/astro/responseInstrumentation.d.ts +4 -33
  76. package/dist/hosts/astro/responseInstrumentation.js +5 -34
  77. package/dist/hosts/environment.d.ts +0 -8
  78. package/dist/hosts/environment.js +0 -1
  79. package/dist/hosts/next/index.js +1 -3
  80. package/dist/hosts/next/loader.d.ts +5 -44
  81. package/dist/hosts/next/loader.js +22 -103
  82. package/dist/hosts/next/loaders/identity-loader.cjs +111 -65
  83. package/dist/hosts/next/loaders/loader-plugin.cjs +111 -65
  84. package/dist/hosts/next/manifest.d.ts +2 -16
  85. package/dist/hosts/next/manifest.js +18 -20
  86. package/dist/hosts/next/mount.d.ts +1 -11
  87. package/dist/hosts/next/mount.js +1 -11
  88. package/dist/hosts/next/repositoryScope.d.ts +2 -17
  89. package/dist/hosts/next/repositoryScope.js +2 -17
  90. package/dist/hosts/next/sidecar.d.ts +0 -13
  91. package/dist/hosts/next/sidecar.js +25 -110
  92. package/dist/hosts/next/wrapper.d.ts +0 -31
  93. package/dist/hosts/next/wrapper.js +13 -64
  94. package/dist/hosts/projectBridge.d.ts +0 -2
  95. package/dist/hosts/projectBridge.js +0 -2
  96. package/dist/hosts/reactRendererCapture.d.ts +2 -0
  97. package/dist/hosts/reactRendererCapture.js +12 -0
  98. package/dist/hosts/static/cli.d.ts +0 -4
  99. package/dist/hosts/static/cli.js +0 -3
  100. package/dist/hosts/static/html/bootstrap.d.ts +1 -18
  101. package/dist/hosts/static/html/bootstrap.js +2 -14
  102. package/dist/hosts/static/manifest.d.ts +2 -15
  103. package/dist/hosts/static/manifest.js +5 -18
  104. package/dist/hosts/static/server.d.ts +4 -38
  105. package/dist/hosts/static/server.js +17 -67
  106. package/dist/hosts/vite/index.d.ts +0 -10
  107. package/dist/hosts/vite/index.js +0 -10
  108. package/dist/hosts/vite/react.d.ts +4 -17
  109. package/dist/hosts/vite/react.js +18 -35
  110. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +1 -10
  111. package/dist/hosts/vite/tokens/activeStylesheets.js +3 -8
  112. package/dist/hosts/vite/tokens/fileMap.d.ts +0 -1
  113. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +2 -15
  114. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +3 -10
  115. package/dist/hosts/vite/vite.d.ts +5 -26
  116. package/dist/hosts/vite/vite.js +44 -80
  117. package/dist/html/dom.d.ts +0 -1
  118. package/dist/html/dom.js +0 -1
  119. package/dist/html/identity.d.ts +1 -15
  120. package/dist/html/identity.js +1 -8
  121. package/dist/html/insertions.d.ts +2 -8
  122. package/dist/html/insertions.js +1 -1
  123. package/dist/inspector/agent/McpConnectionDialog.d.ts +1 -6
  124. package/dist/inspector/agent/McpConnectionDialog.js +1 -6
  125. package/dist/inspector/agent/activity.d.ts +1 -1
  126. package/dist/inspector/agent/activity.js +1 -1
  127. package/dist/inspector/agent/client.d.ts +2 -26
  128. package/dist/inspector/agent/client.js +17 -64
  129. package/dist/inspector/agent/connectionStatus.d.ts +0 -1
  130. package/dist/inspector/agent/connectionStatus.js +0 -1
  131. package/dist/inspector/agent/httpTransport.d.ts +0 -8
  132. package/dist/inspector/agent/httpTransport.js +21 -39
  133. package/dist/inspector/agent/protocol.d.ts +1 -10
  134. package/dist/inspector/agent/protocol.js +1 -9
  135. package/dist/inspector/agent/verification.d.ts +2 -19
  136. package/dist/inspector/agent/verification.js +7 -43
  137. package/dist/inspector/boot.d.ts +3 -1
  138. package/dist/inspector/boot.js +12 -20
  139. package/dist/inspector/canvas/AgentActivityOverlay.d.ts +1 -1
  140. package/dist/inspector/canvas/AgentActivityOverlay.js +1 -1
  141. package/dist/inspector/canvas/CanvasCard.js +7 -14
  142. package/dist/inspector/canvas/CanvasElementOverlay.js +117 -50
  143. package/dist/inspector/canvas/CanvasWorkspace.js +15 -29
  144. package/dist/inspector/canvas/PageCard.d.ts +0 -1
  145. package/dist/inspector/canvas/PageCard.js +0 -1
  146. package/dist/inspector/canvas/SketchToolOptions.d.ts +0 -1
  147. package/dist/inspector/canvas/SketchToolOptions.js +0 -6
  148. package/dist/inspector/canvas/ToolOptionsDrawer.d.ts +1 -6
  149. package/dist/inspector/canvas/ToolOptionsDrawer.js +2 -8
  150. package/dist/inspector/canvas/activeCanvasDocument.d.ts +0 -2
  151. package/dist/inspector/canvas/activeCanvasDocument.js +0 -2
  152. package/dist/inspector/canvas/agentPresentation.d.ts +2 -13
  153. package/dist/inspector/canvas/agentPresentation.js +3 -14
  154. package/dist/inspector/canvas/canvasFrame.d.ts +2 -6
  155. package/dist/inspector/canvas/canvasFrame.js +1 -2
  156. package/dist/inspector/canvas/canvasResize.d.ts +1 -6
  157. package/dist/inspector/canvas/canvasResize.js +1 -6
  158. package/dist/inspector/canvas/canvasStore.d.ts +4 -12
  159. package/dist/inspector/canvas/canvasStore.js +12 -26
  160. package/dist/inspector/canvas/frameConnection.d.ts +1 -7
  161. package/dist/inspector/canvas/frameContent.d.ts +0 -1
  162. package/dist/inspector/canvas/frameLifecycle.d.ts +12 -0
  163. package/dist/inspector/canvas/frameLifecycle.js +11 -0
  164. package/dist/inspector/canvas/frameProtocol.d.ts +5 -40
  165. package/dist/inspector/canvas/frameProtocol.js +1 -24
  166. package/dist/inspector/canvas/frameScrollbarStyles.d.ts +0 -1
  167. package/dist/inspector/canvas/frameScrollbarStyles.js +0 -1
  168. package/dist/inspector/canvas/layout.d.ts +10 -22
  169. package/dist/inspector/canvas/layout.js +0 -3
  170. package/dist/inspector/canvas/normalizeUrl.js +1 -8
  171. package/dist/inspector/canvas/pageSurface.d.ts +1 -6
  172. package/dist/inspector/canvas/pageSurface.js +1 -6
  173. package/dist/inspector/canvas/projection.d.ts +4 -25
  174. package/dist/inspector/canvas/projection.js +22 -72
  175. package/dist/inspector/canvas/rendererBootstrap.d.ts +8 -1
  176. package/dist/inspector/canvas/rendererBootstrap.js +6 -14
  177. package/dist/inspector/canvas/rendererCidIndex.d.ts +0 -5
  178. package/dist/inspector/canvas/rendererCidIndex.js +0 -5
  179. package/dist/inspector/canvas/rendererElementSelector.js +29 -27
  180. package/dist/inspector/canvas/rendererMessageRouter.d.ts +0 -1
  181. package/dist/inspector/canvas/rendererMessageRouter.js +0 -1
  182. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +1 -5
  183. package/dist/inspector/canvas/rendererSelectionProxy.js +2 -7
  184. package/dist/inspector/canvas/rendererStylesheet.d.ts +0 -1
  185. package/dist/inspector/canvas/rendererStylesheet.js +9 -2
  186. package/dist/inspector/canvas/resizeHandleScale.d.ts +1 -10
  187. package/dist/inspector/canvas/resizeHandleScale.js +1 -10
  188. package/dist/inspector/canvas/sessionStore.d.ts +1 -7
  189. package/dist/inspector/canvas/sessionStore.js +21 -34
  190. package/dist/inspector/canvas/staleChangeDetector.js +1 -4
  191. package/dist/inspector/canvas/toolbarScale.d.ts +1 -4
  192. package/dist/inspector/canvas/toolbarScale.js +1 -4
  193. package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +0 -1
  194. package/dist/inspector/canvas/useCanvasLayoutAnimation.js +0 -1
  195. package/dist/inspector/canvas/viewStore.js +1 -1
  196. package/dist/inspector/canvas/wheelPan.d.ts +1 -1
  197. package/dist/inspector/canvas/wheelPan.js +1 -1
  198. package/dist/inspector/canvas/workspaceLease.d.ts +1 -5
  199. package/dist/inspector/canvas/workspaceLease.js +1 -7
  200. package/dist/inspector/changes/codecs.js +2 -1
  201. package/dist/inspector/changes/draftPreview.d.ts +1 -6
  202. package/dist/inspector/changes/draftPreview.js +15 -30
  203. package/dist/inspector/changes/editModel.d.ts +3 -13
  204. package/dist/inspector/changes/editModel.js +1 -2
  205. package/dist/inspector/changes/managedStyleProjection.js +4 -14
  206. package/dist/inspector/changes/model.d.ts +0 -5
  207. package/dist/inspector/changes/model.js +1 -8
  208. package/dist/inspector/changes/previewDiagnostics.d.ts +2 -12
  209. package/dist/inspector/changes/previewDiagnostics.js +4 -20
  210. package/dist/inspector/changes/previewVerification.d.ts +25 -0
  211. package/dist/inspector/changes/previewVerification.js +34 -0
  212. package/dist/inspector/changes/structuralTypes.d.ts +2 -4
  213. package/dist/inspector/changes/types.d.ts +3 -10
  214. package/dist/inspector/clientManifest.d.ts +17 -6
  215. package/dist/inspector/clientManifest.js +16 -3
  216. package/dist/inspector/comments/CommentsOverlay.js +48 -7
  217. package/dist/inspector/comments/element.d.ts +1 -2
  218. package/dist/inspector/comments/element.js +1 -2
  219. package/dist/inspector/comments/store.d.ts +1 -1
  220. package/dist/inspector/comments/store.js +1 -1
  221. package/dist/inspector/comments/verification.d.ts +8 -2
  222. package/dist/inspector/comments/verification.js +18 -10
  223. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +8 -0
  224. package/dist/inspector/componentSemantics/ComponentPropsSection.js +10 -7
  225. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +2 -9
  226. package/dist/inspector/componentSemantics/adapterRegistry.js +2 -9
  227. package/dist/inspector/componentSemantics/changeModel.js +2 -4
  228. package/dist/inspector/componentSemantics/react/callsites.d.ts +28 -0
  229. package/dist/inspector/componentSemantics/react/callsites.js +261 -0
  230. package/dist/inspector/componentSemantics/react/devtoolsHook.d.ts +23 -0
  231. package/dist/inspector/componentSemantics/react/devtoolsHook.js +71 -0
  232. package/dist/inspector/componentSemantics/react/fibers.d.ts +17 -0
  233. package/dist/inspector/componentSemantics/react/fibers.js +30 -0
  234. package/dist/inspector/componentSemantics/{reactRuntime.d.ts → react/runtime.d.ts} +3 -2
  235. package/dist/inspector/componentSemantics/{reactRuntime.js → react/runtime.js} +70 -53
  236. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +2 -18
  237. package/dist/inspector/componentSemantics/runtimeBridge.js +5 -19
  238. package/dist/inspector/componentSemantics/textBinding.d.ts +1 -9
  239. package/dist/inspector/componentSemantics/textBinding.js +16 -42
  240. package/dist/inspector/componentSemantics/types.d.ts +8 -27
  241. package/dist/inspector/componentSemantics/types.js +0 -1
  242. package/dist/inspector/conformance/borderCases.d.ts +0 -5
  243. package/dist/inspector/conformance/borderCases.js +0 -5
  244. package/dist/inspector/conformance/colorCases.d.ts +0 -6
  245. package/dist/inspector/conformance/colorCases.js +0 -6
  246. package/dist/inspector/conformance/fixture.d.ts +1 -5
  247. package/dist/inspector/conformance/fixture.js +1 -5
  248. package/dist/inspector/conformance/spacingCases.d.ts +0 -4
  249. package/dist/inspector/conformance/spacingCases.js +0 -4
  250. package/dist/inspector/conformance/typographyCases.d.ts +0 -5
  251. package/dist/inspector/conformance/typographyCases.js +0 -5
  252. package/dist/inspector/drafts/draftStore.d.ts +7 -21
  253. package/dist/inspector/drafts/draftStore.js +15 -5
  254. package/dist/inspector/drafts/model.d.ts +7 -15
  255. package/dist/inspector/drafts/model.js +0 -2
  256. package/dist/inspector/drafts/store.d.ts +1 -8
  257. package/dist/inspector/drafts/store.js +3 -10
  258. package/dist/inspector/editScope.d.ts +0 -1
  259. package/dist/inspector/editScope.js +0 -1
  260. package/dist/inspector/inline-text/inlineTextDiagnostics.d.ts +0 -2
  261. package/dist/inspector/inline-text/inlineTextDiagnostics.js +0 -2
  262. package/dist/inspector/inline-text/inlineTextEditor.d.ts +2 -8
  263. package/dist/inspector/inline-text/inlineTextEditor.js +26 -79
  264. package/dist/inspector/inline-text/inlineTextLifecycle.js +1 -6
  265. package/dist/inspector/inline-text/textEditChange.d.ts +0 -1
  266. package/dist/inspector/inspection/bridge.d.ts +2 -6
  267. package/dist/inspector/inspection/bridge.js +4 -12
  268. package/dist/inspector/inspection/browserCssInspection.d.ts +4 -11
  269. package/dist/inspector/inspection/browserCssInspection.js +4 -8
  270. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +0 -7
  271. package/dist/inspector/inspection/browserCssInspectionRegistry.js +1 -16
  272. package/dist/inspector/inspection/selectionProperty.d.ts +1 -6
  273. package/dist/inspector/inspection/selectionProperty.js +1 -5
  274. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +1 -5
  275. package/dist/inspector/inspection/useBrowserCssInspection.js +5 -21
  276. package/dist/inspector/iterations/capture.d.ts +0 -1
  277. package/dist/inspector/iterations/capture.js +4 -9
  278. package/dist/inspector/iterations/client.d.ts +0 -1
  279. package/dist/inspector/iterations/client.js +0 -1
  280. package/dist/inspector/iterations/coordinator.d.ts +0 -1
  281. package/dist/inspector/iterations/coordinator.js +0 -1
  282. package/dist/inspector/iterations/prompt.d.ts +0 -1
  283. package/dist/inspector/iterations/prompt.js +0 -1
  284. package/dist/inspector/overlay/DomNavigator.d.ts +3 -1
  285. package/dist/inspector/overlay/DomNavigator.js +39 -15
  286. package/dist/inspector/overlay/DropGuideOverlay.d.ts +0 -1
  287. package/dist/inspector/overlay/DropGuideOverlay.js +0 -1
  288. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +1 -8
  289. package/dist/inspector/overlay/MeasurementGuideOverlay.js +1 -5
  290. package/dist/inspector/overlay/clickPolicy.d.ts +3 -14
  291. package/dist/inspector/overlay/clickPolicy.js +3 -14
  292. package/dist/inspector/overlay/dropGuide.d.ts +0 -3
  293. package/dist/inspector/overlay/dropGuide.js +0 -3
  294. package/dist/inspector/overlay/frameThrottle.d.ts +0 -1
  295. package/dist/inspector/overlay/frameThrottle.js +0 -1
  296. package/dist/inspector/overlay/interactionStyles.d.ts +1 -1
  297. package/dist/inspector/overlay/interactionStyles.js +2 -8
  298. package/dist/inspector/overlay/measurementGeometry.js +4 -12
  299. package/dist/inspector/overlay/selectedGeometry.d.ts +1 -6
  300. package/dist/inspector/overlay/selectedGeometry.js +1 -8
  301. package/dist/inspector/overlay/spacingGestures.d.ts +14 -21
  302. package/dist/inspector/overlay/spacingGestures.js +151 -31
  303. package/dist/inspector/overlay/structuralGestures.d.ts +2 -9
  304. package/dist/inspector/overlay/structuralGestures.js +1 -4
  305. package/dist/inspector/pageInspector.d.ts +4 -13
  306. package/dist/inspector/pageInspector.js +25 -32
  307. package/dist/inspector/projection/cssEscapes.d.ts +0 -1
  308. package/dist/inspector/projection/cssEscapes.js +2 -4
  309. package/dist/inspector/projection/draftProjection.d.ts +2 -14
  310. package/dist/inspector/projection/draftProjection.js +1 -8
  311. package/dist/inspector/projection/managedStylesheet.d.ts +1 -7
  312. package/dist/inspector/projection/managedStylesheet.js +4 -22
  313. package/dist/inspector/projection/renderedInstance.d.ts +5 -28
  314. package/dist/inspector/projection/renderedInstance.js +6 -32
  315. package/dist/inspector/projection/structuralProjection.d.ts +7 -39
  316. package/dist/inspector/projection/structuralProjection.js +17 -52
  317. package/dist/inspector/projection/textProjection.d.ts +2 -14
  318. package/dist/inspector/projection/textProjection.js +17 -70
  319. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +0 -1
  320. package/dist/inspector/prompt/PromptSettingsDialog.js +0 -1
  321. package/dist/inspector/prompt/clipboardHandoff.d.ts +1 -9
  322. package/dist/inspector/prompt/clipboardHandoff.js +1 -9
  323. package/dist/inspector/prompt/generatePrompt.d.ts +1 -1
  324. package/dist/inspector/prompt/generatePrompt.js +10 -25
  325. package/dist/inspector/prompt/promptSettings.d.ts +0 -3
  326. package/dist/inspector/prompt/promptSettings.js +0 -3
  327. package/dist/inspector/runtime/devFlag.d.ts +2 -25
  328. package/dist/inspector/runtime/devFlag.js +4 -31
  329. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +0 -2
  330. package/dist/inspector/runtime/editorShell.d.ts +0 -1
  331. package/dist/inspector/runtime/editorShell.js +0 -1
  332. package/dist/inspector/runtime/inspectorStorage.d.ts +1 -7
  333. package/dist/inspector/runtime/inspectorStorage.js +1 -6
  334. package/dist/inspector/runtime/ownedStylesheets.d.ts +2 -8
  335. package/dist/inspector/runtime/ownedStylesheets.js +2 -8
  336. package/dist/inspector/runtime/runtimeConfig.d.ts +12 -86
  337. package/dist/inspector/runtime/runtimeConfig.js +9 -50
  338. package/dist/inspector/runtime/runtimeIdentityClaims.d.ts +3 -13
  339. package/dist/inspector/runtime/runtimeIdentityClaims.js +9 -19
  340. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +4 -36
  341. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +7 -40
  342. package/dist/inspector/runtime/useRuntimeConfig.d.ts +1 -8
  343. package/dist/inspector/runtime/useRuntimeConfig.js +1 -8
  344. package/dist/inspector/selection/editScope.d.ts +1 -7
  345. package/dist/inspector/selection/editScope.js +2 -12
  346. package/dist/inspector/selection/editTarget.d.ts +1 -5
  347. package/dist/inspector/selection/hierarchy.d.ts +11 -11
  348. package/dist/inspector/selection/hierarchy.js +42 -24
  349. package/dist/inspector/selection/selectionStore.d.ts +0 -3
  350. package/dist/inspector/selection/selectionStore.js +5 -16
  351. package/dist/inspector/selection/sourceSite.d.ts +1 -5
  352. package/dist/inspector/selection/sourceSite.js +2 -8
  353. package/dist/inspector/selection/styleSelection.d.ts +1 -5
  354. package/dist/inspector/selection/styleSelection.js +1 -5
  355. package/dist/inspector/session/lifecycle.d.ts +1 -9
  356. package/dist/inspector/session/lifecycle.js +0 -1
  357. package/dist/inspector/session/sessionContext.d.ts +0 -4
  358. package/dist/inspector/session/sessionContext.js +0 -4
  359. package/dist/inspector/session/sessionFactory.d.ts +0 -9
  360. package/dist/inspector/session/sessionFactory.js +0 -6
  361. package/dist/inspector/settings/SettingsDialog.d.ts +0 -1
  362. package/dist/inspector/settings/SettingsDialog.js +5 -3
  363. package/dist/inspector/shell/AgentStatusButton.d.ts +3 -2
  364. package/dist/inspector/shell/AgentStatusButton.js +5 -5
  365. package/dist/inspector/shell/ChangesLog.js +3 -4
  366. package/dist/inspector/shell/CopyPromptButton.d.ts +2 -1
  367. package/dist/inspector/shell/CopyPromptButton.js +12 -11
  368. package/dist/inspector/shell/InspectorEditors.d.ts +16 -0
  369. package/dist/inspector/shell/InspectorEditors.js +14 -0
  370. package/dist/inspector/shell/InspectorPanel.d.ts +12 -0
  371. package/dist/inspector/shell/InspectorPanel.js +8 -0
  372. package/dist/inspector/shell/InspectorSelection.d.ts +24 -0
  373. package/dist/inspector/shell/InspectorSelection.js +20 -0
  374. package/dist/inspector/shell/InspectorShell.js +26 -48
  375. package/dist/inspector/shell/NudgeLogoIcon.d.ts +5 -0
  376. package/dist/inspector/shell/NudgeLogoIcon.js +5 -0
  377. package/dist/inspector/shell/PeekOriginalButton.d.ts +0 -5
  378. package/dist/inspector/shell/PeekOriginalButton.js +0 -5
  379. package/dist/inspector/shell/PeekOriginalIcon.d.ts +0 -5
  380. package/dist/inspector/shell/PeekOriginalIcon.js +0 -5
  381. package/dist/inspector/shell/PromptActionButton.d.ts +21 -0
  382. package/dist/inspector/shell/PromptActionButton.js +14 -0
  383. package/dist/inspector/shell/elementName.d.ts +5 -0
  384. package/dist/inspector/shell/elementName.js +29 -0
  385. package/dist/inspector/shell/interactionStatePreview.d.ts +1 -4
  386. package/dist/inspector/shell/interactionStatePreview.js +3 -8
  387. package/dist/inspector/shell/originalPreview.d.ts +1 -6
  388. package/dist/inspector/shell/originalPreview.js +1 -6
  389. package/dist/inspector/shell/stateValue.d.ts +1 -2
  390. package/dist/inspector/shell/stateValue.js +2 -5
  391. package/dist/inspector/shell/styleState.d.ts +1 -2
  392. package/dist/inspector/shell/styleState.js +1 -2
  393. package/dist/inspector/sketch/SketchEditor.js +0 -1
  394. package/dist/inspector/sketch/SketchFrameOverlay.js +8 -12
  395. package/dist/inspector/sketch/SketchOverlay.js +5 -6
  396. package/dist/inspector/sketch/SketchPromptPanel.d.ts +0 -1
  397. package/dist/inspector/sketch/SketchPromptPanel.js +0 -1
  398. package/dist/inspector/sketch/SketchWorkspace.js +2 -4
  399. package/dist/inspector/sketch/capture.d.ts +12 -3
  400. package/dist/inspector/sketch/capture.js +12 -11
  401. package/dist/inspector/sketch/copySketch.d.ts +1 -7
  402. package/dist/inspector/sketch/copySketch.js +2 -11
  403. package/dist/inspector/sketch/drawingTools.d.ts +1 -3
  404. package/dist/inspector/sketch/drawingTools.js +1 -2
  405. package/dist/inspector/sketch/frameHeading.d.ts +1 -7
  406. package/dist/inspector/sketch/frameHeading.js +1 -8
  407. package/dist/inspector/sketch/freehand.d.ts +0 -1
  408. package/dist/inspector/sketch/freehand.js +0 -1
  409. package/dist/inspector/sketch/geometry.d.ts +1 -6
  410. package/dist/inspector/sketch/geometry.js +1 -6
  411. package/dist/inspector/sketch/handoff.js +0 -1
  412. package/dist/inspector/sketch/history.d.ts +1 -5
  413. package/dist/inspector/sketch/history.js +1 -4
  414. package/dist/inspector/sketch/interaction.d.ts +2 -2
  415. package/dist/inspector/sketch/interaction.js +2 -2
  416. package/dist/inspector/sketch/model.d.ts +2 -9
  417. package/dist/inspector/sketch/model.js +2 -19
  418. package/dist/inspector/sketch/persistence.d.ts +0 -1
  419. package/dist/inspector/sketch/persistence.js +2 -2
  420. package/dist/inspector/sketch/raster.d.ts +1 -4
  421. package/dist/inspector/sketch/raster.js +2 -8
  422. package/dist/inspector/sketch/store.js +2 -3
  423. package/dist/inspector/sketch/videoFrames.js +2 -3
  424. package/dist/inspector/spacing/projection.d.ts +0 -8
  425. package/dist/inspector/spacing/projection.js +38 -20
  426. package/dist/inspector/styleEditors/BackgroundEditor.js +1 -1
  427. package/dist/inspector/styleEditors/BorderEditor.js +1 -6
  428. package/dist/inspector/styleEditors/ChildPlacement.d.ts +12 -0
  429. package/dist/inspector/styleEditors/ChildPlacement.js +9 -0
  430. package/dist/inspector/styleEditors/FlexControls.d.ts +35 -0
  431. package/dist/inspector/styleEditors/FlexControls.js +158 -0
  432. package/dist/inspector/styleEditors/GapField.d.ts +5 -2
  433. package/dist/inspector/styleEditors/GapField.js +3 -4
  434. package/dist/inspector/styleEditors/GridChildSection.d.ts +0 -5
  435. package/dist/inspector/styleEditors/GridChildSection.js +0 -5
  436. package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
  437. package/dist/inspector/styleEditors/GridPicker.js +2 -4
  438. package/dist/inspector/styleEditors/GridSection.d.ts +10 -8
  439. package/dist/inspector/styleEditors/GridSection.js +22 -9
  440. package/dist/inspector/styleEditors/GridValueField.d.ts +1 -5
  441. package/dist/inspector/styleEditors/GridValueField.js +2 -8
  442. package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +0 -1
  443. package/dist/inspector/styleEditors/ImageBackgroundEditor.js +0 -1
  444. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +0 -1
  445. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +0 -1
  446. package/dist/inspector/styleEditors/LayoutComboField.js +0 -5
  447. package/dist/inspector/styleEditors/LayoutModeRow.d.ts +14 -0
  448. package/dist/inspector/styleEditors/LayoutModeRow.js +60 -0
  449. package/dist/inspector/styleEditors/LayoutSection.d.ts +2 -2
  450. package/dist/inspector/styleEditors/LayoutSection.js +30 -356
  451. package/dist/inspector/styleEditors/OpacityEditor.js +7 -5
  452. package/dist/inspector/styleEditors/PositionControls.d.ts +18 -0
  453. package/dist/inspector/styleEditors/PositionControls.js +16 -0
  454. package/dist/inspector/styleEditors/SizeSection.d.ts +18 -0
  455. package/dist/inspector/styleEditors/SizeSection.js +71 -0
  456. package/dist/inspector/styleEditors/{SpacingBox.d.ts → SpacingField.d.ts} +3 -10
  457. package/dist/inspector/styleEditors/{SpacingBox.js → SpacingField.js} +15 -29
  458. package/dist/inspector/styleEditors/Typography.js +2 -4
  459. package/dist/inspector/styleEditors/borderModel.d.ts +1 -7
  460. package/dist/inspector/styleEditors/borderModel.js +2 -11
  461. package/dist/inspector/styleEditors/completeCssValue.d.ts +1 -5
  462. package/dist/inspector/styleEditors/completeCssValue.js +3 -13
  463. package/dist/inspector/styleEditors/fieldValue.d.ts +20 -0
  464. package/dist/inspector/styleEditors/fieldValue.js +26 -0
  465. package/dist/inspector/styleEditors/gradientValue.d.ts +1 -1
  466. package/dist/inspector/styleEditors/gradientValue.js +3 -2
  467. package/dist/inspector/styleEditors/gridChildModel.d.ts +7 -47
  468. package/dist/inspector/styleEditors/gridChildModel.js +6 -37
  469. package/dist/inspector/styleEditors/hiddenSizeOverrides.d.ts +5 -0
  470. package/dist/inspector/styleEditors/hiddenSizeOverrides.js +42 -0
  471. package/dist/inspector/styleEditors/inlineAuthored.d.ts +1 -8
  472. package/dist/inspector/styleEditors/inlineAuthored.js +3 -17
  473. package/dist/inspector/styleEditors/layoutMode.d.ts +15 -0
  474. package/dist/inspector/styleEditors/layoutMode.js +33 -0
  475. package/dist/inspector/styleEditors/layoutPreviewState.d.ts +0 -1
  476. package/dist/inspector/styleEditors/layoutPreviewState.js +0 -1
  477. package/dist/inspector/styleEditors/layoutValue.d.ts +2 -8
  478. package/dist/inspector/styleEditors/layoutValue.js +4 -12
  479. package/dist/inspector/styleEditors/nudgeValue.d.ts +1 -13
  480. package/dist/inspector/styleEditors/nudgeValue.js +1 -13
  481. package/dist/inspector/styleEditors/rowLookup.d.ts +1 -5
  482. package/dist/inspector/styleEditors/rowLookup.js +1 -5
  483. package/dist/inspector/styleEditors/stringRecord.d.ts +1 -2
  484. package/dist/inspector/styleEditors/stylePresence.d.ts +0 -2
  485. package/dist/inspector/styleEditors/stylePresence.js +1 -4
  486. package/dist/inspector/styleEditors/textRelevance.d.ts +1 -1
  487. package/dist/inspector/styleEditors/textRelevance.js +1 -1
  488. package/dist/inspector/styleEditors/useFieldVisibility.js +1 -2
  489. package/dist/inspector/styleEditors/useLayoutContext.d.ts +13 -0
  490. package/dist/inspector/styleEditors/useLayoutContext.js +53 -0
  491. package/dist/inspector/styleEditors/valuePolicy.d.ts +1 -5
  492. package/dist/inspector/styleEditors/valuePolicy.js +0 -1
  493. package/dist/inspector/testing.d.ts +1 -4
  494. package/dist/inspector/testing.js +1 -4
  495. package/dist/inspector/tokens/TokenChip.d.ts +1 -4
  496. package/dist/inspector/tokens/TokenChip.js +1 -4
  497. package/dist/inspector/tokens/TokenField.d.ts +4 -3
  498. package/dist/inspector/tokens/TokenField.js +19 -29
  499. package/dist/inspector/tokens/catalog.d.ts +2 -10
  500. package/dist/inspector/tokens/catalog.js +5 -12
  501. package/dist/inspector/tokens/dragPointerLock.d.ts +0 -1
  502. package/dist/inspector/tokens/dragPointerLock.js +2 -3
  503. package/dist/inspector/tokens/editActions.d.ts +1 -1
  504. package/dist/inspector/tokens/editActions.js +2 -4
  505. package/dist/inspector/tokens/resolution/cascade.d.ts +1 -5
  506. package/dist/inspector/tokens/resolution/cascade.js +1 -5
  507. package/dist/inspector/tokens/resolution/containerQueryEvaluator.d.ts +1 -5
  508. package/dist/inspector/tokens/resolution/containerQueryEvaluator.js +1 -5
  509. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +4 -19
  510. package/dist/inspector/tokens/resolution/cssomCollector.js +151 -122
  511. package/dist/inspector/tokens/resolution/nestedSelectors.d.ts +1 -5
  512. package/dist/inspector/tokens/resolution/nestedSelectors.js +1 -5
  513. package/dist/inspector/tokens/resolution/ruleMatching.d.ts +4 -14
  514. package/dist/inspector/tokens/resolution/ruleMatching.js +121 -67
  515. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +3 -14
  516. package/dist/inspector/tokens/resolution/selectorSemantics.js +12 -27
  517. package/dist/inspector/tokens/resolution.d.ts +5 -24
  518. package/dist/inspector/tokens/resolution.js +16 -71
  519. package/dist/inspector/tokens/tokenAvailability.d.ts +2 -14
  520. package/dist/inspector/tokens/tokenAvailability.js +6 -38
  521. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +0 -1
  522. package/dist/inspector/tokens/valueSemanticsAdapter.js +18 -2
  523. package/dist/inspector/ui/AtRuleContext.d.ts +5 -5
  524. package/dist/inspector/ui/AtRuleContext.js +8 -6
  525. package/dist/inspector/ui/ControlSurface.d.ts +0 -4
  526. package/dist/inspector/ui/Disclosure.d.ts +0 -5
  527. package/dist/inspector/ui/Disclosure.js +0 -4
  528. package/dist/inspector/ui/InlineStyleWarning.d.ts +0 -1
  529. package/dist/inspector/ui/InspectorPopover.d.ts +1 -5
  530. package/dist/inspector/ui/InspectorPopover.js +1 -5
  531. package/dist/inspector/ui/SegmentedControl.d.ts +4 -4
  532. package/dist/inspector/ui/SegmentedControl.js +6 -4
  533. package/dist/inspector/ui/SideValuesField.d.ts +1 -6
  534. package/dist/inspector/ui/SideValuesField.js +2 -8
  535. package/dist/inspector/ui/Toast.d.ts +0 -4
  536. package/dist/inspector/ui/Toast.js +0 -4
  537. package/dist/inspector/ui/atRuleSegments.d.ts +13 -0
  538. package/dist/inspector/ui/atRuleSegments.js +34 -0
  539. package/dist/inspector/ui/classNames.d.ts +0 -1
  540. package/dist/inspector/ui/classNames.js +0 -1
  541. package/dist/inspector/ui/customCursors.d.ts +7 -1
  542. package/dist/inspector/ui/customCursors.js +2 -6
  543. package/dist/inspector/ui/styles.js +18 -20
  544. package/dist/inspector/workspace/controller.js +20 -1
  545. package/dist/inspector/workspace/handoff.d.ts +1 -5
  546. package/dist/inspector/workspace/handoff.js +1 -5
  547. package/dist/inspector/workspace/timeline.d.ts +5 -2
  548. package/dist/inspector/workspace/timeline.js +0 -1
  549. package/dist/internal/agent-protocol.d.ts +20 -42
  550. package/dist/internal/agent-protocol.js +18 -35
  551. package/dist/nudge-ui.mjs +75 -28
  552. package/dist/project/artifacts.js +24 -21
  553. package/dist/project/files.d.ts +0 -1
  554. package/dist/project/files.js +2 -9
  555. package/dist/project/identity.d.ts +1 -5
  556. package/dist/project/identity.js +1 -5
  557. package/dist/project/mcpPackage.d.ts +1 -6
  558. package/dist/project/mcpPackage.js +2 -7
  559. package/dist/project/pathPolicy.d.ts +1 -6
  560. package/dist/project/pathPolicy.js +1 -6
  561. package/dist/project/tokens.d.ts +2 -12
  562. package/dist/project/tokens.js +4 -15
  563. package/dist/transport/editor.d.ts +1 -12
  564. package/dist/transport/editor.js +2 -13
  565. package/dist/transport/index.d.ts +0 -5
  566. package/dist/transport/index.js +0 -5
  567. package/dist/transport/routes.d.ts +0 -5
  568. package/dist/transport/routes.js +0 -5
  569. package/package.json +5 -4
  570. package/dist/inspector/styleEditors/InsetSection.d.ts +0 -15
  571. package/dist/inspector/styleEditors/InsetSection.js +0 -15
  572. package/dist/inspector/styleEditors/PositionInsets.d.ts +0 -15
  573. package/dist/inspector/styleEditors/PositionInsets.js +0 -12
  574. package/dist/inspector/tokens/TokenDropdown.d.ts +0 -13
  575. package/dist/inspector/tokens/TokenDropdown.js +0 -59
@@ -35,7 +35,7 @@ function videoFrame(video) {
35
35
  }
36
36
  }
37
37
  catch {
38
- // Cross-origin frames can taint a canvas. Keep the poster or empty frame.
38
+ // Cross-origin frames can taint a canvas; the poster or empty frame is kept.
39
39
  }
40
40
  }
41
41
  return image;
@@ -51,8 +51,7 @@ export function prepareSketchVideoFrames(targetDocument) {
51
51
  placeholder.hidden = true;
52
52
  placeholder.src = EMPTY_FRAME;
53
53
  placeholder.setAttribute(FRAME_ATTRIBUTE, id);
54
- // The hidden sibling preserves capture order without detaching or seeking
55
- // the application's video. Only its clone receives the video's styles.
54
+ // A hidden sibling placeholder preserves capture order without touching the live video.
56
55
  video.before(placeholder);
57
56
  placeholders.push(placeholder);
58
57
  }
@@ -29,15 +29,7 @@ export interface InspectorSpacingProjection {
29
29
  export interface InspectorProjection {
30
30
  spacing: Record<ProjectionGroup, InspectorSpacingProjection>;
31
31
  }
32
- /**
33
- * Projects resolved physical side facts into the compact spacing UI shape.
34
- * Authored value, token identity, computed value, and source property all
35
- * participate in shared/mixed detection so visually equal values cannot
36
- * accidentally discard authored CSS intent. Source properties remain on each
37
- * field as provenance but do not by themselves force expansion.
38
- */
39
32
  export declare function projectInspectorValues(el: HTMLElement, rows: ResolvedProperty[]): InspectorProjection;
40
- /** Projects computed group values into the existing spacing editor model. */
41
33
  export declare function projectInspectorValuesForSelection(selection: StyleSelection): InspectorProjection;
42
34
  export declare function projectionSides(axis: ProjectionAxis): readonly [ProjectionSide, ProjectionSide];
43
35
  export {};
@@ -1,23 +1,22 @@
1
1
  import { getStateStyleValue } from "../shell/stateValue.js";
2
+ import { readAuthoredStyleValue } from "../styleEditors/layoutValue.js";
2
3
  const SIDES = ["top", "right", "bottom", "left"];
3
4
  const AXIS_SIDES = {
4
- // Preserve CSS physical-side order within each axis. This makes a mixed
5
- // horizontal value read as right, left and a mixed vertical value as top,
6
- // bottom when the compact editor renders both values.
5
+ // CSS physical-side order per axis, so a mixed pair reads right/left, top/bottom.
7
6
  horizontal: ["right", "left"],
8
7
  vertical: ["top", "bottom"],
9
8
  };
10
9
  function fieldProjection(el, rows, property) {
11
10
  const row = rows.find((candidate) => candidate.property === property) ?? null;
12
- // The selected element is the rendering authority. Resolved rows can be
13
- // one render behind while the debounced inspector refreshes, so use the
14
- // live computed side value for grouping when available and retain the row
15
- // for authored/token/source provenance.
11
+ // Resolved rows can be one render behind; the live value is the grouping authority, the row only supplies provenance.
16
12
  const liveValue = getStateStyleValue(el, property);
17
13
  const rowValue = row?.computed || row?.resolvedValue;
18
14
  const rowIsCurrent = !liveValue || !row || Boolean(row.sourceProperty) || !rowValue || rowValue === liveValue;
19
15
  const effectiveRow = rowIsCurrent ? row : null;
20
- const value = liveValue || row?.resolvedValue || "";
16
+ const computedValue = liveValue || row?.resolvedValue || "";
17
+ if (isInsetSide(property))
18
+ return insetFieldProjection(el, property, effectiveRow, computedValue);
19
+ const value = computedValue;
21
20
  return {
22
21
  property,
23
22
  authoredValue: effectiveRow?.authored ?? effectiveRow?.declaredValue ?? value,
@@ -27,11 +26,23 @@ function fieldProjection(el, rows, property) {
27
26
  row: effectiveRow,
28
27
  };
29
28
  }
29
+ function isInsetSide(property) {
30
+ return SIDES.includes(property);
31
+ }
32
+ /** Inset sides report the browser's used offset even when unauthored, so only authored values are shown. */
33
+ function insetFieldProjection(el, property, row, computedValue) {
34
+ const authoredValue = (row?.authored ?? row?.declaredValue ?? readAuthoredStyleValue(el, property) ?? "").trim() || "auto";
35
+ return {
36
+ property,
37
+ authoredValue,
38
+ value: authoredValue === "auto" ? "auto" : computedValue || authoredValue,
39
+ tokenName: row?.tokenName ?? null,
40
+ sourceProperty: row?.sourceProperty,
41
+ row,
42
+ };
43
+ }
30
44
  function fieldSignature(field) {
31
- // Source property is provenance, not visible value identity. Two physical
32
- // longhands with the same authored/token value may still use the compact
33
- // axis control; the individual source properties remain attached to their
34
- // fields for prompt generation and edit metadata.
45
+ // Source property is provenance, not value identity, so it stays out of the signature.
35
46
  return [field.authoredValue, field.tokenName ?? "", field.value].join("|");
36
47
  }
37
48
  function axisProjection(axis, fields) {
@@ -61,13 +72,6 @@ function spacingProjection(el, rows, property) {
61
72
  },
62
73
  };
63
74
  }
64
- /**
65
- * Projects resolved physical side facts into the compact spacing UI shape.
66
- * Authored value, token identity, computed value, and source property all
67
- * participate in shared/mixed detection so visually equal values cannot
68
- * accidentally discard authored CSS intent. Source properties remain on each
69
- * field as provenance but do not by themselves force expansion.
70
- */
71
75
  export function projectInspectorValues(el, rows) {
72
76
  return {
73
77
  spacing: {
@@ -82,6 +86,8 @@ function selectionField(selection, property) {
82
86
  const mixed = selectedProperty?.value.kind === "mixed";
83
87
  const value = selectedProperty?.value.kind === "common" ? selectedProperty.value.value : "";
84
88
  const row = selectedProperty?.primaryRow ?? null;
89
+ if (isInsetSide(property))
90
+ return selectionInsetField(selection, property, row, selectedProperty?.token.kind === "common" ? selectedProperty.token.name : null);
85
91
  return {
86
92
  property,
87
93
  authoredValue: mixed ? "Mixed" : value,
@@ -91,6 +97,19 @@ function selectionField(selection, property) {
91
97
  row,
92
98
  };
93
99
  }
100
+ function selectionInsetField(selection, property, row, tokenName) {
101
+ const authored = selection.domElements.map((el) => readAuthoredStyleValue(el, property) ?? "auto");
102
+ const mixed = new Set(authored).size > 1;
103
+ const value = mixed ? "Mixed" : authored[0] ?? "auto";
104
+ return {
105
+ property,
106
+ authoredValue: value,
107
+ value,
108
+ tokenName: mixed || value === "auto" ? null : tokenName,
109
+ sourceProperty: row?.sourceProperty,
110
+ row,
111
+ };
112
+ }
94
113
  function selectionAxis(axis, fields) {
95
114
  const sides = AXIS_SIDES[axis];
96
115
  const pair = [fields[sides[0]], fields[sides[1]]];
@@ -118,7 +137,6 @@ function selectionSpacing(selection, property) {
118
137
  },
119
138
  };
120
139
  }
121
- /** Projects computed group values into the existing spacing editor model. */
122
140
  export function projectInspectorValuesForSelection(selection) {
123
141
  if (selection.elements.length === 1) {
124
142
  return projectInspectorValues(selection.primary.domElement, [...selection.primaryRows]);
@@ -176,7 +176,7 @@ function BackgroundLayerEditor(props) {
176
176
  const match = /^([+-]?(?:\d*\.)?\d+)(?:deg)?$/.exec(raw.trim());
177
177
  if (match && Number.isFinite(Number(match[1])))
178
178
  commitGradient({ ...gradient, angle: Number(match[1]) });
179
- }) : null, _jsx(IconButton, { variant: "quiet", label: "Reverse gradient", disabled: blockedBy !== null, onClick: () => commitGradient({ ...gradient, stops: [...gradient.stops].reverse().map((stop) => ({ ...stop, position: 100 - stop.position })) }), children: _jsx(IconArrowsDiff, { "aria-hidden": "true" }) }), _jsx(IconButton, { variant: "quiet", label: "Add gradient stop", disabled: blockedBy !== null, onClick: () => addStop(), children: _jsx(IconPlus, { "aria-hidden": "true" }) })] }), gradient.stops.map((stop, index) => ({ stop, index })).sort((a, b) => a.stop.position - b.stop.position).map(({ stop, index }) => {
179
+ }) : null, _jsx(IconButton, { variant: "secondary", label: "Reverse gradient", disabled: blockedBy !== null, onClick: () => commitGradient({ ...gradient, stops: [...gradient.stops].reverse().map((stop) => ({ ...stop, position: 100 - stop.position })) }), children: _jsx(IconArrowsDiff, { "aria-hidden": "true" }) }), _jsx(IconButton, { variant: "quiet", label: "Add gradient stop", disabled: blockedBy !== null, onClick: () => addStop(), children: _jsx(IconPlus, { "aria-hidden": "true" }) })] }), gradient.stops.map((stop, index) => ({ stop, index })).sort((a, b) => a.stop.position - b.stop.position).map(({ stop, index }) => {
180
180
  const color = interpretTokenValue(stop.color, { table: tokenTable });
181
181
  return _jsxs("div", { className: "background-editor__stop-row", role: "group", "aria-label": `Stop ${index + 1}`, children: [rawField(`Stop ${index + 1} position`, `${Number(stop.position.toFixed(3))}%`, (raw) => {
182
182
  const match = /^([+-]?(?:\d*\.)?\d+)%?$/.exec(raw.trim());
@@ -20,7 +20,6 @@ import { BORDER_SIDES, BORDER_STYLES, borderDeclarations, borderProperty, hasVis
20
20
  function stateStyleReader(el) {
21
21
  return (property, fallback) => getStateStyleValue(el, property, fallback);
22
22
  }
23
- /** Reports whether the intent produced any declarations to write. */
24
23
  function commitBorderIntent(target, source, intent, onAfterEdit) {
25
24
  const declarations = borderDeclarations(source, intent);
26
25
  if (declarations.length === 0)
@@ -29,11 +28,7 @@ function commitBorderIntent(target, source, intent, onAfterEdit) {
29
28
  onAfterEdit?.();
30
29
  return true;
31
30
  }
32
- /**
33
- * Linked presentation from cascade data + optional user toggle.
34
- * Divergent faces always open; equal faces start linked but can expand.
35
- * Linking divergent faces is optimistic until cascade rows catch up.
36
- */
31
+ /** User toggle is optimistic: it holds until the cascade-derived state catches up. */
37
32
  function useBorderLinkedState(dataLinked, resetKey) {
38
33
  const [userUnlinked, setUserUnlinked] = useState(false);
39
34
  const [userLinked, setUserLinked] = useState(false);
@@ -0,0 +1,12 @@
1
+ import type { ReactElement } from "react";
2
+ import type { EditTarget } from "../selection/editTarget.js";
3
+ import type { StyleSelection } from "../selection/styleSelection.js";
4
+ export interface FlexChildControlsProps {
5
+ domElement: HTMLElement;
6
+ editTarget?: EditTarget;
7
+ selection?: StyleSelection | null;
8
+ revision?: number;
9
+ onAfterEdit?: () => void;
10
+ }
11
+ /** How a flex item shares its parent's space; shown behind the size expander. */
12
+ export declare function FlexChildControls(props: FlexChildControlsProps): ReactElement;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { FlexChildSettingsMenu, LayoutValueField } from "./FlexControls.js";
3
+ const FLEX_GROW_PRESETS = ["0", "1", "2", "3"];
4
+ const FLEX_SHRINK_PRESETS = ["0", "1"];
5
+ const FLEX_BASIS_PRESETS = ["auto", "0", "0%", "100%", "50%", "fit-content"];
6
+ /** How a flex item shares its parent's space; shown behind the size expander. */
7
+ export function FlexChildControls(props) {
8
+ return (_jsxs("div", { className: "layout__group layout__group--bottom-rule", "data-test": "layout-flex-child", children: [_jsxs("div", { className: "layout__flex-heading", children: [_jsx("div", { className: "editor__title", children: "Flex Child" }), _jsx(FlexChildSettingsMenu, { ...props })] }), _jsxs("div", { className: "layout__flex-child-fields", children: [_jsx(LayoutValueField, { label: "Grow", property: "flex-grow", presets: FLEX_GROW_PRESETS, inputOnly: true, ...props }), _jsx(LayoutValueField, { label: "Shrink", property: "flex-shrink", presets: FLEX_SHRINK_PRESETS, inputOnly: true, ...props }), _jsx(LayoutValueField, { label: "Basis", property: "flex-basis", presets: FLEX_BASIS_PRESETS, inputOnly: true, ...props })] })] }));
9
+ }
@@ -0,0 +1,35 @@
1
+ import type { ReactElement } from "react";
2
+ import type { ResolvedProperty, TokenEntry } from "../../css/model/index.js";
3
+ import type { EditTarget } from "../selection/editTarget.js";
4
+ import type { StyleSelection } from "../selection/styleSelection.js";
5
+ export interface FlexControlProps {
6
+ domElement: HTMLElement;
7
+ editTarget?: EditTarget;
8
+ selection?: StyleSelection | null;
9
+ revision?: number;
10
+ onAfterEdit?: () => void;
11
+ }
12
+ export interface LayoutValueFieldProps extends FlexControlProps {
13
+ label: string;
14
+ property: string;
15
+ presets: string[];
16
+ inputOnly?: boolean;
17
+ }
18
+ export declare function LayoutValueField({ label, property, presets, inputOnly, domElement, editTarget, selection, revision, onAfterEdit }: LayoutValueFieldProps): ReactElement;
19
+ export declare function FlexChildSettingsMenu({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
20
+ export interface FlexGapFieldProps extends FlexControlProps {
21
+ property: "row-gap" | "column-gap";
22
+ entries: TokenEntry[];
23
+ tokenRows: ResolvedProperty[];
24
+ }
25
+ export declare function FlexGapField({ property, domElement, editTarget, selection, entries, tokenRows, onAfterEdit }: FlexGapFieldProps): ReactElement;
26
+ export declare function FlexWrapToggle({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
27
+ /**
28
+ * The main-axis gap. Spreading the items (`justify-content: space-*`) replaces the fixed gap, so
29
+ * the field reads Auto, keeps the gap as a faint value, and typing `auto` spreads between.
30
+ */
31
+ export declare function FlexMainGapField({ property, domElement, editTarget, selection, entries, tokenRows, revision, onAfterEdit }: FlexGapFieldProps & {
32
+ revision?: number;
33
+ }): ReactElement;
34
+ export declare function FlexAlignmentGrid({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
35
+ export declare function useComputedLayoutValue(domElement: HTMLElement, property: string, fallback: string, revision: number): [string, (value: string) => void];
@@ -0,0 +1,158 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { IconCheck, IconChevronDown, IconSettings, IconSpacingHorizontal, IconSpacingVertical, IconTextWrap } from "@tabler/icons-react";
4
+ import { LayoutDropdown } from "./LayoutDropdown.js";
5
+ import { LayoutComboField } from "./LayoutComboField.js";
6
+ import { GapField } from "./GapField.js";
7
+ import { inlineBlockedBy } from "./inlineAuthored.js";
8
+ import { setStyle, setStyles } from "../tokens/editActions.js";
9
+ import { IconButton } from "../ui/IconButton.js";
10
+ import { InspectorPopover } from "../ui/InspectorPopover.js";
11
+ import { PopoverListbox } from "../ui/PopoverListbox.js";
12
+ import { getStateStyleValue } from "../shell/stateValue.js";
13
+ import { formatInspectorLabel } from "../ui/labels.js";
14
+ import { FieldRow } from "../ui/FieldRow.js";
15
+ import { ControlSurface } from "../ui/ControlSurface.js";
16
+ import { Tooltip } from "../ui/Tooltip.js";
17
+ import { inlineStyleWarningContent } from "../ui/InlineStyleWarning.js";
18
+ const ALIGN_SELF_OPTIONS = ["auto", "stretch", "flex-start", "flex-end", "center", "baseline"];
19
+ const ORDER_PRESETS = ["-1", "0", "1", "2", "3"];
20
+ const FLEX_ALIGNMENT_OPTIONS = ["flex-start", "center", "flex-end"];
21
+ const FLEX_DISTRIBUTION_OPTIONS = ["space-between", "space-around", "space-evenly"];
22
+ export function LayoutValueField({ label, property, presets, inputOnly = false, domElement, editTarget, selection, revision = 0, onAfterEdit }) {
23
+ return (_jsx(FieldRow, { label: label, className: "layout__flex-child-field", children: _jsx(LayoutComboField, { property: property, presets: presets, domElement: domElement, editTarget: editTarget, selection: selection, inputOnly: inputOnly, revision: revision, onAfterEdit: onAfterEdit }) }));
24
+ }
25
+ export function FlexChildSettingsMenu({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
26
+ const [open, setOpen] = useState(false);
27
+ return (_jsx(InspectorPopover, { "data-test": "layout-flex-child-settings", side: "left", align: "start", triggerTooltip: "Flex child settings", triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: "Flex child settings", "data-test": "layout-flex-child-settings", children: _jsx(IconSettings, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), open: open, onOpenChange: setOpen, children: _jsxs("div", { className: "layout__flex-child-settings", "data-test": "layout-flex-child-settings-content", children: [_jsx("div", { className: "layout__flex-child-settings-title", children: "Flex Child Settings" }), _jsx(LayoutDropdown, { property: "align-self", options: ALIGN_SELF_OPTIONS, domElement: domElement, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutValueField, { label: "Order", property: "order", presets: ORDER_PRESETS, domElement: domElement, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit })] }) }));
28
+ }
29
+ export function FlexGapField({ property, domElement, editTarget, selection, entries, tokenRows, onAfterEdit }) {
30
+ const GapIcon = property === "column-gap" ? IconSpacingHorizontal : IconSpacingVertical;
31
+ return (_jsx(ControlSurface, { className: "layout__spacing-field", children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, leading: (_jsx(GapIcon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }));
32
+ }
33
+ export function FlexWrapToggle({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
34
+ const [wrap] = useComputedLayoutValue(domElement, "flex-wrap", "nowrap", revision);
35
+ const selectedWrap = selection?.getProperty("flex-wrap")?.value;
36
+ const mixed = selectedWrap?.kind === "mixed";
37
+ const sharedWrap = selectedWrap?.kind === "common" ? selectedWrap.value : wrap;
38
+ const isWrapped = !mixed && sharedWrap !== "nowrap";
39
+ const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "flex-wrap");
40
+ function toggleWrap() {
41
+ if (blockedBy)
42
+ return;
43
+ setStyle(editTarget ?? domElement, "flex-wrap", isWrapped ? "nowrap" : "wrap");
44
+ onAfterEdit?.();
45
+ }
46
+ return (_jsx(Tooltip, { content: inlineStyleWarningContent(blockedBy), children: _jsx(IconButton, { variant: "quiet", size: "default", "data-active": isWrapped, "data-test": "layout-flex-wrap-toggle", label: mixed ? "Set Flex Wrap" : isWrapped ? "Disable Flex Wrap" : "Enable Flex Wrap", "aria-pressed": mixed ? "mixed" : isWrapped, disabled: blockedBy !== null, onClick: toggleWrap, children: _jsx(IconTextWrap, { size: 16, stroke: 1.8, "aria-hidden": "true" }) }) }));
47
+ }
48
+ const DISTRIBUTION_ITEMS = [
49
+ { value: "packed", label: "Keep grouped" },
50
+ { value: "space-between", label: "Spread between" },
51
+ { value: "space-around", label: "Spread around" },
52
+ { value: "space-evenly", label: "Spread evenly" },
53
+ ];
54
+ /**
55
+ * The main-axis gap. Spreading the items (`justify-content: space-*`) replaces the fixed gap, so
56
+ * the field reads Auto, keeps the gap as a faint value, and typing `auto` spreads between.
57
+ */
58
+ export function FlexMainGapField({ property, domElement, editTarget, selection, entries, tokenRows, revision = 0, onAfterEdit }) {
59
+ const GapIcon = property === "column-gap" ? IconSpacingHorizontal : IconSpacingVertical;
60
+ const [computedJustify] = useComputedLayoutValue(domElement, "justify-content", "flex-start", revision);
61
+ const justify = normalizeFlexJustify(computedJustify);
62
+ const distributed = FLEX_DISTRIBUTION_OPTIONS.includes(justify);
63
+ const lastPlacement = useRef("flex-start");
64
+ const [open, setOpen] = useState(false);
65
+ const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "justify-content");
66
+ const target = editTarget ?? domElement;
67
+ const gapPixels = Number.parseFloat(getStateStyleValue(domElement, property));
68
+ useEffect(() => {
69
+ if (FLEX_ALIGNMENT_OPTIONS.includes(justify))
70
+ lastPlacement.current = justify;
71
+ }, [justify]);
72
+ function setJustifyContent(value) {
73
+ if (blockedBy)
74
+ return;
75
+ setStyle(target, "justify-content", value);
76
+ onAfterEdit?.();
77
+ }
78
+ function interceptRaw(value) {
79
+ if (value.trim().toLowerCase() === "auto") {
80
+ if (!distributed)
81
+ setJustifyContent("space-between");
82
+ return true;
83
+ }
84
+ // A typed gap takes the items back out of a spread; the gap value itself is written by the field,
85
+ // which still saves it when justify-content is authored inline and cannot be changed here.
86
+ if (distributed)
87
+ setJustifyContent(lastPlacement.current);
88
+ return false;
89
+ }
90
+ const chevron = (_jsx(PopoverListbox, { query: "", value: distributed ? justify : "packed", open: open, triggerElement: (_jsx(IconButton, { variant: "quiet", size: "compact", label: "Item distribution", "data-test": "layout-flex-distribution", children: _jsx(IconChevronDown, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), triggerDataTest: "layout-flex-distribution", triggerAriaLabel: "Item distribution", triggerTooltip: inlineStyleWarningContent(blockedBy), disabled: blockedBy !== null, items: DISTRIBUTION_ITEMS.map((item) => ({
91
+ ...item,
92
+ leading: (distributed ? justify : "packed") === item.value
93
+ ? _jsx(IconCheck, { size: 14, stroke: 2, "aria-hidden": "true" })
94
+ : undefined,
95
+ "data-test": `layout-flex-distribution-${item.value}`,
96
+ })), onQueryChange: () => undefined, onOpenChange: setOpen, onSelect: (next) => {
97
+ setJustifyContent(next === "packed" ? lastPlacement.current : next);
98
+ setOpen(false);
99
+ } }));
100
+ return (_jsx(ControlSurface, { className: "layout__spacing-field", children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, ...(distributed ? { displayOverride: "Auto" } : {}), interceptRaw: interceptRaw, trailing: (_jsxs(_Fragment, { children: [distributed && Number.isFinite(gapPixels) ? (_jsx("span", { className: "layout__resolved", "data-test": "layout-gap-value", children: Math.round(gapPixels) })) : null, chevron] })), leading: (_jsx(GapIcon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }));
101
+ }
102
+ export function FlexAlignmentGrid({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
103
+ const [direction] = useComputedLayoutValue(domElement, "flex-direction", "row", revision);
104
+ const [computedJustify, setJustify] = useComputedLayoutValue(domElement, "justify-content", "flex-start", revision);
105
+ const [computedAlign, setAlign] = useComputedLayoutValue(domElement, "align-items", "stretch", revision);
106
+ const justify = normalizeFlexJustify(computedJustify);
107
+ const align = normalizeFlexAlign(computedAlign);
108
+ const isColumn = direction.startsWith("column");
109
+ const isReverse = direction.endsWith("-reverse");
110
+ const distributed = FLEX_DISTRIBUTION_OPTIONS.includes(justify);
111
+ const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "justify-content", "align-items");
112
+ // The grid shows physical positions: justify-content runs along the main axis, so column containers transpose the axes.
113
+ const rowValues = isColumn
114
+ ? isReverse ? [...FLEX_ALIGNMENT_OPTIONS].reverse() : FLEX_ALIGNMENT_OPTIONS
115
+ : FLEX_ALIGNMENT_OPTIONS;
116
+ const columnValues = !isColumn && isReverse
117
+ ? [...FLEX_ALIGNMENT_OPTIONS].reverse()
118
+ : FLEX_ALIGNMENT_OPTIONS;
119
+ function selectAlignment(nextJustify, nextAlign) {
120
+ if (blockedBy)
121
+ return;
122
+ // A grid click changing cross-axis alignment must not replace an explicit distribution choice.
123
+ const resolvedJustify = distributed ? justify : nextJustify;
124
+ setJustify(resolvedJustify);
125
+ setAlign(nextAlign);
126
+ setStyles(editTarget ?? domElement, [
127
+ { property: "justify-content", value: resolvedJustify },
128
+ { property: "align-items", value: nextAlign },
129
+ ]);
130
+ onAfterEdit?.();
131
+ }
132
+ const grid = (_jsxs("div", { className: "layout__alignment-grid", role: "group", "aria-label": "Place flex items", "data-direction": isColumn ? "column" : "row", "data-justify": justify, "data-align": align, "data-distributed": distributed, children: [distributed ? (_jsxs("span", { className: "layout__distribution-preview", "aria-hidden": "true", children: [_jsx("span", {}), _jsx("span", {}), _jsx("span", {})] })) : null, rowValues.flatMap((rowValue) => columnValues.map((columnValue) => {
133
+ const justifyValue = isColumn ? rowValue : columnValue;
134
+ const alignValue = isColumn ? columnValue : rowValue;
135
+ const active = justify === justifyValue && align === alignValue;
136
+ const label = formatInspectorLabel(`Align ${alignValue.replace("flex-", "")} And Distribute ${justifyValue.replace("flex-", "")}`);
137
+ return (_jsx(Tooltip, { children: _jsx(IconButton, { size: "default", variant: "quiet", className: "layout__alignment-button", "data-active": active, "data-test": `layout-align-${alignValue}-${justifyValue}`, label: label, "aria-pressed": active, disabled: blockedBy !== null, onClick: () => selectAlignment(justifyValue, alignValue), children: _jsx("span", {}) }) }, `${alignValue}-${justifyValue}`));
138
+ }))] }));
139
+ return _jsx(Tooltip, { content: inlineStyleWarningContent(blockedBy), disabled: blockedBy === null, children: grid });
140
+ }
141
+ function normalizeFlexJustify(value) {
142
+ // Computed `normal` behaves as `flex-start` for flex containers, so show the physical placement.
143
+ return value === "normal" ? "flex-start" : value;
144
+ }
145
+ function normalizeFlexAlign(value) {
146
+ // `normal` resolves to stretch for flex items.
147
+ return value === "normal" ? "stretch" : value;
148
+ }
149
+ export function useComputedLayoutValue(domElement, property, fallback, revision) {
150
+ const [value, setValue] = useState(() => readLayoutValue(domElement, property, fallback));
151
+ useEffect(() => {
152
+ setValue(readLayoutValue(domElement, property, fallback));
153
+ }, [domElement, property, fallback, revision]);
154
+ return [value, setValue];
155
+ }
156
+ function readLayoutValue(domElement, property, fallback) {
157
+ return getStateStyleValue(domElement, property, fallback);
158
+ }
@@ -12,7 +12,10 @@ export interface GapFieldProps {
12
12
  entries: TokenEntry[];
13
13
  tokenRows: ResolvedProperty[];
14
14
  leading?: ReactNode;
15
+ trailing?: ReactNode;
16
+ /** Replaces the shown value (and ignores the token) while another property overrides the gap, such as `Auto`. */
17
+ displayOverride?: string;
18
+ interceptRaw?: (value: string) => boolean;
15
19
  onAfterEdit?: () => void;
16
20
  }
17
- /** Renders a gap value with a token chip or the legacy raw-value fallback. */
18
- export declare function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, onAfterEdit, }: GapFieldProps): ReactElement;
21
+ export declare function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, trailing, displayOverride, interceptRaw, onAfterEdit, }: GapFieldProps): ReactElement;
@@ -3,8 +3,7 @@ import { TokenField } from "../tokens/TokenField.js";
3
3
  import { formatInspectorLabel } from "../ui/labels.js";
4
4
  import { meaningfulLayoutValue } from "./layoutValue.js";
5
5
  export const GAP_PRESETS = ["0", "0.25rem", "0.5rem", "0.75rem", "1rem", "1.5rem", "2rem", "3rem"];
6
- /** Renders a gap value with a token chip or the legacy raw-value fallback. */
7
- export function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, onAfterEdit, }) {
8
- const tokenRow = tokenRows.find((row) => row.property === property) ?? null;
9
- return (_jsx("span", { className: "layout-combo", "data-test": "layout-combo", "data-property": property, children: _jsx(TokenField, { property: property, selection: selection, tokenRow: tokenRow, initialValue: meaningfulLayoutValue(el, property), domElement: el, editTarget: editTarget, entries: entries, suggestions: GAP_PRESETS, leading: leading, inputDataTest: `layout-combo-input-${property}`, label: formatInspectorLabel(property), chipVariant: "small", inlineWarningDataTest: "layout-combo-blocked", inlineWarningTooltipDataTest: "layout-combo-blocked-tooltip", onAfterEdit: onAfterEdit }) }));
6
+ export function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, leading, trailing, displayOverride, interceptRaw, onAfterEdit, }) {
7
+ const tokenRow = displayOverride !== undefined ? null : tokenRows.find((row) => row.property === property) ?? null;
8
+ return (_jsx("span", { className: "layout-combo", "data-test": "layout-combo", "data-property": property, children: _jsx(TokenField, { property: property, selection: selection, tokenRow: tokenRow, initialValue: meaningfulLayoutValue(el, property), displayValue: displayOverride, domElement: el, editTarget: editTarget, entries: entries, suggestions: GAP_PRESETS, leading: leading, trailing: trailing, interceptRaw: interceptRaw, inputDataTest: `layout-combo-input-${property}`, label: formatInspectorLabel(property), chipVariant: "small", inlineWarningDataTest: "layout-combo-blocked", inlineWarningTooltipDataTest: "layout-combo-blocked-tooltip", onAfterEdit: onAfterEdit }) }));
10
9
  }
@@ -6,9 +6,4 @@ export interface GridChildSectionProps {
6
6
  revision?: number;
7
7
  onAfterEdit?: () => void;
8
8
  }
9
- /**
10
- * Grid child controls expose only placement starts and per-axis alignment.
11
- * All edits commit as managed CSS declarations. Moving a start line preserves
12
- * an existing span where CSS makes that span unambiguous.
13
- */
14
9
  export declare function GridChildSection({ domElement: el, editTarget, revision, onAfterEdit, }: GridChildSectionProps): ReactElement;
@@ -67,11 +67,6 @@ function AlignmentControl({ axis, value, elements, onChange }) {
67
67
  testId: `layout-grid-child-align-${axis}-${option.value}`,
68
68
  })), onChange: onChange, allowDeselect: true, onDeselect: () => onChange("auto") }), _jsx(InlineStyleWarning, { blockedBy: blockedBy })] }));
69
69
  }
70
- /**
71
- * Grid child controls expose only placement starts and per-axis alignment.
72
- * All edits commit as managed CSS declarations. Moving a start line preserves
73
- * an existing span where CSS makes that span unambiguous.
74
- */
75
70
  export function GridChildSection({ domElement: el, editTarget, revision = 0, onAfterEdit, }) {
76
71
  const target = editTarget ?? el;
77
72
  const elements = targetElements(target);
@@ -8,6 +8,6 @@ export interface GridPickerProps {
8
8
  revision?: number;
9
9
  onAfterEdit?: () => void;
10
10
  }
11
- /** Returns a definite track count, or null when CSS itself determines it. */
11
+ /** Null when the browser determines the track count (auto-fill/auto-fit, none, subgrid). */
12
12
  export declare function countGridTracks(value: string): number | null;
13
13
  export declare function GridPicker({ domElement: el, editTarget, revision, onAfterEdit }: GridPickerProps): ReactElement;
@@ -47,7 +47,7 @@ function splitTrackList(value) {
47
47
  parts.push(value.slice(start).trim());
48
48
  return parts;
49
49
  }
50
- /** Returns a definite track count, or null when CSS itself determines it. */
50
+ /** Null when the browser determines the track count (auto-fill/auto-fit, none, subgrid). */
51
51
  export function countGridTracks(value) {
52
52
  const trimmed = value.trim();
53
53
  if (!trimmed || /^(?:none|subgrid)$/i.test(trimmed))
@@ -112,9 +112,7 @@ export function GridPicker({ domElement: el, editTarget, revision = 0, onAfterEd
112
112
  if (!picker)
113
113
  return;
114
114
  const target = event.target;
115
- // Document listeners see a shadow-root event through its host as the
116
- // retargeted `event.target`. Use the composed path so pointer-downs on
117
- // the grid cells are not mistaken for outside clicks.
115
+ // Shadow-root events are retargeted to the host for document listeners, so use the composed path.
118
116
  if (event.composedPath().includes(picker))
119
117
  return;
120
118
  if (target instanceof Node && picker.contains(target))
@@ -1,17 +1,19 @@
1
1
  import type { ReactElement } from "react";
2
- import type { TokenEntry } from "../../css/model/index.js";
3
- import type { ResolvedProperty } from "../../css/model/index.js";
2
+ import type { ResolvedProperty, TokenEntry } from "../../css/model/index.js";
4
3
  import type { EditTarget } from "../selection/editTarget.js";
5
4
  import type { StyleSelection } from "../selection/styleSelection.js";
6
- export interface GridSectionProps {
5
+ export interface GridControlProps {
7
6
  domElement: HTMLElement;
8
7
  editTarget?: EditTarget;
9
8
  selection?: StyleSelection | null;
10
- entries: TokenEntry[];
11
- tokenRows: ResolvedProperty[];
12
- showContainer: boolean;
13
- showChild: boolean;
14
9
  revision?: number;
15
10
  onAfterEdit?: () => void;
16
11
  }
17
- export declare function GridSection({ domElement: el, editTarget, selection, entries, tokenRows, showContainer, showChild, revision, onAfterEdit, }: GridSectionProps): ReactElement;
12
+ export interface GridContainerControlsProps extends GridControlProps {
13
+ entries: TokenEntry[];
14
+ tokenRows: ResolvedProperty[];
15
+ }
16
+ /** Track templates, flow and content alignment: the grid container settings the cell picker does not cover. */
17
+ export declare function GridAdvancedFields({ domElement, editTarget, selection, revision, onAfterEdit, }: GridControlProps): ReactElement;
18
+ /** The cell picker beside the row and column gap fields. */
19
+ export declare function GridContainerControls({ domElement, editTarget, selection, entries, tokenRows, revision, onAfterEdit, }: GridContainerControlsProps): ReactElement;
@@ -1,14 +1,10 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useState } from "react";
3
- import { IconSettings, IconSpacingHorizontal, IconSpacingVertical } from "@tabler/icons-react";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { IconSpacingHorizontal, IconSpacingVertical } from "@tabler/icons-react";
4
3
  import { GridPicker } from "./GridPicker.js";
5
4
  import { GapField } from "./GapField.js";
6
5
  import { LayoutDropdown } from "./LayoutDropdown.js";
7
6
  import { GridValueField } from "./GridValueField.js";
8
- import { GridChildSection } from "./GridChildSection.js";
9
7
  import { ControlSurface } from "../ui/ControlSurface.js";
10
- import { IconButton } from "../ui/IconButton.js";
11
- import { InspectorPopover } from "../ui/InspectorPopover.js";
12
8
  const GRID_AUTO_FLOW_OPTIONS = ["row", "column", "row dense", "column dense"];
13
9
  const GRID_CONTENT_ALIGNMENT_OPTIONS = [
14
10
  "normal",
@@ -21,7 +17,24 @@ const GRID_CONTENT_ALIGNMENT_OPTIONS = [
21
17
  "space-evenly",
22
18
  ];
23
19
  const GRID_ITEM_ALIGNMENT_OPTIONS = ["normal", "stretch", "start", "end", "center", "self-start", "self-end"];
24
- export function GridSection({ domElement: el, editTarget, selection, entries, tokenRows, showContainer, showChild, revision = 0, onAfterEdit, }) {
25
- const [advancedOpen, setAdvancedOpen] = useState(false);
26
- return (_jsxs(_Fragment, { children: [showContainer ? _jsx("div", { className: "layout__group layout__grid", "data-test": "layout-grid-container", children: _jsxs("div", { className: "layout__grid-primary", children: [_jsxs("div", { className: "layout__grid-picker-column", children: [_jsxs("div", { className: "layout__grid-heading", children: [_jsx("div", { className: "editor__title", children: "Grid" }), _jsx(InspectorPopover, { "data-test": "layout-grid-settings", side: "bottom", align: "end", triggerTooltip: "Grid settings", triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: "Grid settings", "data-active": advancedOpen, "data-test": "layout-grid-settings", children: _jsx(IconSettings, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), open: advancedOpen, onOpenChange: setAdvancedOpen, children: _jsxs("div", { className: "layout__grid-advanced", "data-test": "layout-grid-advanced", children: [_jsx("div", { className: "editor__title", children: "Advanced grid CSS" }), _jsxs("div", { className: "layout__grid-fields", children: [_jsx(GridValueField, { property: "grid-template-columns", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-template-rows", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "grid-auto-flow", options: GRID_AUTO_FLOW_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-auto-columns", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-auto-rows", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit })] }), _jsxs("div", { className: "layout__grid-alignment", "data-test": "layout-grid-alignment", children: [_jsx(LayoutDropdown, { property: "justify-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "align-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "justify-items", options: GRID_ITEM_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "align-items", options: GRID_ITEM_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit })] })] }) })] }), _jsx(GridPicker, { domElement: el, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit })] }), _jsxs("div", { className: "layout__grid-gap", "data-test": "layout-grid-gap", children: [_jsx("div", { className: "layout__grid-heading", "data-test": "layout-grid-gap-heading", "aria-hidden": "true", children: _jsx("div", { className: "editor__title" }) }), _jsxs("div", { className: "layout__grid-gap-fields", children: [_jsx(ControlSurface, { className: "layout__spacing-field", "data-test": "layout-grid-row-gap", children: _jsx(GapField, { property: "row-gap", domElement: el, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, leading: (_jsx(IconSpacingVertical, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": "layout-spacing-icon-row-gap" })), onAfterEdit: onAfterEdit }) }), _jsx(ControlSurface, { className: "layout__spacing-field", "data-test": "layout-grid-column-gap", children: _jsx(GapField, { property: "column-gap", domElement: el, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, leading: (_jsx(IconSpacingHorizontal, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": "layout-spacing-icon-column-gap" })), onAfterEdit: onAfterEdit }) })] })] })] }) }) : null, showChild ? _jsx(GridChildSection, { domElement: el, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit }) : null] }));
20
+ const GRID_ALIGNMENT_FIELDS = [
21
+ { property: "justify-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS },
22
+ { property: "align-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS },
23
+ { property: "justify-items", options: GRID_ITEM_ALIGNMENT_OPTIONS },
24
+ { property: "align-items", options: GRID_ITEM_ALIGNMENT_OPTIONS },
25
+ ];
26
+ const GRID_TRACK_PROPERTIES = ["grid-template-columns", "grid-template-rows"];
27
+ const GRID_AUTO_TRACK_PROPERTIES = ["grid-auto-columns", "grid-auto-rows"];
28
+ /** Track templates, flow and content alignment: the grid container settings the cell picker does not cover. */
29
+ export function GridAdvancedFields({ domElement, editTarget, selection, revision = 0, onAfterEdit, }) {
30
+ const shared = { domElement, editTarget, selection, revision, onAfterEdit };
31
+ return (_jsxs("div", { className: "layout__grid-advanced", "data-test": "layout-grid-advanced", children: [_jsx("div", { className: "editor__title", children: "Advanced grid CSS" }), _jsxs("div", { className: "layout__grid-fields", children: [GRID_TRACK_PROPERTIES.map((property) => _jsx(GridValueField, { property: property, ...shared }, property)), _jsx(LayoutDropdown, { property: "grid-auto-flow", options: GRID_AUTO_FLOW_OPTIONS, ...shared }), GRID_AUTO_TRACK_PROPERTIES.map((property) => _jsx(GridValueField, { property: property, ...shared }, property))] }), _jsx("div", { className: "layout__grid-alignment", "data-test": "layout-grid-alignment", children: GRID_ALIGNMENT_FIELDS.map(({ property, options }) => (_jsx(LayoutDropdown, { property: property, options: [...options], stacked: true, ...shared }, property))) })] }));
32
+ }
33
+ /** The cell picker beside the row and column gap fields. */
34
+ export function GridContainerControls({ domElement, editTarget, selection, entries, tokenRows, revision = 0, onAfterEdit, }) {
35
+ const gaps = [
36
+ { property: "row-gap", Icon: IconSpacingVertical },
37
+ { property: "column-gap", Icon: IconSpacingHorizontal },
38
+ ];
39
+ return (_jsxs("div", { className: "layout__grid-primary", "data-test": "layout-grid-container", children: [_jsx(GridPicker, { domElement: domElement, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit }), _jsx("div", { className: "layout__grid-gap-fields", "data-test": "layout-grid-gap", children: gaps.map(({ property, Icon }) => (_jsx(ControlSurface, { className: "layout__spacing-field", "data-test": `layout-grid-${property}`, children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, leading: (_jsx(Icon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }, property))) })] }));
27
40
  }
@@ -9,9 +9,5 @@ export interface GridValueFieldProps {
9
9
  revision?: number;
10
10
  onAfterEdit?: () => void;
11
11
  }
12
- /**
13
- * Raw CSS editor for Grid grammar. Track lists and line placement are not
14
- * safely decomposable into numeric controls, so the authored expression is
15
- * retained verbatim and committed as one managed longhand.
16
- */
12
+ /** Grid track lists and line placement are not safely decomposable into numeric controls. */
17
13
  export declare function GridValueField({ property, domElement: el, editTarget, selection, revision, onAfterEdit, }: GridValueFieldProps): ReactElement;
@@ -15,11 +15,7 @@ const DEFAULT_GRID_VALUES = {
15
15
  "grid-column": "auto",
16
16
  "grid-row": "auto",
17
17
  };
18
- /**
19
- * Raw CSS editor for Grid grammar. Track lists and line placement are not
20
- * safely decomposable into numeric controls, so the authored expression is
21
- * retained verbatim and committed as one managed longhand.
22
- */
18
+ /** Grid track lists and line placement are not safely decomposable into numeric controls. */
23
19
  export function GridValueField({ property, domElement: el, editTarget, selection, revision = 0, onAfterEdit, }) {
24
20
  const atRules = useFieldAtRules(property);
25
21
  const mixed = selection?.getProperty(property)?.value.kind === "mixed";
@@ -30,9 +26,7 @@ export function GridValueField({ property, domElement: el, editTarget, selection
30
26
  };
31
27
  const [value, setValue] = useState(readValue);
32
28
  const [draft, setDraft] = useState(value);
33
- // Commit reads the ref, not state: Escape reverts the draft and then blurs
34
- // within the same event, before React re-renders, so a state-only read
35
- // would commit the pre-escape draft.
29
+ // Commit reads the ref, not state: Escape reverts then blurs in one event, before React re-renders.
36
30
  const draftRef = useRef(value);
37
31
  useEffect(() => {
38
32
  const next = readValue();
@@ -13,6 +13,5 @@ interface ImageBackgroundEditorProps {
13
13
  onCss(value: string): boolean;
14
14
  onSizing(declarations: StyleDeclaration[]): boolean;
15
15
  }
16
- /** Preview uploaded images through the existing workspace style edits. */
17
16
  export declare function ImageBackgroundEditor({ element, elements, value, mixed, sizingValues, onUpload, onCss, onSizing }: ImageBackgroundEditorProps): ReactElement;
18
17
  export {};