nudge-ui 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/dist/cli/agentCommand.d.ts +0 -1
  2. package/dist/cli/agentCommand.js +4 -29
  3. package/dist/client.mjs +987 -221
  4. package/dist/compiler/ast.d.ts +0 -6
  5. package/dist/compiler/ast.js +0 -5
  6. package/dist/compiler/componentContractTypes.d.ts +11 -5
  7. package/dist/compiler/componentContracts.js +3 -9
  8. package/dist/compiler/componentInstrumentation.d.ts +2 -13
  9. package/dist/compiler/componentInstrumentation.js +3 -12
  10. package/dist/compiler/componentPolicyResolution.d.ts +3 -22
  11. package/dist/compiler/componentPolicyResolution.js +6 -38
  12. package/dist/compiler/identityAttributes.d.ts +2 -0
  13. package/dist/compiler/identityAttributes.js +2 -0
  14. package/dist/compiler/index.d.ts +0 -1
  15. package/dist/compiler/index.js +0 -1
  16. package/dist/compiler/packageComponentContracts.d.ts +10 -19
  17. package/dist/compiler/packageComponentContracts.js +60 -43
  18. package/dist/compiler/reactComponentProtocols.d.ts +0 -7
  19. package/dist/compiler/reactComponentProtocols.js +0 -7
  20. package/dist/compiler/reactIdentity.d.ts +2 -2
  21. package/dist/compiler/reactIdentity.js +41 -43
  22. package/dist/compiler/sourcePaths.d.ts +4 -8
  23. package/dist/compiler/sourcePaths.js +6 -8
  24. package/dist/css/dialects/index.d.ts +2 -21
  25. package/dist/css/dialects/index.js +2 -9
  26. package/dist/css/dialects/tailwind.d.ts +2 -16
  27. package/dist/css/dialects/tailwind.js +2 -25
  28. package/dist/css/dialects/vanillaExtract.d.ts +1 -9
  29. package/dist/css/dialects/vanillaExtract.js +0 -1
  30. package/dist/css/index.d.ts +0 -8
  31. package/dist/css/index.js +0 -8
  32. package/dist/css/model/index.d.ts +6 -38
  33. package/dist/css/model/index.js +0 -9
  34. package/dist/css/token-inventory/index.d.ts +0 -23
  35. package/dist/css/token-inventory/index.js +0 -23
  36. package/dist/css/token-inventory/inventory.js +4 -16
  37. package/dist/css/token-inventory/parseStylesheet.d.ts +1 -9
  38. package/dist/css/token-inventory/parseStylesheet.js +5 -42
  39. package/dist/css/token-inventory/policy.d.ts +2 -39
  40. package/dist/css/token-inventory/policy.js +2 -39
  41. package/dist/css/token-inventory/types.d.ts +2 -15
  42. package/dist/css/value-semantics/borderSemantics.d.ts +1 -8
  43. package/dist/css/value-semantics/borderSemantics.js +5 -23
  44. package/dist/css/value-semantics/boxSemantics.d.ts +2 -25
  45. package/dist/css/value-semantics/boxSemantics.js +1 -7
  46. package/dist/css/value-semantics/colorSemantics.d.ts +6 -60
  47. package/dist/css/value-semantics/colorSemantics.js +9 -40
  48. package/dist/css/value-semantics/cssSyntax.d.ts +10 -10
  49. package/dist/css/value-semantics/cssSyntax.js +39 -11
  50. package/dist/css/value-semantics/fontSemantics.d.ts +3 -19
  51. package/dist/css/value-semantics/fontSemantics.js +7 -25
  52. package/dist/css/value-semantics/index.d.ts +1 -12
  53. package/dist/css/value-semantics/index.js +1 -12
  54. package/dist/css/value-semantics/propertyPolicy.d.ts +6 -53
  55. package/dist/css/value-semantics/propertyPolicy.js +47 -59
  56. package/dist/css/value-semantics/stringMaps.d.ts +0 -1
  57. package/dist/css/value-semantics/structuredValues.d.ts +3 -37
  58. package/dist/css/value-semantics/structuredValues.js +6 -17
  59. package/dist/css/value-semantics/tokenInterpretation.d.ts +8 -50
  60. package/dist/css/value-semantics/tokenInterpretation.js +7 -21
  61. package/dist/hosts/astro/astroRuntimeConfig.d.ts +0 -1
  62. package/dist/hosts/astro/astroRuntimeConfig.js +0 -1
  63. package/dist/hosts/astro/clientAsset.d.ts +1 -5
  64. package/dist/hosts/astro/clientAsset.js +1 -5
  65. package/dist/hosts/astro/clientTransport.d.ts +0 -1
  66. package/dist/hosts/astro/clientTransport.js +4 -9
  67. package/dist/hosts/astro/integration.d.ts +2 -28
  68. package/dist/hosts/astro/integration.js +7 -36
  69. package/dist/hosts/astro/markdownIdentity.d.ts +0 -3
  70. package/dist/hosts/astro/markdownIdentity.js +0 -3
  71. package/dist/hosts/astro/middleware.d.ts +1 -12
  72. package/dist/hosts/astro/middleware.js +1 -12
  73. package/dist/hosts/astro/projectContext.d.ts +1 -9
  74. package/dist/hosts/astro/projectContext.js +2 -11
  75. package/dist/hosts/astro/responseInstrumentation.d.ts +4 -33
  76. package/dist/hosts/astro/responseInstrumentation.js +5 -34
  77. package/dist/hosts/environment.d.ts +0 -8
  78. package/dist/hosts/environment.js +0 -1
  79. package/dist/hosts/next/index.js +1 -3
  80. package/dist/hosts/next/loader.d.ts +5 -44
  81. package/dist/hosts/next/loader.js +22 -103
  82. package/dist/hosts/next/loaders/identity-loader.cjs +111 -65
  83. package/dist/hosts/next/loaders/loader-plugin.cjs +111 -65
  84. package/dist/hosts/next/manifest.d.ts +2 -16
  85. package/dist/hosts/next/manifest.js +18 -20
  86. package/dist/hosts/next/mount.d.ts +1 -11
  87. package/dist/hosts/next/mount.js +1 -11
  88. package/dist/hosts/next/repositoryScope.d.ts +2 -17
  89. package/dist/hosts/next/repositoryScope.js +2 -17
  90. package/dist/hosts/next/sidecar.d.ts +0 -13
  91. package/dist/hosts/next/sidecar.js +25 -110
  92. package/dist/hosts/next/wrapper.d.ts +0 -31
  93. package/dist/hosts/next/wrapper.js +14 -71
  94. package/dist/hosts/projectBridge.d.ts +0 -2
  95. package/dist/hosts/projectBridge.js +3 -19
  96. package/dist/hosts/reactRendererCapture.d.ts +2 -0
  97. package/dist/hosts/reactRendererCapture.js +12 -0
  98. package/dist/hosts/static/cli.d.ts +0 -4
  99. package/dist/hosts/static/cli.js +0 -3
  100. package/dist/hosts/static/html/bootstrap.d.ts +1 -18
  101. package/dist/hosts/static/html/bootstrap.js +2 -14
  102. package/dist/hosts/static/manifest.d.ts +2 -15
  103. package/dist/hosts/static/manifest.js +5 -18
  104. package/dist/hosts/static/server.d.ts +4 -38
  105. package/dist/hosts/static/server.js +17 -67
  106. package/dist/hosts/vite/index.d.ts +0 -10
  107. package/dist/hosts/vite/index.js +0 -10
  108. package/dist/hosts/vite/react.d.ts +4 -17
  109. package/dist/hosts/vite/react.js +18 -35
  110. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +1 -10
  111. package/dist/hosts/vite/tokens/activeStylesheets.js +3 -8
  112. package/dist/hosts/vite/tokens/fileMap.d.ts +0 -1
  113. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +2 -15
  114. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +3 -10
  115. package/dist/hosts/vite/vite.d.ts +5 -26
  116. package/dist/hosts/vite/vite.js +44 -80
  117. package/dist/html/dom.d.ts +0 -1
  118. package/dist/html/dom.js +0 -1
  119. package/dist/html/identity.d.ts +1 -15
  120. package/dist/html/identity.js +1 -8
  121. package/dist/html/insertions.d.ts +2 -8
  122. package/dist/html/insertions.js +1 -1
  123. package/dist/inspector/agent/McpConnectionDialog.d.ts +1 -6
  124. package/dist/inspector/agent/McpConnectionDialog.js +8 -9
  125. package/dist/inspector/agent/activity.d.ts +2 -2
  126. package/dist/inspector/agent/activity.js +4 -3
  127. package/dist/inspector/agent/client.d.ts +3 -27
  128. package/dist/inspector/agent/client.js +43 -91
  129. package/dist/inspector/agent/connectionStatus.d.ts +3 -2
  130. package/dist/inspector/agent/connectionStatus.js +25 -1
  131. package/dist/inspector/agent/httpTransport.d.ts +0 -8
  132. package/dist/inspector/agent/httpTransport.js +42 -176
  133. package/dist/inspector/agent/protocol.d.ts +1 -10
  134. package/dist/inspector/agent/protocol.js +1 -9
  135. package/dist/inspector/agent/verification.d.ts +3 -20
  136. package/dist/inspector/agent/verification.js +10 -43
  137. package/dist/inspector/boot.d.ts +5 -0
  138. package/dist/inspector/boot.js +289 -0
  139. package/dist/inspector/canvas/AgentActivityOverlay.d.ts +3 -2
  140. package/dist/inspector/canvas/AgentActivityOverlay.js +7 -4
  141. package/dist/inspector/canvas/CanvasCard.js +26 -24
  142. package/dist/inspector/canvas/CanvasElementOverlay.js +196 -174
  143. package/dist/inspector/canvas/CanvasToolbar.js +2 -1
  144. package/dist/inspector/canvas/CanvasWorkspace.js +87 -124
  145. package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +3 -2
  146. package/dist/inspector/canvas/LockedWorkspaceNotice.js +10 -6
  147. package/dist/inspector/canvas/PageCard.d.ts +9 -0
  148. package/dist/inspector/canvas/PageCard.js +50 -0
  149. package/dist/inspector/canvas/SketchToolOptions.d.ts +4 -0
  150. package/dist/inspector/canvas/SketchToolOptions.js +80 -0
  151. package/dist/inspector/canvas/StaleChangeIndicator.d.ts +1 -1
  152. package/dist/inspector/canvas/StaleChangeIndicator.js +1 -1
  153. package/dist/inspector/canvas/ToolOptionsDrawer.d.ts +16 -0
  154. package/dist/inspector/canvas/ToolOptionsDrawer.js +71 -0
  155. package/dist/inspector/canvas/activeCanvasDocument.d.ts +3 -4
  156. package/dist/inspector/canvas/activeCanvasDocument.js +0 -2
  157. package/dist/inspector/canvas/agentPresentation.d.ts +2 -13
  158. package/dist/inspector/canvas/agentPresentation.js +3 -14
  159. package/dist/inspector/canvas/assets/eraser.svg +28 -0
  160. package/dist/inspector/canvas/assets/pen.svg +25 -0
  161. package/dist/inspector/canvas/canvasFrame.d.ts +12 -0
  162. package/dist/inspector/canvas/canvasFrame.js +9 -0
  163. package/dist/inspector/canvas/canvasGestures.d.ts +0 -1
  164. package/dist/inspector/canvas/canvasGestures.js +0 -6
  165. package/dist/inspector/canvas/canvasResize.d.ts +1 -6
  166. package/dist/inspector/canvas/canvasResize.js +1 -6
  167. package/dist/inspector/canvas/canvasStore.d.ts +5 -7
  168. package/dist/inspector/canvas/canvasStore.js +42 -21
  169. package/dist/inspector/canvas/frameConnection.d.ts +42 -0
  170. package/dist/inspector/canvas/frameConnection.js +73 -0
  171. package/dist/inspector/canvas/frameContent.d.ts +0 -1
  172. package/dist/inspector/canvas/frameLifecycle.d.ts +12 -0
  173. package/dist/inspector/canvas/frameLifecycle.js +11 -0
  174. package/dist/inspector/canvas/frameProtocol.d.ts +20 -38
  175. package/dist/inspector/canvas/frameProtocol.js +37 -24
  176. package/dist/inspector/canvas/frameScrollbarStyles.d.ts +0 -1
  177. package/dist/inspector/canvas/frameScrollbarStyles.js +0 -1
  178. package/dist/inspector/canvas/layout.d.ts +10 -22
  179. package/dist/inspector/canvas/layout.js +0 -3
  180. package/dist/inspector/canvas/normalizeUrl.js +1 -8
  181. package/dist/inspector/canvas/pageSurface.d.ts +6 -0
  182. package/dist/inspector/canvas/pageSurface.js +29 -0
  183. package/dist/inspector/canvas/projection.d.ts +14 -25
  184. package/dist/inspector/canvas/projection.js +64 -87
  185. package/dist/inspector/canvas/rendererBootstrap.d.ts +8 -1
  186. package/dist/inspector/canvas/rendererBootstrap.js +10 -15
  187. package/dist/inspector/canvas/rendererCidIndex.d.ts +0 -5
  188. package/dist/inspector/canvas/rendererCidIndex.js +0 -5
  189. package/dist/inspector/canvas/rendererElementSelector.js +38 -28
  190. package/dist/inspector/canvas/rendererMessageRouter.d.ts +4 -6
  191. package/dist/inspector/canvas/rendererMessageRouter.js +12 -17
  192. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +3 -1
  193. package/dist/inspector/canvas/rendererSelectionProxy.js +7 -40
  194. package/dist/inspector/canvas/rendererStylesheet.d.ts +0 -1
  195. package/dist/inspector/canvas/rendererStylesheet.js +23 -1
  196. package/dist/inspector/canvas/resizeHandleScale.d.ts +1 -10
  197. package/dist/inspector/canvas/resizeHandleScale.js +1 -10
  198. package/dist/inspector/canvas/sessionStore.d.ts +3 -9
  199. package/dist/inspector/canvas/sessionStore.js +33 -43
  200. package/dist/inspector/canvas/staleChangeDetector.d.ts +1 -1
  201. package/dist/inspector/canvas/staleChangeDetector.js +11 -26
  202. package/dist/inspector/canvas/toolbarScale.d.ts +1 -4
  203. package/dist/inspector/canvas/toolbarScale.js +1 -4
  204. package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +0 -1
  205. package/dist/inspector/canvas/useCanvasLayoutAnimation.js +0 -1
  206. package/dist/inspector/canvas/viewStore.js +1 -1
  207. package/dist/inspector/canvas/wheelPan.d.ts +1 -1
  208. package/dist/inspector/canvas/wheelPan.js +1 -1
  209. package/dist/inspector/canvas/workspaceLease.d.ts +1 -5
  210. package/dist/inspector/canvas/workspaceLease.js +1 -7
  211. package/dist/inspector/changes/codecs.d.ts +1 -0
  212. package/dist/inspector/changes/codecs.js +21 -5
  213. package/dist/inspector/changes/draftPreview.d.ts +7 -0
  214. package/dist/inspector/changes/draftPreview.js +118 -0
  215. package/dist/inspector/changes/editModel.d.ts +11 -13
  216. package/dist/inspector/changes/editModel.js +9 -4
  217. package/dist/inspector/changes/managedStyleProjection.js +6 -15
  218. package/dist/inspector/changes/model.d.ts +0 -5
  219. package/dist/inspector/changes/model.js +1 -8
  220. package/dist/inspector/changes/previewDiagnostics.d.ts +2 -12
  221. package/dist/inspector/changes/previewDiagnostics.js +5 -21
  222. package/dist/inspector/changes/previewVerification.d.ts +25 -0
  223. package/dist/inspector/changes/previewVerification.js +34 -0
  224. package/dist/inspector/changes/structuralTypes.d.ts +2 -4
  225. package/dist/inspector/changes/types.d.ts +11 -8
  226. package/dist/inspector/clientManifest.d.ts +17 -6
  227. package/dist/inspector/clientManifest.js +16 -3
  228. package/dist/inspector/comments/CommentsOverlay.js +66 -23
  229. package/dist/inspector/comments/element.d.ts +1 -2
  230. package/dist/inspector/comments/element.js +1 -2
  231. package/dist/inspector/comments/store.d.ts +1 -1
  232. package/dist/inspector/comments/store.js +4 -3
  233. package/dist/inspector/comments/verification.d.ts +8 -2
  234. package/dist/inspector/comments/verification.js +19 -11
  235. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +8 -0
  236. package/dist/inspector/componentSemantics/ComponentPropsSection.js +12 -8
  237. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +2 -9
  238. package/dist/inspector/componentSemantics/adapterRegistry.js +2 -9
  239. package/dist/inspector/componentSemantics/changeAction.js +1 -1
  240. package/dist/inspector/componentSemantics/changeModel.js +2 -4
  241. package/dist/inspector/componentSemantics/react/callsites.d.ts +28 -0
  242. package/dist/inspector/componentSemantics/react/callsites.js +261 -0
  243. package/dist/inspector/componentSemantics/react/devtoolsHook.d.ts +23 -0
  244. package/dist/inspector/componentSemantics/react/devtoolsHook.js +71 -0
  245. package/dist/inspector/componentSemantics/react/fibers.d.ts +17 -0
  246. package/dist/inspector/componentSemantics/react/fibers.js +30 -0
  247. package/dist/inspector/componentSemantics/{reactRuntime.d.ts → react/runtime.d.ts} +3 -2
  248. package/dist/inspector/componentSemantics/{reactRuntime.js → react/runtime.js} +70 -53
  249. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +2 -18
  250. package/dist/inspector/componentSemantics/runtimeBridge.js +5 -19
  251. package/dist/inspector/componentSemantics/textBinding.d.ts +2 -11
  252. package/dist/inspector/componentSemantics/textBinding.js +20 -87
  253. package/dist/inspector/componentSemantics/types.d.ts +8 -27
  254. package/dist/inspector/componentSemantics/types.js +0 -1
  255. package/dist/inspector/conformance/borderCases.d.ts +0 -5
  256. package/dist/inspector/conformance/borderCases.js +0 -5
  257. package/dist/inspector/conformance/colorCases.d.ts +0 -6
  258. package/dist/inspector/conformance/colorCases.js +0 -6
  259. package/dist/inspector/conformance/fixture.d.ts +1 -5
  260. package/dist/inspector/conformance/fixture.js +1 -5
  261. package/dist/inspector/conformance/spacingCases.d.ts +0 -4
  262. package/dist/inspector/conformance/spacingCases.js +0 -4
  263. package/dist/inspector/conformance/typographyCases.d.ts +0 -5
  264. package/dist/inspector/conformance/typographyCases.js +0 -5
  265. package/dist/inspector/drafts/draftStore.d.ts +95 -0
  266. package/dist/inspector/drafts/draftStore.js +461 -0
  267. package/dist/inspector/drafts/model.d.ts +14 -14
  268. package/dist/inspector/drafts/model.js +4 -2
  269. package/dist/inspector/drafts/store.d.ts +47 -16
  270. package/dist/inspector/drafts/store.js +137 -170
  271. package/dist/inspector/editScope.d.ts +0 -1
  272. package/dist/inspector/editScope.js +0 -1
  273. package/dist/inspector/index.d.ts +2 -4
  274. package/dist/inspector/index.js +2 -264
  275. package/dist/inspector/inline-text/inlineTextDiagnostics.d.ts +0 -2
  276. package/dist/inspector/inline-text/inlineTextDiagnostics.js +0 -2
  277. package/dist/inspector/inline-text/inlineTextEditor.d.ts +3 -9
  278. package/dist/inspector/inline-text/inlineTextEditor.js +27 -81
  279. package/dist/inspector/inline-text/inlineTextLifecycle.js +1 -6
  280. package/dist/inspector/inline-text/textEditChange.d.ts +1 -2
  281. package/dist/inspector/inspection/bridge.d.ts +3 -7
  282. package/dist/inspector/inspection/bridge.js +6 -13
  283. package/dist/inspector/inspection/browserCssInspection.d.ts +12 -11
  284. package/dist/inspector/inspection/browserCssInspection.js +32 -14
  285. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +0 -7
  286. package/dist/inspector/inspection/browserCssInspectionRegistry.js +1 -16
  287. package/dist/inspector/inspection/inspectionSnapshot.d.ts +6 -0
  288. package/dist/inspector/inspection/inspectionSnapshot.js +10 -0
  289. package/dist/inspector/inspection/performanceDiagnostics.d.ts +18 -0
  290. package/dist/inspector/inspection/performanceDiagnostics.js +31 -0
  291. package/dist/inspector/inspection/selectionProperty.d.ts +1 -6
  292. package/dist/inspector/inspection/selectionProperty.js +1 -5
  293. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +1 -5
  294. package/dist/inspector/inspection/useBrowserCssInspection.js +22 -59
  295. package/dist/inspector/iterations/capture.d.ts +2 -2
  296. package/dist/inspector/iterations/capture.js +4 -9
  297. package/dist/inspector/iterations/client.d.ts +2 -2
  298. package/dist/inspector/iterations/client.js +0 -1
  299. package/dist/inspector/iterations/coordinator.d.ts +4 -4
  300. package/dist/inspector/iterations/coordinator.js +5 -4
  301. package/dist/inspector/iterations/prompt.d.ts +0 -1
  302. package/dist/inspector/iterations/prompt.js +9 -9
  303. package/dist/inspector/overlay/DomNavigator.d.ts +3 -1
  304. package/dist/inspector/overlay/DomNavigator.js +39 -15
  305. package/dist/inspector/overlay/DropGuideOverlay.d.ts +0 -1
  306. package/dist/inspector/overlay/DropGuideOverlay.js +0 -1
  307. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +1 -8
  308. package/dist/inspector/overlay/MeasurementGuideOverlay.js +1 -5
  309. package/dist/inspector/overlay/clickPolicy.d.ts +3 -14
  310. package/dist/inspector/overlay/clickPolicy.js +3 -14
  311. package/dist/inspector/overlay/dropGuide.d.ts +0 -3
  312. package/dist/inspector/overlay/dropGuide.js +0 -3
  313. package/dist/inspector/overlay/frameThrottle.d.ts +0 -1
  314. package/dist/inspector/overlay/frameThrottle.js +0 -1
  315. package/dist/inspector/overlay/interactionStyles.d.ts +1 -1
  316. package/dist/inspector/overlay/interactionStyles.js +19 -8
  317. package/dist/inspector/overlay/measurementGeometry.js +4 -12
  318. package/dist/inspector/overlay/selectedGeometry.d.ts +1 -6
  319. package/dist/inspector/overlay/selectedGeometry.js +1 -8
  320. package/dist/inspector/overlay/spacingGestures.d.ts +14 -21
  321. package/dist/inspector/overlay/spacingGestures.js +151 -31
  322. package/dist/inspector/overlay/structuralGestures.d.ts +2 -9
  323. package/dist/inspector/overlay/structuralGestures.js +1 -4
  324. package/dist/inspector/pageInspector.d.ts +33 -0
  325. package/dist/inspector/pageInspector.js +335 -0
  326. package/dist/inspector/projection/cssEscapes.d.ts +0 -1
  327. package/dist/inspector/projection/cssEscapes.js +2 -4
  328. package/dist/inspector/projection/draftProjection.d.ts +6 -10
  329. package/dist/inspector/projection/draftProjection.js +8 -7
  330. package/dist/inspector/projection/managedStylesheet.d.ts +1 -7
  331. package/dist/inspector/projection/managedStylesheet.js +28 -26
  332. package/dist/inspector/projection/renderedInstance.d.ts +5 -28
  333. package/dist/inspector/projection/renderedInstance.js +13 -33
  334. package/dist/inspector/projection/structuralProjection.d.ts +7 -48
  335. package/dist/inspector/projection/structuralProjection.js +31 -96
  336. package/dist/inspector/projection/textProjection.d.ts +7 -13
  337. package/dist/inspector/projection/textProjection.js +35 -80
  338. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +0 -1
  339. package/dist/inspector/prompt/PromptSettingsDialog.js +0 -1
  340. package/dist/inspector/prompt/clipboardHandoff.d.ts +1 -0
  341. package/dist/inspector/prompt/clipboardHandoff.js +34 -16
  342. package/dist/inspector/prompt/generatePrompt.d.ts +2 -2
  343. package/dist/inspector/prompt/generatePrompt.js +247 -166
  344. package/dist/inspector/prompt/promptDocument.d.ts +3 -0
  345. package/dist/inspector/prompt/promptDocument.js +8 -0
  346. package/dist/inspector/prompt/promptSettings.d.ts +0 -3
  347. package/dist/inspector/prompt/promptSettings.js +7 -8
  348. package/dist/inspector/runtime/devFlag.d.ts +2 -25
  349. package/dist/inspector/runtime/devFlag.js +4 -31
  350. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +0 -2
  351. package/dist/inspector/runtime/editorShell.d.ts +0 -1
  352. package/dist/inspector/runtime/editorShell.js +0 -1
  353. package/dist/inspector/runtime/inspectorStorage.d.ts +11 -0
  354. package/dist/inspector/runtime/inspectorStorage.js +37 -0
  355. package/dist/inspector/runtime/ownedStylesheets.d.ts +14 -0
  356. package/dist/inspector/runtime/ownedStylesheets.js +66 -0
  357. package/dist/inspector/runtime/runtimeConfig.d.ts +14 -84
  358. package/dist/inspector/runtime/runtimeConfig.js +18 -50
  359. package/dist/inspector/runtime/runtimeIdentityClaims.d.ts +19 -0
  360. package/dist/inspector/runtime/runtimeIdentityClaims.js +178 -0
  361. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +6 -23
  362. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +103 -52
  363. package/dist/inspector/runtime/useRuntimeConfig.d.ts +1 -8
  364. package/dist/inspector/runtime/useRuntimeConfig.js +1 -8
  365. package/dist/inspector/selection/editScope.d.ts +2 -7
  366. package/dist/inspector/selection/editScope.js +15 -14
  367. package/dist/inspector/selection/editTarget.d.ts +1 -5
  368. package/dist/inspector/selection/hierarchy.d.ts +11 -11
  369. package/dist/inspector/selection/hierarchy.js +42 -24
  370. package/dist/inspector/selection/selectionStore.d.ts +0 -3
  371. package/dist/inspector/selection/selectionStore.js +5 -16
  372. package/dist/inspector/selection/sourceSite.d.ts +1 -5
  373. package/dist/inspector/selection/sourceSite.js +2 -8
  374. package/dist/inspector/selection/styleSelection.d.ts +1 -5
  375. package/dist/inspector/selection/styleSelection.js +1 -5
  376. package/dist/inspector/session/lifecycle.d.ts +1 -9
  377. package/dist/inspector/session/lifecycle.js +0 -1
  378. package/dist/inspector/session/sessionContext.d.ts +0 -4
  379. package/dist/inspector/session/sessionContext.js +0 -4
  380. package/dist/inspector/session/sessionFactory.d.ts +0 -9
  381. package/dist/inspector/session/sessionFactory.js +0 -6
  382. package/dist/inspector/settings/SettingsDialog.d.ts +0 -1
  383. package/dist/inspector/settings/SettingsDialog.js +5 -3
  384. package/dist/inspector/shell/AgentStatusButton.d.ts +3 -2
  385. package/dist/inspector/shell/AgentStatusButton.js +7 -7
  386. package/dist/inspector/shell/AppShell.js +6 -2
  387. package/dist/inspector/shell/ChangesLog.js +29 -12
  388. package/dist/inspector/shell/CopyPromptButton.d.ts +2 -1
  389. package/dist/inspector/shell/CopyPromptButton.js +62 -55
  390. package/dist/inspector/shell/EmptyState.js +3 -3
  391. package/dist/inspector/shell/InspectorEditors.d.ts +16 -0
  392. package/dist/inspector/shell/InspectorEditors.js +14 -0
  393. package/dist/inspector/shell/InspectorPanel.d.ts +12 -0
  394. package/dist/inspector/shell/InspectorPanel.js +8 -0
  395. package/dist/inspector/shell/InspectorSelection.d.ts +24 -0
  396. package/dist/inspector/shell/InspectorSelection.js +20 -0
  397. package/dist/inspector/shell/InspectorShell.d.ts +0 -3
  398. package/dist/inspector/shell/InspectorShell.js +44 -58
  399. package/dist/inspector/shell/NudgeLogoIcon.d.ts +5 -0
  400. package/dist/inspector/shell/NudgeLogoIcon.js +5 -0
  401. package/dist/inspector/shell/PeekOriginalButton.d.ts +0 -5
  402. package/dist/inspector/shell/PeekOriginalButton.js +3 -8
  403. package/dist/inspector/shell/PeekOriginalIcon.d.ts +0 -5
  404. package/dist/inspector/shell/PeekOriginalIcon.js +0 -5
  405. package/dist/inspector/shell/PromptActionButton.d.ts +21 -0
  406. package/dist/inspector/shell/PromptActionButton.js +14 -0
  407. package/dist/inspector/shell/elementName.d.ts +5 -0
  408. package/dist/inspector/shell/elementName.js +29 -0
  409. package/dist/inspector/shell/interactionStatePreview.d.ts +6 -0
  410. package/dist/inspector/shell/interactionStatePreview.js +107 -0
  411. package/dist/inspector/shell/originalPreview.d.ts +1 -5
  412. package/dist/inspector/shell/originalPreview.js +5 -37
  413. package/dist/inspector/shell/stateValue.d.ts +1 -2
  414. package/dist/inspector/shell/stateValue.js +4 -8
  415. package/dist/inspector/shell/styleState.d.ts +1 -2
  416. package/dist/inspector/shell/styleState.js +1 -2
  417. package/dist/inspector/sketch/SketchEditor.js +5 -5
  418. package/dist/inspector/sketch/SketchFrameOverlay.d.ts +2 -1
  419. package/dist/inspector/sketch/SketchFrameOverlay.js +13 -16
  420. package/dist/inspector/sketch/SketchOverlay.d.ts +3 -5
  421. package/dist/inspector/sketch/SketchOverlay.js +138 -263
  422. package/dist/inspector/sketch/SketchPromptPanel.d.ts +1 -2
  423. package/dist/inspector/sketch/SketchPromptPanel.js +8 -2
  424. package/dist/inspector/sketch/SketchThumbnail.d.ts +5 -0
  425. package/dist/inspector/sketch/SketchThumbnail.js +18 -0
  426. package/dist/inspector/sketch/SketchWorkspace.d.ts +1 -2
  427. package/dist/inspector/sketch/SketchWorkspace.js +70 -37
  428. package/dist/inspector/sketch/capture.d.ts +12 -3
  429. package/dist/inspector/sketch/capture.js +31 -14
  430. package/dist/inspector/sketch/copySketch.d.ts +4 -0
  431. package/dist/inspector/sketch/copySketch.js +43 -0
  432. package/dist/inspector/sketch/drawingTools.d.ts +15 -0
  433. package/dist/inspector/sketch/drawingTools.js +46 -0
  434. package/dist/inspector/sketch/frameHeading.d.ts +3 -0
  435. package/dist/inspector/sketch/frameHeading.js +23 -0
  436. package/dist/inspector/sketch/freehand.d.ts +0 -1
  437. package/dist/inspector/sketch/freehand.js +3 -4
  438. package/dist/inspector/sketch/geometry.d.ts +2 -1
  439. package/dist/inspector/sketch/geometry.js +15 -1
  440. package/dist/inspector/sketch/handoff.js +0 -1
  441. package/dist/inspector/sketch/history.d.ts +26 -0
  442. package/dist/inspector/sketch/history.js +55 -0
  443. package/dist/inspector/sketch/interaction.d.ts +3 -5
  444. package/dist/inspector/sketch/interaction.js +8 -11
  445. package/dist/inspector/sketch/model.d.ts +33 -6
  446. package/dist/inspector/sketch/model.js +101 -63
  447. package/dist/inspector/sketch/persistence.d.ts +14 -1
  448. package/dist/inspector/sketch/persistence.js +64 -8
  449. package/dist/inspector/sketch/raster.d.ts +3 -2
  450. package/dist/inspector/sketch/raster.js +40 -20
  451. package/dist/inspector/sketch/store.d.ts +1 -1
  452. package/dist/inspector/sketch/store.js +3 -4
  453. package/dist/inspector/sketch/videoFrames.d.ts +6 -0
  454. package/dist/inspector/sketch/videoFrames.js +80 -0
  455. package/dist/inspector/spacing/projection.d.ts +0 -8
  456. package/dist/inspector/spacing/projection.js +38 -20
  457. package/dist/inspector/styleEditors/BackgroundEditor.js +3 -2
  458. package/dist/inspector/styleEditors/BorderEditor.js +30 -135
  459. package/dist/inspector/styleEditors/BorderRadiusEditor.js +8 -3
  460. package/dist/inspector/styleEditors/ChildPlacement.d.ts +12 -0
  461. package/dist/inspector/styleEditors/ChildPlacement.js +9 -0
  462. package/dist/inspector/styleEditors/FlexControls.d.ts +35 -0
  463. package/dist/inspector/styleEditors/FlexControls.js +158 -0
  464. package/dist/inspector/styleEditors/GapField.d.ts +5 -2
  465. package/dist/inspector/styleEditors/GapField.js +3 -4
  466. package/dist/inspector/styleEditors/GridChildSection.d.ts +0 -5
  467. package/dist/inspector/styleEditors/GridChildSection.js +0 -5
  468. package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
  469. package/dist/inspector/styleEditors/GridPicker.js +2 -4
  470. package/dist/inspector/styleEditors/GridSection.d.ts +10 -8
  471. package/dist/inspector/styleEditors/GridSection.js +22 -9
  472. package/dist/inspector/styleEditors/GridValueField.d.ts +1 -5
  473. package/dist/inspector/styleEditors/GridValueField.js +2 -8
  474. package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +0 -1
  475. package/dist/inspector/styleEditors/ImageBackgroundEditor.js +1 -2
  476. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +0 -1
  477. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +0 -1
  478. package/dist/inspector/styleEditors/LayoutComboField.js +0 -5
  479. package/dist/inspector/styleEditors/LayoutModeRow.d.ts +14 -0
  480. package/dist/inspector/styleEditors/LayoutModeRow.js +60 -0
  481. package/dist/inspector/styleEditors/LayoutSection.d.ts +2 -2
  482. package/dist/inspector/styleEditors/LayoutSection.js +30 -356
  483. package/dist/inspector/styleEditors/OpacityEditor.js +7 -5
  484. package/dist/inspector/styleEditors/PositionControls.d.ts +18 -0
  485. package/dist/inspector/styleEditors/PositionControls.js +16 -0
  486. package/dist/inspector/styleEditors/SizeSection.d.ts +18 -0
  487. package/dist/inspector/styleEditors/SizeSection.js +71 -0
  488. package/dist/inspector/styleEditors/{SpacingBox.d.ts → SpacingField.d.ts} +3 -10
  489. package/dist/inspector/styleEditors/{SpacingBox.js → SpacingField.js} +15 -29
  490. package/dist/inspector/styleEditors/Typography.js +2 -4
  491. package/dist/inspector/styleEditors/borderModel.d.ts +36 -0
  492. package/dist/inspector/styleEditors/borderModel.js +105 -0
  493. package/dist/inspector/styleEditors/completeCssValue.d.ts +1 -5
  494. package/dist/inspector/styleEditors/completeCssValue.js +3 -13
  495. package/dist/inspector/styleEditors/fieldValue.d.ts +20 -0
  496. package/dist/inspector/styleEditors/fieldValue.js +26 -0
  497. package/dist/inspector/styleEditors/gradientValue.d.ts +1 -1
  498. package/dist/inspector/styleEditors/gradientValue.js +3 -2
  499. package/dist/inspector/styleEditors/gridChildModel.d.ts +7 -47
  500. package/dist/inspector/styleEditors/gridChildModel.js +6 -37
  501. package/dist/inspector/styleEditors/hiddenSizeOverrides.d.ts +5 -0
  502. package/dist/inspector/styleEditors/hiddenSizeOverrides.js +42 -0
  503. package/dist/inspector/styleEditors/inlineAuthored.d.ts +1 -8
  504. package/dist/inspector/styleEditors/inlineAuthored.js +3 -17
  505. package/dist/inspector/styleEditors/layoutMode.d.ts +15 -0
  506. package/dist/inspector/styleEditors/layoutMode.js +33 -0
  507. package/dist/inspector/styleEditors/layoutPreviewState.d.ts +0 -1
  508. package/dist/inspector/styleEditors/layoutPreviewState.js +0 -1
  509. package/dist/inspector/styleEditors/layoutValue.d.ts +2 -8
  510. package/dist/inspector/styleEditors/layoutValue.js +6 -15
  511. package/dist/inspector/styleEditors/nudgeValue.d.ts +1 -13
  512. package/dist/inspector/styleEditors/nudgeValue.js +1 -13
  513. package/dist/inspector/styleEditors/rowLookup.d.ts +1 -5
  514. package/dist/inspector/styleEditors/rowLookup.js +1 -5
  515. package/dist/inspector/styleEditors/stringRecord.d.ts +1 -2
  516. package/dist/inspector/styleEditors/stylePresence.d.ts +0 -2
  517. package/dist/inspector/styleEditors/stylePresence.js +1 -4
  518. package/dist/inspector/styleEditors/textRelevance.d.ts +1 -1
  519. package/dist/inspector/styleEditors/textRelevance.js +1 -1
  520. package/dist/inspector/styleEditors/useFieldVisibility.js +1 -2
  521. package/dist/inspector/styleEditors/useLayoutContext.d.ts +13 -0
  522. package/dist/inspector/styleEditors/useLayoutContext.js +53 -0
  523. package/dist/inspector/styleEditors/valuePolicy.d.ts +1 -5
  524. package/dist/inspector/styleEditors/valuePolicy.js +0 -1
  525. package/dist/inspector/testing.d.ts +1 -4
  526. package/dist/inspector/testing.js +1 -4
  527. package/dist/inspector/tokens/TokenChip.d.ts +1 -4
  528. package/dist/inspector/tokens/TokenChip.js +1 -4
  529. package/dist/inspector/tokens/TokenField.d.ts +4 -3
  530. package/dist/inspector/tokens/TokenField.js +53 -32
  531. package/dist/inspector/tokens/TokensPanel.js +2 -1
  532. package/dist/inspector/tokens/catalog.d.ts +2 -10
  533. package/dist/inspector/tokens/catalog.js +5 -12
  534. package/dist/inspector/tokens/dragPointerLock.d.ts +0 -1
  535. package/dist/inspector/tokens/dragPointerLock.js +2 -3
  536. package/dist/inspector/tokens/editActions.d.ts +4 -4
  537. package/dist/inspector/tokens/editActions.js +11 -7
  538. package/dist/inspector/tokens/resolution/cascade.d.ts +1 -5
  539. package/dist/inspector/tokens/resolution/cascade.js +1 -5
  540. package/dist/inspector/tokens/resolution/containerQueryEvaluator.d.ts +11 -0
  541. package/dist/inspector/tokens/resolution/containerQueryEvaluator.js +82 -0
  542. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +4 -19
  543. package/dist/inspector/tokens/resolution/cssomCollector.js +186 -122
  544. package/dist/inspector/tokens/resolution/nestedSelectors.d.ts +2 -0
  545. package/dist/inspector/tokens/resolution/nestedSelectors.js +63 -0
  546. package/dist/inspector/tokens/resolution/ruleMatching.d.ts +4 -14
  547. package/dist/inspector/tokens/resolution/ruleMatching.js +136 -63
  548. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +3 -14
  549. package/dist/inspector/tokens/resolution/selectorSemantics.js +12 -27
  550. package/dist/inspector/tokens/resolution.d.ts +11 -27
  551. package/dist/inspector/tokens/resolution.js +105 -181
  552. package/dist/inspector/tokens/tokenAvailability.d.ts +2 -14
  553. package/dist/inspector/tokens/tokenAvailability.js +6 -38
  554. package/dist/inspector/tokens/tokenEdits.d.ts +1 -1
  555. package/dist/inspector/tokens/tokenEdits.js +1 -1
  556. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +0 -1
  557. package/dist/inspector/tokens/valueSemanticsAdapter.js +18 -2
  558. package/dist/inspector/ui/AtRuleContext.d.ts +5 -5
  559. package/dist/inspector/ui/AtRuleContext.js +8 -6
  560. package/dist/inspector/ui/ControlSurface.d.ts +0 -4
  561. package/dist/inspector/ui/Disclosure.d.ts +0 -5
  562. package/dist/inspector/ui/Disclosure.js +0 -4
  563. package/dist/inspector/ui/InlineStyleWarning.d.ts +0 -1
  564. package/dist/inspector/ui/InlineStyleWarning.js +2 -2
  565. package/dist/inspector/ui/InspectorPopover.d.ts +1 -5
  566. package/dist/inspector/ui/InspectorPopover.js +1 -5
  567. package/dist/inspector/ui/InspectorStyle.d.ts +8 -0
  568. package/dist/inspector/ui/InspectorStyle.js +26 -0
  569. package/dist/inspector/ui/PopoverListbox.d.ts +2 -1
  570. package/dist/inspector/ui/PopoverListbox.js +3 -3
  571. package/dist/inspector/ui/SegmentedControl.d.ts +4 -4
  572. package/dist/inspector/ui/SegmentedControl.js +6 -4
  573. package/dist/inspector/ui/SideValuesField.d.ts +1 -6
  574. package/dist/inspector/ui/SideValuesField.js +2 -8
  575. package/dist/inspector/ui/Toast.d.ts +10 -0
  576. package/dist/inspector/ui/Toast.js +26 -0
  577. package/dist/inspector/ui/assets/canvasIllustration.d.ts +2 -0
  578. package/dist/inspector/ui/assets/canvasIllustration.js +21 -0
  579. package/dist/inspector/ui/assets/gridIllustration.d.ts +2 -0
  580. package/dist/inspector/ui/assets/{grid.svg → gridIllustration.js} +3 -2
  581. package/dist/inspector/ui/atRuleSegments.d.ts +13 -0
  582. package/dist/inspector/ui/atRuleSegments.js +34 -0
  583. package/dist/inspector/ui/classNames.d.ts +0 -1
  584. package/dist/inspector/ui/classNames.js +0 -1
  585. package/dist/inspector/ui/customCursors.d.ts +11 -0
  586. package/dist/inspector/ui/customCursors.js +29 -7
  587. package/dist/inspector/ui/styles.js +25 -25
  588. package/dist/inspector/workspace/commands.js +1 -2
  589. package/dist/inspector/workspace/controller.js +20 -2
  590. package/dist/inspector/workspace/handoff.d.ts +1 -5
  591. package/dist/inspector/workspace/handoff.js +4 -7
  592. package/dist/inspector/workspace/sentItems.d.ts +3 -6
  593. package/dist/inspector/workspace/sentItems.js +6 -24
  594. package/dist/inspector/workspace/timeline.d.ts +28 -11
  595. package/dist/inspector/workspace/timeline.js +117 -96
  596. package/dist/internal/agent-protocol.d.ts +53 -38
  597. package/dist/internal/agent-protocol.js +151 -42
  598. package/dist/nudge-ui.mjs +155 -92
  599. package/dist/project/artifacts.js +24 -21
  600. package/dist/project/files.d.ts +0 -1
  601. package/dist/project/files.js +2 -9
  602. package/dist/project/identity.d.ts +1 -5
  603. package/dist/project/identity.js +1 -5
  604. package/dist/project/mcpPackage.d.ts +3 -0
  605. package/dist/project/mcpPackage.js +55 -0
  606. package/dist/project/pathPolicy.d.ts +1 -6
  607. package/dist/project/pathPolicy.js +1 -6
  608. package/dist/project/tokens.d.ts +2 -12
  609. package/dist/project/tokens.js +4 -15
  610. package/dist/transport/editor.d.ts +1 -12
  611. package/dist/transport/editor.js +2 -13
  612. package/dist/transport/index.d.ts +0 -5
  613. package/dist/transport/index.js +0 -5
  614. package/dist/transport/routes.d.ts +0 -5
  615. package/dist/transport/routes.js +0 -5
  616. package/package.json +16 -5
  617. package/dist/inspector/canvas/measurementProjection.d.ts +0 -8
  618. package/dist/inspector/canvas/measurementProjection.js +0 -16
  619. package/dist/inspector/changes/changesLog.d.ts +0 -49
  620. package/dist/inspector/changes/changesLog.js +0 -255
  621. package/dist/inspector/changes/draftChanges.d.ts +0 -58
  622. package/dist/inspector/changes/draftChanges.js +0 -304
  623. package/dist/inspector/conformance/projection.d.ts +0 -2
  624. package/dist/inspector/conformance/projection.js +0 -3
  625. package/dist/inspector/inline-text/textChangeBoundary.d.ts +0 -6
  626. package/dist/inspector/inline-text/textChangeBoundary.js +0 -1
  627. package/dist/inspector/overlay/InspectorOverlay.d.ts +0 -5
  628. package/dist/inspector/overlay/InspectorOverlay.js +0 -332
  629. package/dist/inspector/overlay/elementSelector.d.ts +0 -1
  630. package/dist/inspector/overlay/elementSelector.js +0 -111
  631. package/dist/inspector/sketch/SketchChanges.d.ts +0 -2
  632. package/dist/inspector/sketch/SketchChanges.js +0 -72
  633. package/dist/inspector/sketch/SketchEntryButton.d.ts +0 -4
  634. package/dist/inspector/sketch/SketchEntryButton.js +0 -11
  635. package/dist/inspector/sketch/SketchLayersPanel.d.ts +0 -2
  636. package/dist/inspector/sketch/SketchLayersPanel.js +0 -71
  637. package/dist/inspector/styleEditors/InsetSection.d.ts +0 -15
  638. package/dist/inspector/styleEditors/InsetSection.js +0 -15
  639. package/dist/inspector/styleEditors/PositionInsets.d.ts +0 -15
  640. package/dist/inspector/styleEditors/PositionInsets.js +0 -12
  641. package/dist/inspector/tokens/TokenDropdown.d.ts +0 -13
  642. package/dist/inspector/tokens/TokenDropdown.js +0 -59
@@ -9,8 +9,9 @@ import { resolveSelectionTarget, selectionTargetMode } from "../selection/select
9
9
  import { escapeCssString } from "../projection/cssEscapes.js";
10
10
  import { APPLICATION_GESTURE_EVENTS, blockApplicationClick, blockApplicationGesture, isInlineEditorTarget, isUserClick, } from "../overlay/clickPolicy.js";
11
11
  import { EMPTY_TEXT_PROJECTION_ATTR } from "../projection/textProjection.js";
12
- import { getSpacingAffordanceAtPoint, getSpacingHoverAtPoint, toSpacingDescriptor, } from "../overlay/spacingGestures.js";
12
+ import { getElementSpacingAtPoint, getElementSpacingHandleAtPoint, toSpacingDescriptor, } from "../overlay/spacingGestures.js";
13
13
  import { COMMENT_CURSOR, INTERACTION_CURSOR_PROPERTY, rendererCursorValue } from "../ui/customCursors.js";
14
+ import { isInspectorUiEvent, isPageSurface } from "./pageSurface.js";
14
15
  const REACT_FIBER_KEY = /^__reactFiber\$/;
15
16
  const REACT_INTERNAL_KEY = /^__reactInternalInstance\$/;
16
17
  const HOVER_SCROLL_SETTLE_DELAY = 150;
@@ -94,7 +95,11 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
94
95
  let suppressHoverDuringSpacingDrag = false;
95
96
  let lastHoverPoint = null;
96
97
  function trackListener(target, type, listener, options) {
97
- const eventListener = (event) => listener(event);
98
+ const eventListener = (event) => {
99
+ if (isInspectorUiEvent(event))
100
+ return;
101
+ listener(event);
102
+ };
98
103
  target.addEventListener(type, eventListener, options);
99
104
  listenerCleanup.push(() => target.removeEventListener(type, eventListener, options));
100
105
  }
@@ -166,24 +171,22 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
166
171
  appliedRootCursor = cursor;
167
172
  }
168
173
  function reportHover(pending) {
169
- const { element, clear } = pending;
174
+ const { clear } = pending;
170
175
  const identity = getRendererIdentity();
171
176
  if (!identity)
172
177
  return;
178
+ // Only the handle hit starts a drag and changes the cursor; the area-wide match is purely visual.
179
+ const elementSpacing = !commentMode && !clear && pending.point
180
+ ? getElementSpacingAtPoint(document, pending.element, pending.point.x, pending.point.y)
181
+ : null;
182
+ // A margin belongs to a child of the hovered element; hovering it reports that child.
183
+ const element = elementSpacing?.handle?.element ?? elementSpacing?.area?.element ?? pending.element;
184
+ const spacing = elementSpacing?.handle?.element === element ? elementSpacing.handle : null;
185
+ const hoverSpacing = elementSpacing?.area?.element === element ? elementSpacing.area : null;
173
186
  const cid = element.getAttribute("data-cid");
174
187
  const selector = buildSelector(element);
175
188
  const src = element.getAttribute("data-src") ?? "";
176
189
  const rect = clear ? null : element.getBoundingClientRect();
177
- // The handle hit is the only target that starts a drag, so it is the only
178
- // one that changes the cursor. The area-wide match is purely visual.
179
- const rawSpacing = !commentMode && !clear && pending.point
180
- ? getSpacingAffordanceAtPoint(document, pending.point.x, pending.point.y)
181
- : null;
182
- const spacing = rawSpacing && rawSpacing.element === element ? rawSpacing : null;
183
- const rawHoverSpacing = !commentMode && !clear && pending.point
184
- ? getSpacingHoverAtPoint(document, pending.point.x, pending.point.y)
185
- : null;
186
- const hoverSpacing = rawHoverSpacing && rawHoverSpacing.element === element ? rawHoverSpacing : null;
187
190
  if (spacing) {
188
191
  setSpacingCursor(spacing.element, spacing.cursor);
189
192
  }
@@ -277,7 +280,8 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
277
280
  if (interactionsSuspended)
278
281
  return;
279
282
  updateMeasureState(event.altKey, true);
280
- if (suppressHoverDuringSpacingDrag)
283
+ // Like mousemove, a pressed pointer reports drag moves, not hovers.
284
+ if (suppressHoverDuringSpacingDrag || pendingDrag)
281
285
  return;
282
286
  const target = event.target;
283
287
  if (!(target instanceof Element))
@@ -293,6 +297,8 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
293
297
  trackListener(window, "scroll", suppressHoverDuringScroll, true);
294
298
  let pendingDrag = null;
295
299
  let dragging = false;
300
+ // The browser clicks the common ancestor after a drag; that click must not reselect the ancestor.
301
+ let suppressClickAfterDrag = false;
296
302
  let lastDragPoint = null;
297
303
  let lastSelected = null;
298
304
  trackListener(window, "nudge-ui:open", () => {
@@ -405,19 +411,15 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
405
411
  const element = resolveSelectionTarget(event.target, selectionTargetMode(event));
406
412
  if (!element)
407
413
  return;
408
- const spacingAffordance = getSpacingAffordanceAtPoint(document, event.clientX, event.clientY);
409
- const spacing = spacingAffordance?.element === element
410
- ? toSpacingDescriptor(spacingAffordance)
411
- : null;
414
+ const spacingAffordance = getElementSpacingHandleAtPoint(document, element, event.clientX, event.clientY);
415
+ const spacing = spacingAffordance ? toSpacingDescriptor(spacingAffordance) : null;
412
416
  if (spacing) {
413
417
  suppressHoverDuringSpacingDrag = true;
414
418
  hoverUpdate.cancel();
415
419
  lastHoverPoint = null;
416
420
  }
417
421
  const identity = getRendererIdentity();
418
- // A spacing drag owns the pointer gesture. Do not start an inline-text
419
- // attempt for the same down event; padding and gaps are intentionally not
420
- // editable text targets.
422
+ // A spacing drag owns the gesture; padding and gaps are not editable text targets.
421
423
  if (identity && !spacing) {
422
424
  const emptyProjectionId = event.target instanceof Element
423
425
  ? event.target.closest(`[${EMPTY_TEXT_PROJECTION_ATTR}]`)?.getAttribute(EMPTY_TEXT_PROJECTION_ATTR) ?? undefined
@@ -436,9 +438,10 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
436
438
  };
437
439
  sendToParent(message);
438
440
  }
439
- lastSelected = element;
441
+ const owner = spacingAffordance?.element ?? element;
442
+ lastSelected = owner;
440
443
  pendingDrag = {
441
- element,
444
+ element: owner,
442
445
  point: { x: event.clientX, y: event.clientY },
443
446
  spacing,
444
447
  };
@@ -496,6 +499,8 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
496
499
  function finishDrag(event) {
497
500
  dragMoveUpdate.cancel();
498
501
  if (dragging) {
502
+ suppressClickAfterDrag = true;
503
+ window.setTimeout(() => { suppressClickAfterDrag = false; }, 0);
499
504
  event.preventDefault();
500
505
  const point = { x: event.clientX, y: event.clientY };
501
506
  lastDragPoint = point;
@@ -507,6 +512,9 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
507
512
  }
508
513
  trackListener(document, "mouseup", finishDrag, true);
509
514
  function forwardKeyboardShortcut(event, phase) {
515
+ // The controller's own window listeners already see page-surface keys.
516
+ if (isPageSurface())
517
+ return false;
510
518
  const code = isKeyboardShortcutCode(event.code) ? event.code : null;
511
519
  if (!code)
512
520
  return false;
@@ -537,9 +545,7 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
537
545
  sendToParent(message);
538
546
  return phase === "keydown";
539
547
  }
540
- // Global tool shortcuts need to run before application capture handlers on
541
- // the iframe document. A page-level window handler can otherwise stop the
542
- // event before it reaches the document listener.
548
+ // Must run before application capture handlers on the iframe document, which can stop the event.
543
549
  trackListener(window, "keydown", (event) => {
544
550
  if (isEditableEvent(event))
545
551
  return;
@@ -684,11 +690,15 @@ export function installRendererElementSelector(acceptsClick = isUserClick) {
684
690
  trackListener(document, "click", (event) => {
685
691
  if (interactionsSuspended || !acceptsClick(event))
686
692
  return;
693
+ if (suppressClickAfterDrag) {
694
+ suppressClickAfterDrag = false;
695
+ blockApplicationClick(event);
696
+ return;
697
+ }
687
698
  const target = event.target;
688
699
  if (!(target instanceof Element))
689
700
  return;
690
- // Design-tool clicks are editing gestures and must not reach the
691
- // rendered application; the Select tool is how the app receives them.
701
+ // Design-tool clicks are editing gestures and must not reach the rendered application.
692
702
  const el = resolveSelectionTarget(target, selectionTargetMode(event));
693
703
  if (!el) {
694
704
  blockApplicationClick(event);
@@ -1,11 +1,9 @@
1
- import { type FrameIdentity, type FrameProtocolMessage } from "./frameProtocol.js";
1
+ import { type RendererToControllerMessage } from "./frameProtocol.js";
2
+ import { type FrameConnection } from "./frameConnection.js";
2
3
  export interface CanvasRendererMessage {
3
- cardId: string;
4
- iframe: HTMLIFrameElement;
5
- identity: FrameIdentity;
6
- message: FrameProtocolMessage;
4
+ frame: FrameConnection;
5
+ message: RendererToControllerMessage;
7
6
  }
8
7
  type CanvasRendererMessageListener = (event: CanvasRendererMessage) => void;
9
- /** Subscribes to same-origin messages from registered Canvas renderer frames. */
10
8
  export declare function subscribeCanvasRendererMessages(listener: CanvasRendererMessageListener): () => void;
11
9
  export {};
@@ -1,36 +1,31 @@
1
- import { isRendererMessageFor, PROTOCOL_VERSION, } from "./frameProtocol.js";
2
- import { findCanvasFrameBySource, PROJECT_ID, WORKSPACE_ID } from "./projection.js";
1
+ import { isRendererMessageFor, isRendererMessageType, PROTOCOL_VERSION, } from "./frameProtocol.js";
2
+ import { connectFrame } from "./frameConnection.js";
3
+ import { findCanvasFrameBySource } from "./projection.js";
3
4
  const listeners = new Set();
4
5
  function routeRendererMessage(event) {
5
6
  if (event.origin !== window.location.origin || !event.data || typeof event.data !== "object")
6
7
  return;
7
- const frame = findCanvasFrameBySource(event.source);
8
- if (!frame)
8
+ const source = findCanvasFrameBySource(event.source);
9
+ if (!source)
9
10
  return;
10
- const identity = {
11
- projectId: PROJECT_ID,
12
- workspaceId: WORKSPACE_ID,
13
- cardId: frame.cardId,
14
- };
11
+ const frame = connectFrame(source.cardId, source.iframe);
15
12
  // SAFETY: The object guard above makes the optional discriminator fields safe to inspect.
16
13
  const candidate = event.data;
14
+ if (!isRendererMessageType(candidate.type))
15
+ return;
17
16
  if (candidate.type === "renderer-hello") {
18
17
  if (candidate.protocolVersion !== PROTOCOL_VERSION)
19
18
  return;
20
19
  }
21
- else if (!isRendererMessageFor(event.data, identity)) {
20
+ else if (!isRendererMessageFor(event.data, frame.identity)) {
22
21
  return;
23
22
  }
24
- const routed = {
25
- ...frame,
26
- identity,
27
- // SAFETY: Subscribers narrow the discriminated protocol union before reading message-specific fields.
28
- message: event.data,
29
- };
23
+ // SAFETY: The type is a known renderer message; subscribers narrow it and
24
+ // apply the strict per-message schema before trusting message-specific fields.
25
+ const routed = { frame, message: event.data };
30
26
  for (const listener of listeners)
31
27
  listener(routed);
32
28
  }
33
- /** Subscribes to same-origin messages from registered Canvas renderer frames. */
34
29
  export function subscribeCanvasRendererMessages(listener) {
35
30
  if (listeners.size === 0)
36
31
  window.addEventListener("message", routeRendererMessage);
@@ -1,2 +1,4 @@
1
1
  import type { ElementClickMessage } from "./frameProtocol.js";
2
- export declare function handleElementClick(msg: ElementClickMessage, iframe: HTMLIFrameElement, cardId: string): void;
2
+ import type { FrameConnection } from "./frameConnection.js";
3
+ /** Selects the exact DOM node the user clicked. Falls back to the card when that node is gone. */
4
+ export declare function handleElementClick(msg: ElementClickMessage, frame: FrameConnection): void;
@@ -1,44 +1,12 @@
1
1
  import { getSelectedElements, setSelectedElement, toggleSelectedElement } from "../selection/selectionStore.js";
2
2
  import { selectCard } from "./canvasStore.js";
3
- import { RENDERER_ELEMENT_ID_ATTR } from "./rendererCidIndex.js";
4
3
  import { inspectComponentTargets } from "../componentSemantics/index.js";
5
- function isHtmlElementInDocument(node, doc) {
6
- const frameWindow = doc.defaultView;
7
- return frameWindow !== null && node instanceof frameWindow.HTMLElement;
8
- }
9
- /**
10
- * Resolve the exact DOM element inside a card's iframe that matches an
11
- * element-click message. The renderer (running inside the iframe) tells us
12
- * the clicked element's renderer-owned `elementId`; we re-find the element by
13
- * that stable data attribute so that the parent app can mutate the same
14
- * physical DOM node the user clicked.
15
- *
16
- * The resolution uses a scoped ID query and never depends on document order.
17
- *
18
- * If the exact renderer-owned node no longer exists, fail closed instead of
19
- * binding the copied component metadata to an unrelated DOM node.
20
- */
21
- function findClickedElement(doc, elementId, cid, src) {
22
- if (!doc)
23
- return null;
24
- if (!/^r\d+$/.test(elementId))
25
- return null;
26
- const candidates = doc.querySelectorAll(`[${RENDERER_ELEMENT_ID_ATTR}="${elementId}"]`);
27
- if (candidates.length !== 1)
28
- return null;
29
- const candidate = candidates[0] ?? null;
30
- if (!candidate
31
- || candidate.getAttribute("data-cid") !== cid
32
- || (candidate.getAttribute("data-src") ?? "") !== src)
33
- return null;
34
- return isHtmlElementInDocument(candidate, doc) ? candidate : null;
35
- }
36
- export function handleElementClick(msg, iframe, cardId) {
37
- const doc = iframe.contentDocument;
38
- const el = findClickedElement(doc, msg.elementId, msg.cid, msg.src);
4
+ /** Selects the exact DOM node the user clicked. Falls back to the card when that node is gone. */
5
+ export function handleElementClick(msg, frame) {
6
+ const el = frame.element(msg);
39
7
  if (!el) {
40
8
  setSelectedElement(null);
41
- selectCard(cardId);
9
+ selectCard(frame.cardId);
42
10
  return;
43
11
  }
44
12
  const componentTargets = inspectComponentTargets(el);
@@ -52,14 +20,13 @@ export function handleElementClick(msg, iframe, cardId) {
52
20
  domElement: el,
53
21
  componentTargets,
54
22
  };
55
- // setSelectedElement must run before any side effect that could reload the
56
- // host page, otherwise the selection would be discarded by the unload.
23
+ // Must run before any side effect that could reload the host page, which would drop the selection.
57
24
  const current = getSelectedElements();
58
- if (msg.additive && current.length > 0 && current.every((candidate) => candidate.domElement.ownerDocument === doc)) {
25
+ if (msg.additive && current.length > 0 && current.every((candidate) => candidate.domElement.ownerDocument === el.ownerDocument)) {
59
26
  toggleSelectedElement(selected);
60
27
  }
61
28
  else {
62
29
  setSelectedElement(selected);
63
30
  }
64
- selectCard(cardId);
31
+ selectCard(frame.cardId);
65
32
  }
@@ -1,5 +1,4 @@
1
1
  import { type ReplaceStylesMessage } from "./frameProtocol.js";
2
- /** Installs renderer diagnostics only after the dev-only renderer bootstrap. */
3
2
  export declare function startRendererProjectionDiagnostics(): () => void;
4
3
  export declare function getLastAppliedRevision(): number;
5
4
  export declare function resetRendererRevision(): void;
@@ -9,9 +9,24 @@ import { applyStructuralProjection, getStructuralProjectionReports, isStructural
9
9
  import { applyTextContentProjection, getTextProjectionReports, subscribeTextProjectionDiagnostics, } from "../projection/textProjection.js";
10
10
  import { isTextContentChangeListValue } from "../changes/types.js";
11
11
  import { applyDraftProjection, } from "../projection/draftProjection.js";
12
+ import { adoptStylesheet, allowsStyleElements, getAdoptedStylesheet } from "../runtime/ownedStylesheets.js";
13
+ import { applyRuntimeIdentityClaims, isRuntimeIdentityClaim } from "../runtime/runtimeIdentityClaims.js";
12
14
  const SHEET_ID = "nudge-ui-styles";
15
+ let adoptedCss = null;
13
16
  function replaceRendererCss(css) {
17
+ if (!allowsStyleElements(document)) {
18
+ // Structural and text projections resend unchanged CSS; rewriting it would discard cached resolutions.
19
+ const adopted = getAdoptedStylesheet(document, SHEET_ID);
20
+ if (adopted && adoptedCss === css && document.adoptedStyleSheets.includes(adopted))
21
+ return;
22
+ adoptStylesheet(document, SHEET_ID, css);
23
+ adoptedCss = css;
24
+ notifyBrowserStylesheetChange(document);
25
+ return;
26
+ }
14
27
  let sheet = document.getElementById(SHEET_ID);
28
+ if (sheet?.textContent === css)
29
+ return;
15
30
  if (!sheet) {
16
31
  sheet = document.createElement("style");
17
32
  sheet.id = SHEET_ID;
@@ -22,6 +37,9 @@ function replaceRendererCss(css) {
22
37
  notifyBrowserStylesheetChange(document);
23
38
  }
24
39
  const rendererDocumentProjectionAdapter = {
40
+ applyRuntimeIdentities: (claims) => {
41
+ applyRuntimeIdentityClaims(document, claims);
42
+ },
25
43
  applyStructural: (changes) => {
26
44
  applyStructuralProjection(document, changes);
27
45
  },
@@ -44,6 +62,7 @@ function projectionFromReplaceStylesMessage(msg) {
44
62
  structuralChanges: msg.structuralChanges,
45
63
  textContentChanges: msg.textContentChanges,
46
64
  componentOverrides: msg.componentOverrides,
65
+ runtimeIdentities: msg.runtimeIdentities,
47
66
  };
48
67
  }
49
68
  let lastAppliedRevision = -1;
@@ -113,7 +132,6 @@ function sendProjectionApplied(revision) {
113
132
  };
114
133
  sendToParent(msg);
115
134
  }
116
- /** Installs renderer diagnostics only after the dev-only renderer bootstrap. */
117
135
  export function startRendererProjectionDiagnostics() {
118
136
  if (!isNudgeUiDev() || activeDiagnosticsOwner)
119
137
  return () => undefined;
@@ -195,6 +213,10 @@ export function validateReplaceStyles(msg, projectId, workspaceId, cardId) {
195
213
  if (!isTextContentChangeListValue(m.textContentChanges)) {
196
214
  return { valid: false, reason: "text content changes are invalid" };
197
215
  }
216
+ if (m.runtimeIdentities !== undefined
217
+ && (!Array.isArray(m.runtimeIdentities) || !m.runtimeIdentities.every(isRuntimeIdentityClaim))) {
218
+ return { valid: false, reason: "runtime identities are invalid" };
219
+ }
198
220
  if (!isComponentOverrideList(m.componentOverrides)) {
199
221
  return { valid: false, reason: "component overrides are invalid" };
200
222
  }
@@ -1,13 +1,4 @@
1
- /**
2
- * Keep the resize handle usable while the board is zoomed without allowing
3
- * inverse scaling to make it disproportionately large or small.
4
- */
1
+ /** Keeps the resize handle usable at any zoom without letting inverse scaling make it disproportionately large or small. */
5
2
  export declare const CANVAS_RESIZE_HANDLE_MIN_SCALE: number;
6
3
  export declare const CANVAS_RESIZE_HANDLE_MAX_SCALE = 2;
7
- /**
8
- * Returns the scale to apply inside the board's zoomed coordinate space.
9
- *
10
- * The lower bound matches the inverse of the largest supported camera zoom,
11
- * and the upper bound follows the toolbar compensation policy.
12
- */
13
4
  export declare function getCanvasResizeHandleScale(zoom: number): number;
@@ -1,17 +1,8 @@
1
1
  import { MAX_CAMERA_ZOOM } from "./viewStore.js";
2
2
  import { CANVAS_TOOLBAR_MAX_SCALE } from "./toolbarScale.js";
3
- /**
4
- * Keep the resize handle usable while the board is zoomed without allowing
5
- * inverse scaling to make it disproportionately large or small.
6
- */
3
+ /** Keeps the resize handle usable at any zoom without letting inverse scaling make it disproportionately large or small. */
7
4
  export const CANVAS_RESIZE_HANDLE_MIN_SCALE = 1 / MAX_CAMERA_ZOOM;
8
5
  export const CANVAS_RESIZE_HANDLE_MAX_SCALE = CANVAS_TOOLBAR_MAX_SCALE;
9
- /**
10
- * Returns the scale to apply inside the board's zoomed coordinate space.
11
- *
12
- * The lower bound matches the inverse of the largest supported camera zoom,
13
- * and the upper bound follows the toolbar compensation policy.
14
- */
15
6
  export function getCanvasResizeHandleScale(zoom) {
16
7
  if (!Number.isFinite(zoom) || zoom <= 0) {
17
8
  return CANVAS_RESIZE_HANDLE_MAX_SCALE;
@@ -33,22 +33,16 @@ export interface DurableSession {
33
33
  export type { SerializableChange, SerializableComponentChange, SerializableElementChange, SerializableTextContentChange, SerializableTokenChange, SerializableTokenRef, } from "../changes/codecs.js";
34
34
  export interface HydrationResult {
35
35
  restored: boolean;
36
- changeCount: number;
37
36
  }
38
37
  export declare function serializeSession(): DurableSession;
39
38
  export declare function persistSession(): boolean;
40
39
  export declare function hydrateSession(): HydrationResult;
41
- /** Clears the active frame's edit draft while preserving canvas geometry and other drafts. */
42
- export declare function clearSelectedFrameChanges(): void;
40
+ /** Clears the active draft, its comments, and project sketches while preserving canvas geometry and other drafts. */
41
+ export declare function clearSelectedFrameChanges(): Promise<void>;
43
42
  export declare function clearSession(): void;
44
43
  export declare function enableAutoSave(): void;
45
- /**
46
- * Coalesces the synchronous full-session `JSON.stringify` + `localStorage`
47
- * write behind a trailing timer so commits never block on persistence. A
48
- * refresh or close inside the debounce window still flushes on `beforeunload`.
49
- */
44
+ /** Coalesces the synchronous full-session write behind a trailing timer; `beforeunload` still flushes it. */
50
45
  export declare function scheduleAutoSave(): void;
51
- export declare function scheduleCanvasSave(): void;
52
46
  export declare function flushAutoSave(): void;
53
47
  export declare function getRestoreCount(): number;
54
48
  export declare function setRestoreCount(count: number): void;
@@ -1,11 +1,12 @@
1
+ import { inspectorStorage } from "../runtime/inspectorStorage.js";
1
2
  import { isFrameContent } from "./frameContent.js";
2
3
  import { clearComments } from "../comments/store.js";
4
+ import { clearSketchesForProject } from "../sketch/store.js";
5
+ import { clearSketchClipboardHandoff } from "../sketch/handoff.js";
3
6
  import { documentTarget, targetFromKey } from "../drafts/model.js";
4
- import { canEditDraft, getActiveDraftChanges, isDraftLocked } from "../changes/draftChanges.js";
5
7
  import { getFrameGroups, isFrameGroup, getCanvasCards, getFocusedCardId, getSelectedCardId, hydrateCanvasStore, removeCanvasCard, } from "./canvasStore.js";
6
8
  import { getCanvasMode, getCanvasPresentation, getBoardCamera, setBoardCamera, } from "./viewStore.js";
7
9
  import { applyRules } from "../projection/managedStylesheet.js";
8
- import { clearActiveDraft } from "../changes/changesLog.js";
9
10
  import { removeManagedSheet } from "../projection/managedStylesheet.js";
10
11
  import { setSelectedElement } from "../selection/selectionStore.js";
11
12
  import { canWriteWorkspace } from "./workspaceLease.js";
@@ -13,7 +14,7 @@ import { resetStructuralDeleteProjection, } from "../projection/structuralProjec
13
14
  import { projectToAllReadyCards } from "./projection.js";
14
15
  import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
15
16
  import { clearClipboardHandoff, getClipboardHandoffSnapshot, hydrateClipboardHandoff, isClipboardHandoffSnapshot, } from "../prompt/clipboardHandoff.js";
16
- import { activateDraftForCard, clearDrafts, persistDrafts } from "../drafts/store.js";
17
+ import { activateDraftForCard, canEditDraft, clearActiveDraft, clearDrafts, getActiveDraftChanges, isDraftLocked, persistDrafts, } from "../drafts/store.js";
17
18
  const SCHEMA_VERSION = 17;
18
19
  const STORAGE_PREFIX = "nudge-ui";
19
20
  function projectId() {
@@ -69,70 +70,67 @@ export function persistSession() {
69
70
  return false;
70
71
  return persistSessionUnchecked();
71
72
  }
72
- /**
73
- * Serializes and writes the session without the write-lease gate. The public
74
- * persistence path checks the lease before calling this helper.
75
- */
73
+ /** Skips the write-lease gate; the public persistence path checks the lease first. */
76
74
  function persistSessionUnchecked() {
77
75
  if (!projectId())
78
76
  return false;
79
77
  try {
80
78
  persistDrafts();
81
79
  const session = buildSession();
82
- localStorage.setItem(storageKey(projectId()), JSON.stringify(session));
80
+ inspectorStorage()?.setItem(storageKey(projectId()), JSON.stringify(session));
83
81
  return true;
84
82
  }
85
83
  catch {
86
- // Storage unavailable or quota exceeded — silently ignore
84
+ // Storage unavailable or quota exceeded
87
85
  return false;
88
86
  }
89
87
  }
90
88
  export function hydrateSession() {
91
89
  if (!projectId())
92
- return { restored: false, changeCount: 0 };
90
+ return { restored: false };
93
91
  let raw = null;
94
92
  try {
95
- raw = localStorage.getItem(storageKey(projectId()));
93
+ raw = inspectorStorage()?.getItem(storageKey(projectId())) ?? null;
96
94
  }
97
95
  catch {
98
- return { restored: false, changeCount: 0 };
96
+ return { restored: false };
99
97
  }
100
98
  if (!raw)
101
- return { restored: false, changeCount: 0 };
99
+ return { restored: false };
102
100
  let session;
103
101
  try {
104
102
  session = JSON.parse(raw);
105
103
  }
106
104
  catch {
107
105
  safeDiscard();
108
- return { restored: false, changeCount: 0 };
106
+ return { restored: false };
109
107
  }
110
108
  if (!session || typeof session !== "object") {
111
109
  safeDiscard();
112
- return { restored: false, changeCount: 0 };
110
+ return { restored: false };
113
111
  }
114
112
  const s = session;
115
113
  if (typeof s.schemaVersion !== "number" || s.schemaVersion !== SCHEMA_VERSION) {
116
114
  safeDiscard();
117
- return { restored: false, changeCount: 0 };
115
+ return { restored: false };
118
116
  }
119
117
  if (typeof s.projectId !== "string" || s.projectId !== projectId()) {
120
118
  safeDiscard();
121
- return { restored: false, changeCount: 0 };
119
+ return { restored: false };
122
120
  }
123
121
  if (typeof s.mode !== "string" || (s.mode !== "inspect" && s.mode !== "canvas")) {
124
122
  safeDiscard();
125
- return { restored: false, changeCount: 0 };
123
+ return { restored: false };
126
124
  }
127
125
  if (!isSameOriginUrl(s.inspectUrl)) {
128
126
  safeDiscard();
129
- return { restored: false, changeCount: 0 };
127
+ return { restored: false };
130
128
  }
131
129
  const inspectRouteChanged = s.mode === "inspect" && s.inspectUrl !== window.location.href;
132
130
  const cards = Array.isArray(s.cards) ? s.cards : null;
133
131
  if (!cards) {
134
132
  safeDiscard();
135
- return { restored: false, changeCount: 0 };
133
+ return { restored: false };
136
134
  }
137
135
  const serializableCards = [];
138
136
  for (const card of cards) {
@@ -147,7 +145,7 @@ export function hydrateSession() {
147
145
  candidate.width <= 0 ||
148
146
  candidate.height <= 0) {
149
147
  safeDiscard();
150
- return { restored: false, changeCount: 0 };
148
+ return { restored: false };
151
149
  }
152
150
  const c = card;
153
151
  serializableCards.push({
@@ -163,7 +161,7 @@ export function hydrateSession() {
163
161
  }
164
162
  if (new Set(serializableCards.map((card) => card.id)).size !== serializableCards.length) {
165
163
  safeDiscard();
166
- return { restored: false, changeCount: 0 };
164
+ return { restored: false };
167
165
  }
168
166
  const cardsById = new Map(serializableCards.map((card) => [card.id, card]));
169
167
  const cameraRaw = s.camera;
@@ -172,18 +170,18 @@ export function hydrateSession() {
172
170
  !isFiniteNumber(cameraRaw.y) ||
173
171
  !isFiniteNumber(cameraRaw.zoom)) {
174
172
  safeDiscard();
175
- return { restored: false, changeCount: 0 };
173
+ return { restored: false };
176
174
  }
177
175
  const presentation = s.presentation ?? "focus";
178
176
  const groups = Array.isArray(s.groups) ? s.groups.filter((group) => group?.kind !== "linked") : s.groups ?? [];
179
177
  if ((presentation !== "focus" && presentation !== "canvas") || !Array.isArray(groups) || !groups.every(isFrameGroup)) {
180
178
  safeDiscard();
181
- return { restored: false, changeCount: 0 };
179
+ return { restored: false };
182
180
  }
183
181
  const clipboardHandoff = s.clipboardHandoff;
184
182
  if (!isClipboardHandoffSnapshot(clipboardHandoff)) {
185
183
  safeDiscard();
186
- return { restored: false, changeCount: 0 };
184
+ return { restored: false };
187
185
  }
188
186
  const camera = {
189
187
  x: cameraRaw.x,
@@ -197,38 +195,36 @@ export function hydrateSession() {
197
195
  : undefined;
198
196
  if (focusedCardId === undefined) {
199
197
  safeDiscard();
200
- return { restored: false, changeCount: 0 };
198
+ return { restored: false };
201
199
  }
202
200
  hydrateCanvasStore(s.mode, serializableCards, camera, focusedCardId, presentation, groups);
203
201
  hydrateClipboardHandoff(clipboardHandoff);
204
- // A different URL means the user intentionally navigated while Inspect was
205
- // active. Keep the durable edits, but adopt the new route instead of
206
- // sending the user back to the previous page. On refresh, the URLs already
207
- // match and restoration remains unchanged.
202
+ // A changed URL means the user navigated while Inspect was active: keep the edits but adopt the new route.
208
203
  if (inspectRouteChanged)
209
204
  persistSessionUnchecked();
210
- return { restored: true, changeCount: 0 };
205
+ return { restored: true };
211
206
  }
212
207
  function safeDiscard() {
213
208
  try {
214
- localStorage.removeItem(storageKey(projectId()));
209
+ inspectorStorage()?.removeItem(storageKey(projectId()));
215
210
  }
216
211
  catch {
217
- // ignore
218
212
  }
219
213
  }
220
- /** Clears the active frame's edit draft while preserving canvas geometry and other drafts. */
214
+ /** Clears the active draft, its comments, and project sketches while preserving canvas geometry and other drafts. */
221
215
  export function clearSelectedFrameChanges() {
222
216
  if (!canEditDraft())
223
- return;
217
+ return Promise.resolve();
224
218
  const cardId = getSelectedCardId() ?? getFocusedCardId();
225
219
  if (cardId)
226
220
  activateDraftForCard(cardId);
227
221
  clearComments(targetFromKey(getActiveDraftChanges().draftId) ?? documentTarget(window.location.href));
228
222
  clearActiveDraft();
223
+ clearSketchClipboardHandoff();
229
224
  setSelectedElement(null);
230
225
  projectToAllReadyCards();
231
226
  scheduleAutoSave();
227
+ return clearSketchesForProject();
232
228
  }
233
229
  export function clearSession() {
234
230
  if (isDraftLocked())
@@ -236,10 +232,9 @@ export function clearSession() {
236
232
  if (!canWriteWorkspace())
237
233
  return;
238
234
  try {
239
- localStorage.removeItem(storageKey(projectId()));
235
+ inspectorStorage()?.removeItem(storageKey(projectId()));
240
236
  }
241
237
  catch {
242
- // ignore
243
238
  }
244
239
  clearComments();
245
240
  clearActiveDraft();
@@ -269,11 +264,7 @@ export function enableAutoSave() {
269
264
  autoSaveEnabled = true;
270
265
  window.addEventListener("beforeunload", flushAutoSave);
271
266
  }
272
- /**
273
- * Coalesces the synchronous full-session `JSON.stringify` + `localStorage`
274
- * write behind a trailing timer so commits never block on persistence. A
275
- * refresh or close inside the debounce window still flushes on `beforeunload`.
276
- */
267
+ /** Coalesces the synchronous full-session write behind a trailing timer; `beforeunload` still flushes it. */
277
268
  export function scheduleAutoSave() {
278
269
  if (!autoSaveEnabled)
279
270
  return;
@@ -288,7 +279,6 @@ export function scheduleAutoSave() {
288
279
  autoSaveDirty = false;
289
280
  }, AUTOSAVE_DEBOUNCE_MS);
290
281
  }
291
- export function scheduleCanvasSave() { scheduleAutoSave(); }
292
282
  export function flushAutoSave() {
293
283
  if (autosaveTimer !== null) {
294
284
  clearTimeout(autosaveTimer);