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,528 @@
1
+ import { computeSpecificityCore } from "./selectorSemantics.js";
2
+ const revisionRecords = new WeakMap();
3
+ const ruleSnapshots = new WeakMap();
4
+ const documentResolutionSessions = new WeakMap();
5
+ const documentResolutionReferences = new WeakMap();
6
+ const registeredElements = new WeakSet();
7
+ const documentRevisionListeners = new WeakMap();
8
+ function isCurrentDocumentResolutionSession(doc, session) {
9
+ return session.active && documentResolutionSessions.get(doc) === session;
10
+ }
11
+ function notifyDocumentRevision(doc) {
12
+ const revisions = documentRevisions(doc);
13
+ documentRevisionListeners.get(doc)?.forEach((cb) => cb({ ...revisions }));
14
+ }
15
+ /**
16
+ * Subscribes to cascade revisions for one document. This is the narrow
17
+ * document-scoped seam used by the browser inspection Module.
18
+ */
19
+ export function subscribeDocumentRevision(doc, cb) {
20
+ let listeners = documentRevisionListeners.get(doc);
21
+ if (!listeners) {
22
+ listeners = new Set();
23
+ documentRevisionListeners.set(doc, listeners);
24
+ }
25
+ listeners.add(cb);
26
+ return () => {
27
+ listeners.delete(cb);
28
+ if (listeners.size === 0 && documentRevisionListeners.get(doc) === listeners) {
29
+ documentRevisionListeners.delete(doc);
30
+ }
31
+ };
32
+ }
33
+ /**
34
+ * Elements whose attribute changes can affect a cached cascade outcome. The
35
+ * observer only counts attribute mutations against registered elements so
36
+ * unrelated host churn (React commits, hover states, animations) cannot bump
37
+ * the element revision. Registration is idempotent.
38
+ */
39
+ export function registerResolutionElement(el) {
40
+ registeredElements.add(el);
41
+ }
42
+ /** Releases the observer, listener, and cached state owned by one document. */
43
+ export function disposeDocumentResolution(doc) {
44
+ const session = documentResolutionSessions.get(doc);
45
+ if (session) {
46
+ session.active = false;
47
+ session.observer?.disconnect();
48
+ if (session.view && session.resizeListener) {
49
+ session.view.removeEventListener("resize", session.resizeListener);
50
+ }
51
+ session.observer = null;
52
+ session.resizeListener = null;
53
+ documentResolutionSessions.delete(doc);
54
+ }
55
+ documentResolutionReferences.delete(doc);
56
+ // Keep revision counters monotonic per Document. Resetting them to (0,0)
57
+ // resurrects stale revision-keyed caches in tokens/resolution.ts
58
+ // (stableTokenCache, stateResolutionSnapshots, tokenEntriesCache,
59
+ // concreteElementMatchCaches, sourceSiteMatchCaches): an entry written at
60
+ // (0,0) before disposal matches immediately after disposal at (0,0), even
61
+ // though the CSSOM changed while no observer was attached. Bump instead so
62
+ // every pre-disposal cache entry misses, then let the next
63
+ // documentRevisions() observe from the bumped baseline. Only bump when a
64
+ // session was actually torn down so repeated disposes stay idempotent.
65
+ if (session) {
66
+ const record = revisionRecords.get(doc);
67
+ if (record) {
68
+ record.element += 1;
69
+ record.stylesheet += 1;
70
+ }
71
+ }
72
+ ruleSnapshots.delete(doc);
73
+ documentRevisionListeners.get(doc)?.clear();
74
+ documentRevisionListeners.delete(doc);
75
+ }
76
+ /** Keeps one document's CSSOM observer alive for a browser inspection owner. */
77
+ export function retainDocumentResolution(doc) {
78
+ documentRevisions(doc);
79
+ const session = documentResolutionSessions.get(doc);
80
+ if (!session)
81
+ return () => undefined;
82
+ const existing = documentResolutionReferences.get(doc);
83
+ const reference = existing?.session === session
84
+ ? existing
85
+ : { session, count: 0 };
86
+ reference.count += 1;
87
+ documentResolutionReferences.set(doc, reference);
88
+ let released = false;
89
+ return () => {
90
+ if (released)
91
+ return;
92
+ released = true;
93
+ const current = documentResolutionReferences.get(doc);
94
+ if (!current || current.session !== session)
95
+ return;
96
+ current.count -= 1;
97
+ if (current.count === 0)
98
+ disposeDocumentResolution(doc);
99
+ };
100
+ }
101
+ function isStylesheetNode(node) {
102
+ if (!node || node.nodeType !== node.ELEMENT_NODE)
103
+ return false;
104
+ const tag = node.tagName.toLowerCase();
105
+ return tag === "style" || tag === "link";
106
+ }
107
+ function changesStylesheet(record) {
108
+ if (record.type === "attributes")
109
+ return isStylesheetNode(record.target);
110
+ if (record.type === "characterData")
111
+ return isStylesheetNode(record.target.parentElement);
112
+ return isStylesheetNode(record.target)
113
+ || Array.from(record.addedNodes).some(isStylesheetNode)
114
+ || Array.from(record.removedNodes).some(isStylesheetNode);
115
+ }
116
+ /** A node that is, or lives inside, one of the tool's own probe elements. */
117
+ function isProbeNode(node) {
118
+ let current = node;
119
+ while (current && current.nodeType !== current.DOCUMENT_NODE) {
120
+ if (current.nodeType === current.ELEMENT_NODE && current.hasAttribute("data-nudge-ui"))
121
+ return true;
122
+ current = current.parentNode;
123
+ }
124
+ return false;
125
+ }
126
+ const CONTAINER_PROBE_MARKER = /^data-container-probe-/;
127
+ const MANAGED_SHEET_ID = "nudge-ui-styles";
128
+ function isManagedStylesheetNode(node) {
129
+ return isStylesheetNode(node) && node.id === MANAGED_SHEET_ID;
130
+ }
131
+ /**
132
+ * Records that cannot affect cascade outcomes are skipped: mutations made by
133
+ * the tool's own probes (attribution, container-query, and value), attribute
134
+ * churn on elements outside the resolution registry, and the container-query
135
+ * marker attribute set on registered elements. Managed stylesheet text is
136
+ * intentionally observed because it is a real cascade input.
137
+ */
138
+ function isProbeMutation(record) {
139
+ if (record.type === "attributes") {
140
+ const target = record.target;
141
+ // Stylesheet attributes change which rules are present or active even when
142
+ // the stylesheet element has never been registered as a resolution target.
143
+ // Handle them before the generic unregistered-element fast path.
144
+ if (isStylesheetNode(target)) {
145
+ const name = record.attributeName ?? "";
146
+ if (isManagedStylesheetNode(target))
147
+ return name !== "data-nudge-ui";
148
+ return name.startsWith("data-nudge-ui");
149
+ }
150
+ const name = record.attributeName ?? "";
151
+ // Renderer-owned IDs are lookup metadata, not authored cascade inputs.
152
+ // Ignore them before the registry check so hovering an unregistered canvas
153
+ // node does not invalidate the selected element's resolution snapshot.
154
+ if (name === "data-renderer-id")
155
+ return true;
156
+ if (!registeredElements.has(target))
157
+ return true;
158
+ return name.startsWith("data-nudge-ui")
159
+ || CONTAINER_PROBE_MARKER.test(name);
160
+ }
161
+ if (record.type === "characterData") {
162
+ return isProbeNode(record.target) && !isManagedStylesheetNode(record.target.parentElement);
163
+ }
164
+ if (isProbeNode(record.target) && !isManagedStylesheetNode(record.target))
165
+ return true;
166
+ // Removed nodes are already disconnected, so their ancestor chain is gone;
167
+ // check the record's target subtree and the nodes themselves instead.
168
+ const nodes = [...record.addedNodes, ...record.removedNodes];
169
+ if (nodes.some(isManagedStylesheetNode))
170
+ return false;
171
+ return nodes.length > 0 && nodes.every((node) => node.nodeType === node.ELEMENT_NODE && node.hasAttribute("data-nudge-ui"));
172
+ }
173
+ export function documentRevisions(doc) {
174
+ let record = revisionRecords.get(doc);
175
+ if (!record) {
176
+ record = { element: 0, stylesheet: 0 };
177
+ revisionRecords.set(doc, record);
178
+ }
179
+ // A disposed document keeps its monotonic record (see
180
+ // disposeDocumentResolution) but loses its observer session. Recreate the
181
+ // session so later mutations are observed from the bumped baseline instead
182
+ // of silently freezing the counters.
183
+ if (documentResolutionSessions.get(doc))
184
+ return record;
185
+ const session = {
186
+ active: true,
187
+ observer: null,
188
+ view: doc.defaultView,
189
+ resizeListener: null,
190
+ };
191
+ documentResolutionSessions.set(doc, session);
192
+ // MutationObserver is a global constructor of the document realm, but it is
193
+ // not a property in every TypeScript Window declaration used by consumers.
194
+ // Keep the cast local so the observer and its callback remain document-local.
195
+ const viewWithObserver = session.view;
196
+ const Observer = viewWithObserver?.MutationObserver
197
+ ?? (typeof MutationObserver !== "undefined" ? MutationObserver : undefined);
198
+ const root = doc.documentElement;
199
+ if (Observer && root) {
200
+ const observer = new Observer((records) => {
201
+ if (!isCurrentDocumentResolutionSession(doc, session))
202
+ return;
203
+ const relevant = records.filter((entry) => !isProbeMutation(entry));
204
+ if (relevant.length === 0)
205
+ return;
206
+ record.element++;
207
+ if (relevant.some(changesStylesheet))
208
+ record.stylesheet++;
209
+ notifyDocumentRevision(doc);
210
+ });
211
+ session.observer = observer;
212
+ observer.observe(root, {
213
+ attributes: true,
214
+ childList: true,
215
+ characterData: true,
216
+ subtree: true,
217
+ });
218
+ const resizeListener = () => {
219
+ if (!isCurrentDocumentResolutionSession(doc, session))
220
+ return;
221
+ record.element++;
222
+ record.stylesheet++;
223
+ notifyDocumentRevision(doc);
224
+ };
225
+ session.resizeListener = resizeListener;
226
+ session.view?.addEventListener("resize", resizeListener);
227
+ }
228
+ return record;
229
+ }
230
+ function stylesheetRevision(doc) {
231
+ return documentRevisions(doc).stylesheet;
232
+ }
233
+ /** Invalidates CSSOM-derived snapshots after programmatic stylesheet edits. */
234
+ export function invalidateStyleResolutionCache(doc = document) {
235
+ const record = documentRevisions(doc);
236
+ record.element++;
237
+ record.stylesheet++;
238
+ ruleSnapshots.delete(doc);
239
+ notifyDocumentRevision(doc);
240
+ }
241
+ function isStyleRuleInDocument(rule, doc) {
242
+ const StyleRule = doc.defaultView?.CSSStyleRule;
243
+ if (StyleRule && rule instanceof StyleRule)
244
+ return true;
245
+ return rule.type === (doc.defaultView?.CSSRule.STYLE_RULE ?? 1)
246
+ && "selectorText" in rule && "style" in rule;
247
+ }
248
+ /**
249
+ * Reads the declarations the browser accepted for a style rule. This is the
250
+ * semantic source for authored values; it intentionally does not inspect the
251
+ * stylesheet element's original text. CSSOM may expose a shorthand as empty
252
+ * longhand entries through indexed enumeration, so prefer its serialized
253
+ * declaration block and use enumeration as a compatibility fallback.
254
+ */
255
+ export function declarationsFromCssom(style) {
256
+ const declarations = parseCssomDeclarations(style.cssText);
257
+ const seen = new Set(declarations.map((declaration) => declaration.property));
258
+ for (let index = 0; index < style.length; index++) {
259
+ const property = typeof style.item === "function" ? style.item(index) : style[index] ?? "";
260
+ if (!property || seen.has(property))
261
+ continue;
262
+ const value = style.getPropertyValue(property);
263
+ if (!value)
264
+ continue;
265
+ declarations.push({
266
+ property,
267
+ value,
268
+ important: style.getPropertyPriority(property) === "important",
269
+ });
270
+ }
271
+ return declarations;
272
+ }
273
+ function parseCssomDeclarations(cssText) {
274
+ const declarations = [];
275
+ let start = 0;
276
+ let parenDepth = 0;
277
+ let bracketDepth = 0;
278
+ let braceDepth = 0;
279
+ let quote = null;
280
+ let escaped = false;
281
+ const append = (part) => {
282
+ const colon = findTopLevelColon(part);
283
+ if (colon < 0)
284
+ return;
285
+ const property = part.slice(0, colon).trim();
286
+ let value = part.slice(colon + 1).trim();
287
+ if (!property || !value)
288
+ return;
289
+ const important = /!\s*important\s*$/i.test(value);
290
+ if (important)
291
+ value = value.replace(/!\s*important\s*$/i, "").trim();
292
+ declarations.push({ property, value, important });
293
+ };
294
+ for (let index = 0; index < cssText.length; index++) {
295
+ const char = cssText[index];
296
+ if (quote) {
297
+ if (escaped)
298
+ escaped = false;
299
+ else if (char === "\\")
300
+ escaped = true;
301
+ else if (char === quote)
302
+ quote = null;
303
+ continue;
304
+ }
305
+ if (char === "\"" || char === "'") {
306
+ quote = char;
307
+ continue;
308
+ }
309
+ if (char === "(")
310
+ parenDepth++;
311
+ else if (char === ")")
312
+ parenDepth = Math.max(0, parenDepth - 1);
313
+ else if (char === "[")
314
+ bracketDepth++;
315
+ else if (char === "]")
316
+ bracketDepth = Math.max(0, bracketDepth - 1);
317
+ else if (char === "{")
318
+ braceDepth++;
319
+ else if (char === "}")
320
+ braceDepth = Math.max(0, braceDepth - 1);
321
+ else if (char === ";" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {
322
+ append(cssText.slice(start, index));
323
+ start = index + 1;
324
+ }
325
+ }
326
+ append(cssText.slice(start));
327
+ return declarations;
328
+ }
329
+ function findTopLevelColon(value) {
330
+ let parenDepth = 0;
331
+ let bracketDepth = 0;
332
+ let braceDepth = 0;
333
+ let quote = null;
334
+ let escaped = false;
335
+ for (let index = 0; index < value.length; index++) {
336
+ const char = value[index];
337
+ if (quote) {
338
+ if (escaped)
339
+ escaped = false;
340
+ else if (char === "\\")
341
+ escaped = true;
342
+ else if (char === quote)
343
+ quote = null;
344
+ continue;
345
+ }
346
+ if (char === "\"" || char === "'") {
347
+ quote = char;
348
+ continue;
349
+ }
350
+ if (char === "(")
351
+ parenDepth++;
352
+ else if (char === ")")
353
+ parenDepth = Math.max(0, parenDepth - 1);
354
+ else if (char === "[")
355
+ bracketDepth++;
356
+ else if (char === "]")
357
+ bracketDepth = Math.max(0, bracketDepth - 1);
358
+ else if (char === "{")
359
+ braceDepth++;
360
+ else if (char === "}")
361
+ braceDepth = Math.max(0, braceDepth - 1);
362
+ else if (char === ":" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0)
363
+ return index;
364
+ }
365
+ return -1;
366
+ }
367
+ function atRuleParams(cssText, name) {
368
+ const match = new RegExp(`^\\s*@${name}\\s+([\\s\\S]*?)\\s*\\{`, "i").exec(cssText);
369
+ return match?.[1]?.trim() ?? "";
370
+ }
371
+ function contextForRule(cssText, record) {
372
+ if (/^\s*@media\b/i.test(cssText)) {
373
+ const params = record.conditionText?.trim() || atRuleParams(cssText, "media");
374
+ return params ? { kind: "media", params } : null;
375
+ }
376
+ if (/^\s*@container\b/i.test(cssText)) {
377
+ // CSSContainerRule exposes `conditionText` and `containerName` in modern
378
+ // engines. Fall back to the serialised prelude so named, style, and newer
379
+ // container queries remain presentable without hand-parsing their grammar.
380
+ const containerName = record.containerName?.trim();
381
+ const fromInterfaces = [containerName && containerName !== "none" ? containerName : undefined, record.conditionText?.trim()]
382
+ .filter((part) => Boolean(part))
383
+ .join(" ");
384
+ const params = fromInterfaces || atRuleParams(cssText, "container");
385
+ return params ? { kind: "container", params } : null;
386
+ }
387
+ if (/^\s*@supports\b/i.test(cssText)) {
388
+ const params = record.conditionText?.trim() || atRuleParams(cssText, "supports");
389
+ return params ? { kind: "supports", params } : null;
390
+ }
391
+ return null;
392
+ }
393
+ function isNestedDeclarations(rule, doc) {
394
+ if (isStyleRuleInDocument(rule, doc) || !("style" in rule) || "selectorText" in rule)
395
+ return false;
396
+ // Chromium represents declarations nested in a style rule's @supports /
397
+ // @media block as CSSNestedDeclarations. Its public type is not yet in
398
+ // lib.dom, so identify its declaration-only CSSOM shape conservatively.
399
+ return !/^\s*@/.test(rule.cssText ?? "") && typeof rule.style === "object";
400
+ }
401
+ export function collectRules(doc) {
402
+ const revision = stylesheetRevision(doc);
403
+ const cached = ruleSnapshots.get(doc);
404
+ if (cached?.revision === revision) {
405
+ return {
406
+ rules: cached.rules,
407
+ layerOrder: cached.layerOrder,
408
+ inaccessible: cached.inaccessible,
409
+ };
410
+ }
411
+ const out = [];
412
+ const layerOrder = new Map();
413
+ let inaccessible = false;
414
+ let sourceOrder = 0;
415
+ const registerLayer = (name) => {
416
+ const normalized = name.trim();
417
+ if (!normalized)
418
+ return undefined;
419
+ if (!layerOrder.has(normalized))
420
+ layerOrder.set(normalized, layerOrder.size);
421
+ return normalized;
422
+ };
423
+ const nestedLayerName = (parent, child) => {
424
+ const normalized = child.trim();
425
+ if (!normalized)
426
+ return parent;
427
+ return registerLayer(parent ? `${parent}.${normalized}` : normalized);
428
+ };
429
+ const walkRules = (rules, active = true, layer, atRules = [], inheritedSelector, source) => {
430
+ for (const rule of Array.from(rules)) {
431
+ const serializedRule = rule.cssText ?? "";
432
+ const layerStatement = /^\s*@layer\s+([^;{]+)\s*;/i.exec(serializedRule);
433
+ if (layerStatement && !("cssRules" in rule)) {
434
+ layerStatement[1].split(",").forEach((name) => nestedLayerName(layer, name));
435
+ continue;
436
+ }
437
+ if (isStyleRuleInDocument(rule, doc)) {
438
+ try {
439
+ out.push({
440
+ selectorText: rule.selectorText,
441
+ specificity: computeSpecificityCore(rule.selectorText),
442
+ declarations: declarationsFromCssom(rule.style),
443
+ source,
444
+ sourceOrder: sourceOrder++,
445
+ active,
446
+ layer,
447
+ layerOrder: layer ? layerOrder.get(layer) : undefined,
448
+ atRules: atRules.length > 0 ? atRules : undefined,
449
+ });
450
+ const nested = rule.cssRules;
451
+ if (nested?.length)
452
+ walkRules(nested, active, layer, atRules, rule.selectorText, source);
453
+ }
454
+ catch {
455
+ continue;
456
+ }
457
+ }
458
+ else if (isNestedDeclarations(rule, doc)) {
459
+ if (!inheritedSelector)
460
+ continue;
461
+ try {
462
+ out.push({
463
+ selectorText: inheritedSelector,
464
+ specificity: computeSpecificityCore(inheritedSelector),
465
+ declarations: declarationsFromCssom(rule.style),
466
+ source,
467
+ sourceOrder: sourceOrder++,
468
+ active,
469
+ layer,
470
+ layerOrder: layer ? layerOrder.get(layer) : undefined,
471
+ atRules: atRules.length > 0 ? atRules : undefined,
472
+ });
473
+ }
474
+ catch {
475
+ continue;
476
+ }
477
+ }
478
+ else if ("cssRules" in rule) {
479
+ try {
480
+ const record = rule;
481
+ let childActive = active;
482
+ const cssText = rule.cssText ?? "";
483
+ const isMedia = /^\s*@media\b/i.test(cssText);
484
+ const isSupports = /^\s*@supports\b/i.test(cssText);
485
+ const isLayer = /^\s*@layer\b/i.test(cssText);
486
+ const view = doc.defaultView;
487
+ if (isMedia && record.conditionText)
488
+ childActive = active && (view ? view.matchMedia(record.conditionText).matches : false);
489
+ else if (isSupports && record.conditionText)
490
+ childActive = active && (doc.defaultView?.CSS?.supports(record.conditionText) ?? false);
491
+ // A container query is evaluated relative to the styled element, so
492
+ // it cannot be answered while walking a document-level stylesheet.
493
+ // Resolution evaluates its retained context against the selected
494
+ // element using a harmless browser probe.
495
+ const context = contextForRule(cssText, record);
496
+ const childLayer = isLayer
497
+ ? nestedLayerName(layer, record.name ?? cssText.slice(6, cssText.indexOf("{")).trim())
498
+ : layer;
499
+ walkRules(record.cssRules, childActive, childLayer, context ? [...atRules, context] : atRules, inheritedSelector, source);
500
+ }
501
+ catch {
502
+ continue;
503
+ }
504
+ }
505
+ }
506
+ };
507
+ const stylesheetNodes = Array.from(doc.querySelectorAll('style, link[rel~="stylesheet"]'));
508
+ for (const [index, sheet] of Array.from(doc.styleSheets).entries()) {
509
+ try {
510
+ // jsdom does not currently expose CSSStyleSheet.ownerNode; the document
511
+ // stylesheet list and stylesheet element list retain the same order.
512
+ const owner = sheet.ownerNode ?? stylesheetNodes[index] ?? null;
513
+ const source = owner?.dataset?.viteDevId
514
+ ?? sheet.href
515
+ ?? (owner?.id ? `#${owner.id}` : `stylesheet:${index + 1}`);
516
+ walkRules(sheet.cssRules, true, undefined, [], undefined, source);
517
+ }
518
+ catch {
519
+ inaccessible = true;
520
+ }
521
+ }
522
+ const snapshot = { revision, rules: out, layerOrder, inaccessible };
523
+ ruleSnapshots.set(doc, snapshot);
524
+ return snapshot;
525
+ }
526
+ export function cascadeLayerOrder(doc, name) {
527
+ return collectRules(doc).layerOrder.get(name);
528
+ }
@@ -0,0 +1,12 @@
1
+ /** Number of unique selector strings actually computed (for tests). */
2
+ export declare function specificityComputationCount(): number;
3
+ /** Clears the specificity memo (for tests). */
4
+ export declare function resetSpecificityMemo(): void;
5
+ /**
6
+ * Computes the cascade weight for a selector without asking the DOM to match
7
+ * it. Results are memoized per selector string for the resolution paths that
8
+ * still recompute branch specificity (multi-branch selectors).
9
+ */
10
+ export declare function computeSpecificity(selectorText: string): number;
11
+ /** The unmemoized implementation, exposed for equivalence tests. */
12
+ export declare function computeSpecificityCore(selectorText: string): number;
@@ -0,0 +1,106 @@
1
+ function extractParenContent(source, openIndex) {
2
+ let depth = 0;
3
+ let index = openIndex;
4
+ while (index < source.length && source[index] !== "(")
5
+ index++;
6
+ if (index >= source.length)
7
+ return { content: "", end: openIndex };
8
+ depth = 1;
9
+ const start = index + 1;
10
+ index++;
11
+ while (index < source.length && depth > 0) {
12
+ if (source[index] === "(")
13
+ depth++;
14
+ else if (source[index] === ")")
15
+ depth--;
16
+ index++;
17
+ }
18
+ return { content: source.slice(start, index - 1).trim(), end: index };
19
+ }
20
+ function splitSelectorAtTopLevel(selector, separator) {
21
+ const parts = [];
22
+ let depth = 0;
23
+ let start = 0;
24
+ for (let index = 0; index < selector.length; index++) {
25
+ if (selector[index] === "(")
26
+ depth++;
27
+ else if (selector[index] === ")")
28
+ depth--;
29
+ else if (depth === 0 && separator && selector[index] === separator) {
30
+ parts.push(selector.slice(start, index));
31
+ start = index + 1;
32
+ }
33
+ else if (depth === 0 && !separator && (selector[index] === " " || selector[index] === ">" || selector[index] === "+" || selector[index] === "~")) {
34
+ if (index > start)
35
+ parts.push(selector.slice(start, index).trim());
36
+ start = index + 1;
37
+ }
38
+ }
39
+ const last = selector.slice(start).trim();
40
+ if (last)
41
+ parts.push(last);
42
+ return parts;
43
+ }
44
+ const SPECIFICITY_MEMO_LIMIT = 10_000;
45
+ const specificityMemo = new Map();
46
+ let specificityComputations = 0;
47
+ /** Number of unique selector strings actually computed (for tests). */
48
+ export function specificityComputationCount() {
49
+ return specificityComputations;
50
+ }
51
+ /** Clears the specificity memo (for tests). */
52
+ export function resetSpecificityMemo() {
53
+ specificityMemo.clear();
54
+ specificityComputations = 0;
55
+ }
56
+ /**
57
+ * Computes the cascade weight for a selector without asking the DOM to match
58
+ * it. Results are memoized per selector string for the resolution paths that
59
+ * still recompute branch specificity (multi-branch selectors).
60
+ */
61
+ export function computeSpecificity(selectorText) {
62
+ const cached = specificityMemo.get(selectorText);
63
+ if (cached !== undefined)
64
+ return cached;
65
+ specificityComputations++;
66
+ const result = computeSpecificityCore(selectorText);
67
+ if (specificityMemo.size >= SPECIFICITY_MEMO_LIMIT)
68
+ specificityMemo.clear();
69
+ specificityMemo.set(selectorText, result);
70
+ return result;
71
+ }
72
+ /** The unmemoized implementation, exposed for equivalence tests. */
73
+ export function computeSpecificityCore(selectorText) {
74
+ const selector = selectorText.trim();
75
+ const commaParts = splitSelectorAtTopLevel(selector, ",");
76
+ if (commaParts.length > 1) {
77
+ return Math.max(...commaParts.map(computeSpecificity));
78
+ }
79
+ let idCount = 0;
80
+ let classCount = 0;
81
+ let elementCount = 0;
82
+ for (const compound of splitSelectorAtTopLevel(selector)) {
83
+ let current = compound;
84
+ const pseudoFunction = /:(not|is|has|where)\(/g;
85
+ let match;
86
+ while ((match = pseudoFunction.exec(current)) !== null) {
87
+ const name = match[1];
88
+ const { content, end } = extractParenContent(current, match.index + match[0].length - 1);
89
+ const argumentSpecificity = content ? computeSpecificity(content) : 0;
90
+ if (name !== "where") {
91
+ idCount += Math.floor(argumentSpecificity / 1000000);
92
+ classCount += Math.floor(argumentSpecificity / 10000) % 100;
93
+ elementCount += Math.floor(argumentSpecificity / 100) % 100;
94
+ }
95
+ current = current.slice(0, match.index) + " " + current.slice(end);
96
+ pseudoFunction.lastIndex = match.index + 1;
97
+ }
98
+ current = current.replace(/#[\w-]+/g, () => { idCount++; return " "; });
99
+ current = current.replace(/\.[\w-]+/g, () => { classCount++; return " "; });
100
+ current = current.replace(/\[[^\]]*\]/g, () => { classCount++; return " "; });
101
+ current = current.replace(/::[\w-]+/g, () => { elementCount++; return " "; });
102
+ current = current.replace(/:(?!:)[\w-]+/g, () => { classCount++; return " "; });
103
+ elementCount += current.split(/[\s>+~]+/).filter((word) => word && word !== "*" && word !== "&").length;
104
+ }
105
+ return idCount * 1000000 + classCount * 10000 + elementCount * 100;
106
+ }