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,514 @@
1
+ import { callsiteMultiplicity, editableComponentTargets, inspectComponentTargets, } from "./adapterRegistry.js";
2
+ import { captureTextProjectionTarget, resolveTextProjectionTextNode, textProjectionSelector, } from "../projection/textProjection.js";
3
+ /** The order used when more than one visible prop has the same value. */
4
+ export const VISIBLE_TEXT_PROP_PRIORITY = [
5
+ "children",
6
+ "label",
7
+ "text",
8
+ "caption",
9
+ "description",
10
+ "title",
11
+ ];
12
+ const STRUCTURAL_TEXT_PROPS = new Set([
13
+ "id",
14
+ "className",
15
+ "href",
16
+ "src",
17
+ "role",
18
+ "style",
19
+ ]);
20
+ const UNSAFE_TEXT_TAGS = new Set(["SCRIPT", "STYLE", "TEXTAREA", "OPTION"]);
21
+ const UNSAFE_MIXED_DESCENDANT_TAGS = new Set([
22
+ ...UNSAFE_TEXT_TAGS,
23
+ "INPUT",
24
+ "SELECT",
25
+ "BUTTON",
26
+ "A",
27
+ "B",
28
+ "STRONG",
29
+ "I",
30
+ "EM",
31
+ "U",
32
+ "MARK",
33
+ "CODE",
34
+ "S",
35
+ "DEL",
36
+ "INS",
37
+ ]);
38
+ function isStructuralTextProp(name) {
39
+ return STRUCTURAL_TEXT_PROPS.has(name)
40
+ || name.startsWith("data")
41
+ || name.startsWith("aria-")
42
+ || name.startsWith("aria");
43
+ }
44
+ function normalizedText(value) {
45
+ return value.replace(/\s+/g, " ").trim();
46
+ }
47
+ function isApplicationEditingHost(element) {
48
+ const host = element.closest("[contenteditable]");
49
+ if (!host)
50
+ return false;
51
+ return host.getAttribute("data-inline-editor") !== "true"
52
+ && host.getAttribute("contenteditable") !== "false";
53
+ }
54
+ function isApplicationEditingTextNode(element, textNode) {
55
+ // `element.closest()` only checks the selected root. A tracked root can
56
+ // contain an application-owned editing island, so inspect the text node's
57
+ // complete ancestor chain as well.
58
+ const editingHost = textNode.parentElement?.closest("[contenteditable]");
59
+ if (!editingHost)
60
+ return false;
61
+ return editingHost.getAttribute("data-inline-editor") !== "true"
62
+ && editingHost.getAttribute("contenteditable") !== "false"
63
+ && (editingHost === element || element.contains(editingHost) || editingHost.contains(element));
64
+ }
65
+ function isUnsafeSemanticHost(element) {
66
+ return UNSAFE_TEXT_TAGS.has(element.tagName);
67
+ }
68
+ function isVisibleTextProp(name) {
69
+ return VISIBLE_TEXT_PROP_PRIORITY.some((candidate) => candidate === name);
70
+ }
71
+ function propPriority(name) {
72
+ const index = isVisibleTextProp(name) ? VISIBLE_TEXT_PROP_PRIORITY.indexOf(name) : -1;
73
+ return index < 0 ? VISIBLE_TEXT_PROP_PRIORITY.length : index;
74
+ }
75
+ function isTextNode(node) {
76
+ return node.nodeType === 3;
77
+ }
78
+ function isHiddenTextNode(element, textNode) {
79
+ let current = textNode.parentElement;
80
+ while (current) {
81
+ const style = current.ownerDocument.defaultView?.getComputedStyle(current);
82
+ if (style?.display === "none"
83
+ || style?.visibility === "hidden"
84
+ || style?.visibility === "collapse"
85
+ || style?.contentVisibility === "hidden") {
86
+ return true;
87
+ }
88
+ if (current === element)
89
+ break;
90
+ current = current.parentElement;
91
+ }
92
+ return false;
93
+ }
94
+ function textNodesFor(element) {
95
+ const doc = element.ownerDocument;
96
+ const walker = doc.createTreeWalker(element, 0x4 /* NodeFilter.SHOW_TEXT */);
97
+ const nodes = [];
98
+ let node = walker.nextNode();
99
+ while (node) {
100
+ if (isTextNode(node)
101
+ && normalizedText(node.nodeValue ?? "")
102
+ && !isHiddenTextNode(element, node)) {
103
+ nodes.push(node);
104
+ }
105
+ node = walker.nextNode();
106
+ }
107
+ return nodes;
108
+ }
109
+ function isSafeRenderedTextHost(element, textNode) {
110
+ if (UNSAFE_TEXT_TAGS.has(element.tagName))
111
+ return false;
112
+ const editingHost = element.closest("[contenteditable]");
113
+ if (editingHost
114
+ && editingHost.getAttribute("data-inline-editor") !== "true"
115
+ && editingHost.getAttribute("contenteditable") !== "false")
116
+ return false;
117
+ if (element.children.length === 0) {
118
+ const directTextNodes = Array.from(element.childNodes).filter((node) => node.nodeType === 3);
119
+ return directTextNodes.length === 1 && directTextNodes[0] === textNode;
120
+ }
121
+ if (!element.contains(textNode))
122
+ return false;
123
+ // A line break is layout structure, not rich text content. When the exact
124
+ // text node is captured, wrapping that node leaves the <br> in place and
125
+ // preserves both lines. Other inline formatting remains rejected because
126
+ // replacing text inside it would silently flatten authored markup.
127
+ for (const descendant of Array.from(element.querySelectorAll("*"))) {
128
+ if (UNSAFE_MIXED_DESCENDANT_TAGS.has(descendant.tagName))
129
+ return false;
130
+ const descendantEditingHost = descendant.closest("[contenteditable]");
131
+ if (descendantEditingHost
132
+ && descendantEditingHost.getAttribute("data-inline-editor") !== "true"
133
+ && descendantEditingHost.getAttribute("contenteditable") !== "false")
134
+ return false;
135
+ }
136
+ return true;
137
+ }
138
+ function textNodeAtPoint(element, point) {
139
+ const nodes = textNodesFor(element);
140
+ if (nodes.length === 0)
141
+ return null;
142
+ if (!point)
143
+ return nodes[0] ?? null;
144
+ for (const node of nodes) {
145
+ const range = node.ownerDocument.createRange();
146
+ range.selectNodeContents(node);
147
+ const rects = typeof range.getClientRects === "function"
148
+ ? Array.from(range.getClientRects())
149
+ : [];
150
+ if (rects.some((rect) => point.x >= rect.left && point.x <= rect.right
151
+ && point.y >= rect.top && point.y <= rect.bottom)) {
152
+ return node;
153
+ }
154
+ }
155
+ return nodes[0] ?? null;
156
+ }
157
+ function targetBinding(target, property) {
158
+ return {
159
+ kind: "component-prop",
160
+ property,
161
+ target: {
162
+ framework: target.framework,
163
+ componentId: target.contract.componentId,
164
+ callsiteId: target.meta.callsiteId,
165
+ componentName: target.meta.componentName,
166
+ file: target.meta.file,
167
+ line: target.meta.line,
168
+ column: target.meta.column,
169
+ },
170
+ };
171
+ }
172
+ function authoredAsFor(target, property) {
173
+ return target.meta.authoredProps[property]
174
+ ?? (target.meta.authoredProps["..."] ? "spread" : "default");
175
+ }
176
+ function mountedCountFor(element, target) {
177
+ const mountedCount = callsiteMultiplicity(target);
178
+ if (mountedCount !== null)
179
+ return mountedCount;
180
+ // Adapters written before multiplicity was introduced may still provide a
181
+ // marker-backed inspection. Keep that compatibility fallback conservative:
182
+ // it can prove one root, but it can never prove an arbitrary count.
183
+ return hasUniqueInvocationEvidence(element, target.meta.callsiteId) ? 1 : null;
184
+ }
185
+ function candidatesForText(element, renderedText) {
186
+ const candidates = [];
187
+ const targets = editableComponentTargets(inspectComponentTargets(element));
188
+ for (const target of targets) {
189
+ for (const prop of target.contract.props) {
190
+ if (prop.control !== "text")
191
+ continue;
192
+ if (isStructuralTextProp(prop.name))
193
+ continue;
194
+ const current = target.props[prop.name];
195
+ if (typeof current !== "string" || normalizedText(current) !== normalizedText(renderedText))
196
+ continue;
197
+ candidates.push({
198
+ target,
199
+ property: prop.name,
200
+ priority: propPriority(prop.name),
201
+ mountedCount: mountedCountFor(element, target),
202
+ });
203
+ }
204
+ }
205
+ return candidates;
206
+ }
207
+ function renderedTextCandidate(element, textNode, before, semantic, requireUnique = true) {
208
+ if (!isSafeRenderedTextHost(element, textNode)) {
209
+ return {
210
+ kind: "rejected",
211
+ reason: "unsafe-target",
212
+ message: "Rendered text with descendant markup cannot be edited as one text projection.",
213
+ };
214
+ }
215
+ const target = captureTextProjectionTarget(element, before, textNode);
216
+ if (!target) {
217
+ return {
218
+ kind: "rejected",
219
+ reason: "no-binding",
220
+ message: "The rendered copy has no durable source identity for a text projection.",
221
+ };
222
+ }
223
+ if (requireUnique && !hasUniqueRenderedIdentity(element, target)) {
224
+ return {
225
+ kind: "rejected",
226
+ reason: "ambiguous-binding",
227
+ message: "More than one rendered text root shares this source and evidence identity.",
228
+ };
229
+ }
230
+ const componentTarget = semantic?.target ?? inspectComponentTargets(element)[0];
231
+ const semanticProperty = semantic?.property;
232
+ // A component target is only source evidence when it is the callsite that
233
+ // produced this exact DOM root. For text inside a child host element, the
234
+ // nearest boundary is the enclosing component invocation, so the element's
235
+ // own data-src must remain the prompt/change source.
236
+ const elementDataSrc = element.getAttribute("data-src");
237
+ const elementSource = parseRenderedSource(elementDataSrc ?? "");
238
+ const matchingComponentTarget = componentTarget
239
+ && componentTarget.meta.callsiteId === elementDataSrc
240
+ ? componentTarget
241
+ : null;
242
+ const semanticAuthored = semantic
243
+ ? authoredAsFor(semantic.target, semantic.property)
244
+ : matchingComponentTarget?.meta.authoredProps.children;
245
+ const authoredAs = semanticAuthored === "literal"
246
+ ? "literal"
247
+ : semanticAuthored === "expression" || semanticAuthored === "spread"
248
+ ? "expression"
249
+ : "unknown";
250
+ const source = semantic
251
+ ? {
252
+ file: semantic.target.meta.file,
253
+ line: semantic.target.meta.line,
254
+ column: semantic.target.meta.column,
255
+ component: semantic.target.meta.componentName,
256
+ }
257
+ : matchingComponentTarget
258
+ ? {
259
+ file: matchingComponentTarget.meta.file,
260
+ line: matchingComponentTarget.meta.line,
261
+ column: matchingComponentTarget.meta.column,
262
+ component: matchingComponentTarget.meta.componentName,
263
+ }
264
+ : {
265
+ file: elementSource.file || componentTarget?.meta.file || "",
266
+ line: elementSource.file ? elementSource.line : componentTarget?.meta.line ?? 0,
267
+ column: elementSource.file ? elementSource.column : componentTarget?.meta.column ?? 0,
268
+ component: element.getAttribute("data-cid") ?? componentTarget?.meta.componentName ?? "Rendered text",
269
+ };
270
+ const evidence = semantic && semantic.mountedCount !== null
271
+ ? {
272
+ callsiteId: semantic.target.meta.callsiteId,
273
+ componentName: semantic.target.meta.componentName,
274
+ property: semanticProperty ?? "children",
275
+ mountedCount: semantic.mountedCount,
276
+ }
277
+ : undefined;
278
+ return {
279
+ binding: { kind: "rendered-text", target },
280
+ element,
281
+ textNode,
282
+ before,
283
+ // Keep this private metadata on the candidate for canonical source data.
284
+ renderedSource: {
285
+ file: source.file,
286
+ line: source.line,
287
+ column: source.column,
288
+ component: source.component,
289
+ selector: textProjectionSelector(target) ?? "",
290
+ authoredAs,
291
+ evidence,
292
+ },
293
+ renderedTarget: target,
294
+ scope: "rendered-instance",
295
+ };
296
+ }
297
+ function renderedMetadataForChoice(element, textNode, before, semantic) {
298
+ const rendered = renderedTextCandidate(element, textNode, before, semantic, false);
299
+ if (!("element" in rendered))
300
+ return null;
301
+ if (rendered.binding.kind !== "rendered-text" || !rendered.renderedSource || !rendered.renderedTarget) {
302
+ return null;
303
+ }
304
+ return { target: rendered.renderedTarget, source: rendered.renderedSource };
305
+ }
306
+ function hasUniqueRenderedIdentity(element, target) {
307
+ const selector = textProjectionSelector(target);
308
+ if (!selector)
309
+ return false;
310
+ let roots;
311
+ try {
312
+ roots = Array.from(element.ownerDocument.querySelectorAll(selector));
313
+ }
314
+ catch {
315
+ return false;
316
+ }
317
+ const matching = roots.filter((root) => {
318
+ if (root.getAttribute("data-cprops") !== target.props
319
+ || root.getAttribute("aria-label") !== target.ariaLabel)
320
+ return false;
321
+ const textNode = resolveTextProjectionTextNode(root, target, target.beforeText);
322
+ return textNode !== null
323
+ && !isHiddenTextNode(root, textNode)
324
+ && isSafeRenderedTextHost(root, textNode);
325
+ });
326
+ return matching.length === 1;
327
+ }
328
+ function parseRenderedSource(src) {
329
+ const match = /^(.*):(\d+):(\d+)$/.exec(src);
330
+ if (!match)
331
+ return { file: src, line: 0, column: 0 };
332
+ return { file: match[1] ?? src, line: Number(match[2]), column: Number(match[3]) };
333
+ }
334
+ /**
335
+ * Compatibility evidence for adapters that predate the mounted-count seam.
336
+ * React itself reports multiplicity through the runtime Adapter registry; this
337
+ * fallback is only a one-root proof and is never used to pick an occurrence.
338
+ */
339
+ function hasUniqueInvocationEvidence(element, callsiteId) {
340
+ const nodes = Array.from(element.ownerDocument.querySelectorAll("[data-cid]"));
341
+ const matches = new Set();
342
+ for (const node of nodes) {
343
+ if (inspectComponentTargets(node).some((target) => target.meta.callsiteId === callsiteId)) {
344
+ matches.add(node);
345
+ }
346
+ }
347
+ if (matches.size === 0)
348
+ return false;
349
+ if (![...matches].some((root) => root === element || root.contains(element)))
350
+ return false;
351
+ let roots = 0;
352
+ for (const node of matches) {
353
+ let parent = node.parentElement;
354
+ let nested = false;
355
+ while (parent) {
356
+ if (matches.has(parent)) {
357
+ nested = true;
358
+ break;
359
+ }
360
+ parent = parent.parentElement;
361
+ }
362
+ if (!nested)
363
+ roots += 1;
364
+ if (roots > 1)
365
+ return false;
366
+ }
367
+ return roots === 1;
368
+ }
369
+ /**
370
+ * Resolves only a confidently matched semantic string binding. Text nodes and
371
+ * the temporary editor host are not identity: the returned component target is
372
+ * the durable callsite used by the canonical component-prop record.
373
+ */
374
+ export function resolveTextBinding(element, point) {
375
+ if (isApplicationEditingHost(element)) {
376
+ return {
377
+ kind: "rejected",
378
+ reason: "no-binding",
379
+ message: "Application-owned editing surfaces are not managed by the inspector.",
380
+ };
381
+ }
382
+ // Hard-dangerous hosts are rejected before adapter inspection. Descendant
383
+ // markup is intentionally not included: a confident semantic component
384
+ // binding may still own a nested text node, while rendered fallback keeps
385
+ // its stricter direct-leaf requirement.
386
+ if (isUnsafeSemanticHost(element)) {
387
+ return {
388
+ kind: "rejected",
389
+ reason: "unsafe-target",
390
+ message: "Script, style, form-control, and option contents are not editable text targets.",
391
+ };
392
+ }
393
+ const textNode = textNodeAtPoint(element, point);
394
+ if (!textNode) {
395
+ return {
396
+ kind: "rejected",
397
+ reason: "no-text",
398
+ message: "The selected element does not contain editable visible text.",
399
+ };
400
+ }
401
+ if (isApplicationEditingTextNode(element, textNode)) {
402
+ return {
403
+ kind: "rejected",
404
+ reason: "no-binding",
405
+ message: "Application-owned editing surfaces are not managed by the inspector.",
406
+ };
407
+ }
408
+ const before = textNode.nodeValue ?? "";
409
+ const candidates = candidatesForText(element, before);
410
+ if (candidates.length === 0) {
411
+ return renderedTextCandidate(element, textNode, before);
412
+ }
413
+ const bestPriority = Math.min(...candidates.map((candidate) => candidate.priority));
414
+ const best = candidates.filter((candidate) => candidate.priority === bestPriority);
415
+ const unique = new Map();
416
+ for (const candidate of best) {
417
+ const key = `${candidate.target.meta.callsiteId}\u0000${candidate.property}`;
418
+ if (!unique.has(key))
419
+ unique.set(key, candidate);
420
+ }
421
+ const choices = [...unique.values()];
422
+ if (choices.some((candidate) => candidate.mountedCount === null)) {
423
+ return {
424
+ kind: "rejected",
425
+ reason: "ambiguous-binding",
426
+ message: "The component text has no reliable mounted-callsite evidence; refusing a broad semantic override.",
427
+ };
428
+ }
429
+ const first = choices[0];
430
+ const firstBinding = targetBinding(first.target, first.property);
431
+ const bindingChoices = choices.map((candidate) => {
432
+ const rendered = renderedMetadataForChoice(element, textNode, before, candidate);
433
+ return {
434
+ binding: targetBinding(candidate.target, candidate.property),
435
+ editableTarget: candidate.target,
436
+ mountedCount: candidate.mountedCount,
437
+ authoredAs: authoredAsFor(candidate.target, candidate.property),
438
+ renderedTarget: rendered?.target ?? null,
439
+ renderedSource: rendered?.source,
440
+ };
441
+ });
442
+ // Multiple equal-priority candidates are not rejected or guessed. The
443
+ // session exposes these choices to the inline chooser and blocks commit
444
+ // until the user picks one.
445
+ if (choices.length > 1) {
446
+ return {
447
+ binding: firstBinding,
448
+ editableTarget: first.target,
449
+ element,
450
+ textNode,
451
+ before,
452
+ bindingChoices,
453
+ mountedCount: first.mountedCount,
454
+ scope: first.mountedCount > 1 ? "rendered-instance" : "source-site",
455
+ scopeChoices: first.mountedCount > 1 && authoredAsFor(first.target, first.property) === "literal"
456
+ ? ["rendered-instance", "source-site"]
457
+ : undefined,
458
+ renderedTarget: bindingChoices[0]?.renderedTarget ?? undefined,
459
+ renderedSource: bindingChoices[0]?.renderedSource,
460
+ };
461
+ }
462
+ const match = first;
463
+ const authoredAs = authoredAsFor(match.target, match.property);
464
+ const binding = targetBinding(match.target, match.property);
465
+ if (match.mountedCount > 1 && authoredAs !== "literal") {
466
+ // Expressions/spreads are source-logic intent. A semantic callsite
467
+ // override would fan out to every item, so retain one durable text target
468
+ // and tell the prompt to update the data/source logic.
469
+ return renderedTextCandidate(element, textNode, before, match);
470
+ }
471
+ if (match.mountedCount > 1 && authoredAs === "literal") {
472
+ // Validate the selected output with the same bounded before-text evidence
473
+ // used by the durable projection. The source-site option remains safe even
474
+ // when identical outputs make an instance impossible to distinguish, but
475
+ // an item-only session is never allowed to guess.
476
+ const rendered = renderedTextCandidate(element, textNode, before, match, false);
477
+ if (!("kind" in rendered)) {
478
+ return {
479
+ ...rendered,
480
+ binding,
481
+ editableTarget: match.target,
482
+ mountedCount: match.mountedCount,
483
+ scope: "rendered-instance",
484
+ scopeChoices: ["rendered-instance", "source-site"],
485
+ };
486
+ }
487
+ // An unsafe/missing rendered-text projection only removes the item-scoped
488
+ // option. The explicit all-output source-site edit is still a safe
489
+ // canonical component-prop change and must not be rejected because the
490
+ // DOM fallback cannot capture bounded instance evidence.
491
+ return {
492
+ binding,
493
+ editableTarget: match.target,
494
+ element,
495
+ textNode,
496
+ before,
497
+ mountedCount: match.mountedCount,
498
+ scope: "source-site",
499
+ scopeChoices: ["source-site"],
500
+ };
501
+ }
502
+ // Unique invocation (mountedCount === 1): the callsite is unambiguous, so
503
+ // the source-site edit is always safe and no scope choice is offered. The
504
+ // mountedCount > 1 cases all returned above.
505
+ return {
506
+ binding,
507
+ editableTarget: match.target,
508
+ element,
509
+ textNode,
510
+ before,
511
+ mountedCount: match.mountedCount,
512
+ scope: "source-site",
513
+ };
514
+ }
@@ -0,0 +1,96 @@
1
+ import type { RuntimeProps } from "./runtimeTypes.js";
2
+ import type { EditScope } from "../editScope.js";
3
+ export type ComponentPropValue = string | number | boolean;
4
+ export type AuthoredPropKind = "literal" | "expression" | "spread" | "default";
5
+ export declare const COMPONENT_FRAMEWORKS: readonly ["react"];
6
+ export type ComponentFramework = (typeof COMPONENT_FRAMEWORKS)[number];
7
+ export type ComponentChangeScope = EditScope;
8
+ /** Returns whether a host value names a supported component framework. */
9
+ export declare function isComponentFramework(value: string): value is ComponentFramework;
10
+ /**
11
+ * Bounded evidence for the rendered invocation that a text edit started from.
12
+ * This is deliberately JSON data, never a DOM node or a React fiber.
13
+ */
14
+ export interface ComponentInvocationEvidence {
15
+ occurrence: number;
16
+ props: string | null;
17
+ ariaLabel: string | null;
18
+ beforeText: string;
19
+ mountedCount: number;
20
+ }
21
+ export type ComponentPropBaseline = {
22
+ kind: "default";
23
+ } | {
24
+ kind: "value";
25
+ value: ComponentPropValue;
26
+ };
27
+ export interface ComponentChangeTarget {
28
+ framework: ComponentFramework;
29
+ componentId: string;
30
+ callsiteId: string;
31
+ componentName: string;
32
+ file: string;
33
+ line: number;
34
+ column: number;
35
+ }
36
+ export interface ComponentChangeRecord {
37
+ kind: "component-prop";
38
+ target: ComponentChangeTarget;
39
+ property: string;
40
+ before: ComponentPropBaseline;
41
+ after: ComponentPropValue;
42
+ authoredAs: AuthoredPropKind;
43
+ /** `source-site` is the historical/default semantic projection scope. */
44
+ scope?: ComponentChangeScope;
45
+ /** Present when an inline scope decision was made from one rendered item. */
46
+ evidence?: ComponentInvocationEvidence;
47
+ }
48
+ export interface ComponentInvocationMeta {
49
+ callsiteId: string;
50
+ componentId: string;
51
+ componentName: string;
52
+ file: string;
53
+ line: number;
54
+ column: number;
55
+ authoredProps: Record<string, Exclude<AuthoredPropKind, "default">>;
56
+ }
57
+ export interface RuntimeComponentTarget {
58
+ framework: ComponentFramework;
59
+ meta: ComponentInvocationMeta;
60
+ props: RuntimeProps;
61
+ /** Adapter-reported mounted invocation count for this callsite. */
62
+ mountedCount?: number;
63
+ }
64
+ export interface ComponentPropContract {
65
+ name: string;
66
+ control: "select" | "boolean" | "text";
67
+ options: ComponentPropValue[];
68
+ optional: boolean;
69
+ }
70
+ export interface ComponentContract {
71
+ componentId: string;
72
+ name: string;
73
+ file: string;
74
+ props: ComponentPropContract[];
75
+ provenance: "typescript" | "package-manifest";
76
+ }
77
+ export interface EditableComponentTarget extends RuntimeComponentTarget {
78
+ contract: ComponentContract;
79
+ }
80
+ export interface ComponentOverride {
81
+ framework: ComponentFramework;
82
+ callsiteId: string;
83
+ prop: string;
84
+ value: ComponentPropValue;
85
+ }
86
+ export interface ComponentRuntimeAdapter {
87
+ framework: ComponentFramework;
88
+ inspect(element: HTMLElement): RuntimeComponentTarget[];
89
+ replaceOverrides(overrides: ComponentOverride[]): void;
90
+ /**
91
+ * Return the number of currently mounted invocations for a callsite. A
92
+ * runtime that cannot prove this must return null/undefined so callers can
93
+ * fail closed instead of broadening a semantic override.
94
+ */
95
+ getCallsiteMultiplicity?(callsiteId: string): number | null | undefined;
96
+ }
@@ -0,0 +1,5 @@
1
+ export const COMPONENT_FRAMEWORKS = ["react"];
2
+ /** Returns whether a host value names a supported component framework. */
3
+ export function isComponentFramework(value) {
4
+ return COMPONENT_FRAMEWORKS.some((framework) => framework === value);
5
+ }
@@ -0,0 +1,7 @@
1
+ import type { ConformanceFixture } from "./fixture.js";
2
+ /**
3
+ * Framework-neutral border corpus. Covers shorthand decomposition into width,
4
+ * style, and color longhands (including omitted CSS initials), side-specific
5
+ * shorthands, token attribution, border-radius, and true raw fallbacks.
6
+ */
7
+ export declare const BORDER_CASES: ConformanceFixture[];