nudge-ui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +66 -0
  2. package/bin/nudge-ui.mjs +7 -0
  3. package/dist/LICENSE +21 -0
  4. package/dist/client.mjs +261 -0
  5. package/dist/compiler/ast.d.ts +18 -0
  6. package/dist/compiler/ast.js +75 -0
  7. package/dist/compiler/componentContractTypes.d.ts +19 -0
  8. package/dist/compiler/componentContractTypes.js +1 -0
  9. package/dist/compiler/componentContracts.d.ts +2 -0
  10. package/dist/compiler/componentContracts.js +260 -0
  11. package/dist/compiler/componentInstrumentation.d.ts +32 -0
  12. package/dist/compiler/componentInstrumentation.js +140 -0
  13. package/dist/compiler/componentPolicyResolution.d.ts +71 -0
  14. package/dist/compiler/componentPolicyResolution.js +388 -0
  15. package/dist/compiler/index.d.ts +9 -0
  16. package/dist/compiler/index.js +9 -0
  17. package/dist/compiler/packageComponentContracts.d.ts +32 -0
  18. package/dist/compiler/packageComponentContracts.js +308 -0
  19. package/dist/compiler/reactComponentProtocols.d.ts +145 -0
  20. package/dist/compiler/reactComponentProtocols.js +47 -0
  21. package/dist/compiler/reactIdentity.d.ts +15 -0
  22. package/dist/compiler/reactIdentity.js +339 -0
  23. package/dist/compiler/sourcePaths.d.ts +12 -0
  24. package/dist/compiler/sourcePaths.js +27 -0
  25. package/dist/css/dialects/index.d.ts +62 -0
  26. package/dist/css/dialects/index.js +103 -0
  27. package/dist/css/dialects/tailwind.d.ts +46 -0
  28. package/dist/css/dialects/tailwind.js +119 -0
  29. package/dist/css/dialects/vanillaExtract.d.ts +20 -0
  30. package/dist/css/dialects/vanillaExtract.js +32 -0
  31. package/dist/css/index.d.ts +10 -0
  32. package/dist/css/index.js +10 -0
  33. package/dist/css/model/index.d.ts +190 -0
  34. package/dist/css/model/index.js +10 -0
  35. package/dist/css/token-inventory/index.d.ts +26 -0
  36. package/dist/css/token-inventory/index.js +24 -0
  37. package/dist/css/token-inventory/inventory.d.ts +8 -0
  38. package/dist/css/token-inventory/inventory.js +421 -0
  39. package/dist/css/token-inventory/parseStylesheet.d.ts +16 -0
  40. package/dist/css/token-inventory/parseStylesheet.js +155 -0
  41. package/dist/css/token-inventory/policy.d.ts +47 -0
  42. package/dist/css/token-inventory/policy.js +50 -0
  43. package/dist/css/token-inventory/types.d.ts +97 -0
  44. package/dist/css/token-inventory/types.js +1 -0
  45. package/dist/css/value-semantics/borderSemantics.d.ts +28 -0
  46. package/dist/css/value-semantics/borderSemantics.js +91 -0
  47. package/dist/css/value-semantics/boxSemantics.d.ts +37 -0
  48. package/dist/css/value-semantics/boxSemantics.js +71 -0
  49. package/dist/css/value-semantics/colorSemantics.d.ts +99 -0
  50. package/dist/css/value-semantics/colorSemantics.js +526 -0
  51. package/dist/css/value-semantics/cssSyntax.d.ts +19 -0
  52. package/dist/css/value-semantics/cssSyntax.js +111 -0
  53. package/dist/css/value-semantics/fontSemantics.d.ts +35 -0
  54. package/dist/css/value-semantics/fontSemantics.js +131 -0
  55. package/dist/css/value-semantics/index.d.ts +20 -0
  56. package/dist/css/value-semantics/index.js +15 -0
  57. package/dist/css/value-semantics/propertyPolicy.d.ts +118 -0
  58. package/dist/css/value-semantics/propertyPolicy.js +356 -0
  59. package/dist/css/value-semantics/stringMaps.d.ts +2 -0
  60. package/dist/css/value-semantics/stringMaps.js +1 -0
  61. package/dist/css/value-semantics/structuredValues.d.ts +64 -0
  62. package/dist/css/value-semantics/structuredValues.js +250 -0
  63. package/dist/css/value-semantics/tokenInterpretation.d.ts +90 -0
  64. package/dist/css/value-semantics/tokenInterpretation.js +193 -0
  65. package/dist/css/virtual-design-tokens.d.ts +17 -0
  66. package/dist/hosts/astro/astroRuntimeConfig.d.ts +12 -0
  67. package/dist/hosts/astro/astroRuntimeConfig.js +26 -0
  68. package/dist/hosts/astro/clientAsset.d.ts +12 -0
  69. package/dist/hosts/astro/clientAsset.js +51 -0
  70. package/dist/hosts/astro/clientTransport.d.ts +3 -0
  71. package/dist/hosts/astro/clientTransport.js +57 -0
  72. package/dist/hosts/astro/index.d.ts +3 -0
  73. package/dist/hosts/astro/index.js +2 -0
  74. package/dist/hosts/astro/integration.d.ts +35 -0
  75. package/dist/hosts/astro/integration.js +96 -0
  76. package/dist/hosts/astro/middleware.d.ts +13 -0
  77. package/dist/hosts/astro/middleware.js +22 -0
  78. package/dist/hosts/astro/projectContext.d.ts +11 -0
  79. package/dist/hosts/astro/projectContext.js +34 -0
  80. package/dist/hosts/astro/responseInstrumentation.d.ts +41 -0
  81. package/dist/hosts/astro/responseInstrumentation.js +80 -0
  82. package/dist/hosts/next/index.d.ts +4 -0
  83. package/dist/hosts/next/index.js +7 -0
  84. package/dist/hosts/next/loader.d.ts +66 -0
  85. package/dist/hosts/next/loader.js +346 -0
  86. package/dist/hosts/next/loaders/identity-loader.cjs +228257 -0
  87. package/dist/hosts/next/loaders/loader-plugin.cjs +228257 -0
  88. package/dist/hosts/next/manifest.d.ts +38 -0
  89. package/dist/hosts/next/manifest.js +30 -0
  90. package/dist/hosts/next/mount.d.ts +12 -0
  91. package/dist/hosts/next/mount.js +23 -0
  92. package/dist/hosts/next/repositoryScope.d.ts +20 -0
  93. package/dist/hosts/next/repositoryScope.js +33 -0
  94. package/dist/hosts/next/sidecar.d.ts +27 -0
  95. package/dist/hosts/next/sidecar.js +526 -0
  96. package/dist/hosts/next/wrapper.d.ts +67 -0
  97. package/dist/hosts/next/wrapper.js +310 -0
  98. package/dist/hosts/static/cli.d.ts +12 -0
  99. package/dist/hosts/static/cli.js +77 -0
  100. package/dist/hosts/static/html/bootstrap.d.ts +27 -0
  101. package/dist/hosts/static/html/bootstrap.js +93 -0
  102. package/dist/hosts/static/index.d.ts +4 -0
  103. package/dist/hosts/static/index.js +4 -0
  104. package/dist/hosts/static/manifest.d.ts +18 -0
  105. package/dist/hosts/static/manifest.js +51 -0
  106. package/dist/hosts/static/server.d.ts +72 -0
  107. package/dist/hosts/static/server.js +554 -0
  108. package/dist/hosts/vite/index.d.ts +20 -0
  109. package/dist/hosts/vite/index.js +48 -0
  110. package/dist/hosts/vite/react.d.ts +67 -0
  111. package/dist/hosts/vite/react.js +231 -0
  112. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +28 -0
  113. package/dist/hosts/vite/tokens/activeStylesheets.js +70 -0
  114. package/dist/hosts/vite/tokens/fileMap.d.ts +2 -0
  115. package/dist/hosts/vite/tokens/fileMap.js +1 -0
  116. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +46 -0
  117. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +104 -0
  118. package/dist/hosts/vite/virtual/design-tokens.d.ts +9 -0
  119. package/dist/hosts/vite/virtual/design-tokens.js +7 -0
  120. package/dist/hosts/vite/virtual-design-tokens.d.ts +1 -0
  121. package/dist/hosts/vite/vite.d.ts +62 -0
  122. package/dist/hosts/vite/vite.js +854 -0
  123. package/dist/html/dom.d.ts +13 -0
  124. package/dist/html/dom.js +46 -0
  125. package/dist/html/identity.d.ts +40 -0
  126. package/dist/html/identity.js +196 -0
  127. package/dist/html/insertions.d.ts +26 -0
  128. package/dist/html/insertions.js +59 -0
  129. package/dist/inspector/agent/McpConnectionDialog.d.ts +26 -0
  130. package/dist/inspector/agent/McpConnectionDialog.js +135 -0
  131. package/dist/inspector/agent/client.d.ts +98 -0
  132. package/dist/inspector/agent/client.js +728 -0
  133. package/dist/inspector/agent/connectionStatus.d.ts +13 -0
  134. package/dist/inspector/agent/connectionStatus.js +35 -0
  135. package/dist/inspector/agent/httpTransport.d.ts +21 -0
  136. package/dist/inspector/agent/httpTransport.js +347 -0
  137. package/dist/inspector/agent/protocol.d.ts +95 -0
  138. package/dist/inspector/agent/protocol.js +9 -0
  139. package/dist/inspector/agent/verification.d.ts +39 -0
  140. package/dist/inspector/agent/verification.js +207 -0
  141. package/dist/inspector/canvas/CanvasCard.d.ts +10 -0
  142. package/dist/inspector/canvas/CanvasCard.js +275 -0
  143. package/dist/inspector/canvas/CanvasElementOverlay.d.ts +2 -0
  144. package/dist/inspector/canvas/CanvasElementOverlay.js +301 -0
  145. package/dist/inspector/canvas/CanvasWorkspace.d.ts +2 -0
  146. package/dist/inspector/canvas/CanvasWorkspace.js +301 -0
  147. package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +6 -0
  148. package/dist/inspector/canvas/LockedWorkspaceNotice.js +17 -0
  149. package/dist/inspector/canvas/StaleChangeIndicator.d.ts +7 -0
  150. package/dist/inspector/canvas/StaleChangeIndicator.js +43 -0
  151. package/dist/inspector/canvas/agentPresentation.d.ts +87 -0
  152. package/dist/inspector/canvas/agentPresentation.js +421 -0
  153. package/dist/inspector/canvas/canvasGestures.d.ts +12 -0
  154. package/dist/inspector/canvas/canvasGestures.js +21 -0
  155. package/dist/inspector/canvas/canvasStore.d.ts +108 -0
  156. package/dist/inspector/canvas/canvasStore.js +448 -0
  157. package/dist/inspector/canvas/frameProtocol.d.ts +231 -0
  158. package/dist/inspector/canvas/frameProtocol.js +165 -0
  159. package/dist/inspector/canvas/linkEligibility.d.ts +8 -0
  160. package/dist/inspector/canvas/linkEligibility.js +68 -0
  161. package/dist/inspector/canvas/measurementProjection.d.ts +8 -0
  162. package/dist/inspector/canvas/measurementProjection.js +16 -0
  163. package/dist/inspector/canvas/normalizeUrl.d.ts +7 -0
  164. package/dist/inspector/canvas/normalizeUrl.js +27 -0
  165. package/dist/inspector/canvas/projection.d.ts +41 -0
  166. package/dist/inspector/canvas/projection.js +232 -0
  167. package/dist/inspector/canvas/rendererBootstrap.d.ts +4 -0
  168. package/dist/inspector/canvas/rendererBootstrap.js +410 -0
  169. package/dist/inspector/canvas/rendererCidIndex.d.ts +11 -0
  170. package/dist/inspector/canvas/rendererCidIndex.js +21 -0
  171. package/dist/inspector/canvas/rendererElementSelector.d.ts +2 -0
  172. package/dist/inspector/canvas/rendererElementSelector.js +378 -0
  173. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +2 -0
  174. package/dist/inspector/canvas/rendererSelectionProxy.js +61 -0
  175. package/dist/inspector/canvas/rendererStylesheet.d.ts +16 -0
  176. package/dist/inspector/canvas/rendererStylesheet.js +221 -0
  177. package/dist/inspector/canvas/resizeHandleScale.d.ts +13 -0
  178. package/dist/inspector/canvas/resizeHandleScale.js +20 -0
  179. package/dist/inspector/canvas/roleDetection.d.ts +5 -0
  180. package/dist/inspector/canvas/roleDetection.js +21 -0
  181. package/dist/inspector/canvas/sessionStore.d.ts +71 -0
  182. package/dist/inspector/canvas/sessionStore.js +453 -0
  183. package/dist/inspector/canvas/staleChangeDetector.d.ts +11 -0
  184. package/dist/inspector/canvas/staleChangeDetector.js +217 -0
  185. package/dist/inspector/canvas/toolbarScale.d.ts +7 -0
  186. package/dist/inspector/canvas/toolbarScale.js +11 -0
  187. package/dist/inspector/canvas/workspaceLease.d.ts +26 -0
  188. package/dist/inspector/canvas/workspaceLease.js +214 -0
  189. package/dist/inspector/changes/changesLog.d.ts +46 -0
  190. package/dist/inspector/changes/changesLog.js +209 -0
  191. package/dist/inspector/changes/codecs.d.ts +98 -0
  192. package/dist/inspector/changes/codecs.js +389 -0
  193. package/dist/inspector/changes/editModel.d.ts +74 -0
  194. package/dist/inspector/changes/editModel.js +120 -0
  195. package/dist/inspector/changes/managedStyleProjection.d.ts +6 -0
  196. package/dist/inspector/changes/managedStyleProjection.js +109 -0
  197. package/dist/inspector/changes/model.d.ts +13 -0
  198. package/dist/inspector/changes/model.js +163 -0
  199. package/dist/inspector/changes/presentation.d.ts +14 -0
  200. package/dist/inspector/changes/presentation.js +81 -0
  201. package/dist/inspector/changes/previewDiagnostics.d.ts +39 -0
  202. package/dist/inspector/changes/previewDiagnostics.js +172 -0
  203. package/dist/inspector/changes/structuralTypes.d.ts +35 -0
  204. package/dist/inspector/changes/structuralTypes.js +1 -0
  205. package/dist/inspector/changes/types.d.ts +76 -0
  206. package/dist/inspector/changes/types.js +16 -0
  207. package/dist/inspector/changes/workspaceChanges.d.ts +43 -0
  208. package/dist/inspector/changes/workspaceChanges.js +239 -0
  209. package/dist/inspector/clientManifest.d.ts +24 -0
  210. package/dist/inspector/clientManifest.js +69 -0
  211. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +5 -0
  212. package/dist/inspector/componentSemantics/ComponentPropsSection.js +44 -0
  213. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +11 -0
  214. package/dist/inspector/componentSemantics/adapterRegistry.js +75 -0
  215. package/dist/inspector/componentSemantics/boundaries.d.ts +2 -0
  216. package/dist/inspector/componentSemantics/boundaries.js +10 -0
  217. package/dist/inspector/componentSemantics/changeAction.d.ts +3 -0
  218. package/dist/inspector/componentSemantics/changeAction.js +6 -0
  219. package/dist/inspector/componentSemantics/changeModel.d.ts +8 -0
  220. package/dist/inspector/componentSemantics/changeModel.js +60 -0
  221. package/dist/inspector/componentSemantics/index.d.ts +4 -0
  222. package/dist/inspector/componentSemantics/index.js +2 -0
  223. package/dist/inspector/componentSemantics/reactRuntime.d.ts +10 -0
  224. package/dist/inspector/componentSemantics/reactRuntime.js +186 -0
  225. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +25 -0
  226. package/dist/inspector/componentSemantics/runtimeBridge.js +161 -0
  227. package/dist/inspector/componentSemantics/runtimeTypes.d.ts +2 -0
  228. package/dist/inspector/componentSemantics/runtimeTypes.js +1 -0
  229. package/dist/inspector/componentSemantics/textBinding.d.ts +69 -0
  230. package/dist/inspector/componentSemantics/textBinding.js +514 -0
  231. package/dist/inspector/componentSemantics/types.d.ts +96 -0
  232. package/dist/inspector/componentSemantics/types.js +5 -0
  233. package/dist/inspector/conformance/borderCases.d.ts +7 -0
  234. package/dist/inspector/conformance/borderCases.js +428 -0
  235. package/dist/inspector/conformance/colorCases.d.ts +8 -0
  236. package/dist/inspector/conformance/colorCases.js +470 -0
  237. package/dist/inspector/conformance/fixture.d.ts +68 -0
  238. package/dist/inspector/conformance/fixture.js +153 -0
  239. package/dist/inspector/conformance/projection.d.ts +2 -0
  240. package/dist/inspector/conformance/projection.js +3 -0
  241. package/dist/inspector/conformance/spacingCases.d.ts +6 -0
  242. package/dist/inspector/conformance/spacingCases.js +417 -0
  243. package/dist/inspector/conformance/typographyCases.d.ts +7 -0
  244. package/dist/inspector/conformance/typographyCases.js +174 -0
  245. package/dist/inspector/editScope.d.ts +4 -0
  246. package/dist/inspector/editScope.js +5 -0
  247. package/dist/inspector/index.d.ts +20 -0
  248. package/dist/inspector/index.js +236 -0
  249. package/dist/inspector/inline-text/inlineTextEditor.d.ts +74 -0
  250. package/dist/inspector/inline-text/inlineTextEditor.js +1207 -0
  251. package/dist/inspector/inline-text/inlineTextLifecycle.d.ts +2 -0
  252. package/dist/inspector/inline-text/inlineTextLifecycle.js +17 -0
  253. package/dist/inspector/inline-text/textChangeBoundary.d.ts +6 -0
  254. package/dist/inspector/inline-text/textChangeBoundary.js +1 -0
  255. package/dist/inspector/inspection/bridge.d.ts +72 -0
  256. package/dist/inspector/inspection/bridge.js +134 -0
  257. package/dist/inspector/inspection/browserCssInspection.d.ts +74 -0
  258. package/dist/inspector/inspection/browserCssInspection.js +317 -0
  259. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +12 -0
  260. package/dist/inspector/inspection/browserCssInspectionRegistry.js +66 -0
  261. package/dist/inspector/inspection/selectionProperty.d.ts +32 -0
  262. package/dist/inspector/inspection/selectionProperty.js +33 -0
  263. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +20 -0
  264. package/dist/inspector/inspection/useBrowserCssInspection.js +159 -0
  265. package/dist/inspector/overlay/DropGuideOverlay.d.ts +17 -0
  266. package/dist/inspector/overlay/DropGuideOverlay.js +17 -0
  267. package/dist/inspector/overlay/InspectorOverlay.d.ts +5 -0
  268. package/dist/inspector/overlay/InspectorOverlay.js +328 -0
  269. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +19 -0
  270. package/dist/inspector/overlay/MeasurementGuideOverlay.js +40 -0
  271. package/dist/inspector/overlay/clickPolicy.d.ts +7 -0
  272. package/dist/inspector/overlay/clickPolicy.js +13 -0
  273. package/dist/inspector/overlay/dropGuide.d.ts +22 -0
  274. package/dist/inspector/overlay/dropGuide.js +48 -0
  275. package/dist/inspector/overlay/elementSelector.d.ts +1 -0
  276. package/dist/inspector/overlay/elementSelector.js +100 -0
  277. package/dist/inspector/overlay/frameThrottle.d.ts +10 -0
  278. package/dist/inspector/overlay/frameThrottle.js +38 -0
  279. package/dist/inspector/overlay/interactionStyles.d.ts +3 -0
  280. package/dist/inspector/overlay/interactionStyles.js +70 -0
  281. package/dist/inspector/overlay/measurementGeometry.d.ts +25 -0
  282. package/dist/inspector/overlay/measurementGeometry.js +104 -0
  283. package/dist/inspector/overlay/overlayGeometry.d.ts +40 -0
  284. package/dist/inspector/overlay/overlayGeometry.js +59 -0
  285. package/dist/inspector/overlay/selectedGeometry.d.ts +7 -0
  286. package/dist/inspector/overlay/selectedGeometry.js +51 -0
  287. package/dist/inspector/overlay/structuralGestures.d.ts +28 -0
  288. package/dist/inspector/overlay/structuralGestures.js +180 -0
  289. package/dist/inspector/projection/cssEscapes.d.ts +3 -0
  290. package/dist/inspector/projection/cssEscapes.js +20 -0
  291. package/dist/inspector/projection/managedStylesheet.d.ts +33 -0
  292. package/dist/inspector/projection/managedStylesheet.js +240 -0
  293. package/dist/inspector/projection/renderedInstance.d.ts +56 -0
  294. package/dist/inspector/projection/renderedInstance.js +306 -0
  295. package/dist/inspector/projection/structuralProjection.d.ts +93 -0
  296. package/dist/inspector/projection/structuralProjection.js +560 -0
  297. package/dist/inspector/projection/structuralProjectionBoundary.d.ts +5 -0
  298. package/dist/inspector/projection/structuralProjectionBoundary.js +65 -0
  299. package/dist/inspector/projection/textProjection.d.ts +53 -0
  300. package/dist/inspector/projection/textProjection.js +705 -0
  301. package/dist/inspector/projection/workspaceProjection.d.ts +43 -0
  302. package/dist/inspector/projection/workspaceProjection.js +58 -0
  303. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +15 -0
  304. package/dist/inspector/prompt/PromptSettingsDialog.js +17 -0
  305. package/dist/inspector/prompt/clipboardHandoff.d.ts +34 -0
  306. package/dist/inspector/prompt/clipboardHandoff.js +212 -0
  307. package/dist/inspector/prompt/copyToClipboard.d.ts +1 -0
  308. package/dist/inspector/prompt/copyToClipboard.js +34 -0
  309. package/dist/inspector/prompt/detectFramework.d.ts +6 -0
  310. package/dist/inspector/prompt/detectFramework.js +4 -0
  311. package/dist/inspector/prompt/generatePrompt.d.ts +7 -0
  312. package/dist/inspector/prompt/generatePrompt.js +391 -0
  313. package/dist/inspector/prompt/promptSettings.d.ts +8 -0
  314. package/dist/inspector/prompt/promptSettings.js +28 -0
  315. package/dist/inspector/runtime/devFlag.d.ts +28 -0
  316. package/dist/inspector/runtime/devFlag.js +50 -0
  317. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +19 -0
  318. package/dist/inspector/runtime/documentStylesheetOrder.js +89 -0
  319. package/dist/inspector/runtime/domRealm.d.ts +4 -0
  320. package/dist/inspector/runtime/domRealm.js +11 -0
  321. package/dist/inspector/runtime/runtimeConfig.d.ts +119 -0
  322. package/dist/inspector/runtime/runtimeConfig.js +276 -0
  323. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +32 -0
  324. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +149 -0
  325. package/dist/inspector/runtime/useRuntimeConfig.d.ts +10 -0
  326. package/dist/inspector/runtime/useRuntimeConfig.js +13 -0
  327. package/dist/inspector/selection/editScope.d.ts +32 -0
  328. package/dist/inspector/selection/editScope.js +140 -0
  329. package/dist/inspector/selection/editTarget.d.ts +8 -0
  330. package/dist/inspector/selection/editTarget.js +11 -0
  331. package/dist/inspector/selection/hierarchy.d.ts +7 -0
  332. package/dist/inspector/selection/hierarchy.js +42 -0
  333. package/dist/inspector/selection/resolveSelection.d.ts +10 -0
  334. package/dist/inspector/selection/resolveSelection.js +60 -0
  335. package/dist/inspector/selection/selectionStore.d.ts +41 -0
  336. package/dist/inspector/selection/selectionStore.js +262 -0
  337. package/dist/inspector/selection/selectionTarget.d.ts +5 -0
  338. package/dist/inspector/selection/selectionTarget.js +50 -0
  339. package/dist/inspector/selection/sourceSite.d.ts +2 -0
  340. package/dist/inspector/selection/sourceSite.js +12 -0
  341. package/dist/inspector/selection/styleSelection.d.ts +22 -0
  342. package/dist/inspector/selection/styleSelection.js +104 -0
  343. package/dist/inspector/session/index.d.ts +3 -0
  344. package/dist/inspector/session/index.js +2 -0
  345. package/dist/inspector/session/lifecycle.d.ts +22 -0
  346. package/dist/inspector/session/lifecycle.js +63 -0
  347. package/dist/inspector/session/sessionContext.d.ts +21 -0
  348. package/dist/inspector/session/sessionContext.js +28 -0
  349. package/dist/inspector/session/sessionFactory.d.ts +29 -0
  350. package/dist/inspector/session/sessionFactory.js +73 -0
  351. package/dist/inspector/settings/SettingsDialog.d.ts +12 -0
  352. package/dist/inspector/settings/SettingsDialog.js +46 -0
  353. package/dist/inspector/shell/AppShell.d.ts +2 -0
  354. package/dist/inspector/shell/AppShell.js +9 -0
  355. package/dist/inspector/shell/ChangesLog.d.ts +6 -0
  356. package/dist/inspector/shell/ChangesLog.js +92 -0
  357. package/dist/inspector/shell/CopyPromptButton.d.ts +9 -0
  358. package/dist/inspector/shell/CopyPromptButton.js +159 -0
  359. package/dist/inspector/shell/DomNavigation.d.ts +8 -0
  360. package/dist/inspector/shell/DomNavigation.js +30 -0
  361. package/dist/inspector/shell/EmptyState.d.ts +2 -0
  362. package/dist/inspector/shell/EmptyState.js +15 -0
  363. package/dist/inspector/shell/InspectorShell.d.ts +11 -0
  364. package/dist/inspector/shell/InspectorShell.js +268 -0
  365. package/dist/inspector/shell/openStore.d.ts +6 -0
  366. package/dist/inspector/shell/openStore.js +29 -0
  367. package/dist/inspector/shell/panelLayout.d.ts +2 -0
  368. package/dist/inspector/shell/panelLayout.js +29 -0
  369. package/dist/inspector/shell/shortcuts.d.ts +3 -0
  370. package/dist/inspector/shell/shortcuts.js +25 -0
  371. package/dist/inspector/shell/stateValue.d.ts +3 -0
  372. package/dist/inspector/shell/stateValue.js +34 -0
  373. package/dist/inspector/shell/styleState.d.ts +7 -0
  374. package/dist/inspector/shell/styleState.js +13 -0
  375. package/dist/inspector/spacing/projection.d.ts +43 -0
  376. package/dist/inspector/spacing/projection.js +136 -0
  377. package/dist/inspector/styleEditors/AppearanceSection.d.ts +13 -0
  378. package/dist/inspector/styleEditors/AppearanceSection.js +6 -0
  379. package/dist/inspector/styleEditors/AspectRatioField.d.ts +17 -0
  380. package/dist/inspector/styleEditors/AspectRatioField.js +10 -0
  381. package/dist/inspector/styleEditors/BorderEditor.d.ts +13 -0
  382. package/dist/inspector/styleEditors/BorderEditor.js +295 -0
  383. package/dist/inspector/styleEditors/BorderRadiusEditor.d.ts +14 -0
  384. package/dist/inspector/styleEditors/BorderRadiusEditor.js +108 -0
  385. package/dist/inspector/styleEditors/BoxShadowEditor.d.ts +13 -0
  386. package/dist/inspector/styleEditors/BoxShadowEditor.js +13 -0
  387. package/dist/inspector/styleEditors/ColorPicker.d.ts +15 -0
  388. package/dist/inspector/styleEditors/ColorPicker.js +73 -0
  389. package/dist/inspector/styleEditors/GapField.d.ts +17 -0
  390. package/dist/inspector/styleEditors/GapField.js +12 -0
  391. package/dist/inspector/styleEditors/GridChildSection.d.ts +14 -0
  392. package/dist/inspector/styleEditors/GridChildSection.js +91 -0
  393. package/dist/inspector/styleEditors/GridPicker.d.ts +13 -0
  394. package/dist/inspector/styleEditors/GridPicker.js +179 -0
  395. package/dist/inspector/styleEditors/GridSection.d.ts +17 -0
  396. package/dist/inspector/styleEditors/GridSection.js +27 -0
  397. package/dist/inspector/styleEditors/GridValueField.d.ts +17 -0
  398. package/dist/inspector/styleEditors/GridValueField.js +70 -0
  399. package/dist/inspector/styleEditors/InsetSection.d.ts +15 -0
  400. package/dist/inspector/styleEditors/InsetSection.js +15 -0
  401. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +6 -0
  402. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +6 -0
  403. package/dist/inspector/styleEditors/LayoutComboField.d.ts +18 -0
  404. package/dist/inspector/styleEditors/LayoutComboField.js +138 -0
  405. package/dist/inspector/styleEditors/LayoutDropdown.d.ts +14 -0
  406. package/dist/inspector/styleEditors/LayoutDropdown.js +34 -0
  407. package/dist/inspector/styleEditors/LayoutSection.d.ts +13 -0
  408. package/dist/inspector/styleEditors/LayoutSection.js +342 -0
  409. package/dist/inspector/styleEditors/OpacityEditor.d.ts +13 -0
  410. package/dist/inspector/styleEditors/OpacityEditor.js +34 -0
  411. package/dist/inspector/styleEditors/PositionInsets.d.ts +15 -0
  412. package/dist/inspector/styleEditors/PositionInsets.js +12 -0
  413. package/dist/inspector/styleEditors/SpacingBox.d.ts +29 -0
  414. package/dist/inspector/styleEditors/SpacingBox.js +189 -0
  415. package/dist/inspector/styleEditors/Typography.d.ts +13 -0
  416. package/dist/inspector/styleEditors/Typography.js +137 -0
  417. package/dist/inspector/styleEditors/completeCssValue.d.ts +8 -0
  418. package/dist/inspector/styleEditors/completeCssValue.js +34 -0
  419. package/dist/inspector/styleEditors/gridChildModel.d.ts +74 -0
  420. package/dist/inspector/styleEditors/gridChildModel.js +138 -0
  421. package/dist/inspector/styleEditors/layoutValue.d.ts +24 -0
  422. package/dist/inspector/styleEditors/layoutValue.js +103 -0
  423. package/dist/inspector/styleEditors/nudgeValue.d.ts +8 -0
  424. package/dist/inspector/styleEditors/nudgeValue.js +71 -0
  425. package/dist/inspector/styleEditors/rowLookup.d.ts +11 -0
  426. package/dist/inspector/styleEditors/rowLookup.js +13 -0
  427. package/dist/inspector/styleEditors/stringRecord.d.ts +4 -0
  428. package/dist/inspector/styleEditors/stringRecord.js +1 -0
  429. package/dist/inspector/styleEditors/valuePolicy.d.ts +20 -0
  430. package/dist/inspector/styleEditors/valuePolicy.js +82 -0
  431. package/dist/inspector/testing.d.ts +10 -0
  432. package/dist/inspector/testing.js +9 -0
  433. package/dist/inspector/tokens/TokenChip.d.ts +24 -0
  434. package/dist/inspector/tokens/TokenChip.js +23 -0
  435. package/dist/inspector/tokens/TokenDropdown.d.ts +13 -0
  436. package/dist/inspector/tokens/TokenDropdown.js +59 -0
  437. package/dist/inspector/tokens/TokenField.d.ts +68 -0
  438. package/dist/inspector/tokens/TokenField.js +485 -0
  439. package/dist/inspector/tokens/TokenLabel.d.ts +7 -0
  440. package/dist/inspector/tokens/TokenLabel.js +23 -0
  441. package/dist/inspector/tokens/TokensPanel.d.ts +5 -0
  442. package/dist/inspector/tokens/TokensPanel.js +47 -0
  443. package/dist/inspector/tokens/catalog.d.ts +51 -0
  444. package/dist/inspector/tokens/catalog.js +184 -0
  445. package/dist/inspector/tokens/editActions.d.ts +35 -0
  446. package/dist/inspector/tokens/editActions.js +164 -0
  447. package/dist/inspector/tokens/resolution/cascade.d.ts +14 -0
  448. package/dist/inspector/tokens/resolution/cascade.js +31 -0
  449. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +43 -0
  450. package/dist/inspector/tokens/resolution/cssomCollector.js +528 -0
  451. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +12 -0
  452. package/dist/inspector/tokens/resolution/selectorSemantics.js +106 -0
  453. package/dist/inspector/tokens/resolution.d.ts +56 -0
  454. package/dist/inspector/tokens/resolution.js +1401 -0
  455. package/dist/inspector/tokens/tokenEdits.d.ts +3 -0
  456. package/dist/inspector/tokens/tokenEdits.js +22 -0
  457. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +6 -0
  458. package/dist/inspector/tokens/valueSemanticsAdapter.js +68 -0
  459. package/dist/inspector/ui/AtRuleContext.d.ts +18 -0
  460. package/dist/inspector/ui/AtRuleContext.js +54 -0
  461. package/dist/inspector/ui/Button.d.ts +9 -0
  462. package/dist/inspector/ui/Button.js +4 -0
  463. package/dist/inspector/ui/ColorSwatch.d.ts +7 -0
  464. package/dist/inspector/ui/ColorSwatch.js +6 -0
  465. package/dist/inspector/ui/ControlSurface.d.ts +14 -0
  466. package/dist/inspector/ui/ControlSurface.js +10 -0
  467. package/dist/inspector/ui/FieldRow.d.ts +14 -0
  468. package/dist/inspector/ui/FieldRow.js +15 -0
  469. package/dist/inspector/ui/IconButton.d.ts +14 -0
  470. package/dist/inspector/ui/IconButton.js +5 -0
  471. package/dist/inspector/ui/InspectorPopover.d.ts +17 -0
  472. package/dist/inspector/ui/InspectorPopover.js +13 -0
  473. package/dist/inspector/ui/PopoverListbox.d.ts +37 -0
  474. package/dist/inspector/ui/PopoverListbox.js +21 -0
  475. package/dist/inspector/ui/SegmentedControl.d.ts +24 -0
  476. package/dist/inspector/ui/SegmentedControl.js +16 -0
  477. package/dist/inspector/ui/Select.d.ts +25 -0
  478. package/dist/inspector/ui/Select.js +56 -0
  479. package/dist/inspector/ui/SideValuesField.d.ts +44 -0
  480. package/dist/inspector/ui/SideValuesField.js +76 -0
  481. package/dist/inspector/ui/StatusCallout.d.ts +9 -0
  482. package/dist/inspector/ui/StatusCallout.js +4 -0
  483. package/dist/inspector/ui/TextInput.d.ts +12 -0
  484. package/dist/inspector/ui/TextInput.js +5 -0
  485. package/dist/inspector/ui/ToggleButton.d.ts +11 -0
  486. package/dist/inspector/ui/ToggleButton.js +6 -0
  487. package/dist/inspector/ui/assets/grid.svg +14 -0
  488. package/dist/inspector/ui/css.d.ts +9 -0
  489. package/dist/inspector/ui/labels.d.ts +1 -0
  490. package/dist/inspector/ui/labels.js +7 -0
  491. package/dist/inspector/ui/styles.d.ts +1 -0
  492. package/dist/inspector/ui/styles.js +68 -0
  493. package/dist/inspector/virtual-modules.d.ts +7 -0
  494. package/dist/inspector/vite-env.d.ts +10 -0
  495. package/dist/internal/agent-protocol.d.ts +232 -0
  496. package/dist/internal/agent-protocol.js +237 -0
  497. package/dist/nudge-ui.mjs +15722 -0
  498. package/dist/project/files.d.ts +19 -0
  499. package/dist/project/files.js +226 -0
  500. package/dist/project/identity.d.ts +6 -0
  501. package/dist/project/identity.js +19 -0
  502. package/dist/project/pathPolicy.d.ts +8 -0
  503. package/dist/project/pathPolicy.js +12 -0
  504. package/dist/project/tokens.d.ts +36 -0
  505. package/dist/project/tokens.js +223 -0
  506. package/dist/transport/index.d.ts +8 -0
  507. package/dist/transport/index.js +8 -0
  508. package/dist/transport/routes.d.ts +13 -0
  509. package/dist/transport/routes.js +16 -0
  510. package/package.json +137 -0
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { IconBorderCorners, IconRadiusBottomLeft, IconRadiusBottomRight, IconRadiusTopLeft, IconRadiusTopRight, } from "@tabler/icons-react";
4
+ import { ToggleButton } from "../ui/ToggleButton.js";
5
+ import { findTokenRow, metadataFor } from "./rowLookup.js";
6
+ import { TokenField } from "../tokens/TokenField.js";
7
+ import { setStyle } from "../tokens/editActions.js";
8
+ import { SideControls, SIDE_NAMES } from "../ui/SideValuesField.js";
9
+ import { ControlSurface } from "../ui/ControlSurface.js";
10
+ import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
11
+ import { completeCssValue } from "./completeCssValue.js";
12
+ import { valuePolicyFor } from "./valuePolicy.js";
13
+ const BORDER_RADIUS_CORNERS = [
14
+ "border-top-left-radius",
15
+ "border-top-right-radius",
16
+ "border-bottom-right-radius",
17
+ "border-bottom-left-radius",
18
+ ];
19
+ const BORDER_RADIUS_ICONS = [
20
+ IconRadiusTopLeft,
21
+ IconRadiusTopRight,
22
+ IconRadiusBottomRight,
23
+ IconRadiusBottomLeft,
24
+ ];
25
+ const BORDER_RADIUS_LABELS = ["Top Left", "Top Right", "Bottom Right", "Bottom Left"];
26
+ function cornerAuthoredSignature(rows, corner) {
27
+ const row = findTokenRow(rows, corner);
28
+ return `${row?.authored ?? row?.declaredValue ?? ""}|${row?.tokenName ?? ""}`;
29
+ }
30
+ function cornersAreLinked(rows) {
31
+ const signatures = BORDER_RADIUS_CORNERS.map((corner) => cornerAuthoredSignature(rows, corner));
32
+ return new Set(signatures).size === 1;
33
+ }
34
+ function linkAllCorners(target, rows, selection, onAfterEdit) {
35
+ const firstRow = findTokenRow(rows, BORDER_RADIUS_CORNERS[0]);
36
+ const selectedValue = selection && selection.elements.length > 1
37
+ ? selection.getProperty(BORDER_RADIUS_CORNERS[0])?.value
38
+ : null;
39
+ const sharedValue = (selectedValue?.kind === "common" ? selectedValue.value : undefined)
40
+ ?? firstRow?.authored
41
+ ?? firstRow?.declaredValue
42
+ ?? "";
43
+ if (!sharedValue)
44
+ return;
45
+ setStyle(target, "border-radius", sharedValue);
46
+ onAfterEdit?.();
47
+ }
48
+ export function BorderRadiusEditor(props) {
49
+ const { element, selection, entries, tokenRows = [], onAfterEdit, embedded = false } = props;
50
+ const el = element.domElement;
51
+ const editTarget = selection?.target ?? el;
52
+ const isGroup = Boolean(selection && selection.elements.length > 1);
53
+ const allEntries = entries ?? getNudgeUiTokenEntries();
54
+ const dataLinked = !isGroup && cornersAreLinked(tokenRows);
55
+ const [userUnlinked, setUserUnlinked] = useState(false);
56
+ const [userLinked, setUserLinked] = useState(false);
57
+ useEffect(() => {
58
+ setUserUnlinked(false);
59
+ setUserLinked(false);
60
+ }, [el]);
61
+ useEffect(() => {
62
+ if (dataLinked)
63
+ setUserLinked(false);
64
+ else
65
+ setUserUnlinked(false);
66
+ }, [dataLinked]);
67
+ const isLinked = dataLinked ? !userUnlinked : userLinked;
68
+ function handleExpand() {
69
+ setUserUnlinked(true);
70
+ setUserLinked(false);
71
+ }
72
+ function handleCollapse() {
73
+ setUserLinked(true);
74
+ setUserUnlinked(false);
75
+ linkAllCorners(editTarget, tokenRows, selection, onAfterEdit);
76
+ }
77
+ const cornerSides = BORDER_RADIUS_CORNERS.map((corner, index) => ({
78
+ side: SIDE_NAMES[index],
79
+ sideLabel: BORDER_RADIUS_LABELS[index],
80
+ icon: (() => {
81
+ const Icon = BORDER_RADIUS_ICONS[index];
82
+ return _jsx(Icon, { className: "side-values__icon side-values__side-icon", size: 16, "aria-hidden": "true" });
83
+ })(),
84
+ control: (_jsx(TokenField, { property: corner, selection: selection, tokenRow: findTokenRow(tokenRows, corner), domElement: el, editTarget: editTarget, entries: allEntries, editMetadata: metadataFor(findTokenRow(tokenRows, corner)), onAfterEdit: onAfterEdit, chipVariant: "small" })),
85
+ }));
86
+ const linkedTokenRow = () => {
87
+ const first = findTokenRow(tokenRows, BORDER_RADIUS_CORNERS[0]);
88
+ if (!first)
89
+ return null;
90
+ return { ...first, property: "border-radius" };
91
+ };
92
+ const borderRadiusRow = findTokenRow(tokenRows, "border-radius") ?? linkedTokenRow();
93
+ const mixed = !dataLinked;
94
+ const groupedControl = (_jsx(ControlSurface, { children: _jsx(TokenField, { property: "border-radius", selection: selection, tokenRow: mixed ? null : borderRadiusRow, initialValue: mixed ? "Mix" : undefined, displayValue: mixed ? "Mix" : undefined, domElement: el, editTarget: editTarget, entries: allEntries, editMetadata: metadataFor(borderRadiusRow), mixed: mixed, formatRawValue: (value) => mixed && value.trim().toLowerCase() === "mix"
95
+ ? ""
96
+ : completeCssValue(value.trim(), valuePolicyFor("border-radius")), onAfterEdit: onAfterEdit, chipVariant: "small" }) }));
97
+ const toggleButton = (_jsx(ToggleButton, { className: embedded ? "border-radius-editor__toggle" : undefined, variant: "quiet", size: "default", "data-test": isLinked ? "border-radius-expand" : "border-radius-collapse", label: isLinked ? "Edit Individual Corners" : "Link All Corners", title: isLinked ? "Edit Individual Corners" : "Link All Corners", pressed: !isLinked, onPressedChange: (pressed) => {
98
+ if (pressed)
99
+ handleExpand();
100
+ else
101
+ handleCollapse();
102
+ }, children: _jsx(IconBorderCorners, { size: "var(--icon-size-small)", "aria-hidden": "true" }) }));
103
+ const individuals = !isLinked ? (_jsx("div", { className: "border-radius-editor__individuals", children: _jsx(SideControls, { label: "Border Radius Corners", layout: "corners", sides: cornerSides }) })) : null;
104
+ if (embedded) {
105
+ return (_jsxs("div", { className: "border-radius-editor border-radius-editor--embedded", "data-test": "border-radius-editor", "data-expanded": !isLinked ? "true" : "false", children: [_jsxs("div", { className: "border-radius-editor__main", children: [_jsx("div", { className: "appearance__field-header", children: _jsx("div", { className: "appearance__field-label", children: "Corner Radius" }) }), groupedControl] }), toggleButton, individuals] }));
106
+ }
107
+ return (_jsxs("div", { className: "editor border-radius-editor", "data-test": "border-radius-editor", "data-expanded": !isLinked ? "true" : "false", children: [_jsxs("div", { className: "border-radius-editor__main", children: [_jsx("div", { className: "editor__title-row", children: _jsx("div", { className: "editor__title", children: "Border Radius" }) }), _jsxs("div", { className: "border-radius__grouped-row", children: [groupedControl, toggleButton] })] }), individuals] }));
108
+ }
@@ -0,0 +1,13 @@
1
+ import type { ReactElement } from "react";
2
+ import type { TokenEntry } from "../../css/model/index.js";
3
+ import type { ResolvedProperty } from "../../css/model/index.js";
4
+ import type { SelectedElement } from "../selection/selectionStore.js";
5
+ import type { StyleSelection } from "../selection/styleSelection.js";
6
+ export interface BoxShadowEditorProps {
7
+ element: SelectedElement;
8
+ selection?: StyleSelection | null;
9
+ entries?: TokenEntry[];
10
+ tokenRows?: ResolvedProperty[];
11
+ onAfterEdit?: () => void;
12
+ }
13
+ export declare function BoxShadowEditor(props: BoxShadowEditorProps): ReactElement;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { TokenField } from "../tokens/TokenField.js";
3
+ import { FieldRow } from "../ui/FieldRow.js";
4
+ import { ControlSurface } from "../ui/ControlSurface.js";
5
+ import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
6
+ export function BoxShadowEditor(props) {
7
+ const { element, selection, entries, tokenRows = [], onAfterEdit } = props;
8
+ const el = element.domElement;
9
+ const editTarget = selection?.target ?? el;
10
+ const allEntries = entries ?? getNudgeUiTokenEntries();
11
+ const tokenRow = tokenRows.find((row) => row.property === "box-shadow") ?? null;
12
+ return (_jsxs("div", { className: "editor", "data-test": "box-shadow-editor", children: [_jsx("div", { className: "editor__title", children: "Box Shadow" }), _jsx("div", { className: "property", children: _jsx(FieldRow, { label: "Box Shadow", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: "box-shadow", selection: selection, tokenRow: tokenRow, domElement: el, editTarget: editTarget, entries: allEntries, onAfterEdit: onAfterEdit }) }) }) })] }));
13
+ }
@@ -0,0 +1,15 @@
1
+ import type { ReactElement } from "react";
2
+ import type { TokenEntry } from "../../css/model/index.js";
3
+ import type { SelectedElement } from "../selection/selectionStore.js";
4
+ import type { ResolvedProperty } from "../../css/model/index.js";
5
+ import type { StyleSelection } from "../selection/styleSelection.js";
6
+ export interface ColorPickerProps {
7
+ element: SelectedElement;
8
+ selection?: StyleSelection | null;
9
+ property?: string;
10
+ entries?: TokenEntry[];
11
+ tokenRow?: ResolvedProperty | null;
12
+ onAfterEdit?: () => void;
13
+ }
14
+ export declare function isEmptyColorValue(value: string): boolean;
15
+ export declare function ColorPicker(props: ColorPickerProps): ReactElement;
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { IconMinus, IconPlus } from "@tabler/icons-react";
4
+ import { getStateStyleValue } from "../shell/stateValue.js";
5
+ import { TokenField } from "../tokens/TokenField.js";
6
+ import { formatInspectorLabel } from "../ui/labels.js";
7
+ import { IconButton } from "../ui/IconButton.js";
8
+ import { ControlSurface } from "../ui/ControlSurface.js";
9
+ import { setStyle } from "../tokens/editActions.js";
10
+ import { getNudgeUiTokenEntries } from "../runtime/runtimeConfig.js";
11
+ function colorSectionTitle(property) {
12
+ if (property === "background-color")
13
+ return "Background Color";
14
+ if (property === "color")
15
+ return "Color";
16
+ return formatInspectorLabel(property);
17
+ }
18
+ function isZeroColorComponent(value) {
19
+ return /^0(?:\.0+)?%?$/.test(value.trim());
20
+ }
21
+ export function isEmptyColorValue(value) {
22
+ const normalized = value.trim().toLowerCase();
23
+ if (!normalized || normalized === "none" || normalized === "transparent")
24
+ return true;
25
+ if (/^#(?:0000|00000000)$/.test(normalized))
26
+ return true;
27
+ const match = normalized.match(/^rgba?\((.*)\)$/);
28
+ if (!match)
29
+ return false;
30
+ const components = match[1].split(/[\s,/]+/).filter(Boolean);
31
+ return components.length === 4
32
+ && components.slice(0, 3).every(isZeroColorComponent)
33
+ && isZeroColorComponent(components[3]);
34
+ }
35
+ export function ColorPicker(props) {
36
+ const { element, selection, property = "color", entries, tokenRow, onAfterEdit } = props;
37
+ const el = element.domElement;
38
+ const selectedElements = useMemo(() => selection?.elements ?? [element], [element, selection]);
39
+ const target = selection?.target ?? el;
40
+ const allEntries = entries ?? getNudgeUiTokenEntries();
41
+ const declaredValue = tokenRow?.declaredValue?.trim() ?? "";
42
+ const paintedValue = getStateStyleValue(el, property);
43
+ const resolvedValue = tokenRow?.resolvedValue ?? paintedValue;
44
+ // An explicit declaration remains meaningful even when it paints as empty
45
+ // for text color (for example `transparent` or `var(--missing, transparent)`).
46
+ // A transparent background, however, is the empty state represented by the
47
+ // remove action and should not remain visible as an authored value.
48
+ const emptyValues = selectedElements.map((selected) => getStateStyleValue(selected.domElement, property));
49
+ const isEmpty = selectedElements.length > 1
50
+ ? emptyValues.every((value) => isEmptyColorValue(value))
51
+ : property === "background-color"
52
+ ? isEmptyColorValue(declaredValue) || isEmptyColorValue(resolvedValue) || isEmptyColorValue(paintedValue)
53
+ : declaredValue.length === 0 && isEmptyColorValue(resolvedValue);
54
+ const [fieldAdded, setFieldAdded] = useState(false);
55
+ const [backgroundRemoved, setBackgroundRemoved] = useState(false);
56
+ useEffect(() => {
57
+ setFieldAdded(false);
58
+ setBackgroundRemoved(false);
59
+ }, [el, property, selectedElements]);
60
+ function handleAfterEdit() {
61
+ setFieldAdded(false);
62
+ setBackgroundRemoved(false);
63
+ onAfterEdit?.();
64
+ }
65
+ const showTokenField = (!isEmpty && !backgroundRemoved) || fieldAdded;
66
+ function handleRemoveColor() {
67
+ setStyle(target, property, "transparent");
68
+ setFieldAdded(false);
69
+ setBackgroundRemoved(property === "background-color");
70
+ onAfterEdit?.();
71
+ }
72
+ return (_jsxs("div", { className: `editor`, "data-test": "color-picker", "data-property": property, children: [_jsxs("div", { className: "editor__title-row", children: [_jsx("div", { className: "editor__title", children: colorSectionTitle(property) }), showTokenField ? (_jsx(IconButton, { variant: "quiet", label: `Remove ${colorSectionTitle(property)}`, "data-test": "remove-color", className: "color__remove", onClick: handleRemoveColor, children: _jsx(IconMinus, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) })) : (_jsx(IconButton, { variant: "quiet", label: `Add ${colorSectionTitle(property)}`, "data-test": "add-color", className: "color__add", onClick: () => setFieldAdded(true), children: _jsx(IconPlus, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) }))] }), showTokenField && (_jsx("div", { className: "color", children: _jsx(ControlSurface, { children: _jsx(TokenField, { property: property, tokenRow: isEmpty ? null : tokenRow, selection: selection, initialValue: isEmpty ? "" : undefined, domElement: el, editTarget: target, entries: allEntries, onAfterEdit: handleAfterEdit }) }) }))] }));
73
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactElement } from "react";
2
+ import type { TokenEntry } from "../../css/model/index.js";
3
+ import type { ResolvedProperty } from "../../css/model/index.js";
4
+ import type { EditTarget } from "../selection/editTarget.js";
5
+ import type { StyleSelection } from "../selection/styleSelection.js";
6
+ export declare const GAP_PRESETS: string[];
7
+ export interface GapFieldProps {
8
+ property: "row-gap" | "column-gap";
9
+ domElement: HTMLElement;
10
+ editTarget?: EditTarget;
11
+ selection?: StyleSelection | null;
12
+ entries: TokenEntry[];
13
+ tokenRows: ResolvedProperty[];
14
+ onAfterEdit?: () => void;
15
+ }
16
+ /** Renders a gap value with a token chip or the legacy raw-value fallback. */
17
+ export declare function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, onAfterEdit, }: GapFieldProps): ReactElement;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { TokenField } from "../tokens/TokenField.js";
3
+ import { formatInspectorLabel } from "../ui/labels.js";
4
+ import { inlineAuthoredValue, meaningfulLayoutValue } from "./layoutValue.js";
5
+ import { LayoutBlockedIndicator } from "./LayoutBlockedIndicator.js";
6
+ export const GAP_PRESETS = ["0", "0.25rem", "0.5rem", "0.75rem", "1rem", "1.5rem", "2rem", "3rem"];
7
+ /** Renders a gap value with a token chip or the legacy raw-value fallback. */
8
+ export function GapField({ property, domElement: el, editTarget, selection, entries, tokenRows, onAfterEdit, }) {
9
+ const tokenRow = tokenRows.find((row) => row.property === property) ?? null;
10
+ const blockedBy = inlineAuthoredValue(el, property);
11
+ return (_jsxs("span", { className: `layout-combo${blockedBy ? " layout-combo--blocked" : ""}`, "data-test": "layout-combo", "data-property": property, children: [_jsx(TokenField, { property: property, selection: selection, tokenRow: tokenRow, initialValue: meaningfulLayoutValue(el, property), domElement: el, editTarget: editTarget, entries: entries, suggestions: GAP_PRESETS, inputDataTest: `layout-combo-input-${property}`, label: formatInspectorLabel(property), chipVariant: "small", disabled: blockedBy !== null, onAfterEdit: onAfterEdit }), blockedBy ? _jsx(LayoutBlockedIndicator, { blockedBy: blockedBy }) : null] }));
12
+ }
@@ -0,0 +1,14 @@
1
+ import type { ReactElement } from "react";
2
+ import type { EditTarget } from "../selection/editTarget.js";
3
+ export interface GridChildSectionProps {
4
+ domElement: HTMLElement;
5
+ editTarget?: EditTarget;
6
+ revision?: number;
7
+ onAfterEdit?: () => void;
8
+ }
9
+ /**
10
+ * Grid child controls expose only placement starts and per-axis alignment.
11
+ * All edits commit as managed CSS declarations. Moving a start line preserves
12
+ * an existing span where CSS makes that span unambiguous.
13
+ */
14
+ export declare function GridChildSection({ domElement: el, editTarget, revision, onAfterEdit, }: GridChildSectionProps): ReactElement;
@@ -0,0 +1,91 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { IconAlignBoxCenterBottom, IconAlignBoxCenterMiddle, IconAlignBoxCenterStretch, IconAlignBoxCenterTop, IconAlignBoxLeftMiddle, IconAlignBoxRightMiddle, IconColumns2, IconLayoutRows, } from "@tabler/icons-react";
4
+ import { ControlSurface } from "../ui/ControlSurface.js";
5
+ import { FieldRow } from "../ui/FieldRow.js";
6
+ import { SegmentedControl } from "../ui/SegmentedControl.js";
7
+ import { TextInput } from "../ui/TextInput.js";
8
+ import { commitGridAxisPlacement, commitGridChildAlignment, readGridAxisPlacement, readGridChildAlignment, } from "./gridChildModel.js";
9
+ function readAxis(el, axis) {
10
+ return { placement: readGridAxisPlacement(el, axis) };
11
+ }
12
+ function AxisPlacementRow({ axis, label, state, onStart }) {
13
+ const [draft, setDraft] = useState(state.placement.start);
14
+ const draftRef = useRef(draft);
15
+ useEffect(() => {
16
+ draftRef.current = state.placement.start;
17
+ setDraft(state.placement.start);
18
+ }, [state.placement.start]);
19
+ function updateDraft(next) {
20
+ draftRef.current = next;
21
+ setDraft(next);
22
+ }
23
+ function commit() {
24
+ const next = draftRef.current.trim() || "auto";
25
+ updateDraft(next);
26
+ if (next !== state.placement.start)
27
+ onStart(next);
28
+ }
29
+ const AxisIcon = axis === "column" ? IconColumns2 : IconLayoutRows;
30
+ return (_jsx(FieldRow, { label: label, className: `field-row--stacked layout__grid-child-placement layout__grid-child-placement--${axis}`, "data-test": `layout-grid-child-${axis}`, children: _jsxs(ControlSurface, { children: [_jsx(AxisIcon, { className: "layout__grid-child-placement-icon", size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }), _jsx(TextInput, { appearance: "embedded", value: draft, "data-test": `layout-grid-child-${axis}-start`, "aria-label": label, onChange: (event) => updateDraft(event.target.value), onBlur: commit, onKeyDown: (event) => {
31
+ if (event.key === "Escape") {
32
+ event.preventDefault();
33
+ updateDraft(state.placement.start);
34
+ event.currentTarget.blur();
35
+ }
36
+ else if (event.key === "Enter") {
37
+ event.preventDefault();
38
+ event.currentTarget.blur();
39
+ }
40
+ } })] }) }));
41
+ }
42
+ function AlignmentControl({ axis, value, onChange }) {
43
+ const horizontal = axis === "h";
44
+ const options = horizontal
45
+ ? [
46
+ { value: "start", label: "Align left", icon: _jsx(IconAlignBoxLeftMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
47
+ { value: "center", label: "Align center", icon: _jsx(IconAlignBoxCenterMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
48
+ { value: "end", label: "Align right", icon: _jsx(IconAlignBoxRightMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
49
+ { value: "stretch", label: "Stretch horizontally", icon: _jsx(IconAlignBoxCenterStretch, { className: "layout__grid-child-align-icon--horizontal", size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
50
+ ]
51
+ : [
52
+ { value: "start", label: "Align top", icon: _jsx(IconAlignBoxCenterTop, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
53
+ { value: "center", label: "Align middle", icon: _jsx(IconAlignBoxCenterMiddle, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
54
+ { value: "end", label: "Align bottom", icon: _jsx(IconAlignBoxCenterBottom, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
55
+ { value: "stretch", label: "Stretch vertically", icon: _jsx(IconAlignBoxCenterStretch, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) },
56
+ ];
57
+ return (_jsx(FieldRow, { label: horizontal ? "Horizontal alignment" : "Vertical alignment", hideLabel: true, className: `field-row--stacked layout__grid-child-alignment layout__grid-child-alignment--${axis}`, "data-test": `layout-grid-child-align-${axis}`, children: _jsx(SegmentedControl, { value: value === "auto" ? null : value, "aria-label": horizontal ? "Horizontal alignment" : "Vertical alignment", "data-test": `layout-grid-child-select-${horizontal ? "justify-self" : "align-self"}`, className: "layout__grid-child-alignment-control", options: options.map((option) => ({
58
+ ...option,
59
+ testId: `layout-grid-child-align-${axis}-${option.value}`,
60
+ })), onChange: onChange, allowDeselect: true, onDeselect: () => onChange("auto") }) }));
61
+ }
62
+ /**
63
+ * Grid child controls expose only placement starts and per-axis alignment.
64
+ * All edits commit as managed CSS declarations. Moving a start line preserves
65
+ * an existing span where CSS makes that span unambiguous.
66
+ */
67
+ export function GridChildSection({ domElement: el, editTarget, revision = 0, onAfterEdit, }) {
68
+ const target = editTarget ?? el;
69
+ const [column, setColumn] = useState(() => readAxis(el, "column"));
70
+ const [row, setRow] = useState(() => readAxis(el, "row"));
71
+ const [alignH, setAlignH] = useState(() => readGridChildAlignment(el, "h"));
72
+ const [alignV, setAlignV] = useState(() => readGridChildAlignment(el, "v"));
73
+ useEffect(() => {
74
+ setColumn(readAxis(el, "column"));
75
+ setRow(readAxis(el, "row"));
76
+ setAlignH(readGridChildAlignment(el, "h"));
77
+ setAlignV(readGridChildAlignment(el, "v"));
78
+ }, [el, revision]);
79
+ function handleAfterEdit() {
80
+ onAfterEdit?.();
81
+ }
82
+ function handleStart(axis, start) {
83
+ if (commitGridAxisPlacement(target, axis, { start, span: "keep" }).length > 0)
84
+ handleAfterEdit();
85
+ }
86
+ function handleAlignment(axis, value) {
87
+ if (commitGridChildAlignment(target, axis, value).length > 0)
88
+ handleAfterEdit();
89
+ }
90
+ return (_jsxs("div", { className: "layout__group layout__grid-child", "data-test": "layout-grid-child", children: [_jsx("div", { className: "editor__title", children: "Grid Child" }), _jsxs("div", { className: "layout__grid-child-fields", "data-test": "layout-grid-child-fields", children: [_jsx(AxisPlacementRow, { axis: "column", label: "Column", state: column, onStart: (start) => handleStart("column", start) }), _jsx(AxisPlacementRow, { axis: "row", label: "Row", state: row, onStart: (start) => handleStart("row", start) }), _jsx(AlignmentControl, { axis: "v", value: alignV, onChange: (value) => handleAlignment("v", value) }), _jsx(AlignmentControl, { axis: "h", value: alignH, onChange: (value) => handleAlignment("h", value) })] })] }));
91
+ }
@@ -0,0 +1,13 @@
1
+ import type { ReactElement } from "react";
2
+ import type { EditTarget } from "../selection/editTarget.js";
3
+ export declare const GRID_PICKER_MAX_COLUMNS = 12;
4
+ export declare const GRID_PICKER_MAX_ROWS = 8;
5
+ export interface GridPickerProps {
6
+ domElement: HTMLElement;
7
+ editTarget?: EditTarget;
8
+ revision?: number;
9
+ onAfterEdit?: () => void;
10
+ }
11
+ /** Returns a definite track count, or null when CSS itself determines it. */
12
+ export declare function countGridTracks(value: string): number | null;
13
+ export declare function GridPicker({ domElement: el, editTarget, revision, onAfterEdit }: GridPickerProps): ReactElement;
@@ -0,0 +1,179 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ import { getLayoutValue } from "./layoutValue.js";
4
+ import { setStyles } from "../tokens/editActions.js";
5
+ export const GRID_PICKER_MAX_COLUMNS = 12;
6
+ export const GRID_PICKER_MAX_ROWS = 8;
7
+ function clampDimension(value, max) {
8
+ return Math.max(1, Math.min(max, Math.round(value)));
9
+ }
10
+ function splitTrackList(value) {
11
+ const parts = [];
12
+ let start = 0;
13
+ let depth = 0;
14
+ let quote = null;
15
+ let escaped = false;
16
+ for (let index = 0; index < value.length; index++) {
17
+ const char = value[index];
18
+ if (quote) {
19
+ if (escaped)
20
+ escaped = false;
21
+ else if (char === "\\")
22
+ escaped = true;
23
+ else if (char === quote)
24
+ quote = null;
25
+ continue;
26
+ }
27
+ if (char === "\"" || char === "'") {
28
+ quote = char;
29
+ continue;
30
+ }
31
+ if (char === "(")
32
+ depth++;
33
+ else if (char === ")")
34
+ depth = Math.max(0, depth - 1);
35
+ else if (/\s/.test(char) && depth === 0) {
36
+ if (value.slice(start, index).trim())
37
+ parts.push(value.slice(start, index).trim());
38
+ while (/\s/.test(value[index + 1] ?? ""))
39
+ index++;
40
+ start = index + 1;
41
+ }
42
+ }
43
+ if (value.slice(start).trim())
44
+ parts.push(value.slice(start).trim());
45
+ return parts;
46
+ }
47
+ /** Returns a definite track count, or null when CSS itself determines it. */
48
+ export function countGridTracks(value) {
49
+ const trimmed = value.trim();
50
+ if (!trimmed || /^(?:none|subgrid)$/i.test(trimmed))
51
+ return null;
52
+ let count = 0;
53
+ for (const token of splitTrackList(trimmed)) {
54
+ const repeat = /^repeat\(\s*(\d+)\s*,/i.exec(token);
55
+ if (repeat) {
56
+ count += Number(repeat[1]);
57
+ continue;
58
+ }
59
+ if (/^repeat\(/i.test(token))
60
+ return null;
61
+ if (/^\[.*\]$/s.test(token))
62
+ continue;
63
+ count++;
64
+ }
65
+ return count > 0 ? count : null;
66
+ }
67
+ function readDimensions(el) {
68
+ const columns = getLayoutValue(el, "grid-template-columns");
69
+ const rows = getLayoutValue(el, "grid-template-rows");
70
+ const authoredColumns = countGridTracks(columns.authored ?? "");
71
+ const authoredRows = countGridTracks(rows.authored ?? "");
72
+ const computedColumns = countGridTracks(columns.computed);
73
+ const computedRows = countGridTracks(rows.computed);
74
+ return {
75
+ columns: clampDimension(authoredColumns ?? computedColumns ?? 1, GRID_PICKER_MAX_COLUMNS),
76
+ rows: clampDimension(authoredRows ?? computedRows ?? 1, GRID_PICKER_MAX_ROWS),
77
+ };
78
+ }
79
+ function gridStyle(columns, rows) {
80
+ // SAFETY: CSSProperties allows custom properties through index signatures; the object only sets known custom properties.
81
+ return {
82
+ "--grid-picker-columns": columns,
83
+ "--grid-picker-rows": rows,
84
+ };
85
+ }
86
+ function cells(columns, rows) {
87
+ return Array.from({ length: columns * rows }, (_, index) => ({
88
+ column: (index % columns) + 1,
89
+ row: Math.floor(index / columns) + 1,
90
+ }));
91
+ }
92
+ export function GridPicker({ domElement: el, editTarget, revision = 0, onAfterEdit }) {
93
+ const [dimensions, setDimensions] = useState(() => readDimensions(el));
94
+ const [hovered, setHovered] = useState(null);
95
+ const [open, setOpen] = useState(false);
96
+ const [popoverPosition, setPopoverPosition] = useState(null);
97
+ const pickerRef = useRef(null);
98
+ const triggerRef = useRef(null);
99
+ useEffect(() => {
100
+ setDimensions(readDimensions(el));
101
+ setHovered(null);
102
+ }, [el, revision]);
103
+ useEffect(() => {
104
+ if (!open)
105
+ return;
106
+ function closeOnOutsidePointer(event) {
107
+ const picker = pickerRef.current;
108
+ if (!picker)
109
+ return;
110
+ const target = event.target;
111
+ // Document listeners see a shadow-root event through its host as the
112
+ // retargeted `event.target`. Use the composed path so pointer-downs on
113
+ // the grid cells are not mistaken for outside clicks.
114
+ if (event.composedPath().includes(picker))
115
+ return;
116
+ if (target instanceof Node && picker.contains(target))
117
+ return;
118
+ setOpen(false);
119
+ setHovered(null);
120
+ }
121
+ document.addEventListener("pointerdown", closeOnOutsidePointer);
122
+ return () => document.removeEventListener("pointerdown", closeOnOutsidePointer);
123
+ }, [open]);
124
+ useLayoutEffect(() => {
125
+ if (!open)
126
+ return;
127
+ function updatePopoverPosition() {
128
+ const trigger = triggerRef.current;
129
+ if (!trigger)
130
+ return;
131
+ const rect = trigger.getBoundingClientRect();
132
+ setPopoverPosition({
133
+ left: rect.left + (rect.width / 2),
134
+ top: rect.bottom + 6,
135
+ });
136
+ }
137
+ updatePopoverPosition();
138
+ window.addEventListener("resize", updatePopoverPosition);
139
+ window.addEventListener("scroll", updatePopoverPosition, true);
140
+ return () => {
141
+ window.removeEventListener("resize", updatePopoverPosition);
142
+ window.removeEventListener("scroll", updatePopoverPosition, true);
143
+ };
144
+ }, [open]);
145
+ function choose(columns, rows) {
146
+ const next = {
147
+ columns: clampDimension(columns, GRID_PICKER_MAX_COLUMNS),
148
+ rows: clampDimension(rows, GRID_PICKER_MAX_ROWS),
149
+ };
150
+ setDimensions(next);
151
+ setHovered(null);
152
+ setOpen(false);
153
+ if (setStyles(editTarget ?? el, [
154
+ { property: "grid-template-columns", value: `repeat(${next.columns}, minmax(0, 1fr))` },
155
+ { property: "grid-template-rows", value: `repeat(${next.rows}, minmax(0, 1fr))` },
156
+ ]).length > 0) {
157
+ onAfterEdit?.();
158
+ }
159
+ }
160
+ const previewCells = cells(dimensions.columns, dimensions.rows);
161
+ const pickerCells = cells(GRID_PICKER_MAX_COLUMNS, GRID_PICKER_MAX_ROWS);
162
+ const visible = hovered ?? dimensions;
163
+ return (_jsxs("div", { ref: pickerRef, className: "grid-picker", "data-test": "layout-grid-picker", onKeyDown: (event) => {
164
+ if (event.key === "Escape") {
165
+ setOpen(false);
166
+ setHovered(null);
167
+ }
168
+ }, children: [_jsx("button", { type: "button", className: "grid-picker__trigger", "data-test": "layout-grid-picker-trigger", ref: triggerRef, "aria-label": `Grid ${dimensions.columns} by ${dimensions.rows}`, "aria-expanded": open, "aria-haspopup": "dialog", onClick: () => {
169
+ setPopoverPosition(null);
170
+ setOpen((current) => !current);
171
+ }, children: _jsxs("span", { className: "grid-picker__preview", style: gridStyle(dimensions.columns, dimensions.rows), "aria-hidden": "true", children: [previewCells.map(({ column, row }) => (_jsx("span", { className: "grid-picker__preview-cell" }, `${column}-${row}`))), _jsxs("span", { className: "grid-picker__preview-label", children: [dimensions.columns, " \u00D7 ", dimensions.rows] })] }) }), open ? (_jsxs("div", { className: "grid-picker__popover", "data-test": "layout-grid-picker-popover", role: "dialog", "aria-label": "Choose grid size", style: popoverPosition ? {
172
+ left: popoverPosition.left,
173
+ top: popoverPosition.top,
174
+ visibility: "visible",
175
+ } : undefined, children: [_jsx("div", { className: "grid-picker__cell-grid", style: gridStyle(GRID_PICKER_MAX_COLUMNS, GRID_PICKER_MAX_ROWS), children: pickerCells.map(({ column, row }) => {
176
+ const active = column <= visible.columns && row <= visible.rows;
177
+ return (_jsx("button", { type: "button", className: `grid-picker__cell${active ? " grid-picker__cell--active" : ""}`, "data-test": `layout-grid-cell-${column}-${row}`, "aria-label": `${column} columns by ${row} rows`, onMouseEnter: () => setHovered({ columns: column, rows: row }), onFocus: () => setHovered({ columns: column, rows: row }), onClick: () => choose(column, row) }, `${column}-${row}`));
178
+ }) }), _jsxs("div", { className: "grid-picker__popover-value", "aria-live": "polite", children: [visible.columns, " \u00D7 ", visible.rows] })] })) : null] }));
179
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactElement } from "react";
2
+ import type { TokenEntry } from "../../css/model/index.js";
3
+ import type { ResolvedProperty } from "../../css/model/index.js";
4
+ import type { EditTarget } from "../selection/editTarget.js";
5
+ import type { StyleSelection } from "../selection/styleSelection.js";
6
+ export interface GridSectionProps {
7
+ domElement: HTMLElement;
8
+ editTarget?: EditTarget;
9
+ selection?: StyleSelection | null;
10
+ entries: TokenEntry[];
11
+ tokenRows: ResolvedProperty[];
12
+ showContainer: boolean;
13
+ showChild: boolean;
14
+ revision?: number;
15
+ onAfterEdit?: () => void;
16
+ }
17
+ export declare function GridSection({ domElement: el, editTarget, selection, entries, tokenRows, showContainer, showChild, revision, onAfterEdit, }: GridSectionProps): ReactElement;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { IconSettings, IconSpacingHorizontal, IconSpacingVertical } from "@tabler/icons-react";
4
+ import { GridPicker } from "./GridPicker.js";
5
+ import { GapField } from "./GapField.js";
6
+ import { LayoutDropdown } from "./LayoutDropdown.js";
7
+ import { GridValueField } from "./GridValueField.js";
8
+ import { GridChildSection } from "./GridChildSection.js";
9
+ import { ControlSurface } from "../ui/ControlSurface.js";
10
+ import { IconButton } from "../ui/IconButton.js";
11
+ import { InspectorPopover } from "../ui/InspectorPopover.js";
12
+ const GRID_AUTO_FLOW_OPTIONS = ["row", "column", "row dense", "column dense"];
13
+ const GRID_CONTENT_ALIGNMENT_OPTIONS = [
14
+ "normal",
15
+ "start",
16
+ "end",
17
+ "center",
18
+ "stretch",
19
+ "space-between",
20
+ "space-around",
21
+ "space-evenly",
22
+ ];
23
+ const GRID_ITEM_ALIGNMENT_OPTIONS = ["normal", "stretch", "start", "end", "center", "self-start", "self-end"];
24
+ export function GridSection({ domElement: el, editTarget, selection, entries, tokenRows, showContainer, showChild, revision = 0, onAfterEdit, }) {
25
+ const [advancedOpen, setAdvancedOpen] = useState(false);
26
+ return (_jsxs(_Fragment, { children: [showContainer ? _jsx("div", { className: "layout__group layout__grid", "data-test": "layout-grid-container", children: _jsxs("div", { className: "layout__grid-primary", children: [_jsxs("div", { className: "layout__grid-picker-column", children: [_jsxs("div", { className: "layout__grid-heading", children: [_jsx("div", { className: "editor__title", children: "Grid" }), _jsx(InspectorPopover, { "data-test": "layout-grid-settings", side: "bottom", align: "end", triggerElement: (_jsx(IconButton, { variant: "quiet", size: "default", label: "Grid settings", title: "Grid settings", "data-active": advancedOpen, "data-test": "layout-grid-settings", children: _jsx(IconSettings, { size: 16, stroke: 1.8, "aria-hidden": "true" }) })), open: advancedOpen, onOpenChange: setAdvancedOpen, children: _jsxs("div", { className: "layout__grid-advanced", "data-test": "layout-grid-advanced", children: [_jsx("div", { className: "editor__title", children: "Advanced grid CSS" }), _jsxs("div", { className: "layout__grid-fields", children: [_jsx(GridValueField, { property: "grid-template-columns", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-template-rows", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "grid-auto-flow", options: GRID_AUTO_FLOW_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-auto-columns", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit }), _jsx(GridValueField, { property: "grid-auto-rows", domElement: el, editTarget: editTarget, selection: selection, revision: revision, onAfterEdit: onAfterEdit })] }), _jsxs("div", { className: "layout__grid-alignment", "data-test": "layout-grid-alignment", children: [_jsx(LayoutDropdown, { property: "justify-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "align-content", options: GRID_CONTENT_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "justify-items", options: GRID_ITEM_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit }), _jsx(LayoutDropdown, { property: "align-items", options: GRID_ITEM_ALIGNMENT_OPTIONS, domElement: el, editTarget: editTarget, selection: selection, stacked: true, revision: revision, onAfterEdit: onAfterEdit })] })] }) })] }), _jsx(GridPicker, { domElement: el, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit })] }), _jsxs("div", { className: "layout__grid-gap", "data-test": "layout-grid-gap", children: [_jsx("div", { className: "editor__title", children: "Gap" }), _jsxs("div", { className: "layout__grid-gap-fields", children: [_jsxs(ControlSurface, { className: "layout__spacing-field", "data-test": "layout-grid-row-gap", children: [_jsx(IconSpacingVertical, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": "layout-spacing-icon-row-gap" }), _jsx(GapField, { property: "row-gap", domElement: el, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, onAfterEdit: onAfterEdit })] }), _jsxs(ControlSurface, { className: "layout__spacing-field", "data-test": "layout-grid-column-gap", children: [_jsx(IconSpacingHorizontal, { className: "layout__spacing-icon", size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true", "data-test": "layout-spacing-icon-column-gap" }), _jsx(GapField, { property: "column-gap", domElement: el, editTarget: editTarget, selection: selection, entries: entries, tokenRows: tokenRows, onAfterEdit: onAfterEdit })] })] })] })] }) }) : null, showChild ? _jsx(GridChildSection, { domElement: el, editTarget: editTarget, revision: revision, onAfterEdit: onAfterEdit }) : null] }));
27
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactElement } from "react";
2
+ import type { EditTarget } from "../selection/editTarget.js";
3
+ import type { StyleSelection } from "../selection/styleSelection.js";
4
+ export interface GridValueFieldProps {
5
+ property: string;
6
+ domElement: HTMLElement;
7
+ editTarget?: EditTarget;
8
+ selection?: StyleSelection | null;
9
+ revision?: number;
10
+ onAfterEdit?: () => void;
11
+ }
12
+ /**
13
+ * Raw CSS editor for Grid grammar. Track lists and line placement are not
14
+ * safely decomposable into numeric controls, so the authored expression is
15
+ * retained verbatim and committed as one managed longhand.
16
+ */
17
+ export declare function GridValueField({ property, domElement: el, editTarget, selection, revision, onAfterEdit, }: GridValueFieldProps): ReactElement;