nudge-ui 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. package/dist/cli/agentCommand.d.ts +0 -1
  2. package/dist/cli/agentCommand.js +0 -1
  3. package/dist/client.mjs +238 -122
  4. package/dist/compiler/ast.d.ts +0 -6
  5. package/dist/compiler/ast.js +0 -5
  6. package/dist/compiler/componentContractTypes.d.ts +11 -5
  7. package/dist/compiler/componentContracts.js +3 -9
  8. package/dist/compiler/componentInstrumentation.d.ts +2 -13
  9. package/dist/compiler/componentInstrumentation.js +3 -12
  10. package/dist/compiler/componentPolicyResolution.d.ts +3 -22
  11. package/dist/compiler/componentPolicyResolution.js +6 -38
  12. package/dist/compiler/identityAttributes.d.ts +2 -0
  13. package/dist/compiler/identityAttributes.js +2 -0
  14. package/dist/compiler/index.d.ts +0 -1
  15. package/dist/compiler/index.js +0 -1
  16. package/dist/compiler/packageComponentContracts.d.ts +10 -19
  17. package/dist/compiler/packageComponentContracts.js +60 -43
  18. package/dist/compiler/reactComponentProtocols.d.ts +0 -7
  19. package/dist/compiler/reactComponentProtocols.js +0 -7
  20. package/dist/compiler/reactIdentity.d.ts +2 -2
  21. package/dist/compiler/reactIdentity.js +41 -43
  22. package/dist/compiler/sourcePaths.d.ts +4 -8
  23. package/dist/compiler/sourcePaths.js +6 -8
  24. package/dist/css/dialects/index.d.ts +2 -21
  25. package/dist/css/dialects/index.js +2 -9
  26. package/dist/css/dialects/tailwind.d.ts +2 -16
  27. package/dist/css/dialects/tailwind.js +2 -25
  28. package/dist/css/dialects/vanillaExtract.d.ts +1 -9
  29. package/dist/css/dialects/vanillaExtract.js +0 -1
  30. package/dist/css/index.d.ts +0 -8
  31. package/dist/css/index.js +0 -8
  32. package/dist/css/model/index.d.ts +6 -38
  33. package/dist/css/model/index.js +0 -9
  34. package/dist/css/token-inventory/index.d.ts +0 -23
  35. package/dist/css/token-inventory/index.js +0 -23
  36. package/dist/css/token-inventory/inventory.js +4 -16
  37. package/dist/css/token-inventory/parseStylesheet.d.ts +1 -9
  38. package/dist/css/token-inventory/parseStylesheet.js +5 -42
  39. package/dist/css/token-inventory/policy.d.ts +2 -39
  40. package/dist/css/token-inventory/policy.js +2 -39
  41. package/dist/css/token-inventory/types.d.ts +2 -15
  42. package/dist/css/value-semantics/borderSemantics.d.ts +1 -8
  43. package/dist/css/value-semantics/borderSemantics.js +5 -23
  44. package/dist/css/value-semantics/boxSemantics.d.ts +2 -25
  45. package/dist/css/value-semantics/boxSemantics.js +1 -7
  46. package/dist/css/value-semantics/colorSemantics.d.ts +6 -60
  47. package/dist/css/value-semantics/colorSemantics.js +9 -40
  48. package/dist/css/value-semantics/cssSyntax.d.ts +10 -10
  49. package/dist/css/value-semantics/cssSyntax.js +39 -11
  50. package/dist/css/value-semantics/fontSemantics.d.ts +3 -19
  51. package/dist/css/value-semantics/fontSemantics.js +7 -25
  52. package/dist/css/value-semantics/index.d.ts +1 -12
  53. package/dist/css/value-semantics/index.js +1 -12
  54. package/dist/css/value-semantics/propertyPolicy.d.ts +6 -53
  55. package/dist/css/value-semantics/propertyPolicy.js +47 -59
  56. package/dist/css/value-semantics/stringMaps.d.ts +0 -1
  57. package/dist/css/value-semantics/structuredValues.d.ts +3 -37
  58. package/dist/css/value-semantics/structuredValues.js +6 -17
  59. package/dist/css/value-semantics/tokenInterpretation.d.ts +8 -50
  60. package/dist/css/value-semantics/tokenInterpretation.js +7 -21
  61. package/dist/hosts/astro/astroRuntimeConfig.d.ts +0 -1
  62. package/dist/hosts/astro/astroRuntimeConfig.js +0 -1
  63. package/dist/hosts/astro/clientAsset.d.ts +1 -5
  64. package/dist/hosts/astro/clientAsset.js +1 -5
  65. package/dist/hosts/astro/clientTransport.d.ts +0 -1
  66. package/dist/hosts/astro/clientTransport.js +4 -9
  67. package/dist/hosts/astro/integration.d.ts +2 -28
  68. package/dist/hosts/astro/integration.js +7 -36
  69. package/dist/hosts/astro/markdownIdentity.d.ts +0 -3
  70. package/dist/hosts/astro/markdownIdentity.js +0 -3
  71. package/dist/hosts/astro/middleware.d.ts +1 -12
  72. package/dist/hosts/astro/middleware.js +1 -12
  73. package/dist/hosts/astro/projectContext.d.ts +1 -9
  74. package/dist/hosts/astro/projectContext.js +2 -11
  75. package/dist/hosts/astro/responseInstrumentation.d.ts +4 -33
  76. package/dist/hosts/astro/responseInstrumentation.js +5 -34
  77. package/dist/hosts/environment.d.ts +0 -8
  78. package/dist/hosts/environment.js +0 -1
  79. package/dist/hosts/next/index.js +1 -3
  80. package/dist/hosts/next/loader.d.ts +5 -44
  81. package/dist/hosts/next/loader.js +22 -103
  82. package/dist/hosts/next/loaders/identity-loader.cjs +111 -65
  83. package/dist/hosts/next/loaders/loader-plugin.cjs +111 -65
  84. package/dist/hosts/next/manifest.d.ts +2 -16
  85. package/dist/hosts/next/manifest.js +18 -20
  86. package/dist/hosts/next/mount.d.ts +1 -11
  87. package/dist/hosts/next/mount.js +1 -11
  88. package/dist/hosts/next/repositoryScope.d.ts +2 -17
  89. package/dist/hosts/next/repositoryScope.js +2 -17
  90. package/dist/hosts/next/sidecar.d.ts +0 -13
  91. package/dist/hosts/next/sidecar.js +25 -110
  92. package/dist/hosts/next/wrapper.d.ts +0 -31
  93. package/dist/hosts/next/wrapper.js +13 -64
  94. package/dist/hosts/projectBridge.d.ts +0 -2
  95. package/dist/hosts/projectBridge.js +0 -2
  96. package/dist/hosts/reactRendererCapture.d.ts +2 -0
  97. package/dist/hosts/reactRendererCapture.js +12 -0
  98. package/dist/hosts/static/cli.d.ts +0 -4
  99. package/dist/hosts/static/cli.js +0 -3
  100. package/dist/hosts/static/html/bootstrap.d.ts +1 -18
  101. package/dist/hosts/static/html/bootstrap.js +2 -14
  102. package/dist/hosts/static/manifest.d.ts +2 -15
  103. package/dist/hosts/static/manifest.js +5 -18
  104. package/dist/hosts/static/server.d.ts +4 -38
  105. package/dist/hosts/static/server.js +17 -67
  106. package/dist/hosts/vite/index.d.ts +0 -10
  107. package/dist/hosts/vite/index.js +0 -10
  108. package/dist/hosts/vite/react.d.ts +4 -17
  109. package/dist/hosts/vite/react.js +18 -35
  110. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +1 -10
  111. package/dist/hosts/vite/tokens/activeStylesheets.js +3 -8
  112. package/dist/hosts/vite/tokens/fileMap.d.ts +0 -1
  113. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +2 -15
  114. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +3 -10
  115. package/dist/hosts/vite/vite.d.ts +5 -26
  116. package/dist/hosts/vite/vite.js +44 -80
  117. package/dist/html/dom.d.ts +0 -1
  118. package/dist/html/dom.js +0 -1
  119. package/dist/html/identity.d.ts +1 -15
  120. package/dist/html/identity.js +1 -8
  121. package/dist/html/insertions.d.ts +2 -8
  122. package/dist/html/insertions.js +1 -1
  123. package/dist/inspector/agent/McpConnectionDialog.d.ts +1 -6
  124. package/dist/inspector/agent/McpConnectionDialog.js +1 -6
  125. package/dist/inspector/agent/activity.d.ts +1 -1
  126. package/dist/inspector/agent/activity.js +1 -1
  127. package/dist/inspector/agent/client.d.ts +2 -26
  128. package/dist/inspector/agent/client.js +17 -64
  129. package/dist/inspector/agent/connectionStatus.d.ts +0 -1
  130. package/dist/inspector/agent/connectionStatus.js +0 -1
  131. package/dist/inspector/agent/httpTransport.d.ts +0 -8
  132. package/dist/inspector/agent/httpTransport.js +21 -39
  133. package/dist/inspector/agent/protocol.d.ts +1 -10
  134. package/dist/inspector/agent/protocol.js +1 -9
  135. package/dist/inspector/agent/verification.d.ts +2 -19
  136. package/dist/inspector/agent/verification.js +7 -43
  137. package/dist/inspector/boot.d.ts +3 -1
  138. package/dist/inspector/boot.js +12 -20
  139. package/dist/inspector/canvas/AgentActivityOverlay.d.ts +1 -1
  140. package/dist/inspector/canvas/AgentActivityOverlay.js +1 -1
  141. package/dist/inspector/canvas/CanvasCard.js +7 -14
  142. package/dist/inspector/canvas/CanvasElementOverlay.js +117 -50
  143. package/dist/inspector/canvas/CanvasWorkspace.js +15 -29
  144. package/dist/inspector/canvas/PageCard.d.ts +0 -1
  145. package/dist/inspector/canvas/PageCard.js +0 -1
  146. package/dist/inspector/canvas/SketchToolOptions.d.ts +0 -1
  147. package/dist/inspector/canvas/SketchToolOptions.js +0 -6
  148. package/dist/inspector/canvas/ToolOptionsDrawer.d.ts +1 -6
  149. package/dist/inspector/canvas/ToolOptionsDrawer.js +2 -8
  150. package/dist/inspector/canvas/activeCanvasDocument.d.ts +0 -2
  151. package/dist/inspector/canvas/activeCanvasDocument.js +0 -2
  152. package/dist/inspector/canvas/agentPresentation.d.ts +2 -13
  153. package/dist/inspector/canvas/agentPresentation.js +3 -14
  154. package/dist/inspector/canvas/canvasFrame.d.ts +2 -6
  155. package/dist/inspector/canvas/canvasFrame.js +1 -2
  156. package/dist/inspector/canvas/canvasResize.d.ts +1 -6
  157. package/dist/inspector/canvas/canvasResize.js +1 -6
  158. package/dist/inspector/canvas/canvasStore.d.ts +4 -12
  159. package/dist/inspector/canvas/canvasStore.js +12 -26
  160. package/dist/inspector/canvas/frameConnection.d.ts +1 -7
  161. package/dist/inspector/canvas/frameContent.d.ts +0 -1
  162. package/dist/inspector/canvas/frameLifecycle.d.ts +12 -0
  163. package/dist/inspector/canvas/frameLifecycle.js +11 -0
  164. package/dist/inspector/canvas/frameProtocol.d.ts +5 -40
  165. package/dist/inspector/canvas/frameProtocol.js +1 -24
  166. package/dist/inspector/canvas/frameScrollbarStyles.d.ts +0 -1
  167. package/dist/inspector/canvas/frameScrollbarStyles.js +0 -1
  168. package/dist/inspector/canvas/layout.d.ts +10 -22
  169. package/dist/inspector/canvas/layout.js +0 -3
  170. package/dist/inspector/canvas/normalizeUrl.js +1 -8
  171. package/dist/inspector/canvas/pageSurface.d.ts +1 -6
  172. package/dist/inspector/canvas/pageSurface.js +1 -6
  173. package/dist/inspector/canvas/projection.d.ts +4 -25
  174. package/dist/inspector/canvas/projection.js +22 -72
  175. package/dist/inspector/canvas/rendererBootstrap.d.ts +8 -1
  176. package/dist/inspector/canvas/rendererBootstrap.js +6 -14
  177. package/dist/inspector/canvas/rendererCidIndex.d.ts +0 -5
  178. package/dist/inspector/canvas/rendererCidIndex.js +0 -5
  179. package/dist/inspector/canvas/rendererElementSelector.js +29 -27
  180. package/dist/inspector/canvas/rendererMessageRouter.d.ts +0 -1
  181. package/dist/inspector/canvas/rendererMessageRouter.js +0 -1
  182. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +1 -5
  183. package/dist/inspector/canvas/rendererSelectionProxy.js +2 -7
  184. package/dist/inspector/canvas/rendererStylesheet.d.ts +0 -1
  185. package/dist/inspector/canvas/rendererStylesheet.js +9 -2
  186. package/dist/inspector/canvas/resizeHandleScale.d.ts +1 -10
  187. package/dist/inspector/canvas/resizeHandleScale.js +1 -10
  188. package/dist/inspector/canvas/sessionStore.d.ts +1 -7
  189. package/dist/inspector/canvas/sessionStore.js +21 -34
  190. package/dist/inspector/canvas/staleChangeDetector.js +1 -4
  191. package/dist/inspector/canvas/toolbarScale.d.ts +1 -4
  192. package/dist/inspector/canvas/toolbarScale.js +1 -4
  193. package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +0 -1
  194. package/dist/inspector/canvas/useCanvasLayoutAnimation.js +0 -1
  195. package/dist/inspector/canvas/viewStore.js +1 -1
  196. package/dist/inspector/canvas/wheelPan.d.ts +1 -1
  197. package/dist/inspector/canvas/wheelPan.js +1 -1
  198. package/dist/inspector/canvas/workspaceLease.d.ts +1 -5
  199. package/dist/inspector/canvas/workspaceLease.js +1 -7
  200. package/dist/inspector/changes/codecs.js +2 -1
  201. package/dist/inspector/changes/draftPreview.d.ts +1 -6
  202. package/dist/inspector/changes/draftPreview.js +15 -30
  203. package/dist/inspector/changes/editModel.d.ts +3 -13
  204. package/dist/inspector/changes/editModel.js +1 -2
  205. package/dist/inspector/changes/managedStyleProjection.js +4 -14
  206. package/dist/inspector/changes/model.d.ts +0 -5
  207. package/dist/inspector/changes/model.js +1 -8
  208. package/dist/inspector/changes/previewDiagnostics.d.ts +2 -12
  209. package/dist/inspector/changes/previewDiagnostics.js +4 -20
  210. package/dist/inspector/changes/previewVerification.d.ts +25 -0
  211. package/dist/inspector/changes/previewVerification.js +34 -0
  212. package/dist/inspector/changes/structuralTypes.d.ts +2 -4
  213. package/dist/inspector/changes/types.d.ts +3 -10
  214. package/dist/inspector/clientManifest.d.ts +17 -6
  215. package/dist/inspector/clientManifest.js +16 -3
  216. package/dist/inspector/comments/CommentsOverlay.js +48 -7
  217. package/dist/inspector/comments/element.d.ts +1 -2
  218. package/dist/inspector/comments/element.js +1 -2
  219. package/dist/inspector/comments/store.d.ts +1 -1
  220. package/dist/inspector/comments/store.js +1 -1
  221. package/dist/inspector/comments/verification.d.ts +8 -2
  222. package/dist/inspector/comments/verification.js +18 -10
  223. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +8 -0
  224. package/dist/inspector/componentSemantics/ComponentPropsSection.js +10 -7
  225. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +2 -9
  226. package/dist/inspector/componentSemantics/adapterRegistry.js +2 -9
  227. package/dist/inspector/componentSemantics/changeModel.js +2 -4
  228. package/dist/inspector/componentSemantics/react/callsites.d.ts +28 -0
  229. package/dist/inspector/componentSemantics/react/callsites.js +261 -0
  230. package/dist/inspector/componentSemantics/react/devtoolsHook.d.ts +23 -0
  231. package/dist/inspector/componentSemantics/react/devtoolsHook.js +71 -0
  232. package/dist/inspector/componentSemantics/react/fibers.d.ts +17 -0
  233. package/dist/inspector/componentSemantics/react/fibers.js +30 -0
  234. package/dist/inspector/componentSemantics/{reactRuntime.d.ts → react/runtime.d.ts} +3 -2
  235. package/dist/inspector/componentSemantics/{reactRuntime.js → react/runtime.js} +70 -53
  236. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +2 -18
  237. package/dist/inspector/componentSemantics/runtimeBridge.js +5 -19
  238. package/dist/inspector/componentSemantics/textBinding.d.ts +1 -9
  239. package/dist/inspector/componentSemantics/textBinding.js +16 -42
  240. package/dist/inspector/componentSemantics/types.d.ts +8 -27
  241. package/dist/inspector/componentSemantics/types.js +0 -1
  242. package/dist/inspector/conformance/borderCases.d.ts +0 -5
  243. package/dist/inspector/conformance/borderCases.js +0 -5
  244. package/dist/inspector/conformance/colorCases.d.ts +0 -6
  245. package/dist/inspector/conformance/colorCases.js +0 -6
  246. package/dist/inspector/conformance/fixture.d.ts +1 -5
  247. package/dist/inspector/conformance/fixture.js +1 -5
  248. package/dist/inspector/conformance/spacingCases.d.ts +0 -4
  249. package/dist/inspector/conformance/spacingCases.js +0 -4
  250. package/dist/inspector/conformance/typographyCases.d.ts +0 -5
  251. package/dist/inspector/conformance/typographyCases.js +0 -5
  252. package/dist/inspector/drafts/draftStore.d.ts +7 -21
  253. package/dist/inspector/drafts/draftStore.js +15 -5
  254. package/dist/inspector/drafts/model.d.ts +7 -15
  255. package/dist/inspector/drafts/model.js +0 -2
  256. package/dist/inspector/drafts/store.d.ts +1 -8
  257. package/dist/inspector/drafts/store.js +3 -10
  258. package/dist/inspector/editScope.d.ts +0 -1
  259. package/dist/inspector/editScope.js +0 -1
  260. package/dist/inspector/inline-text/inlineTextDiagnostics.d.ts +0 -2
  261. package/dist/inspector/inline-text/inlineTextDiagnostics.js +0 -2
  262. package/dist/inspector/inline-text/inlineTextEditor.d.ts +2 -8
  263. package/dist/inspector/inline-text/inlineTextEditor.js +26 -79
  264. package/dist/inspector/inline-text/inlineTextLifecycle.js +1 -6
  265. package/dist/inspector/inline-text/textEditChange.d.ts +0 -1
  266. package/dist/inspector/inspection/bridge.d.ts +2 -6
  267. package/dist/inspector/inspection/bridge.js +4 -12
  268. package/dist/inspector/inspection/browserCssInspection.d.ts +4 -11
  269. package/dist/inspector/inspection/browserCssInspection.js +4 -8
  270. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +0 -7
  271. package/dist/inspector/inspection/browserCssInspectionRegistry.js +1 -16
  272. package/dist/inspector/inspection/selectionProperty.d.ts +1 -6
  273. package/dist/inspector/inspection/selectionProperty.js +1 -5
  274. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +1 -5
  275. package/dist/inspector/inspection/useBrowserCssInspection.js +5 -21
  276. package/dist/inspector/iterations/capture.d.ts +0 -1
  277. package/dist/inspector/iterations/capture.js +4 -9
  278. package/dist/inspector/iterations/client.d.ts +0 -1
  279. package/dist/inspector/iterations/client.js +0 -1
  280. package/dist/inspector/iterations/coordinator.d.ts +0 -1
  281. package/dist/inspector/iterations/coordinator.js +0 -1
  282. package/dist/inspector/iterations/prompt.d.ts +0 -1
  283. package/dist/inspector/iterations/prompt.js +0 -1
  284. package/dist/inspector/overlay/DomNavigator.d.ts +3 -1
  285. package/dist/inspector/overlay/DomNavigator.js +39 -15
  286. package/dist/inspector/overlay/DropGuideOverlay.d.ts +0 -1
  287. package/dist/inspector/overlay/DropGuideOverlay.js +0 -1
  288. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +1 -8
  289. package/dist/inspector/overlay/MeasurementGuideOverlay.js +1 -5
  290. package/dist/inspector/overlay/clickPolicy.d.ts +3 -14
  291. package/dist/inspector/overlay/clickPolicy.js +3 -14
  292. package/dist/inspector/overlay/dropGuide.d.ts +0 -3
  293. package/dist/inspector/overlay/dropGuide.js +0 -3
  294. package/dist/inspector/overlay/frameThrottle.d.ts +0 -1
  295. package/dist/inspector/overlay/frameThrottle.js +0 -1
  296. package/dist/inspector/overlay/interactionStyles.d.ts +1 -1
  297. package/dist/inspector/overlay/interactionStyles.js +2 -8
  298. package/dist/inspector/overlay/measurementGeometry.js +4 -12
  299. package/dist/inspector/overlay/selectedGeometry.d.ts +1 -6
  300. package/dist/inspector/overlay/selectedGeometry.js +1 -8
  301. package/dist/inspector/overlay/spacingGestures.d.ts +14 -21
  302. package/dist/inspector/overlay/spacingGestures.js +151 -31
  303. package/dist/inspector/overlay/structuralGestures.d.ts +2 -9
  304. package/dist/inspector/overlay/structuralGestures.js +1 -4
  305. package/dist/inspector/pageInspector.d.ts +4 -13
  306. package/dist/inspector/pageInspector.js +25 -32
  307. package/dist/inspector/projection/cssEscapes.d.ts +0 -1
  308. package/dist/inspector/projection/cssEscapes.js +2 -4
  309. package/dist/inspector/projection/draftProjection.d.ts +2 -14
  310. package/dist/inspector/projection/draftProjection.js +1 -8
  311. package/dist/inspector/projection/managedStylesheet.d.ts +1 -7
  312. package/dist/inspector/projection/managedStylesheet.js +4 -22
  313. package/dist/inspector/projection/renderedInstance.d.ts +5 -28
  314. package/dist/inspector/projection/renderedInstance.js +6 -32
  315. package/dist/inspector/projection/structuralProjection.d.ts +7 -39
  316. package/dist/inspector/projection/structuralProjection.js +17 -52
  317. package/dist/inspector/projection/textProjection.d.ts +2 -14
  318. package/dist/inspector/projection/textProjection.js +17 -70
  319. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +0 -1
  320. package/dist/inspector/prompt/PromptSettingsDialog.js +0 -1
  321. package/dist/inspector/prompt/clipboardHandoff.d.ts +1 -9
  322. package/dist/inspector/prompt/clipboardHandoff.js +1 -9
  323. package/dist/inspector/prompt/generatePrompt.d.ts +1 -1
  324. package/dist/inspector/prompt/generatePrompt.js +10 -25
  325. package/dist/inspector/prompt/promptSettings.d.ts +0 -3
  326. package/dist/inspector/prompt/promptSettings.js +0 -3
  327. package/dist/inspector/runtime/devFlag.d.ts +2 -25
  328. package/dist/inspector/runtime/devFlag.js +4 -31
  329. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +0 -2
  330. package/dist/inspector/runtime/editorShell.d.ts +0 -1
  331. package/dist/inspector/runtime/editorShell.js +0 -1
  332. package/dist/inspector/runtime/inspectorStorage.d.ts +1 -7
  333. package/dist/inspector/runtime/inspectorStorage.js +1 -6
  334. package/dist/inspector/runtime/ownedStylesheets.d.ts +2 -8
  335. package/dist/inspector/runtime/ownedStylesheets.js +2 -8
  336. package/dist/inspector/runtime/runtimeConfig.d.ts +12 -86
  337. package/dist/inspector/runtime/runtimeConfig.js +9 -50
  338. package/dist/inspector/runtime/runtimeIdentityClaims.d.ts +3 -13
  339. package/dist/inspector/runtime/runtimeIdentityClaims.js +9 -19
  340. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +4 -36
  341. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +7 -40
  342. package/dist/inspector/runtime/useRuntimeConfig.d.ts +1 -8
  343. package/dist/inspector/runtime/useRuntimeConfig.js +1 -8
  344. package/dist/inspector/selection/editScope.d.ts +1 -7
  345. package/dist/inspector/selection/editScope.js +2 -12
  346. package/dist/inspector/selection/editTarget.d.ts +1 -5
  347. package/dist/inspector/selection/hierarchy.d.ts +11 -11
  348. package/dist/inspector/selection/hierarchy.js +42 -24
  349. package/dist/inspector/selection/selectionStore.d.ts +0 -3
  350. package/dist/inspector/selection/selectionStore.js +5 -16
  351. package/dist/inspector/selection/sourceSite.d.ts +1 -5
  352. package/dist/inspector/selection/sourceSite.js +2 -8
  353. package/dist/inspector/selection/styleSelection.d.ts +1 -5
  354. package/dist/inspector/selection/styleSelection.js +1 -5
  355. package/dist/inspector/session/lifecycle.d.ts +1 -9
  356. package/dist/inspector/session/lifecycle.js +0 -1
  357. package/dist/inspector/session/sessionContext.d.ts +0 -4
  358. package/dist/inspector/session/sessionContext.js +0 -4
  359. package/dist/inspector/session/sessionFactory.d.ts +0 -9
  360. package/dist/inspector/session/sessionFactory.js +0 -6
  361. package/dist/inspector/settings/SettingsDialog.d.ts +0 -1
  362. package/dist/inspector/settings/SettingsDialog.js +5 -3
  363. package/dist/inspector/shell/AgentStatusButton.d.ts +3 -2
  364. package/dist/inspector/shell/AgentStatusButton.js +5 -5
  365. package/dist/inspector/shell/ChangesLog.js +3 -4
  366. package/dist/inspector/shell/CopyPromptButton.d.ts +2 -1
  367. package/dist/inspector/shell/CopyPromptButton.js +12 -11
  368. package/dist/inspector/shell/InspectorEditors.d.ts +16 -0
  369. package/dist/inspector/shell/InspectorEditors.js +14 -0
  370. package/dist/inspector/shell/InspectorPanel.d.ts +12 -0
  371. package/dist/inspector/shell/InspectorPanel.js +8 -0
  372. package/dist/inspector/shell/InspectorSelection.d.ts +24 -0
  373. package/dist/inspector/shell/InspectorSelection.js +20 -0
  374. package/dist/inspector/shell/InspectorShell.js +26 -48
  375. package/dist/inspector/shell/NudgeLogoIcon.d.ts +5 -0
  376. package/dist/inspector/shell/NudgeLogoIcon.js +5 -0
  377. package/dist/inspector/shell/PeekOriginalButton.d.ts +0 -5
  378. package/dist/inspector/shell/PeekOriginalButton.js +0 -5
  379. package/dist/inspector/shell/PeekOriginalIcon.d.ts +0 -5
  380. package/dist/inspector/shell/PeekOriginalIcon.js +0 -5
  381. package/dist/inspector/shell/PromptActionButton.d.ts +21 -0
  382. package/dist/inspector/shell/PromptActionButton.js +14 -0
  383. package/dist/inspector/shell/elementName.d.ts +5 -0
  384. package/dist/inspector/shell/elementName.js +29 -0
  385. package/dist/inspector/shell/interactionStatePreview.d.ts +1 -4
  386. package/dist/inspector/shell/interactionStatePreview.js +3 -8
  387. package/dist/inspector/shell/originalPreview.d.ts +1 -6
  388. package/dist/inspector/shell/originalPreview.js +1 -6
  389. package/dist/inspector/shell/stateValue.d.ts +1 -2
  390. package/dist/inspector/shell/stateValue.js +2 -5
  391. package/dist/inspector/shell/styleState.d.ts +1 -2
  392. package/dist/inspector/shell/styleState.js +1 -2
  393. package/dist/inspector/sketch/SketchEditor.js +0 -1
  394. package/dist/inspector/sketch/SketchFrameOverlay.js +8 -12
  395. package/dist/inspector/sketch/SketchOverlay.js +5 -6
  396. package/dist/inspector/sketch/SketchPromptPanel.d.ts +0 -1
  397. package/dist/inspector/sketch/SketchPromptPanel.js +0 -1
  398. package/dist/inspector/sketch/SketchWorkspace.js +2 -4
  399. package/dist/inspector/sketch/capture.d.ts +12 -3
  400. package/dist/inspector/sketch/capture.js +12 -11
  401. package/dist/inspector/sketch/copySketch.d.ts +1 -7
  402. package/dist/inspector/sketch/copySketch.js +2 -11
  403. package/dist/inspector/sketch/drawingTools.d.ts +1 -3
  404. package/dist/inspector/sketch/drawingTools.js +1 -2
  405. package/dist/inspector/sketch/frameHeading.d.ts +1 -7
  406. package/dist/inspector/sketch/frameHeading.js +1 -8
  407. package/dist/inspector/sketch/freehand.d.ts +0 -1
  408. package/dist/inspector/sketch/freehand.js +0 -1
  409. package/dist/inspector/sketch/geometry.d.ts +1 -6
  410. package/dist/inspector/sketch/geometry.js +1 -6
  411. package/dist/inspector/sketch/handoff.js +0 -1
  412. package/dist/inspector/sketch/history.d.ts +1 -5
  413. package/dist/inspector/sketch/history.js +1 -4
  414. package/dist/inspector/sketch/interaction.d.ts +2 -2
  415. package/dist/inspector/sketch/interaction.js +2 -2
  416. package/dist/inspector/sketch/model.d.ts +2 -9
  417. package/dist/inspector/sketch/model.js +2 -19
  418. package/dist/inspector/sketch/persistence.d.ts +0 -1
  419. package/dist/inspector/sketch/persistence.js +2 -2
  420. package/dist/inspector/sketch/raster.d.ts +1 -4
  421. package/dist/inspector/sketch/raster.js +2 -8
  422. package/dist/inspector/sketch/store.js +2 -3
  423. package/dist/inspector/sketch/videoFrames.js +2 -3
  424. package/dist/inspector/spacing/projection.d.ts +0 -8
  425. package/dist/inspector/spacing/projection.js +38 -20
  426. package/dist/inspector/styleEditors/BackgroundEditor.js +1 -1
  427. package/dist/inspector/styleEditors/BorderEditor.js +1 -6
  428. package/dist/inspector/styleEditors/ChildPlacement.d.ts +12 -0
  429. package/dist/inspector/styleEditors/ChildPlacement.js +9 -0
  430. package/dist/inspector/styleEditors/FlexControls.d.ts +35 -0
  431. package/dist/inspector/styleEditors/FlexControls.js +158 -0
  432. package/dist/inspector/styleEditors/GapField.d.ts +5 -2
  433. package/dist/inspector/styleEditors/GapField.js +3 -4
  434. package/dist/inspector/styleEditors/GridChildSection.d.ts +0 -5
  435. package/dist/inspector/styleEditors/GridChildSection.js +0 -5
  436. package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
  437. package/dist/inspector/styleEditors/GridPicker.js +2 -4
  438. package/dist/inspector/styleEditors/GridSection.d.ts +10 -8
  439. package/dist/inspector/styleEditors/GridSection.js +22 -9
  440. package/dist/inspector/styleEditors/GridValueField.d.ts +1 -5
  441. package/dist/inspector/styleEditors/GridValueField.js +2 -8
  442. package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +0 -1
  443. package/dist/inspector/styleEditors/ImageBackgroundEditor.js +0 -1
  444. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +0 -1
  445. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +0 -1
  446. package/dist/inspector/styleEditors/LayoutComboField.js +0 -5
  447. package/dist/inspector/styleEditors/LayoutModeRow.d.ts +14 -0
  448. package/dist/inspector/styleEditors/LayoutModeRow.js +60 -0
  449. package/dist/inspector/styleEditors/LayoutSection.d.ts +2 -2
  450. package/dist/inspector/styleEditors/LayoutSection.js +30 -356
  451. package/dist/inspector/styleEditors/OpacityEditor.js +7 -5
  452. package/dist/inspector/styleEditors/PositionControls.d.ts +18 -0
  453. package/dist/inspector/styleEditors/PositionControls.js +16 -0
  454. package/dist/inspector/styleEditors/SizeSection.d.ts +18 -0
  455. package/dist/inspector/styleEditors/SizeSection.js +71 -0
  456. package/dist/inspector/styleEditors/{SpacingBox.d.ts → SpacingField.d.ts} +3 -10
  457. package/dist/inspector/styleEditors/{SpacingBox.js → SpacingField.js} +15 -29
  458. package/dist/inspector/styleEditors/Typography.js +2 -4
  459. package/dist/inspector/styleEditors/borderModel.d.ts +1 -7
  460. package/dist/inspector/styleEditors/borderModel.js +2 -11
  461. package/dist/inspector/styleEditors/completeCssValue.d.ts +1 -5
  462. package/dist/inspector/styleEditors/completeCssValue.js +3 -13
  463. package/dist/inspector/styleEditors/fieldValue.d.ts +20 -0
  464. package/dist/inspector/styleEditors/fieldValue.js +26 -0
  465. package/dist/inspector/styleEditors/gradientValue.d.ts +1 -1
  466. package/dist/inspector/styleEditors/gradientValue.js +3 -2
  467. package/dist/inspector/styleEditors/gridChildModel.d.ts +7 -47
  468. package/dist/inspector/styleEditors/gridChildModel.js +6 -37
  469. package/dist/inspector/styleEditors/hiddenSizeOverrides.d.ts +5 -0
  470. package/dist/inspector/styleEditors/hiddenSizeOverrides.js +42 -0
  471. package/dist/inspector/styleEditors/inlineAuthored.d.ts +1 -8
  472. package/dist/inspector/styleEditors/inlineAuthored.js +3 -17
  473. package/dist/inspector/styleEditors/layoutMode.d.ts +15 -0
  474. package/dist/inspector/styleEditors/layoutMode.js +33 -0
  475. package/dist/inspector/styleEditors/layoutPreviewState.d.ts +0 -1
  476. package/dist/inspector/styleEditors/layoutPreviewState.js +0 -1
  477. package/dist/inspector/styleEditors/layoutValue.d.ts +2 -8
  478. package/dist/inspector/styleEditors/layoutValue.js +4 -12
  479. package/dist/inspector/styleEditors/nudgeValue.d.ts +1 -13
  480. package/dist/inspector/styleEditors/nudgeValue.js +1 -13
  481. package/dist/inspector/styleEditors/rowLookup.d.ts +1 -5
  482. package/dist/inspector/styleEditors/rowLookup.js +1 -5
  483. package/dist/inspector/styleEditors/stringRecord.d.ts +1 -2
  484. package/dist/inspector/styleEditors/stylePresence.d.ts +0 -2
  485. package/dist/inspector/styleEditors/stylePresence.js +1 -4
  486. package/dist/inspector/styleEditors/textRelevance.d.ts +1 -1
  487. package/dist/inspector/styleEditors/textRelevance.js +1 -1
  488. package/dist/inspector/styleEditors/useFieldVisibility.js +1 -2
  489. package/dist/inspector/styleEditors/useLayoutContext.d.ts +13 -0
  490. package/dist/inspector/styleEditors/useLayoutContext.js +53 -0
  491. package/dist/inspector/styleEditors/valuePolicy.d.ts +1 -5
  492. package/dist/inspector/styleEditors/valuePolicy.js +0 -1
  493. package/dist/inspector/testing.d.ts +1 -4
  494. package/dist/inspector/testing.js +1 -4
  495. package/dist/inspector/tokens/TokenChip.d.ts +1 -4
  496. package/dist/inspector/tokens/TokenChip.js +1 -4
  497. package/dist/inspector/tokens/TokenField.d.ts +4 -3
  498. package/dist/inspector/tokens/TokenField.js +19 -29
  499. package/dist/inspector/tokens/catalog.d.ts +2 -10
  500. package/dist/inspector/tokens/catalog.js +5 -12
  501. package/dist/inspector/tokens/dragPointerLock.d.ts +0 -1
  502. package/dist/inspector/tokens/dragPointerLock.js +2 -3
  503. package/dist/inspector/tokens/editActions.d.ts +1 -1
  504. package/dist/inspector/tokens/editActions.js +2 -4
  505. package/dist/inspector/tokens/resolution/cascade.d.ts +1 -5
  506. package/dist/inspector/tokens/resolution/cascade.js +1 -5
  507. package/dist/inspector/tokens/resolution/containerQueryEvaluator.d.ts +1 -5
  508. package/dist/inspector/tokens/resolution/containerQueryEvaluator.js +1 -5
  509. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +4 -19
  510. package/dist/inspector/tokens/resolution/cssomCollector.js +151 -122
  511. package/dist/inspector/tokens/resolution/nestedSelectors.d.ts +1 -5
  512. package/dist/inspector/tokens/resolution/nestedSelectors.js +1 -5
  513. package/dist/inspector/tokens/resolution/ruleMatching.d.ts +4 -14
  514. package/dist/inspector/tokens/resolution/ruleMatching.js +121 -67
  515. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +3 -14
  516. package/dist/inspector/tokens/resolution/selectorSemantics.js +12 -27
  517. package/dist/inspector/tokens/resolution.d.ts +5 -24
  518. package/dist/inspector/tokens/resolution.js +16 -71
  519. package/dist/inspector/tokens/tokenAvailability.d.ts +2 -14
  520. package/dist/inspector/tokens/tokenAvailability.js +6 -38
  521. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +0 -1
  522. package/dist/inspector/tokens/valueSemanticsAdapter.js +18 -2
  523. package/dist/inspector/ui/AtRuleContext.d.ts +5 -5
  524. package/dist/inspector/ui/AtRuleContext.js +8 -6
  525. package/dist/inspector/ui/ControlSurface.d.ts +0 -4
  526. package/dist/inspector/ui/Disclosure.d.ts +0 -5
  527. package/dist/inspector/ui/Disclosure.js +0 -4
  528. package/dist/inspector/ui/InlineStyleWarning.d.ts +0 -1
  529. package/dist/inspector/ui/InspectorPopover.d.ts +1 -5
  530. package/dist/inspector/ui/InspectorPopover.js +1 -5
  531. package/dist/inspector/ui/SegmentedControl.d.ts +4 -4
  532. package/dist/inspector/ui/SegmentedControl.js +6 -4
  533. package/dist/inspector/ui/SideValuesField.d.ts +1 -6
  534. package/dist/inspector/ui/SideValuesField.js +2 -8
  535. package/dist/inspector/ui/Toast.d.ts +0 -4
  536. package/dist/inspector/ui/Toast.js +0 -4
  537. package/dist/inspector/ui/atRuleSegments.d.ts +13 -0
  538. package/dist/inspector/ui/atRuleSegments.js +34 -0
  539. package/dist/inspector/ui/classNames.d.ts +0 -1
  540. package/dist/inspector/ui/classNames.js +0 -1
  541. package/dist/inspector/ui/customCursors.d.ts +7 -1
  542. package/dist/inspector/ui/customCursors.js +2 -6
  543. package/dist/inspector/ui/styles.js +18 -20
  544. package/dist/inspector/workspace/controller.js +20 -1
  545. package/dist/inspector/workspace/handoff.d.ts +1 -5
  546. package/dist/inspector/workspace/handoff.js +1 -5
  547. package/dist/inspector/workspace/timeline.d.ts +5 -2
  548. package/dist/inspector/workspace/timeline.js +0 -1
  549. package/dist/internal/agent-protocol.d.ts +20 -42
  550. package/dist/internal/agent-protocol.js +18 -35
  551. package/dist/nudge-ui.mjs +75 -28
  552. package/dist/project/artifacts.js +24 -21
  553. package/dist/project/files.d.ts +0 -1
  554. package/dist/project/files.js +2 -9
  555. package/dist/project/identity.d.ts +1 -5
  556. package/dist/project/identity.js +1 -5
  557. package/dist/project/mcpPackage.d.ts +1 -6
  558. package/dist/project/mcpPackage.js +2 -7
  559. package/dist/project/pathPolicy.d.ts +1 -6
  560. package/dist/project/pathPolicy.js +1 -6
  561. package/dist/project/tokens.d.ts +2 -12
  562. package/dist/project/tokens.js +4 -15
  563. package/dist/transport/editor.d.ts +1 -12
  564. package/dist/transport/editor.js +2 -13
  565. package/dist/transport/index.d.ts +0 -5
  566. package/dist/transport/index.js +0 -5
  567. package/dist/transport/routes.d.ts +0 -5
  568. package/dist/transport/routes.js +0 -5
  569. package/package.json +5 -4
  570. package/dist/inspector/styleEditors/InsetSection.d.ts +0 -15
  571. package/dist/inspector/styleEditors/InsetSection.js +0 -15
  572. package/dist/inspector/styleEditors/PositionInsets.d.ts +0 -15
  573. package/dist/inspector/styleEditors/PositionInsets.js +0 -12
  574. package/dist/inspector/tokens/TokenDropdown.d.ts +0 -13
  575. package/dist/inspector/tokens/TokenDropdown.js +0 -59
@@ -0,0 +1,12 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ export interface InspectorPanelProps {
3
+ readonly isOpen: boolean;
4
+ readonly collapseDisabled?: boolean;
5
+ readonly toggleShortcut?: string;
6
+ readonly headerActions: ReactNode;
7
+ readonly prompt: ReactNode;
8
+ readonly children: ReactNode;
9
+ readonly onOpenChange: (open: boolean) => void;
10
+ }
11
+ /** Shared panel layout. The host supplies state, content, and commands. */
12
+ export declare function InspectorPanel({ isOpen, collapseDisabled, toggleShortcut, headerActions, prompt, children, onOpenChange }: InspectorPanelProps): ReactElement;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { IconLayoutSidebarRight } from "@tabler/icons-react";
3
+ import { IconButton } from "../ui/IconButton.js";
4
+ import { Tooltip } from "../ui/Tooltip.js";
5
+ /** Shared panel layout. The host supplies state, content, and commands. */
6
+ export function InspectorPanel({ isOpen, collapseDisabled, toggleShortcut, headerActions, prompt, children, onOpenChange }) {
7
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "panel", "data-open": isOpen ? "true" : "false", children: [_jsxs("div", { className: "panel__tabs", "aria-label": "Inspector controls", children: [_jsxs("div", { className: "panel__header-row", "data-test": "inspect-tab", children: [_jsx(Tooltip, { content: "Hide inspector", shortcut: toggleShortcut, stableTrigger: true, children: _jsx(IconButton, { variant: "quiet", label: "Collapse inspector", "data-test": "collapse-inspector", disabled: collapseDisabled, style: { marginLeft: "calc(var(--space-8) * -1)" }, onClick: () => onOpenChange(false), children: _jsx(IconLayoutSidebarRight, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) }) }), _jsx("div", { className: "panel__header-actions", children: headerActions })] }), _jsx("div", { className: "panel__copy-row", children: prompt })] }), _jsx("div", { className: "panel__body", children: children })] }), !isOpen ? (_jsx("div", { className: "panel__restore", children: _jsx(Tooltip, { children: _jsx(IconButton, { variant: "quiet", label: "Show inspector", className: "panel__restore-button", "data-test": "show-inspector", onClick: () => onOpenChange(true), children: _jsx(IconLayoutSidebarRight, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) }) }) })) : null] }));
8
+ }
@@ -0,0 +1,24 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ import type { InteractionState } from "./styleState.js";
3
+ import type { ElementName } from "./elementName.js";
4
+ export interface InspectorSelectionProps {
5
+ readonly identity?: {
6
+ readonly cid: string;
7
+ readonly src: string;
8
+ };
9
+ readonly count: number;
10
+ readonly name: ElementName | null;
11
+ /** The selection has editable component props, which links it like a shared source site does. */
12
+ readonly isComponent?: boolean;
13
+ /** Component props, shown between the name and the link status. */
14
+ readonly children?: ReactNode;
15
+ readonly editScope: "source-site" | "rendered-instance" | null;
16
+ readonly sourceSiteMatchCount: number;
17
+ readonly styleState: InteractionState;
18
+ readonly availableInteractionStates: readonly InteractionState[];
19
+ readonly onStyleStateChange: (state: InteractionState) => void;
20
+ readonly onRelink: () => void;
21
+ readonly onUnlink: () => void;
22
+ }
23
+ /** Presents selection scope and interaction states without reading the DOM. */
24
+ export declare function InspectorSelection({ identity, count, name, isComponent, children, editScope, sourceSiteMatchCount, styleState, availableInteractionStates, onStyleStateChange, onRelink, onUnlink }: InspectorSelectionProps): ReactElement;
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { StatusCallout } from "../ui/StatusCallout.js";
3
+ import { IconLink, IconSquareRotated, IconUnlink } from "@tabler/icons-react";
4
+ import { IconButton } from "../ui/IconButton.js";
5
+ import { FieldRow } from "../ui/FieldRow.js";
6
+ import { Select } from "../ui/Select.js";
7
+ import { formatInspectorLabel } from "../ui/labels.js";
8
+ /** Presents selection scope and interaction states without reading the DOM. */
9
+ export function InspectorSelection({ identity, count, name, isComponent = false, children, editScope, sourceSiteMatchCount, styleState, availableInteractionStates, onStyleStateChange, onRelink, onUnlink }) {
10
+ const showInteractionState = count === 1 && availableInteractionStates.length > 1;
11
+ const hasEditScopeCallout = count === 1 && (editScope === "rendered-instance" || sourceSiteMatchCount > 1);
12
+ return _jsx(_Fragment, { children: name || children || showInteractionState || hasEditScopeCallout ? (_jsxs("div", { className: `selection${hasEditScopeCallout ? "" : " selection--without-scope-callout"}`, "data-test": "selection", "data-selected-cid": identity?.cid, "data-selected-src": identity?.src, "data-selected-count": count, children: [name ? (_jsxs("div", { className: "editor__title-row selection__name", "data-test": "selection-name", children: [isComponent || (hasEditScopeCallout && editScope === "source-site") ? (_jsx(IconSquareRotated, { className: "selection__linked-icon", size: 14, stroke: 2, "aria-hidden": "true", "data-test": "selection-linked-icon" })) : null, _jsx("div", { className: "editor__title", children: name.title }), hasEditScopeCallout ? (_jsx(StatusCallout, { tone: editScope === "rendered-instance" ? "neutral" : "accent", className: "selection__scope", "data-test": "edit-scope", "data-lost": "false", children: editScope === "rendered-instance" ? (_jsxs("div", { className: "scope__unlinked", children: [_jsx("span", { children: "Unlinked" }), _jsx(IconButton, { variant: "quiet", label: "Relink element", className: "scope__action", "data-test": "relink-element", onClick: onRelink, children: _jsx(IconLink, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) })] })) : (_jsxs("div", { className: "scope__linked", children: [_jsxs("span", { children: ["Linked (", sourceSiteMatchCount, ")"] }), _jsx(IconButton, { variant: "quiet", label: "Unlink element", "data-test": "unlink-element", onClick: onUnlink, children: _jsx(IconUnlink, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) })] })) })) : null] })) : null, children, showInteractionState ? (_jsx(FieldRow, { label: "State", className: "style-state", "data-test": "style-state", children: _jsx(Select, { value: styleState, "data-test": "style-state-select", "aria-label": "Style State", options: availableInteractionStates.map((state) => ({
13
+ value: state,
14
+ label: formatInspectorLabel(state),
15
+ })), onValueChange: (state) => {
16
+ const next = availableInteractionStates.find((candidate) => candidate === state);
17
+ if (next)
18
+ onStyleStateChange(next);
19
+ } }) })) : null] })) : null });
20
+ }
@@ -1,37 +1,28 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { InspectorPanel } from "./InspectorPanel.js";
3
+ import { InspectorSelection } from "./InspectorSelection.js";
4
+ import { describeElement } from "./elementName.js";
5
+ import { InspectorEditors } from "./InspectorEditors.js";
2
6
  import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
3
- import { IconLayoutSidebarRight } from "@tabler/icons-react";
4
7
  import { useInspectorOpen, setInspectorOpen } from "./openStore.js";
5
8
  import { useSelectedElement, useSelectedElements, setSelectedElement, removeSelectedElement, } from "../selection/selectionStore.js";
6
9
  import { findTokenRow } from "../styleEditors/rowLookup.js";
7
10
  import { useBrowserCssInspection } from "../inspection/useBrowserCssInspection.js";
8
11
  import { resolveSelectionFromElement } from "../selection/resolveSelection.js";
9
12
  import { AgentStatusButton } from "./AgentStatusButton.js";
10
- import { SpacingBox } from "../styleEditors/SpacingBox.js";
11
- import { Typography } from "../styleEditors/Typography.js";
12
13
  import { isTextRelevant } from "../styleEditors/textRelevance.js";
13
- import { BackgroundEditor } from "../styleEditors/BackgroundEditor.js";
14
- import { ColorPicker } from "../styleEditors/ColorPicker.js";
15
- import { BorderEditor } from "../styleEditors/BorderEditor.js";
16
- import { AppearanceSection } from "../styleEditors/AppearanceSection.js";
17
- import { BoxShadowEditor } from "../styleEditors/BoxShadowEditor.js";
18
- import { LayoutSection } from "../styleEditors/LayoutSection.js";
19
14
  import { ChangesLog } from "./ChangesLog.js";
20
15
  import { discardChangesForInstanceOverride, undo, redo } from "../drafts/store.js";
21
16
  import { countSourceSiteMatches, getEditScope, relinkElement, sourceSiteSelector, unlinkElement } from "../selection/editScope.js";
22
17
  import { canEditStyles } from "../tokens/editActions.js";
23
- import { Button } from "../ui/Button.js";
24
18
  import { CopyPromptButton } from "./CopyPromptButton.js";
25
19
  import { PeekOriginalButton } from "./PeekOriginalButton.js";
20
+ import { NudgeLogoIcon } from "./NudgeLogoIcon.js";
26
21
  import { StatusCallout } from "../ui/StatusCallout.js";
27
- import { IconButton } from "../ui/IconButton.js";
28
22
  import { UI_STYLES } from "../ui/styles.js";
29
23
  import { getActiveStyleState, setActiveStyleState } from "./styleState.js";
30
24
  import { useInteractionStatePreview } from "./interactionStatePreview.js";
31
25
  import { getInspectorToggleShortcutLabel, isEditableEvent } from "./shortcuts.js";
32
- import { formatInspectorLabel } from "../ui/labels.js";
33
- import { FieldRow } from "../ui/FieldRow.js";
34
- import { Select } from "../ui/Select.js";
35
26
  import { clearSelectedFrameChanges } from "../canvas/sessionStore.js";
36
27
  import { useFocusedCardId, useSelectedCardId, } from "../canvas/canvasStore.js";
37
28
  import { getActiveCanvasFrame } from "../canvas/activeCanvasDocument.js";
@@ -39,8 +30,7 @@ import { canvasFrameHost } from "../canvas/canvasFrame.js";
39
30
  import { getFrameRegistryVersion, subscribeFrameRegistry } from "../canvas/projection.js";
40
31
  import { getElementWindow } from "../runtime/domRealm.js";
41
32
  import { deleteElement, nudgeElement } from "../overlay/structuralGestures.js";
42
- import { AtRuleContextProvider } from "../ui/AtRuleContext.js";
43
- import { ComponentPropsSection } from "../componentSemantics/ComponentPropsSection.js";
33
+ import { ComponentPropsSection, useComponentProps } from "../componentSemantics/ComponentPropsSection.js";
44
34
  import { cancelInlineTextEdit, isInlineTextEditingActive, useInlineTextDiagnostic, } from "../inline-text/inlineTextEditor.js";
45
35
  import { getInlineTextFeedback } from "../inline-text/inlineTextFeedback.js";
46
36
  import { useNudgeUiRuntimeConfig } from "../runtime/useRuntimeConfig.js";
@@ -51,7 +41,6 @@ import { isNudgeUiDev } from "../runtime/devFlag.js";
51
41
  import { isDemoRuntime, isNudgeUiFeatureEnabled } from "../runtime/runtimeConfig.js";
52
42
  import { SketchWorkspace } from "../sketch/SketchWorkspace.js";
53
43
  import { useSketchInteractionActive } from "../sketch/interaction.js";
54
- import { Tooltip } from "../ui/Tooltip.js";
55
44
  import { InspectorStyle } from "../ui/InspectorStyle.js";
56
45
  function findFirstTokenRow(rows, properties) {
57
46
  for (const property of properties) {
@@ -101,6 +90,7 @@ export function InspectorShell() {
101
90
  const sketchHost = selectedCardId || focusedCardId ? canvasFrameHost(getActiveCanvasFrame()) : null;
102
91
  const selected = useSelectedElement();
103
92
  const selectedElements = useSelectedElements();
93
+ const componentProps = useComponentProps(selected);
104
94
  const inlineTextFeedback = getInlineTextFeedback(useInlineTextDiagnostic());
105
95
  const [settingsOpen, setSettingsOpen] = useState(false);
106
96
  const [settingsSection, setSettingsSection] = useState("instructions");
@@ -110,17 +100,14 @@ export function InspectorShell() {
110
100
  const cssInspection = useBrowserCssInspection(selectedElements, styleState);
111
101
  const isMultiSelection = selectedElements.length > 1;
112
102
  useEffect(() => {
113
- // A new selection should never inherit an incidental state from the
114
- // previous element. Base is the inspector's deliberate default.
103
+ // A new selection must not inherit an incidental state from the previous element; base is the deliberate default.
115
104
  setActiveStyleState("base");
116
105
  setStyleState("base");
117
106
  }, [selected?.domElement, isMultiSelection]);
118
107
  useEffect(() => {
119
108
  if (!selected)
120
109
  return;
121
- // The selected element can live inside a card iframe (canvas mode); observe
122
- // its own ownerDocument rather than the parent app's document, otherwise
123
- // removal inside the iframe would never be noticed.
110
+ // In canvas mode the element can live in a card iframe, so observe its ownerDocument, not the parent app's.
124
111
  const observers = [];
125
112
  const roots = new Map();
126
113
  for (const target of selectedElements) {
@@ -184,8 +171,7 @@ export function InspectorShell() {
184
171
  setSelectedElement(null);
185
172
  return;
186
173
  }
187
- // macOS labels the physical Backspace key as Delete, while browsers
188
- // report it as "Backspace". Support both without stealing text edits.
174
+ // macOS labels the physical Backspace key as Delete; browsers report "Backspace". Support both.
189
175
  if (event.key === "Delete" || event.key === "Backspace") {
190
176
  event.preventDefault();
191
177
  if (!isMultiSelection && deleteElement(selected))
@@ -212,7 +198,6 @@ export function InspectorShell() {
212
198
  const tokenRows = useMemo(() => styleSelection ? [...styleSelection.primaryRows] : [], [styleSelection]);
213
199
  const availableInteractionStates = inspectionSnapshot?.availableStates ?? [];
214
200
  const showText = selectedElements.length > 0 && selectedElements.every((element, index) => isTextRelevant(element.domElement, cssInspection.elements[index]?.properties ?? []));
215
- const showInteractionState = !isMultiSelection && availableInteractionStates.length > 1;
216
201
  const paintedBackgroundRow = findFirstTokenRow(tokenRows, ["background-color", "background"]);
217
202
  const backgroundTokenRow = useMemo(() => {
218
203
  if (!selected)
@@ -227,8 +212,6 @@ export function InspectorShell() {
227
212
  const sourceSiteMatchCount = selected && editScope === "source-site"
228
213
  ? countSourceSiteMatches(selected.domElement, scopeRevision)
229
214
  : 0;
230
- const hasEditScopeCallout = !isMultiSelection
231
- && (editScope === "rendered-instance" || sourceSiteMatchCount > 1);
232
215
  function refreshScopeState() {
233
216
  refreshScope((revision) => revision + 1);
234
217
  }
@@ -240,25 +223,20 @@ export function InspectorShell() {
240
223
  // Sketch persistence failures are reported by the sketch store in the panel.
241
224
  void clearSelectedFrameChanges().catch(() => undefined);
242
225
  }
243
- return (_jsxs(_Fragment, { children: [_jsx(InspectorStyle, { testId: "inspector-styles", css: UI_STYLES }), _jsxs("div", { className: "panel", "data-open": isOpen ? "true" : "false", children: [_jsxs("div", { className: "panel__tabs", "aria-label": "Inspector controls", children: [_jsxs("div", { className: "panel__header-row", "data-test": "inspect-tab", children: [_jsx(Tooltip, { content: "Hide inspector", shortcut: getInspectorToggleShortcutLabel(), stableTrigger: true, children: _jsx(IconButton, { variant: "quiet", label: "Collapse inspector", "data-test": "collapse-inspector", disabled: sketchActive, style: { marginLeft: "calc(var(--space-8) * -1)" }, onClick: () => {
244
- cancelInlineTextEdit();
245
- setInspectorOpen(false);
246
- }, children: _jsx(IconLayoutSidebarRight, { size: "var(--icon-size-small)", stroke: 1.8, "aria-hidden": "true" }) }) }), _jsxs("div", { className: "panel__header-actions", children: [_jsx(PeekOriginalButton, {}), _jsx(AgentStatusButton, { onOpenSettings: openSettings })] })] }), _jsx("div", { className: "panel__copy-row", children: _jsx(CopyPromptButton, { settingsOpen: settingsOpen, settingsSection: settingsSection, onOpenSettings: openSettings, onSettingsOpenChange: setSettingsOpen }) })] }), _jsxs("div", { className: "panel__body", children: [inlineTextFeedback ? (_jsx(StatusCallout, { tone: "danger", className: "inline-text-diagnostic", "data-test": "inline-text-diagnostic", role: "status", "aria-live": "polite", "aria-atomic": "true", children: _jsx("span", { children: inlineTextFeedback.message }) })) : null, runtimeConfig.inspectionUnavailableReason ? (_jsxs(StatusCallout, { tone: "danger", "data-test": "page-inspection-error", role: "status", children: ["Can\u2019t load Nudge on this page due to ", runtimeConfig.inspectionUnavailableReason, "."] })) : selected ? (_jsxs(_Fragment, { children: [showInteractionState || hasEditScopeCallout ? (_jsxs("div", { className: `selection${hasEditScopeCallout ? "" : " selection--without-scope-callout"}`, "data-test": "selection", "data-selected-cid": selected.cid, "data-selected-src": selected.src, "data-selected-count": selectedElements.length, children: [hasEditScopeCallout ? (_jsx(StatusCallout, { tone: editScope === "rendered-instance" ? "neutral" : "accent", "data-test": "edit-scope", "data-lost": "false", children: editScope === "rendered-instance" ? (_jsxs("div", { className: "scope__unlinked", children: [_jsx("span", { children: "Element unlinked" }), _jsx(Button, { size: "compact", className: "scope__action", "data-test": "relink-element", onClick: () => {
247
- const overrideId = relinkElement(selected.domElement);
248
- if (overrideId)
249
- discardChangesForInstanceOverride(overrideId);
250
- refreshScopeState();
251
- }, children: "Relink" })] })) : (_jsxs("div", { className: "scope__linked", children: [_jsxs("span", { children: ["Affects ", sourceSiteMatchCount, " elements."] }), _jsx(Button, { size: "compact", variant: "quiet", "data-test": "unlink-element", onClick: () => {
252
- unlinkElement(selected.domElement);
253
- refreshScopeState();
254
- }, children: "Unlink" })] })) })) : null, showInteractionState ? (_jsx(FieldRow, { label: "State", className: "style-state", "data-test": "style-state", children: _jsx(Select, { value: styleState, "data-test": "style-state-select", "aria-label": "Style State", options: availableInteractionStates.map((state) => ({
255
- value: state,
256
- label: formatInspectorLabel(state),
257
- })), onValueChange: (state) => {
258
- const nextState = availableInteractionStates.find((candidate) => candidate === state);
259
- if (!nextState)
260
- return;
261
- setActiveStyleState(nextState);
262
- setStyleState(nextState);
263
- } }) })) : null] })) : null, !isMultiSelection ? _jsx(ComponentPropsSection, { selected: selected }) : null, selectionEditable ? (_jsx(AtRuleContextProvider, { rows: tokenRows, children: _jsxs("div", { className: "style-editors", "data-test": "style-editors", children: [_jsx(LayoutSection, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRows: tokenRows }, `layout-${styleState}`), _jsx(SpacingBox, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRows: tokenRows }, `spacing-${styleState}`), _jsx(AppearanceSection, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRows: tokenRows }, `appearance-${styleState}`), showText ? _jsxs(_Fragment, { children: [_jsx(Typography, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRows: tokenRows }, `type-${styleState}`), _jsx(ColorPicker, { element: selected, selection: styleSelection, property: "color", entries: tokenEntries, tokenRow: findTokenRow(tokenRows, "color") }, `color-${styleState}`)] }) : null, _jsx(BackgroundEditor, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRow: backgroundTokenRow }, `background-${styleState}`), _jsx(BorderEditor, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRows: tokenRows }, `border-${styleState}`), _jsx(BoxShadowEditor, { element: selected, selection: styleSelection, entries: tokenEntries, tokenRows: tokenRows }, `box-shadow-${styleState}`)] }) })) : (_jsx(StatusCallout, { tone: "neutral", "data-test": "multi-selection-uneditable", children: "These repeated items are indistinguishable, so Nudge UI cannot safely target only part of the group. Select every repeated item to edit them together." }))] })) : (_jsx(EmptyState, {})), _jsx(ChangesLog, { onClearSession: clearInspectorSession })] })] }), sketchEnabled ? (_jsx(SketchWorkspace, { hostElement: sketchHost, projectId: runtimeConfig.projectId })) : null, !isOpen ? (_jsx("div", { className: "panel__restore", children: _jsx(Tooltip, { children: _jsx(IconButton, { variant: "quiet", label: "Show inspector", className: "panel__restore-button", "data-test": "show-inspector", onClick: () => setInspectorOpen(true), children: _jsx(IconLayoutSidebarRight, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) }) }) })) : null] }));
226
+ return (_jsxs(_Fragment, { children: [_jsx(InspectorStyle, { testId: "inspector-styles", css: UI_STYLES }), _jsxs(InspectorPanel, { isOpen: isOpen, collapseDisabled: sketchActive, toggleShortcut: getInspectorToggleShortcutLabel(), onOpenChange: (open) => {
227
+ if (!open)
228
+ cancelInlineTextEdit();
229
+ setInspectorOpen(open);
230
+ }, headerActions: _jsxs(_Fragment, { children: [_jsx(PeekOriginalButton, {}), _jsx(AgentStatusButton, { onOpenSettings: openSettings })] }), prompt: _jsx(CopyPromptButton, { settingsOpen: settingsOpen, settingsSection: settingsSection, onOpenSettings: openSettings, onSettingsOpenChange: setSettingsOpen, onClearChanges: clearInspectorSession }), children: [inlineTextFeedback ? (_jsx(StatusCallout, { tone: "danger", className: "inline-text-diagnostic", "data-test": "inline-text-diagnostic", role: "status", "aria-live": "polite", "aria-atomic": "true", children: _jsx("span", { children: inlineTextFeedback.message }) })) : null, runtimeConfig.inspectionUnavailableReason ? (_jsxs(StatusCallout, { tone: "danger", "data-test": "page-inspection-error", role: "status", children: ["Can\u2019t load Nudge on this page due to ", runtimeConfig.inspectionUnavailableReason, "."] })) : selected ? (_jsxs(_Fragment, { children: [_jsx(InspectorSelection, { identity: selected, count: selectedElements.length, isComponent: !isMultiSelection && componentProps !== null, name: isMultiSelection ? { title: `${selectedElements.length} elements` } : componentProps ? { title: componentProps.target.meta.componentName } : describeElement(selected.domElement), editScope: editScope, sourceSiteMatchCount: sourceSiteMatchCount, styleState: styleState, availableInteractionStates: availableInteractionStates, onStyleStateChange: (state) => {
231
+ setActiveStyleState(state);
232
+ setStyleState(state);
233
+ }, onRelink: () => {
234
+ const overrideId = relinkElement(selected.domElement);
235
+ if (overrideId)
236
+ discardChangesForInstanceOverride(overrideId);
237
+ refreshScopeState();
238
+ }, onUnlink: () => {
239
+ unlinkElement(selected.domElement);
240
+ refreshScopeState();
241
+ }, children: !isMultiSelection ? _jsx(ComponentPropsSection, { selected: selected }) : null }), selectionEditable ? (_jsx(InspectorEditors, { selected: selected, styleSelection: styleSelection, tokenEntries: tokenEntries, tokenRows: tokenRows, styleState: styleState, showText: showText, backgroundTokenRow: backgroundTokenRow })) : (_jsx(StatusCallout, { tone: "neutral", "data-test": "multi-selection-uneditable", children: "These repeated items are indistinguishable, so Nudge UI cannot safely target only part of the group. Select every repeated item to edit them together." }))] })) : (_jsx(EmptyState, {})), _jsx(ChangesLog, { onClearSession: clearInspectorSession })] }), sketchEnabled ? (_jsx(SketchWorkspace, { hostElement: sketchHost, projectId: runtimeConfig.projectId })) : null] }));
264
242
  }
@@ -0,0 +1,5 @@
1
+ import type { ReactElement } from "react";
2
+ /** Same artwork as the extension and landing favicons. */
3
+ export declare function NudgeLogoIcon({ size }: {
4
+ size?: string;
5
+ }): ReactElement;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Same artwork as the extension and landing favicons. */
3
+ export function NudgeLogoIcon({ size = "var(--icon-size-small)" }) {
4
+ return (_jsxs("svg", { viewBox: "5 4 35 35", width: size, height: size, fill: "currentColor", "aria-hidden": "true", children: [_jsx("path", { d: "M14.7742 6C27.6015 6 38 16.569 38 29.6066V38H30.7742V29.6066C30.7742 20.6251 23.6107 13.3443 14.7742 13.3443H13.2258V38H6V6H14.7742Z" }), _jsx("path", { d: "M39 15.6629C37 11.5 33 7 28.4919 5H39V15.6629Z" })] }));
5
+ }
@@ -1,7 +1,2 @@
1
1
  import { type ReactElement } from "react";
2
- /**
3
- * Press-and-hold button that previews the page without inspector changes
4
- * (NUD-30). Releasing restores the edited preview; canonical intent is never
5
- * cleared, so nothing is lost while held.
6
- */
7
2
  export declare function PeekOriginalButton(): ReactElement;
@@ -11,11 +11,6 @@ function useDraftChangeCount() {
11
11
  return snapshot.changes.length + snapshot.structuralChanges.length;
12
12
  }, () => 0);
13
13
  }
14
- /**
15
- * Press-and-hold button that previews the page without inspector changes
16
- * (NUD-30). Releasing restores the edited preview; canonical intent is never
17
- * cleared, so nothing is lost while held.
18
- */
19
14
  export function PeekOriginalButton() {
20
15
  const active = useOriginalPreviewActive();
21
16
  const changeCount = useDraftChangeCount();
@@ -1,7 +1,2 @@
1
1
  import type { ReactElement } from "react";
2
- /**
3
- * Before/after comparison glyph for the hold-to-view-original button.
4
- * Custom artwork rendered with the shared inspector icon tokens so it
5
- * matches the neighboring header icons.
6
- */
7
2
  export declare function PeekOriginalIcon(): ReactElement;
@@ -1,9 +1,4 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * Before/after comparison glyph for the hold-to-view-original button.
4
- * Custom artwork rendered with the shared inspector icon tokens so it
5
- * matches the neighboring header icons.
6
- */
7
2
  export function PeekOriginalIcon() {
8
3
  return (_jsxs("svg", { viewBox: "0 0 24 24", width: "var(--icon-size-small)", height: "var(--icon-size-small)", "aria-hidden": "true", children: [_jsx("path", { d: "M8.66667 5L6 5C4.34315 5 3 6.34315 3 8L3 16C3 17.6569 4.34315 19 6 19L12 19", fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeWidth: "var(--icon-stroke-width)" }), _jsx("path", { d: "M13 5L18 5C19.6569 5 21 6.34315 21 8L21 16C21 17.6569 19.6569 19 18 19L16.3333 19", fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeWidth: "var(--icon-stroke-width)" }), _jsx("line", { x1: "13.7721", y1: "22.2984", x2: "8.29835", y2: "2.22788", fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeWidth: "var(--icon-stroke-width)" })] }));
9
4
  }
@@ -0,0 +1,21 @@
1
+ import { type ReactElement, type ReactNode } from "react";
2
+ import { type ButtonProps } from "../ui/Button.js";
3
+ export interface PromptActionButtonProps extends ButtonProps {
4
+ readonly copied?: boolean;
5
+ readonly agentState?: string;
6
+ readonly busy?: boolean;
7
+ readonly icon?: ReactNode;
8
+ readonly label?: ReactNode;
9
+ readonly badgeCount?: number;
10
+ readonly hasMenu?: boolean;
11
+ }
12
+ /** Presents a prompt action without owning clipboard or agent connections. */
13
+ export declare const PromptActionButton: import("react").ForwardRefExoticComponent<PromptActionButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
14
+ export interface PromptActionRowProps {
15
+ readonly children: ReactNode;
16
+ /** Clears the pending changes; the clear changes action stays beside the prompt action and disables without changes. */
17
+ readonly onClear?: () => void;
18
+ readonly hasChanges?: boolean;
19
+ }
20
+ /** A prompt action with a matching clear changes action beside it, disabled until there are changes. */
21
+ export declare function PromptActionRow({ children, onClear, hasChanges }: PromptActionRowProps): ReactElement;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { IconChevronDown, IconCopy, IconRestore } from "@tabler/icons-react";
4
+ import { Button } from "../ui/Button.js";
5
+ import { IconButton } from "../ui/IconButton.js";
6
+ import { Tooltip } from "../ui/Tooltip.js";
7
+ /** Presents a prompt action without owning clipboard or agent connections. */
8
+ export const PromptActionButton = forwardRef(function PromptActionButton({ copied = false, agentState = "disconnected", busy = false, icon = _jsx(IconCopy, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }), label = "Copy prompt", badgeCount = 0, hasMenu = false, ...props }, ref) {
9
+ return _jsxs(Button, { ref: ref, variant: "primary", className: "copy-prompt__main", "data-test": "copy-prompt", type: "button", "data-copied": copied ? "true" : "false", "data-agent-state": agentState, "aria-busy": busy ? "true" : undefined, ...props, children: [icon, label, badgeCount > 0 ? _jsx("span", { className: "copy-prompt__change-count", "data-test": "copy-prompt-change-count", children: badgeCount }) : null, hasMenu ? _jsx(IconChevronDown, { size: "var(--icon-size-small)", stroke: "var(--icon-stroke-width)", "aria-hidden": "true" }) : null] });
10
+ });
11
+ /** A prompt action with a matching clear changes action beside it, disabled until there are changes. */
12
+ export function PromptActionRow({ children, onClear, hasChanges = false }) {
13
+ return (_jsxs("div", { className: "copy-prompt__row", children: [children, onClear ? (_jsx(Tooltip, { children: _jsx(IconButton, { className: "copy-prompt__clear-changes", variant: "secondary", label: "Clear changes", "data-test": "copy-prompt-clear", disabled: !hasChanges, onClick: onClear, children: _jsx(IconRestore, { size: "var(--icon-size-small)", "aria-hidden": "true" }) }) })) : null] }));
14
+ }
@@ -0,0 +1,5 @@
1
+ export interface ElementName {
2
+ readonly title: string;
3
+ }
4
+ /** The title is derived from the tag, with an accessible name when the author gave one. */
5
+ export declare function describeElement(element: HTMLElement): ElementName;
@@ -0,0 +1,29 @@
1
+ const TAG_LABELS = new Map([
2
+ ["a", "Link"],
3
+ ["article", "Article"],
4
+ ["aside", "Aside"],
5
+ ["button", "Button"],
6
+ ["footer", "Footer"],
7
+ ["form", "Form"],
8
+ ["header", "Header"],
9
+ ["img", "Image"],
10
+ ["input", "Input"],
11
+ ["label", "Label"],
12
+ ["li", "List item"],
13
+ ["main", "Main"],
14
+ ["nav", "Navigation"],
15
+ ["ol", "List"],
16
+ ["p", "Paragraph"],
17
+ ["section", "Section"],
18
+ ["select", "Select"],
19
+ ["svg", "Icon"],
20
+ ["textarea", "Text area"],
21
+ ["ul", "List"],
22
+ ]);
23
+ /** The title is derived from the tag, with an accessible name when the author gave one. */
24
+ export function describeElement(element) {
25
+ const tag = element.localName.toLowerCase();
26
+ const base = /^h[1-6]$/.test(tag) ? `Heading ${tag.slice(1)}` : TAG_LABELS.get(tag) ?? (tag.charAt(0).toUpperCase() + tag.slice(1));
27
+ const accessible = element.getAttribute("aria-label")?.trim();
28
+ return { title: accessible ? `${base} · ${accessible}` : base };
29
+ }
@@ -1,9 +1,6 @@
1
1
  import { type InteractionState } from "./styleState.js";
2
2
  /** Matches native interaction states and the Inspector's temporary CSS state. */
3
3
  export declare function selectorForInteractionStatePreview(selector: string): string;
4
- /**
5
- * Projects CSS interaction states into the selected element's document.
6
- * This previews styles without dispatching events or changing application state.
7
- */
4
+ /** Previews interaction states without dispatching events or changing application state. */
8
5
  export declare function startInteractionStatePreview(element: HTMLElement, state: InteractionState): () => void;
9
6
  export declare function useInteractionStatePreview(element: HTMLElement | null, state: InteractionState): void;
@@ -11,8 +11,7 @@ export function selectorForInteractionStatePreview(selector) {
11
11
  for (const pseudo of [...selectorPseudoClasses(selector)].reverse()) {
12
12
  if (!interactionStates.has(pseudo.name))
13
13
  continue;
14
- // Keep native states on other elements, but use the chosen state on the
15
- // selected element. :where() keeps the original pseudo-class specificity.
14
+ // :where() keeps the replacement at the original pseudo-class specificity.
16
15
  const replacement = `:is(:${pseudo.name}:where(:not([${MARKER}])), [${MARKER}="${pseudo.name}"])`;
17
16
  transformed = transformed.slice(0, pseudo.start) + replacement + transformed.slice(pseudo.end);
18
17
  }
@@ -20,8 +19,7 @@ export function selectorForInteractionStatePreview(selector) {
20
19
  }
21
20
  function previewSelector(selector) {
22
21
  const transformed = selectorForInteractionStatePreview(selector);
23
- // Add the same specificity to every copied branch. This preserves their
24
- // relative cascade while overriding native pointer states on the target.
22
+ // Same added specificity on every branch preserves their relative cascade while overriding native pointer states.
25
23
  const scope = `:where([${MARKER}], [${MARKER}] *):is(#${STATE_PREVIEW_SHEET_ID}, *)`;
26
24
  // A scope must precede a pseudo-element, which cannot take an attribute.
27
25
  let parentheses = 0;
@@ -58,10 +56,7 @@ function previewSelector(selector) {
58
56
  }
59
57
  return transformed + scope;
60
58
  }
61
- /**
62
- * Projects CSS interaction states into the selected element's document.
63
- * This previews styles without dispatching events or changing application state.
64
- */
59
+ /** Previews interaction states without dispatching events or changing application state. */
65
60
  export function startInteractionStatePreview(element, state) {
66
61
  if (state === "base")
67
62
  return () => undefined;
@@ -1,10 +1,5 @@
1
1
  export declare function isOriginalPreviewActive(): boolean;
2
2
  export declare function subscribeOriginalPreview(listener: () => void): () => void;
3
3
  export declare function useOriginalPreviewActive(): boolean;
4
- /**
5
- * Hold-to-view-original (NUD-30). While active the host document shows the
6
- * page without any inspector changes; the draft preview owns that projection.
7
- * Canonical intent stays in the workspace, so releasing restores the edited
8
- * preview without loss.
9
- */
4
+ /** While active the document shows the page without inspector changes; canonical intent is never cleared. */
10
5
  export declare function setOriginalPreviewActive(next: boolean): void;
@@ -13,12 +13,7 @@ export function subscribeOriginalPreview(listener) {
13
13
  export function useOriginalPreviewActive() {
14
14
  return useSyncExternalStore(subscribeOriginalPreview, () => previewingOriginal, () => false);
15
15
  }
16
- /**
17
- * Hold-to-view-original (NUD-30). While active the host document shows the
18
- * page without any inspector changes; the draft preview owns that projection.
19
- * Canonical intent stays in the workspace, so releasing restores the edited
20
- * preview without loss.
21
- */
16
+ /** While active the document shows the page without inspector changes; canonical intent is never cleared. */
22
17
  export function setOriginalPreviewActive(next) {
23
18
  if (next === previewingOriginal)
24
19
  return;
@@ -1,3 +1,2 @@
1
- /** Read an inspector value from the selected authored state, falling back to
2
- * the browser only when CSSOM has no declaration to attribute. */
1
+ /** Reads from the authored state; the browser is only the fallback when CSSOM has no declaration to attribute. */
3
2
  export declare function getStateStyleValue(el: HTMLElement, property: string, fallback?: string): string;
@@ -1,14 +1,11 @@
1
1
  import { getActiveStyleState } from "./styleState.js";
2
2
  import { readInspectionSnapshot } from "../inspection/inspectionSnapshot.js";
3
3
  import { getElementComputedStyle } from "../runtime/domRealm.js";
4
- /** Read an inspector value from the selected authored state, falling back to
5
- * the browser only when CSSOM has no declaration to attribute. */
4
+ /** Reads from the authored state; the browser is only the fallback when CSSOM has no declaration to attribute. */
6
5
  export function getStateStyleValue(el, property, fallback = "") {
7
6
  try {
8
7
  const state = getActiveStyleState();
9
- // Keep the browser's exact computed value for ordinary Base inspection.
10
- // Authored resolution is needed when the live element is transiently
11
- // interacted with, or when the user explicitly selected another state.
8
+ // Base inspection uses the browser's computed value unless the element is transiently hovered or focused.
12
9
  const hasLiveInteraction = [":hover", ":active", ":focus", ":focus-visible"].some((selector) => {
13
10
  try {
14
11
  return el.matches(selector);
@@ -1,7 +1,6 @@
1
1
  export declare const INTERACTION_STATES: readonly ["hover", "active", "focus", "focus-visible", "disabled"];
2
2
  export type InteractionState = "base" | (typeof INTERACTION_STATES)[number];
3
- /** The selected authored interaction state. Kept outside React so edit actions
4
- * and history have the same context as the panel that initiated an edit. */
3
+ /** Kept outside React so edit actions and history share the panel's context. */
5
4
  export declare function getActiveStyleState(): InteractionState;
6
5
  export declare function setActiveStyleState(state: InteractionState): void;
7
6
  export declare function selectorForInteractionState(selector: string, state: InteractionState): string;
@@ -1,7 +1,6 @@
1
1
  export const INTERACTION_STATES = ["hover", "active", "focus", "focus-visible", "disabled"];
2
2
  let activeState = "base";
3
- /** The selected authored interaction state. Kept outside React so edit actions
4
- * and history have the same context as the panel that initiated an edit. */
3
+ /** Kept outside React so edit actions and history share the panel's context. */
5
4
  export function getActiveStyleState() {
6
5
  return activeState;
7
6
  }
@@ -273,7 +273,6 @@ export function SketchEditor({ open, document: sketchDocument, captured, onCance
273
273
  event.currentTarget.releasePointerCapture(event.pointerId);
274
274
  }
275
275
  catch {
276
- // The pointer may already have been released by the browser.
277
276
  }
278
277
  if (draftPointLimitReached.current) {
279
278
  draftPointLimitReached.current = false;
@@ -8,13 +8,11 @@ import { sketchBelongsToCard, useDrafts } from "../drafts/store.js";
8
8
  export function sketchRouteKey(url) {
9
9
  try {
10
10
  const parsed = new URL(url);
11
- // These parameters belong to the inspector host, not to the application
12
- // route. Removing them lets a sketch follow the same page in Focus mode,
13
- // the canvas, and a direct editor launch.
11
+ // Inspector-host params: removing them keeps one sketch attached across
12
+ // Focus mode, the canvas, and direct launch.
14
13
  parsed.searchParams.delete("__nudge_ui_direct");
15
14
  parsed.searchParams.delete("nudge-ui");
16
- // Hashes identify an in-document location, not a different sketch canvas.
17
- // Keep saved marks attached when navigation changes only the anchor.
15
+ // Hashes are in-document anchors, so marks stay attached when only the anchor changes.
18
16
  return `${parsed.origin}${parsed.pathname}${parsed.search}`;
19
17
  }
20
18
  catch {
@@ -43,9 +41,8 @@ export function projectSketchPoint(point, document, frameWindow, width, height)
43
41
  const viewportWidth = Math.max(1, frameWindow.innerWidth || width);
44
42
  const viewportHeight = Math.max(1, frameWindow.innerHeight || height);
45
43
  const scroll = getSketchScrollPosition(frameWindow);
46
- // Preserve the point's relative horizontal position when the responsive
47
- // iframe changes width. Apply the scroll delta separately so horizontal
48
- // page scrolling still moves the sketch with the content.
44
+ // Horizontal position scales with the responsive iframe width; the scroll
45
+ // delta is applied separately.
49
46
  const captureLocalX = (point.x / imageWidth) * capture.viewportWidth;
50
47
  const currentLocalX = (captureLocalX / Math.max(1, capture.viewportWidth)) * viewportWidth
51
48
  - (scroll.x - capture.scrollX);
@@ -101,10 +98,9 @@ export function SketchFrameOverlay({ cardId, iframe, cardUrl, artifactId, ready
101
98
  const frameWindow = iframe?.contentWindow ?? null;
102
99
  const layers = useMemo(() => {
103
100
  if (!iframe || !frameWindow || documents.length === 0) {
104
- return {
105
- strokes: [],
106
- annotations: [],
107
- };
101
+ const strokes = [];
102
+ const annotations = [];
103
+ return { strokes, annotations };
108
104
  }
109
105
  const strokes = [];
110
106
  const annotations = [];
@@ -13,7 +13,7 @@ import { isEditableEvent } from "../shell/shortcuts.js";
13
13
  import { ERASER_CURSOR, SKETCH_CURSOR } from "../ui/customCursors.js";
14
14
  import { useTemporaryAppInteraction } from "../canvas/viewStore.js";
15
15
  import { portalContainer } from "../ui/portalContainer.js";
16
- /** Eraser reach around the pointer in screen pixels, matching the cursor ring. */
16
+ /** Screen-pixel eraser reach; must match the cursor ring. */
17
17
  const ERASER_RADIUS_PX = 8;
18
18
  function sketchCursor(tool) {
19
19
  if (tool === "eraser")
@@ -121,9 +121,8 @@ export function SketchOverlay({ open, hostElement, selectTarget, onCancel, onDon
121
121
  if (open)
122
122
  svgRef.current?.focus();
123
123
  }, [open]);
124
- // Listen on the window rather than the dialog: the drawing options live in
125
- // the canvas toolbar, so focus is often outside the dialog while sketching.
126
- // Text fields keep their native undo.
124
+ // Window-level so shortcuts work while focus is in the canvas toolbar; text
125
+ // fields keep their native undo.
127
126
  useEffect(() => {
128
127
  if (!open)
129
128
  return;
@@ -165,8 +164,8 @@ export function SketchOverlay({ open, hostElement, selectTarget, onCancel, onDon
165
164
  || event.clientY < drawingViewport.offsetY || event.clientY > drawingViewport.offsetY + drawingViewport.displayHeight)
166
165
  return;
167
166
  const point = pointFromEvent(event, drawingViewport);
168
- // Drawing cancels the browser's focus change, so move focus here
169
- // explicitly; otherwise undo keeps going to the note or a toolbar button.
167
+ // Drawing cancels the browser's focus change, so move focus here or undo
168
+ // goes to the note or toolbar.
170
169
  event.preventDefault();
171
170
  svgRef.current?.focus({ preventScroll: true });
172
171
  pointerId.current = event.pointerId;
@@ -11,5 +11,4 @@ export interface SketchPromptPanelProps {
11
11
  readonly onDone: () => void | Promise<void>;
12
12
  readonly onCancel?: () => void;
13
13
  }
14
- /** The small note editor shared by a new live sketch and saved sketch layers. */
15
14
  export declare function SketchPromptPanel({ dataTest, className, description, error, disabled, saving, autoFocus, onDescriptionChange, onDone, onCancel, }: SketchPromptPanelProps): ReactElement;
@@ -3,7 +3,6 @@ import { IconAlertTriangleFilled } from "@tabler/icons-react";
3
3
  import { useRef } from "react";
4
4
  import { Button } from "../ui/Button.js";
5
5
  import { SKETCH_LIMITS } from "./model.js";
6
- /** The small note editor shared by a new live sketch and saved sketch layers. */
7
6
  export function SketchPromptPanel({ dataTest, className, description, error = null, disabled = false, saving = false, autoFocus = false, onDescriptionChange, onDone, onCancel, }) {
8
7
  // Keep the last message while the banner collapses so its text does not vanish mid-animation.
9
8
  const lastError = useRef(error);