nudge-ui 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/dist/cli/agentCommand.d.ts +0 -1
  2. package/dist/cli/agentCommand.js +4 -29
  3. package/dist/client.mjs +987 -221
  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 +14 -71
  94. package/dist/hosts/projectBridge.d.ts +0 -2
  95. package/dist/hosts/projectBridge.js +3 -19
  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 +8 -9
  125. package/dist/inspector/agent/activity.d.ts +2 -2
  126. package/dist/inspector/agent/activity.js +4 -3
  127. package/dist/inspector/agent/client.d.ts +3 -27
  128. package/dist/inspector/agent/client.js +43 -91
  129. package/dist/inspector/agent/connectionStatus.d.ts +3 -2
  130. package/dist/inspector/agent/connectionStatus.js +25 -1
  131. package/dist/inspector/agent/httpTransport.d.ts +0 -8
  132. package/dist/inspector/agent/httpTransport.js +42 -176
  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 +3 -20
  136. package/dist/inspector/agent/verification.js +10 -43
  137. package/dist/inspector/boot.d.ts +5 -0
  138. package/dist/inspector/boot.js +289 -0
  139. package/dist/inspector/canvas/AgentActivityOverlay.d.ts +3 -2
  140. package/dist/inspector/canvas/AgentActivityOverlay.js +7 -4
  141. package/dist/inspector/canvas/CanvasCard.js +26 -24
  142. package/dist/inspector/canvas/CanvasElementOverlay.js +196 -174
  143. package/dist/inspector/canvas/CanvasToolbar.js +2 -1
  144. package/dist/inspector/canvas/CanvasWorkspace.js +87 -124
  145. package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +3 -2
  146. package/dist/inspector/canvas/LockedWorkspaceNotice.js +10 -6
  147. package/dist/inspector/canvas/PageCard.d.ts +9 -0
  148. package/dist/inspector/canvas/PageCard.js +50 -0
  149. package/dist/inspector/canvas/SketchToolOptions.d.ts +4 -0
  150. package/dist/inspector/canvas/SketchToolOptions.js +80 -0
  151. package/dist/inspector/canvas/StaleChangeIndicator.d.ts +1 -1
  152. package/dist/inspector/canvas/StaleChangeIndicator.js +1 -1
  153. package/dist/inspector/canvas/ToolOptionsDrawer.d.ts +16 -0
  154. package/dist/inspector/canvas/ToolOptionsDrawer.js +71 -0
  155. package/dist/inspector/canvas/activeCanvasDocument.d.ts +3 -4
  156. package/dist/inspector/canvas/activeCanvasDocument.js +0 -2
  157. package/dist/inspector/canvas/agentPresentation.d.ts +2 -13
  158. package/dist/inspector/canvas/agentPresentation.js +3 -14
  159. package/dist/inspector/canvas/assets/eraser.svg +28 -0
  160. package/dist/inspector/canvas/assets/pen.svg +25 -0
  161. package/dist/inspector/canvas/canvasFrame.d.ts +12 -0
  162. package/dist/inspector/canvas/canvasFrame.js +9 -0
  163. package/dist/inspector/canvas/canvasGestures.d.ts +0 -1
  164. package/dist/inspector/canvas/canvasGestures.js +0 -6
  165. package/dist/inspector/canvas/canvasResize.d.ts +1 -6
  166. package/dist/inspector/canvas/canvasResize.js +1 -6
  167. package/dist/inspector/canvas/canvasStore.d.ts +5 -7
  168. package/dist/inspector/canvas/canvasStore.js +42 -21
  169. package/dist/inspector/canvas/frameConnection.d.ts +42 -0
  170. package/dist/inspector/canvas/frameConnection.js +73 -0
  171. package/dist/inspector/canvas/frameContent.d.ts +0 -1
  172. package/dist/inspector/canvas/frameLifecycle.d.ts +12 -0
  173. package/dist/inspector/canvas/frameLifecycle.js +11 -0
  174. package/dist/inspector/canvas/frameProtocol.d.ts +20 -38
  175. package/dist/inspector/canvas/frameProtocol.js +37 -24
  176. package/dist/inspector/canvas/frameScrollbarStyles.d.ts +0 -1
  177. package/dist/inspector/canvas/frameScrollbarStyles.js +0 -1
  178. package/dist/inspector/canvas/layout.d.ts +10 -22
  179. package/dist/inspector/canvas/layout.js +0 -3
  180. package/dist/inspector/canvas/normalizeUrl.js +1 -8
  181. package/dist/inspector/canvas/pageSurface.d.ts +6 -0
  182. package/dist/inspector/canvas/pageSurface.js +29 -0
  183. package/dist/inspector/canvas/projection.d.ts +14 -25
  184. package/dist/inspector/canvas/projection.js +64 -87
  185. package/dist/inspector/canvas/rendererBootstrap.d.ts +8 -1
  186. package/dist/inspector/canvas/rendererBootstrap.js +10 -15
  187. package/dist/inspector/canvas/rendererCidIndex.d.ts +0 -5
  188. package/dist/inspector/canvas/rendererCidIndex.js +0 -5
  189. package/dist/inspector/canvas/rendererElementSelector.js +38 -28
  190. package/dist/inspector/canvas/rendererMessageRouter.d.ts +4 -6
  191. package/dist/inspector/canvas/rendererMessageRouter.js +12 -17
  192. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +3 -1
  193. package/dist/inspector/canvas/rendererSelectionProxy.js +7 -40
  194. package/dist/inspector/canvas/rendererStylesheet.d.ts +0 -1
  195. package/dist/inspector/canvas/rendererStylesheet.js +23 -1
  196. package/dist/inspector/canvas/resizeHandleScale.d.ts +1 -10
  197. package/dist/inspector/canvas/resizeHandleScale.js +1 -10
  198. package/dist/inspector/canvas/sessionStore.d.ts +3 -9
  199. package/dist/inspector/canvas/sessionStore.js +33 -43
  200. package/dist/inspector/canvas/staleChangeDetector.d.ts +1 -1
  201. package/dist/inspector/canvas/staleChangeDetector.js +11 -26
  202. package/dist/inspector/canvas/toolbarScale.d.ts +1 -4
  203. package/dist/inspector/canvas/toolbarScale.js +1 -4
  204. package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +0 -1
  205. package/dist/inspector/canvas/useCanvasLayoutAnimation.js +0 -1
  206. package/dist/inspector/canvas/viewStore.js +1 -1
  207. package/dist/inspector/canvas/wheelPan.d.ts +1 -1
  208. package/dist/inspector/canvas/wheelPan.js +1 -1
  209. package/dist/inspector/canvas/workspaceLease.d.ts +1 -5
  210. package/dist/inspector/canvas/workspaceLease.js +1 -7
  211. package/dist/inspector/changes/codecs.d.ts +1 -0
  212. package/dist/inspector/changes/codecs.js +21 -5
  213. package/dist/inspector/changes/draftPreview.d.ts +7 -0
  214. package/dist/inspector/changes/draftPreview.js +118 -0
  215. package/dist/inspector/changes/editModel.d.ts +11 -13
  216. package/dist/inspector/changes/editModel.js +9 -4
  217. package/dist/inspector/changes/managedStyleProjection.js +6 -15
  218. package/dist/inspector/changes/model.d.ts +0 -5
  219. package/dist/inspector/changes/model.js +1 -8
  220. package/dist/inspector/changes/previewDiagnostics.d.ts +2 -12
  221. package/dist/inspector/changes/previewDiagnostics.js +5 -21
  222. package/dist/inspector/changes/previewVerification.d.ts +25 -0
  223. package/dist/inspector/changes/previewVerification.js +34 -0
  224. package/dist/inspector/changes/structuralTypes.d.ts +2 -4
  225. package/dist/inspector/changes/types.d.ts +11 -8
  226. package/dist/inspector/clientManifest.d.ts +17 -6
  227. package/dist/inspector/clientManifest.js +16 -3
  228. package/dist/inspector/comments/CommentsOverlay.js +66 -23
  229. package/dist/inspector/comments/element.d.ts +1 -2
  230. package/dist/inspector/comments/element.js +1 -2
  231. package/dist/inspector/comments/store.d.ts +1 -1
  232. package/dist/inspector/comments/store.js +4 -3
  233. package/dist/inspector/comments/verification.d.ts +8 -2
  234. package/dist/inspector/comments/verification.js +19 -11
  235. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +8 -0
  236. package/dist/inspector/componentSemantics/ComponentPropsSection.js +12 -8
  237. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +2 -9
  238. package/dist/inspector/componentSemantics/adapterRegistry.js +2 -9
  239. package/dist/inspector/componentSemantics/changeAction.js +1 -1
  240. package/dist/inspector/componentSemantics/changeModel.js +2 -4
  241. package/dist/inspector/componentSemantics/react/callsites.d.ts +28 -0
  242. package/dist/inspector/componentSemantics/react/callsites.js +261 -0
  243. package/dist/inspector/componentSemantics/react/devtoolsHook.d.ts +23 -0
  244. package/dist/inspector/componentSemantics/react/devtoolsHook.js +71 -0
  245. package/dist/inspector/componentSemantics/react/fibers.d.ts +17 -0
  246. package/dist/inspector/componentSemantics/react/fibers.js +30 -0
  247. package/dist/inspector/componentSemantics/{reactRuntime.d.ts → react/runtime.d.ts} +3 -2
  248. package/dist/inspector/componentSemantics/{reactRuntime.js → react/runtime.js} +70 -53
  249. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +2 -18
  250. package/dist/inspector/componentSemantics/runtimeBridge.js +5 -19
  251. package/dist/inspector/componentSemantics/textBinding.d.ts +2 -11
  252. package/dist/inspector/componentSemantics/textBinding.js +20 -87
  253. package/dist/inspector/componentSemantics/types.d.ts +8 -27
  254. package/dist/inspector/componentSemantics/types.js +0 -1
  255. package/dist/inspector/conformance/borderCases.d.ts +0 -5
  256. package/dist/inspector/conformance/borderCases.js +0 -5
  257. package/dist/inspector/conformance/colorCases.d.ts +0 -6
  258. package/dist/inspector/conformance/colorCases.js +0 -6
  259. package/dist/inspector/conformance/fixture.d.ts +1 -5
  260. package/dist/inspector/conformance/fixture.js +1 -5
  261. package/dist/inspector/conformance/spacingCases.d.ts +0 -4
  262. package/dist/inspector/conformance/spacingCases.js +0 -4
  263. package/dist/inspector/conformance/typographyCases.d.ts +0 -5
  264. package/dist/inspector/conformance/typographyCases.js +0 -5
  265. package/dist/inspector/drafts/draftStore.d.ts +95 -0
  266. package/dist/inspector/drafts/draftStore.js +461 -0
  267. package/dist/inspector/drafts/model.d.ts +14 -14
  268. package/dist/inspector/drafts/model.js +4 -2
  269. package/dist/inspector/drafts/store.d.ts +47 -16
  270. package/dist/inspector/drafts/store.js +137 -170
  271. package/dist/inspector/editScope.d.ts +0 -1
  272. package/dist/inspector/editScope.js +0 -1
  273. package/dist/inspector/index.d.ts +2 -4
  274. package/dist/inspector/index.js +2 -264
  275. package/dist/inspector/inline-text/inlineTextDiagnostics.d.ts +0 -2
  276. package/dist/inspector/inline-text/inlineTextDiagnostics.js +0 -2
  277. package/dist/inspector/inline-text/inlineTextEditor.d.ts +3 -9
  278. package/dist/inspector/inline-text/inlineTextEditor.js +27 -81
  279. package/dist/inspector/inline-text/inlineTextLifecycle.js +1 -6
  280. package/dist/inspector/inline-text/textEditChange.d.ts +1 -2
  281. package/dist/inspector/inspection/bridge.d.ts +3 -7
  282. package/dist/inspector/inspection/bridge.js +6 -13
  283. package/dist/inspector/inspection/browserCssInspection.d.ts +12 -11
  284. package/dist/inspector/inspection/browserCssInspection.js +32 -14
  285. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +0 -7
  286. package/dist/inspector/inspection/browserCssInspectionRegistry.js +1 -16
  287. package/dist/inspector/inspection/inspectionSnapshot.d.ts +6 -0
  288. package/dist/inspector/inspection/inspectionSnapshot.js +10 -0
  289. package/dist/inspector/inspection/performanceDiagnostics.d.ts +18 -0
  290. package/dist/inspector/inspection/performanceDiagnostics.js +31 -0
  291. package/dist/inspector/inspection/selectionProperty.d.ts +1 -6
  292. package/dist/inspector/inspection/selectionProperty.js +1 -5
  293. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +1 -5
  294. package/dist/inspector/inspection/useBrowserCssInspection.js +22 -59
  295. package/dist/inspector/iterations/capture.d.ts +2 -2
  296. package/dist/inspector/iterations/capture.js +4 -9
  297. package/dist/inspector/iterations/client.d.ts +2 -2
  298. package/dist/inspector/iterations/client.js +0 -1
  299. package/dist/inspector/iterations/coordinator.d.ts +4 -4
  300. package/dist/inspector/iterations/coordinator.js +5 -4
  301. package/dist/inspector/iterations/prompt.d.ts +0 -1
  302. package/dist/inspector/iterations/prompt.js +9 -9
  303. package/dist/inspector/overlay/DomNavigator.d.ts +3 -1
  304. package/dist/inspector/overlay/DomNavigator.js +39 -15
  305. package/dist/inspector/overlay/DropGuideOverlay.d.ts +0 -1
  306. package/dist/inspector/overlay/DropGuideOverlay.js +0 -1
  307. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +1 -8
  308. package/dist/inspector/overlay/MeasurementGuideOverlay.js +1 -5
  309. package/dist/inspector/overlay/clickPolicy.d.ts +3 -14
  310. package/dist/inspector/overlay/clickPolicy.js +3 -14
  311. package/dist/inspector/overlay/dropGuide.d.ts +0 -3
  312. package/dist/inspector/overlay/dropGuide.js +0 -3
  313. package/dist/inspector/overlay/frameThrottle.d.ts +0 -1
  314. package/dist/inspector/overlay/frameThrottle.js +0 -1
  315. package/dist/inspector/overlay/interactionStyles.d.ts +1 -1
  316. package/dist/inspector/overlay/interactionStyles.js +19 -8
  317. package/dist/inspector/overlay/measurementGeometry.js +4 -12
  318. package/dist/inspector/overlay/selectedGeometry.d.ts +1 -6
  319. package/dist/inspector/overlay/selectedGeometry.js +1 -8
  320. package/dist/inspector/overlay/spacingGestures.d.ts +14 -21
  321. package/dist/inspector/overlay/spacingGestures.js +151 -31
  322. package/dist/inspector/overlay/structuralGestures.d.ts +2 -9
  323. package/dist/inspector/overlay/structuralGestures.js +1 -4
  324. package/dist/inspector/pageInspector.d.ts +33 -0
  325. package/dist/inspector/pageInspector.js +335 -0
  326. package/dist/inspector/projection/cssEscapes.d.ts +0 -1
  327. package/dist/inspector/projection/cssEscapes.js +2 -4
  328. package/dist/inspector/projection/draftProjection.d.ts +6 -10
  329. package/dist/inspector/projection/draftProjection.js +8 -7
  330. package/dist/inspector/projection/managedStylesheet.d.ts +1 -7
  331. package/dist/inspector/projection/managedStylesheet.js +28 -26
  332. package/dist/inspector/projection/renderedInstance.d.ts +5 -28
  333. package/dist/inspector/projection/renderedInstance.js +13 -33
  334. package/dist/inspector/projection/structuralProjection.d.ts +7 -48
  335. package/dist/inspector/projection/structuralProjection.js +31 -96
  336. package/dist/inspector/projection/textProjection.d.ts +7 -13
  337. package/dist/inspector/projection/textProjection.js +35 -80
  338. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +0 -1
  339. package/dist/inspector/prompt/PromptSettingsDialog.js +0 -1
  340. package/dist/inspector/prompt/clipboardHandoff.d.ts +1 -0
  341. package/dist/inspector/prompt/clipboardHandoff.js +34 -16
  342. package/dist/inspector/prompt/generatePrompt.d.ts +2 -2
  343. package/dist/inspector/prompt/generatePrompt.js +247 -166
  344. package/dist/inspector/prompt/promptDocument.d.ts +3 -0
  345. package/dist/inspector/prompt/promptDocument.js +8 -0
  346. package/dist/inspector/prompt/promptSettings.d.ts +0 -3
  347. package/dist/inspector/prompt/promptSettings.js +7 -8
  348. package/dist/inspector/runtime/devFlag.d.ts +2 -25
  349. package/dist/inspector/runtime/devFlag.js +4 -31
  350. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +0 -2
  351. package/dist/inspector/runtime/editorShell.d.ts +0 -1
  352. package/dist/inspector/runtime/editorShell.js +0 -1
  353. package/dist/inspector/runtime/inspectorStorage.d.ts +11 -0
  354. package/dist/inspector/runtime/inspectorStorage.js +37 -0
  355. package/dist/inspector/runtime/ownedStylesheets.d.ts +14 -0
  356. package/dist/inspector/runtime/ownedStylesheets.js +66 -0
  357. package/dist/inspector/runtime/runtimeConfig.d.ts +14 -84
  358. package/dist/inspector/runtime/runtimeConfig.js +18 -50
  359. package/dist/inspector/runtime/runtimeIdentityClaims.d.ts +19 -0
  360. package/dist/inspector/runtime/runtimeIdentityClaims.js +178 -0
  361. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +6 -23
  362. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +103 -52
  363. package/dist/inspector/runtime/useRuntimeConfig.d.ts +1 -8
  364. package/dist/inspector/runtime/useRuntimeConfig.js +1 -8
  365. package/dist/inspector/selection/editScope.d.ts +2 -7
  366. package/dist/inspector/selection/editScope.js +15 -14
  367. package/dist/inspector/selection/editTarget.d.ts +1 -5
  368. package/dist/inspector/selection/hierarchy.d.ts +11 -11
  369. package/dist/inspector/selection/hierarchy.js +42 -24
  370. package/dist/inspector/selection/selectionStore.d.ts +0 -3
  371. package/dist/inspector/selection/selectionStore.js +5 -16
  372. package/dist/inspector/selection/sourceSite.d.ts +1 -5
  373. package/dist/inspector/selection/sourceSite.js +2 -8
  374. package/dist/inspector/selection/styleSelection.d.ts +1 -5
  375. package/dist/inspector/selection/styleSelection.js +1 -5
  376. package/dist/inspector/session/lifecycle.d.ts +1 -9
  377. package/dist/inspector/session/lifecycle.js +0 -1
  378. package/dist/inspector/session/sessionContext.d.ts +0 -4
  379. package/dist/inspector/session/sessionContext.js +0 -4
  380. package/dist/inspector/session/sessionFactory.d.ts +0 -9
  381. package/dist/inspector/session/sessionFactory.js +0 -6
  382. package/dist/inspector/settings/SettingsDialog.d.ts +0 -1
  383. package/dist/inspector/settings/SettingsDialog.js +5 -3
  384. package/dist/inspector/shell/AgentStatusButton.d.ts +3 -2
  385. package/dist/inspector/shell/AgentStatusButton.js +7 -7
  386. package/dist/inspector/shell/AppShell.js +6 -2
  387. package/dist/inspector/shell/ChangesLog.js +29 -12
  388. package/dist/inspector/shell/CopyPromptButton.d.ts +2 -1
  389. package/dist/inspector/shell/CopyPromptButton.js +62 -55
  390. package/dist/inspector/shell/EmptyState.js +3 -3
  391. package/dist/inspector/shell/InspectorEditors.d.ts +16 -0
  392. package/dist/inspector/shell/InspectorEditors.js +14 -0
  393. package/dist/inspector/shell/InspectorPanel.d.ts +12 -0
  394. package/dist/inspector/shell/InspectorPanel.js +8 -0
  395. package/dist/inspector/shell/InspectorSelection.d.ts +24 -0
  396. package/dist/inspector/shell/InspectorSelection.js +20 -0
  397. package/dist/inspector/shell/InspectorShell.d.ts +0 -3
  398. package/dist/inspector/shell/InspectorShell.js +44 -58
  399. package/dist/inspector/shell/NudgeLogoIcon.d.ts +5 -0
  400. package/dist/inspector/shell/NudgeLogoIcon.js +5 -0
  401. package/dist/inspector/shell/PeekOriginalButton.d.ts +0 -5
  402. package/dist/inspector/shell/PeekOriginalButton.js +3 -8
  403. package/dist/inspector/shell/PeekOriginalIcon.d.ts +0 -5
  404. package/dist/inspector/shell/PeekOriginalIcon.js +0 -5
  405. package/dist/inspector/shell/PromptActionButton.d.ts +21 -0
  406. package/dist/inspector/shell/PromptActionButton.js +14 -0
  407. package/dist/inspector/shell/elementName.d.ts +5 -0
  408. package/dist/inspector/shell/elementName.js +29 -0
  409. package/dist/inspector/shell/interactionStatePreview.d.ts +6 -0
  410. package/dist/inspector/shell/interactionStatePreview.js +107 -0
  411. package/dist/inspector/shell/originalPreview.d.ts +1 -5
  412. package/dist/inspector/shell/originalPreview.js +5 -37
  413. package/dist/inspector/shell/stateValue.d.ts +1 -2
  414. package/dist/inspector/shell/stateValue.js +4 -8
  415. package/dist/inspector/shell/styleState.d.ts +1 -2
  416. package/dist/inspector/shell/styleState.js +1 -2
  417. package/dist/inspector/sketch/SketchEditor.js +5 -5
  418. package/dist/inspector/sketch/SketchFrameOverlay.d.ts +2 -1
  419. package/dist/inspector/sketch/SketchFrameOverlay.js +13 -16
  420. package/dist/inspector/sketch/SketchOverlay.d.ts +3 -5
  421. package/dist/inspector/sketch/SketchOverlay.js +138 -263
  422. package/dist/inspector/sketch/SketchPromptPanel.d.ts +1 -2
  423. package/dist/inspector/sketch/SketchPromptPanel.js +8 -2
  424. package/dist/inspector/sketch/SketchThumbnail.d.ts +5 -0
  425. package/dist/inspector/sketch/SketchThumbnail.js +18 -0
  426. package/dist/inspector/sketch/SketchWorkspace.d.ts +1 -2
  427. package/dist/inspector/sketch/SketchWorkspace.js +70 -37
  428. package/dist/inspector/sketch/capture.d.ts +12 -3
  429. package/dist/inspector/sketch/capture.js +31 -14
  430. package/dist/inspector/sketch/copySketch.d.ts +4 -0
  431. package/dist/inspector/sketch/copySketch.js +43 -0
  432. package/dist/inspector/sketch/drawingTools.d.ts +15 -0
  433. package/dist/inspector/sketch/drawingTools.js +46 -0
  434. package/dist/inspector/sketch/frameHeading.d.ts +3 -0
  435. package/dist/inspector/sketch/frameHeading.js +23 -0
  436. package/dist/inspector/sketch/freehand.d.ts +0 -1
  437. package/dist/inspector/sketch/freehand.js +3 -4
  438. package/dist/inspector/sketch/geometry.d.ts +2 -1
  439. package/dist/inspector/sketch/geometry.js +15 -1
  440. package/dist/inspector/sketch/handoff.js +0 -1
  441. package/dist/inspector/sketch/history.d.ts +26 -0
  442. package/dist/inspector/sketch/history.js +55 -0
  443. package/dist/inspector/sketch/interaction.d.ts +3 -5
  444. package/dist/inspector/sketch/interaction.js +8 -11
  445. package/dist/inspector/sketch/model.d.ts +33 -6
  446. package/dist/inspector/sketch/model.js +101 -63
  447. package/dist/inspector/sketch/persistence.d.ts +14 -1
  448. package/dist/inspector/sketch/persistence.js +64 -8
  449. package/dist/inspector/sketch/raster.d.ts +3 -2
  450. package/dist/inspector/sketch/raster.js +40 -20
  451. package/dist/inspector/sketch/store.d.ts +1 -1
  452. package/dist/inspector/sketch/store.js +3 -4
  453. package/dist/inspector/sketch/videoFrames.d.ts +6 -0
  454. package/dist/inspector/sketch/videoFrames.js +80 -0
  455. package/dist/inspector/spacing/projection.d.ts +0 -8
  456. package/dist/inspector/spacing/projection.js +38 -20
  457. package/dist/inspector/styleEditors/BackgroundEditor.js +3 -2
  458. package/dist/inspector/styleEditors/BorderEditor.js +30 -135
  459. package/dist/inspector/styleEditors/BorderRadiusEditor.js +8 -3
  460. package/dist/inspector/styleEditors/ChildPlacement.d.ts +12 -0
  461. package/dist/inspector/styleEditors/ChildPlacement.js +9 -0
  462. package/dist/inspector/styleEditors/FlexControls.d.ts +35 -0
  463. package/dist/inspector/styleEditors/FlexControls.js +158 -0
  464. package/dist/inspector/styleEditors/GapField.d.ts +5 -2
  465. package/dist/inspector/styleEditors/GapField.js +3 -4
  466. package/dist/inspector/styleEditors/GridChildSection.d.ts +0 -5
  467. package/dist/inspector/styleEditors/GridChildSection.js +0 -5
  468. package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
  469. package/dist/inspector/styleEditors/GridPicker.js +2 -4
  470. package/dist/inspector/styleEditors/GridSection.d.ts +10 -8
  471. package/dist/inspector/styleEditors/GridSection.js +22 -9
  472. package/dist/inspector/styleEditors/GridValueField.d.ts +1 -5
  473. package/dist/inspector/styleEditors/GridValueField.js +2 -8
  474. package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +0 -1
  475. package/dist/inspector/styleEditors/ImageBackgroundEditor.js +1 -2
  476. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +0 -1
  477. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +0 -1
  478. package/dist/inspector/styleEditors/LayoutComboField.js +0 -5
  479. package/dist/inspector/styleEditors/LayoutModeRow.d.ts +14 -0
  480. package/dist/inspector/styleEditors/LayoutModeRow.js +60 -0
  481. package/dist/inspector/styleEditors/LayoutSection.d.ts +2 -2
  482. package/dist/inspector/styleEditors/LayoutSection.js +30 -356
  483. package/dist/inspector/styleEditors/OpacityEditor.js +7 -5
  484. package/dist/inspector/styleEditors/PositionControls.d.ts +18 -0
  485. package/dist/inspector/styleEditors/PositionControls.js +16 -0
  486. package/dist/inspector/styleEditors/SizeSection.d.ts +18 -0
  487. package/dist/inspector/styleEditors/SizeSection.js +71 -0
  488. package/dist/inspector/styleEditors/{SpacingBox.d.ts → SpacingField.d.ts} +3 -10
  489. package/dist/inspector/styleEditors/{SpacingBox.js → SpacingField.js} +15 -29
  490. package/dist/inspector/styleEditors/Typography.js +2 -4
  491. package/dist/inspector/styleEditors/borderModel.d.ts +36 -0
  492. package/dist/inspector/styleEditors/borderModel.js +105 -0
  493. package/dist/inspector/styleEditors/completeCssValue.d.ts +1 -5
  494. package/dist/inspector/styleEditors/completeCssValue.js +3 -13
  495. package/dist/inspector/styleEditors/fieldValue.d.ts +20 -0
  496. package/dist/inspector/styleEditors/fieldValue.js +26 -0
  497. package/dist/inspector/styleEditors/gradientValue.d.ts +1 -1
  498. package/dist/inspector/styleEditors/gradientValue.js +3 -2
  499. package/dist/inspector/styleEditors/gridChildModel.d.ts +7 -47
  500. package/dist/inspector/styleEditors/gridChildModel.js +6 -37
  501. package/dist/inspector/styleEditors/hiddenSizeOverrides.d.ts +5 -0
  502. package/dist/inspector/styleEditors/hiddenSizeOverrides.js +42 -0
  503. package/dist/inspector/styleEditors/inlineAuthored.d.ts +1 -8
  504. package/dist/inspector/styleEditors/inlineAuthored.js +3 -17
  505. package/dist/inspector/styleEditors/layoutMode.d.ts +15 -0
  506. package/dist/inspector/styleEditors/layoutMode.js +33 -0
  507. package/dist/inspector/styleEditors/layoutPreviewState.d.ts +0 -1
  508. package/dist/inspector/styleEditors/layoutPreviewState.js +0 -1
  509. package/dist/inspector/styleEditors/layoutValue.d.ts +2 -8
  510. package/dist/inspector/styleEditors/layoutValue.js +6 -15
  511. package/dist/inspector/styleEditors/nudgeValue.d.ts +1 -13
  512. package/dist/inspector/styleEditors/nudgeValue.js +1 -13
  513. package/dist/inspector/styleEditors/rowLookup.d.ts +1 -5
  514. package/dist/inspector/styleEditors/rowLookup.js +1 -5
  515. package/dist/inspector/styleEditors/stringRecord.d.ts +1 -2
  516. package/dist/inspector/styleEditors/stylePresence.d.ts +0 -2
  517. package/dist/inspector/styleEditors/stylePresence.js +1 -4
  518. package/dist/inspector/styleEditors/textRelevance.d.ts +1 -1
  519. package/dist/inspector/styleEditors/textRelevance.js +1 -1
  520. package/dist/inspector/styleEditors/useFieldVisibility.js +1 -2
  521. package/dist/inspector/styleEditors/useLayoutContext.d.ts +13 -0
  522. package/dist/inspector/styleEditors/useLayoutContext.js +53 -0
  523. package/dist/inspector/styleEditors/valuePolicy.d.ts +1 -5
  524. package/dist/inspector/styleEditors/valuePolicy.js +0 -1
  525. package/dist/inspector/testing.d.ts +1 -4
  526. package/dist/inspector/testing.js +1 -4
  527. package/dist/inspector/tokens/TokenChip.d.ts +1 -4
  528. package/dist/inspector/tokens/TokenChip.js +1 -4
  529. package/dist/inspector/tokens/TokenField.d.ts +4 -3
  530. package/dist/inspector/tokens/TokenField.js +53 -32
  531. package/dist/inspector/tokens/TokensPanel.js +2 -1
  532. package/dist/inspector/tokens/catalog.d.ts +2 -10
  533. package/dist/inspector/tokens/catalog.js +5 -12
  534. package/dist/inspector/tokens/dragPointerLock.d.ts +0 -1
  535. package/dist/inspector/tokens/dragPointerLock.js +2 -3
  536. package/dist/inspector/tokens/editActions.d.ts +4 -4
  537. package/dist/inspector/tokens/editActions.js +11 -7
  538. package/dist/inspector/tokens/resolution/cascade.d.ts +1 -5
  539. package/dist/inspector/tokens/resolution/cascade.js +1 -5
  540. package/dist/inspector/tokens/resolution/containerQueryEvaluator.d.ts +11 -0
  541. package/dist/inspector/tokens/resolution/containerQueryEvaluator.js +82 -0
  542. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +4 -19
  543. package/dist/inspector/tokens/resolution/cssomCollector.js +186 -122
  544. package/dist/inspector/tokens/resolution/nestedSelectors.d.ts +2 -0
  545. package/dist/inspector/tokens/resolution/nestedSelectors.js +63 -0
  546. package/dist/inspector/tokens/resolution/ruleMatching.d.ts +4 -14
  547. package/dist/inspector/tokens/resolution/ruleMatching.js +136 -63
  548. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +3 -14
  549. package/dist/inspector/tokens/resolution/selectorSemantics.js +12 -27
  550. package/dist/inspector/tokens/resolution.d.ts +11 -27
  551. package/dist/inspector/tokens/resolution.js +105 -181
  552. package/dist/inspector/tokens/tokenAvailability.d.ts +2 -14
  553. package/dist/inspector/tokens/tokenAvailability.js +6 -38
  554. package/dist/inspector/tokens/tokenEdits.d.ts +1 -1
  555. package/dist/inspector/tokens/tokenEdits.js +1 -1
  556. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +0 -1
  557. package/dist/inspector/tokens/valueSemanticsAdapter.js +18 -2
  558. package/dist/inspector/ui/AtRuleContext.d.ts +5 -5
  559. package/dist/inspector/ui/AtRuleContext.js +8 -6
  560. package/dist/inspector/ui/ControlSurface.d.ts +0 -4
  561. package/dist/inspector/ui/Disclosure.d.ts +0 -5
  562. package/dist/inspector/ui/Disclosure.js +0 -4
  563. package/dist/inspector/ui/InlineStyleWarning.d.ts +0 -1
  564. package/dist/inspector/ui/InlineStyleWarning.js +2 -2
  565. package/dist/inspector/ui/InspectorPopover.d.ts +1 -5
  566. package/dist/inspector/ui/InspectorPopover.js +1 -5
  567. package/dist/inspector/ui/InspectorStyle.d.ts +8 -0
  568. package/dist/inspector/ui/InspectorStyle.js +26 -0
  569. package/dist/inspector/ui/PopoverListbox.d.ts +2 -1
  570. package/dist/inspector/ui/PopoverListbox.js +3 -3
  571. package/dist/inspector/ui/SegmentedControl.d.ts +4 -4
  572. package/dist/inspector/ui/SegmentedControl.js +6 -4
  573. package/dist/inspector/ui/SideValuesField.d.ts +1 -6
  574. package/dist/inspector/ui/SideValuesField.js +2 -8
  575. package/dist/inspector/ui/Toast.d.ts +10 -0
  576. package/dist/inspector/ui/Toast.js +26 -0
  577. package/dist/inspector/ui/assets/canvasIllustration.d.ts +2 -0
  578. package/dist/inspector/ui/assets/canvasIllustration.js +21 -0
  579. package/dist/inspector/ui/assets/gridIllustration.d.ts +2 -0
  580. package/dist/inspector/ui/assets/{grid.svg → gridIllustration.js} +3 -2
  581. package/dist/inspector/ui/atRuleSegments.d.ts +13 -0
  582. package/dist/inspector/ui/atRuleSegments.js +34 -0
  583. package/dist/inspector/ui/classNames.d.ts +0 -1
  584. package/dist/inspector/ui/classNames.js +0 -1
  585. package/dist/inspector/ui/customCursors.d.ts +11 -0
  586. package/dist/inspector/ui/customCursors.js +29 -7
  587. package/dist/inspector/ui/styles.js +25 -25
  588. package/dist/inspector/workspace/commands.js +1 -2
  589. package/dist/inspector/workspace/controller.js +20 -2
  590. package/dist/inspector/workspace/handoff.d.ts +1 -5
  591. package/dist/inspector/workspace/handoff.js +4 -7
  592. package/dist/inspector/workspace/sentItems.d.ts +3 -6
  593. package/dist/inspector/workspace/sentItems.js +6 -24
  594. package/dist/inspector/workspace/timeline.d.ts +28 -11
  595. package/dist/inspector/workspace/timeline.js +117 -96
  596. package/dist/internal/agent-protocol.d.ts +53 -38
  597. package/dist/internal/agent-protocol.js +151 -42
  598. package/dist/nudge-ui.mjs +155 -92
  599. package/dist/project/artifacts.js +24 -21
  600. package/dist/project/files.d.ts +0 -1
  601. package/dist/project/files.js +2 -9
  602. package/dist/project/identity.d.ts +1 -5
  603. package/dist/project/identity.js +1 -5
  604. package/dist/project/mcpPackage.d.ts +3 -0
  605. package/dist/project/mcpPackage.js +55 -0
  606. package/dist/project/pathPolicy.d.ts +1 -6
  607. package/dist/project/pathPolicy.js +1 -6
  608. package/dist/project/tokens.d.ts +2 -12
  609. package/dist/project/tokens.js +4 -15
  610. package/dist/transport/editor.d.ts +1 -12
  611. package/dist/transport/editor.js +2 -13
  612. package/dist/transport/index.d.ts +0 -5
  613. package/dist/transport/index.js +0 -5
  614. package/dist/transport/routes.d.ts +0 -5
  615. package/dist/transport/routes.js +0 -5
  616. package/package.json +16 -5
  617. package/dist/inspector/canvas/measurementProjection.d.ts +0 -8
  618. package/dist/inspector/canvas/measurementProjection.js +0 -16
  619. package/dist/inspector/changes/changesLog.d.ts +0 -49
  620. package/dist/inspector/changes/changesLog.js +0 -255
  621. package/dist/inspector/changes/draftChanges.d.ts +0 -58
  622. package/dist/inspector/changes/draftChanges.js +0 -304
  623. package/dist/inspector/conformance/projection.d.ts +0 -2
  624. package/dist/inspector/conformance/projection.js +0 -3
  625. package/dist/inspector/inline-text/textChangeBoundary.d.ts +0 -6
  626. package/dist/inspector/inline-text/textChangeBoundary.js +0 -1
  627. package/dist/inspector/overlay/InspectorOverlay.d.ts +0 -5
  628. package/dist/inspector/overlay/InspectorOverlay.js +0 -332
  629. package/dist/inspector/overlay/elementSelector.d.ts +0 -1
  630. package/dist/inspector/overlay/elementSelector.js +0 -111
  631. package/dist/inspector/sketch/SketchChanges.d.ts +0 -2
  632. package/dist/inspector/sketch/SketchChanges.js +0 -72
  633. package/dist/inspector/sketch/SketchEntryButton.d.ts +0 -4
  634. package/dist/inspector/sketch/SketchEntryButton.js +0 -11
  635. package/dist/inspector/sketch/SketchLayersPanel.d.ts +0 -2
  636. package/dist/inspector/sketch/SketchLayersPanel.js +0 -71
  637. package/dist/inspector/styleEditors/InsetSection.d.ts +0 -15
  638. package/dist/inspector/styleEditors/InsetSection.js +0 -15
  639. package/dist/inspector/styleEditors/PositionInsets.d.ts +0 -15
  640. package/dist/inspector/styleEditors/PositionInsets.js +0 -12
  641. package/dist/inspector/tokens/TokenDropdown.d.ts +0 -13
  642. package/dist/inspector/tokens/TokenDropdown.js +0 -59
@@ -3,9 +3,8 @@ import { useEffect, useState } from "react";
3
3
  import { IconBorderSides, IconBorderStyle2, IconCheck, IconMinus, IconPlus, } from "@tabler/icons-react";
4
4
  import { findTokenRow } from "./rowLookup.js";
5
5
  import { TokenField } from "../tokens/TokenField.js";
6
- import { setStyle, setStyles } from "../tokens/editActions.js";
6
+ import { setStyles } from "../tokens/editActions.js";
7
7
  import { FieldRow } from "../ui/FieldRow.js";
8
- import { SIDE_NAMES } from "../ui/SideValuesField.js";
9
8
  import { IconButton } from "../ui/IconButton.js";
10
9
  import { ToggleButton } from "../ui/ToggleButton.js";
11
10
  import { formatInspectorLabel } from "../ui/labels.js";
@@ -13,107 +12,23 @@ import { getStateStyleValue } from "../shell/stateValue.js";
13
12
  import { PopoverListbox } from "../ui/PopoverListbox.js";
14
13
  import { ControlSurface } from "../ui/ControlSurface.js";
15
14
  import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
16
- import { isZeroCssValue } from "./stylePresence.js";
17
15
  import { useFieldVisibility } from "./useFieldVisibility.js";
18
16
  import { Tooltip } from "../ui/Tooltip.js";
19
17
  import { inlineStyleWarningContent } from "../ui/InlineStyleWarning.js";
20
18
  import { inlineBlockedBy } from "./inlineAuthored.js";
21
- const BORDER_STYLES = ["none", "hidden", "solid", "dashed", "dotted", "double", "groove", "ridge", "inset", "outset"];
22
- const INVISIBLE_BORDER_STYLES = new Set(["none", "hidden"]);
23
- const BORDER_SIDES = SIDE_NAMES.map((side) => `border-${side}`);
24
- function borderStyleValue(el, rows, property) {
25
- const row = findTokenRow(rows, property);
26
- const structured = row?.structure?.style?.trim();
27
- if (structured)
28
- return structured.toLowerCase();
29
- const authored = (row?.authored ?? row?.declaredValue ?? "").trim().toLowerCase();
30
- if (authored && BORDER_STYLES.includes(authored))
31
- return authored;
32
- return (getStateStyleValue(el, property, "none") || "none").toLowerCase();
19
+ import { BORDER_SIDES, BORDER_STYLES, borderDeclarations, borderProperty, hasVisibleBorder, readBorderEditor, } from "./borderModel.js";
20
+ function stateStyleReader(el) {
21
+ return (property, fallback) => getStateStyleValue(el, property, fallback);
33
22
  }
34
- function borderWidthValue(el, rows, property) {
35
- const row = findTokenRow(rows, property);
36
- if (row?.structure?.width)
37
- return row.structure.width.trim();
38
- return (row?.authored
39
- || row?.declaredValue
40
- || row?.resolvedValue
41
- || getStateStyleValue(el, property, "0px")
42
- || "0px").trim();
23
+ function commitBorderIntent(target, source, intent, onAfterEdit) {
24
+ const declarations = borderDeclarations(source, intent);
25
+ if (declarations.length === 0)
26
+ return false;
27
+ setStyles(target, declarations);
28
+ onAfterEdit?.();
29
+ return true;
43
30
  }
44
- function borderColorValue(el, rows, property) {
45
- const row = findTokenRow(rows, property);
46
- if (row?.structure?.color)
47
- return row.structure.color.trim();
48
- return (row?.authored
49
- || row?.declaredValue
50
- || row?.resolvedValue
51
- || getStateStyleValue(el, property, "currentcolor")
52
- || "currentcolor").trim();
53
- }
54
- /** Effective per-side value used to decide linked vs individual UI. */
55
- function sideComponentSignature(el, rows, property) {
56
- const row = findTokenRow(rows, property);
57
- if (property.endsWith("-width")) {
58
- return `w:${borderWidthValue(el, rows, property).toLowerCase()}|t:${row?.tokenName ?? ""}`;
59
- }
60
- if (property.endsWith("-style")) {
61
- return `s:${borderStyleValue(el, rows, property)}`;
62
- }
63
- if (property.endsWith("-color")) {
64
- return `c:${borderColorValue(el, rows, property).toLowerCase()}|t:${row?.tokenName ?? ""}`;
65
- }
66
- return `${row?.authored ?? ""}|${row?.resolvedValue ?? getStateStyleValue(el, property)}`;
67
- }
68
- function sideValueForLink(el, rows, property, fallback = "") {
69
- if (property.endsWith("-width"))
70
- return borderWidthValue(el, rows, property) || fallback;
71
- if (property.endsWith("-style"))
72
- return borderStyleValue(el, rows, property) || fallback;
73
- if (property.endsWith("-color"))
74
- return borderColorValue(el, rows, property) || fallback;
75
- return fallback;
76
- }
77
- function borderLinkDeclaration(el, rows, shorthand, sideProperties) {
78
- const sharedValue = sideValueForLink(el, rows, sideProperties[0], shorthand === "border-style" ? "solid" : "");
79
- return sharedValue ? { property: shorthand, value: sharedValue } : null;
80
- }
81
- function linkedTokenRow(rows, shorthand, sideProperties) {
82
- const direct = findTokenRow(rows, shorthand);
83
- if (direct)
84
- return direct;
85
- const first = findTokenRow(rows, sideProperties[0]);
86
- return first ? { ...first, property: shorthand } : null;
87
- }
88
- /**
89
- * Sides are linked when every face shares the same effective component value.
90
- * Uses structured width/style/color parts (not the full authored shorthand string)
91
- * so four different `border-*` shorthands correctly expand the UI.
92
- */
93
- function valuesAreLinked(el, rows, shorthand, sideProperties) {
94
- const hasDirectRow = Boolean(findTokenRow(rows, shorthand));
95
- const hasSideRows = sideProperties.some((property) => Boolean(findTokenRow(rows, property)));
96
- // A lone shorthand with no per-side overrides is inherently linked.
97
- if (hasDirectRow && !hasSideRows)
98
- return true;
99
- const signatures = sideProperties.map((property) => sideComponentSignature(el, rows, property));
100
- return new Set(signatures).size === 1;
101
- }
102
- /** Initial visibility follows the effective border, including stylesheet resets. */
103
- function hasBorderPresence(el) {
104
- return SIDE_NAMES.some((side) => {
105
- const style = getStateStyleValue(el, `border-${side}-style`, "none").toLowerCase();
106
- if (INVISIBLE_BORDER_STYLES.has(style))
107
- return false;
108
- const width = getStateStyleValue(el, `border-${side}-width`, "0px");
109
- return !isZeroCssValue(width);
110
- });
111
- }
112
- /**
113
- * Linked presentation from cascade data + optional user toggle.
114
- * Divergent faces always open; equal faces start linked but can expand.
115
- * Linking divergent faces is optimistic until cascade rows catch up.
116
- */
31
+ /** User toggle is optimistic: it holds until the cascade-derived state catches up. */
117
32
  function useBorderLinkedState(dataLinked, resetKey) {
118
33
  const [userUnlinked, setUserUnlinked] = useState(false);
119
34
  const [userLinked, setUserLinked] = useState(false);
@@ -147,36 +62,25 @@ export function BorderEditor(props) {
147
62
  const editTarget = selection?.target ?? el;
148
63
  const isGroup = Boolean(selection && selection.elements.length > 1);
149
64
  const allEntries = entries ?? getNudgeUiTokenEntries();
150
- const borderWidthProperties = BORDER_SIDES.map((side) => `${side}-width`);
151
- const borderStyleProperties = BORDER_SIDES.map((side) => `${side}-style`);
152
- const borderColorProperties = BORDER_SIDES.map((side) => `${side}-color`);
153
65
  const borderBlockedBy = inlineBlockedBy(selectedElements, "border", "border-width", "border-style", "border-color");
154
- const borderWidthDataLinked = valuesAreLinked(el, tokenRows, "border-width", borderWidthProperties);
155
- const borderStyleDataLinked = valuesAreLinked(el, tokenRows, "border-style", borderStyleProperties);
156
- const borderColorDataLinked = valuesAreLinked(el, tokenRows, "border-color", borderColorProperties);
157
- const allDataLinked = !isGroup && borderWidthDataLinked && borderStyleDataLinked && borderColorDataLinked;
158
- const [borderLinked, setBorderLinked] = useBorderLinkedState(allDataLinked, el);
159
- const borderRow = findTokenRow(tokenRows, "border");
160
- const hasStructuredBorderRows = tokenRows.some((row) => Boolean(row.structure));
161
- const rawBorderFallback = !isGroup && Boolean(borderRow && !borderRow.structure && !hasStructuredBorderRows);
162
- const linkedBorderStyle = borderStyleValue(el, tokenRows, "border-style");
163
- const showWidthAndColor = !(borderLinked && INVISIBLE_BORDER_STYLES.has(linkedBorderStyle));
164
- const hasBorder = selectedElements.some(hasBorderPresence);
66
+ const source = { rows: tokenRows, computed: stateStyleReader(el) };
67
+ const border = readBorderEditor(source, { group: isGroup });
68
+ const [borderLinked, setBorderLinked] = useBorderLinkedState(border.sidesLinked, el);
69
+ const showWidthAndColor = !borderLinked || border.linkedStyleDraws;
70
+ const hasBorder = selectedElements.some((element) => hasVisibleBorder(stateStyleReader(element)));
165
71
  const visibility = useFieldVisibility(selectedElements, "border", hasBorder);
166
72
  const showBorderControls = visibility.visible;
167
73
  function handleAddBorder() {
168
74
  if (borderBlockedBy)
169
75
  return;
170
- setStyle(editTarget, "border", "1px solid");
76
+ commitBorderIntent(editTarget, source, { kind: "add" }, onAfterEdit);
171
77
  visibility.show();
172
- onAfterEdit?.();
173
78
  }
174
79
  function handleRemoveBorder() {
175
80
  if (borderBlockedBy)
176
81
  return;
177
- setStyle(editTarget, "border", "0 solid");
82
+ commitBorderIntent(editTarget, source, { kind: "remove" }, onAfterEdit);
178
83
  visibility.hide();
179
- onAfterEdit?.();
180
84
  }
181
85
  function handleExpand() {
182
86
  setBorderLinked(false);
@@ -185,23 +89,18 @@ export function BorderEditor(props) {
185
89
  if (borderBlockedBy)
186
90
  return;
187
91
  setBorderLinked(true);
188
- const declarations = [
189
- borderLinkDeclaration(el, tokenRows, "border-style", borderStyleProperties),
190
- borderLinkDeclaration(el, tokenRows, "border-width", borderWidthProperties),
191
- borderLinkDeclaration(el, tokenRows, "border-color", borderColorProperties),
192
- ].filter((declaration) => declaration !== null);
193
- if (declarations.length > 0) {
194
- setStyles(editTarget, declarations);
195
- onAfterEdit?.();
196
- }
92
+ commitBorderIntent(editTarget, source, { kind: "link-sides" }, onAfterEdit);
93
+ }
94
+ function handleSelectStyle(property, style) {
95
+ return commitBorderIntent(editTarget, source, { kind: "set-style", property, style }, onAfterEdit);
197
96
  }
198
- const sideRows = SIDE_NAMES.map((side, index) => ({
97
+ const sideRows = BORDER_SIDES.map((side) => ({
199
98
  side,
200
- color: (_jsx(ControlSurface, { children: _jsx(TokenField, { property: borderColorProperties[index], selection: selection, tokenRow: findTokenRow(tokenRows, borderColorProperties[index]), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) })),
201
- width: (_jsx(ControlSurface, { children: _jsx(TokenField, { property: borderWidthProperties[index], selection: selection, tokenRow: findTokenRow(tokenRows, borderWidthProperties[index]), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }) })),
202
- style: (_jsx(BorderStyleSettingsMenu, { property: borderStyleProperties[index], tokenRow: findTokenRow(tokenRows, borderStyleProperties[index]), domElement: el, editTarget: editTarget, selection: selection, dataTest: `border-style-${side}`, onAfterEdit: onAfterEdit })),
99
+ color: (_jsx(ControlSurface, { children: _jsx(TokenField, { property: borderProperty("color", side), selection: selection, tokenRow: findTokenRow(tokenRows, borderProperty("color", side)), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) })),
100
+ width: (_jsx(ControlSurface, { children: _jsx(TokenField, { property: borderProperty("width", side), selection: selection, tokenRow: findTokenRow(tokenRows, borderProperty("width", side)), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }) })),
101
+ style: (_jsx(BorderStyleSettingsMenu, { property: borderProperty("style", side), tokenRow: findTokenRow(tokenRows, borderProperty("style", side)), domElement: el, selection: selection, dataTest: `border-style-${side}`, onSelectStyle: handleSelectStyle })),
203
102
  }));
204
- return (_jsxs("div", { className: `editor`, "data-test": "border-editor", children: [_jsxs("div", { className: "editor__title-row", children: [_jsx("div", { className: "editor__title", children: "Border" }), showBorderControls ? (_jsx(Tooltip, { content: inlineStyleWarningContent(borderBlockedBy), children: _jsx(IconButton, { variant: "quiet", label: "Remove Border", "data-test": "remove-border", className: "border__remove", disabled: borderBlockedBy !== null, onClick: handleRemoveBorder, children: _jsx(IconMinus, { size: 16, "aria-hidden": "true" }) }) })) : (_jsx(IconButton, { variant: "quiet", label: "Add Border", "data-test": "add-border", className: "border__add", disabled: borderBlockedBy !== null, onClick: handleAddBorder, children: _jsx(IconPlus, { size: 16, "aria-hidden": "true" }) }))] }), showBorderControls && (_jsx("div", { className: "border", "data-expanded": borderLinked ? "false" : "true", children: rawBorderFallback ? (_jsx(FieldRow, { label: "Border", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border", selection: selection, tokenRow: borderRow, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) })) : borderLinked ? (_jsxs("div", { className: "border__linked-row", children: [showWidthAndColor ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "border__linked-control border__linked-control--color", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-color", selection: selection, tokenRow: linkedTokenRow(tokenRows, "border-color", borderColorProperties), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) }), _jsx("div", { className: "border__linked-control border__linked-control--width", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-width", selection: selection, tokenRow: linkedTokenRow(tokenRows, "border-width", borderWidthProperties), domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }) }) })] })) : null, _jsx(BorderStyleSettingsMenu, { property: "border-style", tokenRow: linkedTokenRow(tokenRows, "border-style", borderStyleProperties), domElement: el, editTarget: editTarget, selection: selection, onAfterEdit: onAfterEdit }), _jsx(ToggleButton, { variant: "quiet", size: "default", "data-test": "border-expand", label: "Edit Individual Border Sides", pressed: !borderLinked, onPressedChange: (pressed) => {
103
+ return (_jsxs("div", { className: `editor`, "data-test": "border-editor", children: [_jsxs("div", { className: "editor__title-row", children: [_jsx("div", { className: "editor__title", children: "Border" }), showBorderControls ? (_jsx(Tooltip, { content: inlineStyleWarningContent(borderBlockedBy), children: _jsx(IconButton, { variant: "quiet", label: "Remove Border", "data-test": "remove-border", className: "border__remove", disabled: borderBlockedBy !== null, onClick: handleRemoveBorder, children: _jsx(IconMinus, { size: 16, "aria-hidden": "true" }) }) })) : (_jsx(IconButton, { variant: "quiet", label: "Add Border", "data-test": "add-border", className: "border__add", disabled: borderBlockedBy !== null, onClick: handleAddBorder, children: _jsx(IconPlus, { size: 16, "aria-hidden": "true" }) }))] }), showBorderControls && (_jsx("div", { className: "border", "data-expanded": borderLinked ? "false" : "true", children: border.rawShorthandRow ? (_jsx(FieldRow, { label: "Border", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border", selection: selection, tokenRow: border.rawShorthandRow, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) })) : borderLinked ? (_jsxs("div", { className: "border__linked-row", children: [showWidthAndColor ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "border__linked-control border__linked-control--color", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-color", selection: selection, tokenRow: border.linkedRows.color, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) }), _jsx("div", { className: "border__linked-control border__linked-control--width", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-width", selection: selection, tokenRow: border.linkedRows.width, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit, chipVariant: "small" }) }) })] })) : null, _jsx(BorderStyleSettingsMenu, { property: "border-style", tokenRow: border.linkedRows.style, domElement: el, selection: selection, onSelectStyle: handleSelectStyle }), _jsx(ToggleButton, { variant: "quiet", size: "default", "data-test": "border-expand", label: "Edit Individual Border Sides", pressed: !borderLinked, onPressedChange: (pressed) => {
205
104
  if (pressed)
206
105
  handleExpand();
207
106
  }, children: _jsx(IconBorderSides, { size: 16, "aria-hidden": "true" }) })] })) : (_jsxs("div", { className: "border__expanded", children: [_jsxs("div", { className: "border__expanded-header", children: [_jsx("span", { className: "side-values__label", children: formatInspectorLabel("Individual Sides") }), _jsx(ToggleButton, { variant: "quiet", size: "default", "data-test": "border-collapse", label: "Link All Border Sides", pressed: !borderLinked, disabled: borderBlockedBy !== null, onPressedChange: (pressed) => {
@@ -231,7 +130,7 @@ function BorderSideIndicator({ side }) {
231
130
  const { outline, emphasis } = BORDER_SIDE_ICON_PATHS[side];
232
131
  return (_jsxs("svg", { className: "side-values__icon side-values__side-icon", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: outline, stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "square", strokeOpacity: "0.2" }), _jsx("line", { ...emphasis, stroke: "currentColor", strokeWidth: "var(--icon-stroke-width)", strokeLinecap: "round" })] }));
233
132
  }
234
- function BorderStyleSettingsMenu({ property, tokenRow, domElement: el, editTarget, selection, dataTest = "border-style-settings", onAfterEdit }) {
133
+ function BorderStyleSettingsMenu({ property, tokenRow, domElement: el, selection, dataTest = "border-style-settings", onSelectStyle }) {
235
134
  const structured = tokenRow?.structure?.style?.trim().toLowerCase() ?? "";
236
135
  const selectedValue = selection?.getProperty(property)?.value;
237
136
  const mixed = selectedValue?.kind === "mixed";
@@ -244,14 +143,10 @@ function BorderStyleSettingsMenu({ property, tokenRow, domElement: el, editTarge
244
143
  setValue(mixed ? "Mixed" : commonValue || structured || getStateStyleValue(el, property, "none") || "none");
245
144
  }, [commonValue, el, mixed, property, structured]);
246
145
  function handleChange(next) {
247
- if (blockedBy)
248
- return;
249
- if (!BORDER_STYLES.includes(next))
146
+ if (blockedBy || !onSelectStyle(property, next))
250
147
  return;
251
148
  setValue(next);
252
- setStyle(editTarget ?? el, property, next);
253
149
  setOpen(false);
254
- onAfterEdit?.();
255
150
  }
256
151
  return (_jsx(PopoverListbox, { query: "", value: null, open: open, triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: `Border style: ${formatInspectorLabel(value)}`, "data-test": dataTest, "data-current-style": value, children: _jsx(IconBorderStyle2, { size: 16, "aria-hidden": "true" }) })), triggerDataTest: dataTest, triggerAriaLabel: "Border style settings", triggerTooltip: inlineStyleWarningContent(blockedBy), disabled: blockedBy !== null, items: BORDER_STYLES.map((style) => ({
257
152
  value: style,
@@ -28,7 +28,13 @@ function cornerAuthoredSignature(rows, corner) {
28
28
  const row = findTokenRow(rows, corner);
29
29
  return `${row?.authored ?? row?.declaredValue ?? ""}|${row?.tokenName ?? ""}`;
30
30
  }
31
- function cornersAreLinked(rows) {
31
+ function cornersAreLinked(rows, selection) {
32
+ if (selection && selection.elements.length > 1) {
33
+ const values = BORDER_RADIUS_CORNERS.map((corner) => selection.getProperty(corner)?.value);
34
+ const first = values[0];
35
+ return first?.kind === "common"
36
+ && values.every((value) => value?.kind === "common" && value.value === first.value);
37
+ }
32
38
  const signatures = BORDER_RADIUS_CORNERS.map((corner) => cornerAuthoredSignature(rows, corner));
33
39
  return new Set(signatures).size === 1;
34
40
  }
@@ -50,9 +56,8 @@ export function BorderRadiusEditor(props) {
50
56
  const { element, selection, entries, tokenRows = [], onAfterEdit, embedded = false } = props;
51
57
  const el = element.domElement;
52
58
  const editTarget = selection?.target ?? el;
53
- const isGroup = Boolean(selection && selection.elements.length > 1);
54
59
  const allEntries = entries ?? getNudgeUiTokenEntries();
55
- const dataLinked = !isGroup && cornersAreLinked(tokenRows);
60
+ const dataLinked = cornersAreLinked(tokenRows, selection);
56
61
  const blockedBy = inlineBlockedBy(selection?.domElements ?? [el], "border-radius");
57
62
  const [userUnlinked, setUserUnlinked] = useState(false);
58
63
  const [userLinked, setUserLinked] = useState(false);
@@ -0,0 +1,12 @@
1
+ import type { ReactElement } from "react";
2
+ import type { EditTarget } from "../selection/editTarget.js";
3
+ import type { StyleSelection } from "../selection/styleSelection.js";
4
+ export interface FlexChildControlsProps {
5
+ domElement: HTMLElement;
6
+ editTarget?: EditTarget;
7
+ selection?: StyleSelection | null;
8
+ revision?: number;
9
+ onAfterEdit?: () => void;
10
+ }
11
+ /** How a flex item shares its parent's space; shown behind the size expander. */
12
+ export declare function FlexChildControls(props: FlexChildControlsProps): ReactElement;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { FlexChildSettingsMenu, LayoutValueField } from "./FlexControls.js";
3
+ const FLEX_GROW_PRESETS = ["0", "1", "2", "3"];
4
+ const FLEX_SHRINK_PRESETS = ["0", "1"];
5
+ const FLEX_BASIS_PRESETS = ["auto", "0", "0%", "100%", "50%", "fit-content"];
6
+ /** How a flex item shares its parent's space; shown behind the size expander. */
7
+ export function FlexChildControls(props) {
8
+ return (_jsxs("div", { className: "layout__group layout__group--bottom-rule", "data-test": "layout-flex-child", children: [_jsxs("div", { className: "layout__flex-heading", children: [_jsx("div", { className: "editor__title", children: "Flex Child" }), _jsx(FlexChildSettingsMenu, { ...props })] }), _jsxs("div", { className: "layout__flex-child-fields", children: [_jsx(LayoutValueField, { label: "Grow", property: "flex-grow", presets: FLEX_GROW_PRESETS, inputOnly: true, ...props }), _jsx(LayoutValueField, { label: "Shrink", property: "flex-shrink", presets: FLEX_SHRINK_PRESETS, inputOnly: true, ...props }), _jsx(LayoutValueField, { label: "Basis", property: "flex-basis", presets: FLEX_BASIS_PRESETS, inputOnly: true, ...props })] })] }));
9
+ }
@@ -0,0 +1,35 @@
1
+ import type { ReactElement } from "react";
2
+ import type { ResolvedProperty, TokenEntry } from "../../css/model/index.js";
3
+ import type { EditTarget } from "../selection/editTarget.js";
4
+ import type { StyleSelection } from "../selection/styleSelection.js";
5
+ export interface FlexControlProps {
6
+ domElement: HTMLElement;
7
+ editTarget?: EditTarget;
8
+ selection?: StyleSelection | null;
9
+ revision?: number;
10
+ onAfterEdit?: () => void;
11
+ }
12
+ export interface LayoutValueFieldProps extends FlexControlProps {
13
+ label: string;
14
+ property: string;
15
+ presets: string[];
16
+ inputOnly?: boolean;
17
+ }
18
+ export declare function LayoutValueField({ label, property, presets, inputOnly, domElement, editTarget, selection, revision, onAfterEdit }: LayoutValueFieldProps): ReactElement;
19
+ export declare function FlexChildSettingsMenu({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
20
+ export interface FlexGapFieldProps extends FlexControlProps {
21
+ property: "row-gap" | "column-gap";
22
+ entries: TokenEntry[];
23
+ tokenRows: ResolvedProperty[];
24
+ }
25
+ export declare function FlexGapField({ property, domElement, editTarget, selection, entries, tokenRows, onAfterEdit }: FlexGapFieldProps): ReactElement;
26
+ export declare function FlexWrapToggle({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
27
+ /**
28
+ * The main-axis gap. Spreading the items (`justify-content: space-*`) replaces the fixed gap, so
29
+ * the field reads Auto, keeps the gap as a faint value, and typing `auto` spreads between.
30
+ */
31
+ export declare function FlexMainGapField({ property, domElement, editTarget, selection, entries, tokenRows, revision, onAfterEdit }: FlexGapFieldProps & {
32
+ revision?: number;
33
+ }): ReactElement;
34
+ export declare function FlexAlignmentGrid({ domElement, editTarget, selection, revision, onAfterEdit }: FlexControlProps): ReactElement;
35
+ export declare function useComputedLayoutValue(domElement: HTMLElement, property: string, fallback: string, revision: number): [string, (value: string) => void];
@@ -0,0 +1,158 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { IconCheck, IconChevronDown, IconSettings, IconSpacingHorizontal, IconSpacingVertical, IconTextWrap } from "@tabler/icons-react";
4
+ import { LayoutDropdown } from "./LayoutDropdown.js";
5
+ import { LayoutComboField } from "./LayoutComboField.js";
6
+ import { GapField } from "./GapField.js";
7
+ import { inlineBlockedBy } from "./inlineAuthored.js";
8
+ import { setStyle, setStyles } from "../tokens/editActions.js";
9
+ import { IconButton } from "../ui/IconButton.js";
10
+ import { InspectorPopover } from "../ui/InspectorPopover.js";
11
+ import { PopoverListbox } from "../ui/PopoverListbox.js";
12
+ import { getStateStyleValue } from "../shell/stateValue.js";
13
+ import { formatInspectorLabel } from "../ui/labels.js";
14
+ import { FieldRow } from "../ui/FieldRow.js";
15
+ import { ControlSurface } from "../ui/ControlSurface.js";
16
+ import { Tooltip } from "../ui/Tooltip.js";
17
+ import { inlineStyleWarningContent } from "../ui/InlineStyleWarning.js";
18
+ const ALIGN_SELF_OPTIONS = ["auto", "stretch", "flex-start", "flex-end", "center", "baseline"];
19
+ const ORDER_PRESETS = ["-1", "0", "1", "2", "3"];
20
+ const FLEX_ALIGNMENT_OPTIONS = ["flex-start", "center", "flex-end"];
21
+ const FLEX_DISTRIBUTION_OPTIONS = ["space-between", "space-around", "space-evenly"];
22
+ export function LayoutValueField({ label, property, presets, inputOnly = false, domElement, editTarget, selection, revision = 0, onAfterEdit }) {
23
+ return (_jsx(FieldRow, { label: label, className: "layout__flex-child-field", children: _jsx(LayoutComboField, { property: property, presets: presets, domElement: domElement, editTarget: editTarget, selection: selection, inputOnly: inputOnly, revision: revision, onAfterEdit: onAfterEdit }) }));
24
+ }
25
+ export function FlexChildSettingsMenu({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
26
+ const [open, setOpen] = useState(false);
27
+ return (_jsx(InspectorPopover, { "data-test": "layout-flex-child-settings", side: "left", align: "start", triggerTooltip: "Flex child settings", triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: "Flex child settings", "data-test": "layout-flex-child-settings", children: _jsx(IconSettings, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), open: open, onOpenChange: setOpen, children: _jsxs("div", { className: "layout__flex-child-settings", "data-test": "layout-flex-child-settings-content", children: [_jsx("div", { className: "layout__flex-child-settings-title", children: "Flex Child Settings" }), _jsx(LayoutDropdown, { property: "align-self", options: ALIGN_SELF_OPTIONS, domElement: domElement, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutValueField, { label: "Order", property: "order", presets: ORDER_PRESETS, domElement: domElement, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit })] }) }));
28
+ }
29
+ export function FlexGapField({ property, domElement, editTarget, selection, entries, tokenRows, onAfterEdit }) {
30
+ const GapIcon = property === "column-gap" ? IconSpacingHorizontal : IconSpacingVertical;
31
+ return (_jsx(ControlSurface, { className: "layout__spacing-field", children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, leading: (_jsx(GapIcon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }));
32
+ }
33
+ export function FlexWrapToggle({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
34
+ const [wrap] = useComputedLayoutValue(domElement, "flex-wrap", "nowrap", revision);
35
+ const selectedWrap = selection?.getProperty("flex-wrap")?.value;
36
+ const mixed = selectedWrap?.kind === "mixed";
37
+ const sharedWrap = selectedWrap?.kind === "common" ? selectedWrap.value : wrap;
38
+ const isWrapped = !mixed && sharedWrap !== "nowrap";
39
+ const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "flex-wrap");
40
+ function toggleWrap() {
41
+ if (blockedBy)
42
+ return;
43
+ setStyle(editTarget ?? domElement, "flex-wrap", isWrapped ? "nowrap" : "wrap");
44
+ onAfterEdit?.();
45
+ }
46
+ return (_jsx(Tooltip, { content: inlineStyleWarningContent(blockedBy), children: _jsx(IconButton, { variant: "quiet", size: "default", "data-active": isWrapped, "data-test": "layout-flex-wrap-toggle", label: mixed ? "Set Flex Wrap" : isWrapped ? "Disable Flex Wrap" : "Enable Flex Wrap", "aria-pressed": mixed ? "mixed" : isWrapped, disabled: blockedBy !== null, onClick: toggleWrap, children: _jsx(IconTextWrap, { size: 16, stroke: 1.8, "aria-hidden": "true" }) }) }));
47
+ }
48
+ const DISTRIBUTION_ITEMS = [
49
+ { value: "packed", label: "Keep grouped" },
50
+ { value: "space-between", label: "Spread between" },
51
+ { value: "space-around", label: "Spread around" },
52
+ { value: "space-evenly", label: "Spread evenly" },
53
+ ];
54
+ /**
55
+ * The main-axis gap. Spreading the items (`justify-content: space-*`) replaces the fixed gap, so
56
+ * the field reads Auto, keeps the gap as a faint value, and typing `auto` spreads between.
57
+ */
58
+ export function FlexMainGapField({ property, domElement, editTarget, selection, entries, tokenRows, revision = 0, onAfterEdit }) {
59
+ const GapIcon = property === "column-gap" ? IconSpacingHorizontal : IconSpacingVertical;
60
+ const [computedJustify] = useComputedLayoutValue(domElement, "justify-content", "flex-start", revision);
61
+ const justify = normalizeFlexJustify(computedJustify);
62
+ const distributed = FLEX_DISTRIBUTION_OPTIONS.includes(justify);
63
+ const lastPlacement = useRef("flex-start");
64
+ const [open, setOpen] = useState(false);
65
+ const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "justify-content");
66
+ const target = editTarget ?? domElement;
67
+ const gapPixels = Number.parseFloat(getStateStyleValue(domElement, property));
68
+ useEffect(() => {
69
+ if (FLEX_ALIGNMENT_OPTIONS.includes(justify))
70
+ lastPlacement.current = justify;
71
+ }, [justify]);
72
+ function setJustifyContent(value) {
73
+ if (blockedBy)
74
+ return;
75
+ setStyle(target, "justify-content", value);
76
+ onAfterEdit?.();
77
+ }
78
+ function interceptRaw(value) {
79
+ if (value.trim().toLowerCase() === "auto") {
80
+ if (!distributed)
81
+ setJustifyContent("space-between");
82
+ return true;
83
+ }
84
+ // A typed gap takes the items back out of a spread; the gap value itself is written by the field,
85
+ // which still saves it when justify-content is authored inline and cannot be changed here.
86
+ if (distributed)
87
+ setJustifyContent(lastPlacement.current);
88
+ return false;
89
+ }
90
+ const chevron = (_jsx(PopoverListbox, { query: "", value: distributed ? justify : "packed", open: open, triggerElement: (_jsx(IconButton, { variant: "quiet", size: "compact", label: "Item distribution", "data-test": "layout-flex-distribution", children: _jsx(IconChevronDown, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), triggerDataTest: "layout-flex-distribution", triggerAriaLabel: "Item distribution", triggerTooltip: inlineStyleWarningContent(blockedBy), disabled: blockedBy !== null, items: DISTRIBUTION_ITEMS.map((item) => ({
91
+ ...item,
92
+ leading: (distributed ? justify : "packed") === item.value
93
+ ? _jsx(IconCheck, { size: 14, stroke: 2, "aria-hidden": "true" })
94
+ : undefined,
95
+ "data-test": `layout-flex-distribution-${item.value}`,
96
+ })), onQueryChange: () => undefined, onOpenChange: setOpen, onSelect: (next) => {
97
+ setJustifyContent(next === "packed" ? lastPlacement.current : next);
98
+ setOpen(false);
99
+ } }));
100
+ return (_jsx(ControlSurface, { className: "layout__spacing-field", children: _jsx(GapField, { property: property, domElement: domElement, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, ...(distributed ? { displayOverride: "Auto" } : {}), interceptRaw: interceptRaw, trailing: (_jsxs(_Fragment, { children: [distributed && Number.isFinite(gapPixels) ? (_jsx("span", { className: "layout__resolved", "data-test": "layout-gap-value", children: Math.round(gapPixels) })) : null, chevron] })), leading: (_jsx(GapIcon, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": `layout-spacing-icon-${property}` })), onAfterEdit: onAfterEdit }) }));
101
+ }
102
+ export function FlexAlignmentGrid({ domElement, editTarget, selection, revision = 0, onAfterEdit }) {
103
+ const [direction] = useComputedLayoutValue(domElement, "flex-direction", "row", revision);
104
+ const [computedJustify, setJustify] = useComputedLayoutValue(domElement, "justify-content", "flex-start", revision);
105
+ const [computedAlign, setAlign] = useComputedLayoutValue(domElement, "align-items", "stretch", revision);
106
+ const justify = normalizeFlexJustify(computedJustify);
107
+ const align = normalizeFlexAlign(computedAlign);
108
+ const isColumn = direction.startsWith("column");
109
+ const isReverse = direction.endsWith("-reverse");
110
+ const distributed = FLEX_DISTRIBUTION_OPTIONS.includes(justify);
111
+ const blockedBy = inlineBlockedBy(selection?.domElements ?? [domElement], "justify-content", "align-items");
112
+ // The grid shows physical positions: justify-content runs along the main axis, so column containers transpose the axes.
113
+ const rowValues = isColumn
114
+ ? isReverse ? [...FLEX_ALIGNMENT_OPTIONS].reverse() : FLEX_ALIGNMENT_OPTIONS
115
+ : FLEX_ALIGNMENT_OPTIONS;
116
+ const columnValues = !isColumn && isReverse
117
+ ? [...FLEX_ALIGNMENT_OPTIONS].reverse()
118
+ : FLEX_ALIGNMENT_OPTIONS;
119
+ function selectAlignment(nextJustify, nextAlign) {
120
+ if (blockedBy)
121
+ return;
122
+ // A grid click changing cross-axis alignment must not replace an explicit distribution choice.
123
+ const resolvedJustify = distributed ? justify : nextJustify;
124
+ setJustify(resolvedJustify);
125
+ setAlign(nextAlign);
126
+ setStyles(editTarget ?? domElement, [
127
+ { property: "justify-content", value: resolvedJustify },
128
+ { property: "align-items", value: nextAlign },
129
+ ]);
130
+ onAfterEdit?.();
131
+ }
132
+ const grid = (_jsxs("div", { className: "layout__alignment-grid", role: "group", "aria-label": "Place flex items", "data-direction": isColumn ? "column" : "row", "data-justify": justify, "data-align": align, "data-distributed": distributed, children: [distributed ? (_jsxs("span", { className: "layout__distribution-preview", "aria-hidden": "true", children: [_jsx("span", {}), _jsx("span", {}), _jsx("span", {})] })) : null, rowValues.flatMap((rowValue) => columnValues.map((columnValue) => {
133
+ const justifyValue = isColumn ? rowValue : columnValue;
134
+ const alignValue = isColumn ? columnValue : rowValue;
135
+ const active = justify === justifyValue && align === alignValue;
136
+ const label = formatInspectorLabel(`Align ${alignValue.replace("flex-", "")} And Distribute ${justifyValue.replace("flex-", "")}`);
137
+ return (_jsx(Tooltip, { children: _jsx(IconButton, { size: "default", variant: "quiet", className: "layout__alignment-button", "data-active": active, "data-test": `layout-align-${alignValue}-${justifyValue}`, label: label, "aria-pressed": active, disabled: blockedBy !== null, onClick: () => selectAlignment(justifyValue, alignValue), children: _jsx("span", {}) }) }, `${alignValue}-${justifyValue}`));
138
+ }))] }));
139
+ return _jsx(Tooltip, { content: inlineStyleWarningContent(blockedBy), disabled: blockedBy === null, children: grid });
140
+ }
141
+ function normalizeFlexJustify(value) {
142
+ // Computed `normal` behaves as `flex-start` for flex containers, so show the physical placement.
143
+ return value === "normal" ? "flex-start" : value;
144
+ }
145
+ function normalizeFlexAlign(value) {
146
+ // `normal` resolves to stretch for flex items.
147
+ return value === "normal" ? "stretch" : value;
148
+ }
149
+ export function useComputedLayoutValue(domElement, property, fallback, revision) {
150
+ const [value, setValue] = useState(() => readLayoutValue(domElement, property, fallback));
151
+ useEffect(() => {
152
+ setValue(readLayoutValue(domElement, property, fallback));
153
+ }, [domElement, property, fallback, revision]);
154
+ return [value, setValue];
155
+ }
156
+ function readLayoutValue(domElement, property, fallback) {
157
+ return getStateStyleValue(domElement, property, fallback);
158
+ }
@@ -12,7 +12,10 @@ export interface GapFieldProps {
12
12
  entries: TokenEntry[];
13
13
  tokenRows: ResolvedProperty[];
14
14
  leading?: ReactNode;
15
+ trailing?: ReactNode;
16
+ /** Replaces the shown value (and ignores the token) while another property overrides the gap, such as `Auto`. */
17
+ displayOverride?: string;
18
+ interceptRaw?: (value: string) => boolean;
15
19
  onAfterEdit?: () => void;
16
20
  }
17
- /** 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;