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
@@ -1,15 +1,15 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
3
- import { PROTOCOL_VERSION, isElementClickMessage, isInlineTextIntentMessage, } from "./frameProtocol.js";
3
+ import { isElementClickMessage, isInlineTextIntentMessage } from "./frameProtocol.js";
4
4
  import { useCanvasCards } from "./canvasStore.js";
5
5
  import { useBoardCamera, useCanvasPresentation, useCanvasPresentationTransitioning, useCanvasLayoutTransitioning, getCanvasLayoutTransitioning, useTemporaryAppInteraction, } from "./viewStore.js";
6
6
  import { handleElementClick } from "./rendererSelectionProxy.js";
7
7
  import { getSelectedElements, useHierarchy, useSelectedElement, useSelectedElements } from "../selection/selectionStore.js";
8
8
  import { readBorderWidths, toRect, } from "../overlay/overlayGeometry.js";
9
- const overlayStyles = ".canvas-element-overlay {\n position: fixed;\n pointer-events: none;\n z-index: 1;\n background: transparent;\n outline: 1px solid var(--accent);\n outline-offset: -1px;\n}\n\n.canvas-spacing-guide {\n position: fixed;\n z-index: 1;\n border-radius: 999px;\n background: var(--accent);\n outline: none;\n box-shadow: none;\n pointer-events: none;\n}\n\n.canvas-spacing-fill {\n position: fixed;\n z-index: 1;\n pointer-events: none;\n background: rgb(59 130 246 / 14%);\n}\n\n.canvas-spacing-fill[data-kind=\"gap\"] {\n background: rgb(236 72 153 / 14%);\n}\n\n.canvas-spacing-guide[data-kind=\"gap\"] {\n background: #ec4899;\n}\n\n.canvas-spacing-value-badge {\n position: fixed;\n z-index: 2;\n transform: translate(-50%, calc(-100% - var(--space-8)));\n padding: var(--space-4) var(--space-8);\n border-radius: var(--radius-8);\n background: var(--surface-raised-2x);\n box-shadow: var(--shadow-popup);\n color: var(--text-primary);\n font-family: var(--font-family);\n font-size: var(--font-size-base);\n font-weight: 400;\n line-height: 1.4;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n pointer-events: none;\n}\n\n.canvas-selected-outline {\n position: fixed;\n pointer-events: none;\n z-index: 1;\n outline: 1px solid var(--accent);\n outline-offset: -1px;\n}\n\n.canvas-dom-drop-line {\n z-index: 2147483647;\n border-radius: 999px;\n background: #3b82f6;\n box-shadow: 0 0 0 1px rgb(255 255 255 / 95%), 0 1px 5px rgb(37 99 235 / 72%);\n}\n\n.canvas-dom-drop-line::before,\n.canvas-dom-drop-line::after {\n position: absolute;\n top: 50%;\n width: 8px;\n height: 8px;\n border: 2px solid #ffffff;\n border-radius: 50%;\n background: #2563eb;\n content: \"\";\n transform: translateY(-50%);\n}\n\n.canvas-dom-drop-line::before { left: -3px; }\n.canvas-dom-drop-line::after { right: -3px; }\n\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::before,\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::after {\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n}\n\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::before { top: -3px; }\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::after { top: auto; bottom: -3px; }\n\n.canvas-dom-drop-target {\n z-index: 2147483646;\n box-sizing: border-box;\n border: 1px solid rgb(59 130 246 / 72%);\n border-radius: 4px;\n background: rgb(59 130 246 / 5%);\n}\n";
9
+ const overlayStyles = ".canvas-element-overlay {\n position: fixed;\n pointer-events: none;\n z-index: 1;\n background: transparent;\n outline: 1px solid var(--accent);\n outline-offset: -1px;\n}\n\n.canvas-element-overlay[data-linked=\"true\"] {\n outline-color: var(--linked);\n}\n\n.canvas-spacing-guide {\n position: fixed;\n z-index: 1;\n border-radius: 999px;\n background: var(--accent);\n outline: none;\n box-shadow: none;\n pointer-events: none;\n}\n\n.canvas-spacing-fill {\n position: fixed;\n z-index: 1;\n pointer-events: none;\n background: rgb(59 130 246 / 14%);\n}\n\n.canvas-spacing-fill[data-kind=\"gap\"] {\n background: rgb(236 72 153 / 14%);\n}\n\n.canvas-spacing-guide[data-kind=\"gap\"] {\n background: #ec4899;\n}\n\n.canvas-spacing-fill[data-kind=\"margin\"] {\n background: rgb(239 68 68 / 14%);\n}\n\n.canvas-spacing-guide[data-kind=\"margin\"] {\n background: #ef4444;\n}\n\n.canvas-spacing-value-badge {\n position: fixed;\n z-index: 2;\n transform: translate(-50%, calc(-100% - var(--space-8)));\n padding: var(--space-4) var(--space-8);\n border-radius: var(--radius-8);\n background: var(--surface-raised-2x);\n box-shadow: var(--shadow-popup);\n color: var(--text-primary);\n font-family: var(--font-family);\n font-size: var(--font-size-base);\n font-weight: 400;\n line-height: 1.4;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n pointer-events: none;\n}\n\n.canvas-selected-outline {\n position: fixed;\n pointer-events: none;\n z-index: 1;\n outline: 1px solid var(--accent);\n outline-offset: -1px;\n}\n\n.canvas-selected-outline[data-linked=\"true\"] {\n outline-color: var(--linked);\n}\n\n.canvas-linked-outline {\n position: fixed;\n pointer-events: none;\n z-index: 1;\n outline: 1px solid var(--linked);\n outline-offset: -1px;\n opacity: 0.6;\n}\n\n.canvas-dom-drop-line {\n z-index: 2147483647;\n border-radius: 999px;\n background: #3b82f6;\n box-shadow: 0 0 0 1px rgb(255 255 255 / 95%), 0 1px 5px rgb(37 99 235 / 72%);\n}\n\n.canvas-dom-drop-line::before,\n.canvas-dom-drop-line::after {\n position: absolute;\n top: 50%;\n width: 8px;\n height: 8px;\n border: 2px solid #ffffff;\n border-radius: 50%;\n background: #2563eb;\n content: \"\";\n transform: translateY(-50%);\n}\n\n.canvas-dom-drop-line::before { left: -3px; }\n.canvas-dom-drop-line::after { right: -3px; }\n\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::before,\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::after {\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n}\n\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::before { top: -3px; }\n.canvas-dom-drop-line[data-orientation=\"vertical\"]::after { top: auto; bottom: -3px; }\n\n.canvas-dom-drop-target {\n z-index: 2147483646;\n box-sizing: border-box;\n border: 1px solid rgb(59 130 246 / 72%);\n border-radius: 4px;\n background: rgb(59 130 246 / 5%);\n}\n";
10
10
  import { deleteElement, getDropLocationAtPoint, moveElement, nudgeElement } from "../overlay/structuralGestures.js";
11
11
  import { changeKey } from "../changes/model.js";
12
- import { getChanges, redo, subscribeChanges, undo } from "../changes/changesLog.js";
12
+ import { getActiveDraftChanges, redo, subscribeActiveDraftChanges, undo } from "../drafts/store.js";
13
13
  import { resolveSelectionFromElement } from "../selection/resolveSelection.js";
14
14
  import { setSelectedElement } from "../selection/selectionStore.js";
15
15
  import { clearDropGuide, showDropGuide, useDropGuide } from "../overlay/dropGuide.js";
@@ -17,10 +17,12 @@ import { DropGuideOverlay } from "../overlay/DropGuideOverlay.js";
17
17
  import { getMeasurementGeometry } from "../overlay/measurementGeometry.js";
18
18
  import { getElementComputedStyle } from "../runtime/domRealm.js";
19
19
  import { MeasurementGuideOverlay } from "../overlay/MeasurementGuideOverlay.js";
20
- import { projectMeasurementSegments } from "./measurementProjection.js";
21
- import { getRegisteredFrames, PROJECT_ID, WORKSPACE_ID } from "./projection.js";
20
+ import { findCanvasFrameByDocument, getRegisteredFrames } from "./projection.js";
21
+ import { connectFrame, measureFrameViewport, toViewportPoint, toViewportRect } from "./frameConnection.js";
22
22
  import { RENDERER_ELEMENT_ID_ATTR } from "./rendererCidIndex.js";
23
23
  import { observeSelectedGeometry } from "../overlay/selectedGeometry.js";
24
+ import { getEditScope, sourceSiteSelector } from "../selection/editScope.js";
25
+ import { useComponentProps } from "../componentSemantics/ComponentPropsSection.js";
24
26
  import { handleInlineTextEditIntent, useInlineTextSession } from "../inline-text/inlineTextEditor.js";
25
27
  import { setInspectorOpen, toggleInspector } from "../shell/openStore.js";
26
28
  import { EMPTY_TEXT_PROJECTION_ATTR } from "../projection/textProjection.js";
@@ -30,21 +32,15 @@ import { getSpacingAffordanceAtPoint, getSpacingAffordanceForDescriptor, getSpac
30
32
  import { beginLayoutPreview, endLayoutPreview } from "../styleEditors/layoutPreviewState.js";
31
33
  import { useNudgeUiRuntimeConfig } from "../runtime/useRuntimeConfig.js";
32
34
  import { DomNavigator } from "../overlay/DomNavigator.js";
33
- function projectRect(iframe, rect, zoom) {
34
- const frameRect = iframe.getBoundingClientRect();
35
- return {
36
- left: frameRect.left + rect.left * zoom,
37
- top: frameRect.top + rect.top * zoom,
38
- width: rect.width * zoom,
39
- height: rect.height * zoom,
40
- };
41
- }
42
- function projectPoint(iframe, x, y, zoom) {
43
- const frameRect = iframe.getBoundingClientRect();
44
- return {
45
- x: frameRect.left + x * zoom,
46
- y: frameRect.top + y * zoom,
47
- };
35
+ import { InspectorStyle } from "../ui/InspectorStyle.js";
36
+ /** An element that is already the only selection keeps its record; re-resolving can differ only in derived metadata. */
37
+ function selectGestureElement(element) {
38
+ const current = getSelectedElements();
39
+ if (current.length === 1 && current[0].domElement === element)
40
+ return;
41
+ const selected = resolveSelectionFromElement(element);
42
+ if (selected)
43
+ setSelectedElement(selected);
48
44
  }
49
45
  function spacingBadgeForDrag(drag, point) {
50
46
  return {
@@ -74,40 +70,18 @@ function spacingGuideStyle(rect) {
74
70
  height,
75
71
  });
76
72
  }
77
- function findFrameElement(iframe, elementId, cid, src) {
78
- const doc = iframe.contentDocument;
79
- if (!doc)
80
- return null;
81
- if (!/^r\d+$/.test(elementId))
82
- return null;
83
- const candidates = doc.querySelectorAll(`[${RENDERER_ELEMENT_ID_ATTR}="${elementId}"]`);
84
- if (candidates.length !== 1)
85
- return null;
86
- const candidate = candidates[0] ?? null;
87
- if (!candidate
88
- || candidate.getAttribute("data-cid") !== cid
89
- || (candidate.getAttribute("data-src") ?? "") !== src)
73
+ function projectGuideToCanvas(guide) {
74
+ const iframe = findCanvasFrameByDocument(guide?.document);
75
+ if (!guide || !iframe)
90
76
  return null;
91
- const frameWindow = doc.defaultView;
92
- return frameWindow && candidate instanceof frameWindow.HTMLElement ? candidate : null;
93
- }
94
- function projectGuideToCanvas(guide, zoom) {
95
- if (!guide)
96
- return null;
97
- const iframe = guide.document.defaultView?.frameElement;
98
- if (!(iframe instanceof HTMLIFrameElement))
99
- return null;
100
- const iframeRect = iframe.getBoundingClientRect();
101
- const project = (rect, scaleWidth, scaleHeight) => ({
102
- left: iframeRect.left + rect.left * zoom,
103
- top: iframeRect.top + rect.top * zoom,
104
- width: scaleWidth ? rect.width * zoom : rect.width,
105
- height: scaleHeight ? rect.height * zoom : rect.height,
106
- });
77
+ const viewport = measureFrameViewport(iframe);
107
78
  return {
108
79
  orientation: guide.orientation,
109
- line: project(guide.line, guide.orientation === "horizontal", guide.orientation === "vertical"),
110
- target: project(guide.target, true, true),
80
+ line: toViewportRect(viewport, guide.line, {
81
+ width: guide.orientation === "horizontal",
82
+ height: guide.orientation === "vertical",
83
+ }),
84
+ target: toViewportRect(viewport, guide.target),
111
85
  };
112
86
  }
113
87
  function spacingDescriptorMatches(affordance, descriptor) {
@@ -138,14 +112,7 @@ function restoreSpacingPreview(drag) {
138
112
  }
139
113
  endLayoutPreview(drag.element, drag.affordance.property);
140
114
  }
141
- /**
142
- * Commits a managed rule for the drag's final value. Returns the created change
143
- * records (empty for a no-op drag). The preview inline is intentionally left
144
- * applied at the committed value once a record exists; the caller must register
145
- * a PendingSpacingCommit and release it after the renderer acknowledges the
146
- * projected sheet. Restoring the authored declaration first would flash the old
147
- * value for the postMessage round trip the sheet takes.
148
- */
115
+ /** On a real change the preview inline stays applied; the caller must register a PendingSpacingCommit. */
149
116
  function commitSpacingDrag(drag) {
150
117
  if (drag.currentValue === drag.startValue) {
151
118
  restoreSpacingPreview(drag);
@@ -157,9 +124,7 @@ function commitSpacingDrag(drag) {
157
124
  oldRawValue: spacingValueCss(drag.startValue),
158
125
  }]);
159
126
  }
160
- /** Removes a deferred preview inline as soon as the projected sheet alone
161
- * reproduces the committed value; keeps it otherwise and retries on the next
162
- * projection acknowledgement from that frame. */
127
+ /** Removes the preview inline once the projected sheet alone reproduces the value; retries on the next acknowledgement. */
163
128
  function tryReleasePendingSpacingCommit(commit) {
164
129
  const { element, property, committedValue } = commit;
165
130
  if (!element.isConnected)
@@ -185,13 +150,11 @@ function releasePendingSpacingCommits(pending, iframe) {
185
150
  }
186
151
  pending.length = write;
187
152
  }
188
- /** Restores any held preview inline whose committed rule was undone, reverted,
189
- * or cleared before its sheet landed. Runs synchronously with the workspace
190
- * change, so the inline never outlives the intent behind it. */
153
+ /** Restores a held preview inline whose committed rule was undone, reverted, or cleared. */
191
154
  function reconcilePendingSpacingCommits(pending) {
192
155
  if (pending.length === 0)
193
156
  return;
194
- const survivingKeys = new Set(getChanges().map(changeKey));
157
+ const survivingKeys = new Set(getActiveDraftChanges().changes.map(changeKey));
195
158
  let write = 0;
196
159
  for (const commit of pending) {
197
160
  if (commit.keys.some((key) => survivingKeys.has(key))) {
@@ -210,9 +173,7 @@ function reconcilePendingSpacingCommits(pending) {
210
173
  }
211
174
  pending.length = write;
212
175
  }
213
- /** Registers a held preview inline, folding an older unapplied commit for the
214
- * same element and property into the newest one so the held value and the
215
- * authored baseline both stay coherent across rapid successive drags. */
176
+ /** Folds an older unapplied commit for the same element and property into the newest one. */
216
177
  function pushPendingSpacingCommit(pending, next) {
217
178
  const existing = pending.findIndex((commit) => commit.iframe === next.iframe
218
179
  && commit.element === next.element
@@ -227,15 +188,42 @@ function pushPendingSpacingCommit(pending, next) {
227
188
  originalInlinePriority: pending[existing].originalInlinePriority,
228
189
  };
229
190
  }
230
- function sendMeasureModifier(iframe, cardId, altKey) {
231
- iframe.contentWindow?.postMessage({
232
- type: "measure-modifier",
233
- protocolVersion: PROTOCOL_VERSION,
234
- projectId: PROJECT_ID,
235
- workspaceId: WORKSPACE_ID,
236
- cardId,
237
- altKey,
238
- }, window.location.origin);
191
+ const LINKED_PEER_LIMIT = 200;
192
+ /** Frames the follow loop keeps measuring after outlines stop moving, covering the commit that applies a pan. */
193
+ const OUTLINE_IDLE_FRAMES = 8;
194
+ /** Writes the outline boxes straight to the DOM, so a stale React render cannot win; returns whether any moved. */
195
+ function syncOutlinePositions(frame, outlines) {
196
+ const viewport = measureFrameViewport(frame);
197
+ let moved = false;
198
+ for (const [element, node] of outlines) {
199
+ const rect = toViewportRect(viewport, toRect(element.getBoundingClientRect()));
200
+ const box = `${rect.left}|${rect.top}|${rect.width}|${rect.height}`;
201
+ if (node.dataset.box !== box)
202
+ moved = true;
203
+ node.dataset.box = box;
204
+ node.style.left = `${rect.left}px`;
205
+ node.style.top = `${rect.top}px`;
206
+ node.style.width = `${rect.width}px`;
207
+ node.style.height = `${rect.height}px`;
208
+ }
209
+ return moved;
210
+ }
211
+ function isLinkedElement(element) {
212
+ return element !== null && getEditScope(element) === "source-site" && findLinkedPeers(element).length > 0;
213
+ }
214
+ /** Other elements rendered from the selected element's source site. */
215
+ function findLinkedPeers(element) {
216
+ const selector = sourceSiteSelector(element.getAttribute("data-cid") ?? "", element.getAttribute("data-src") ?? "");
217
+ if (!selector)
218
+ return [];
219
+ try {
220
+ return [...element.ownerDocument.querySelectorAll(selector)]
221
+ .filter((candidate) => candidate !== element)
222
+ .slice(0, LINKED_PEER_LIMIT);
223
+ }
224
+ catch {
225
+ return [];
226
+ }
239
227
  }
240
228
  export function CanvasElementOverlay() {
241
229
  const [hover, setHover] = useState(null);
@@ -257,10 +245,9 @@ export function CanvasElementOverlay() {
257
245
  setHover(null);
258
246
  setMeasureState(null);
259
247
  }, [layoutTransitioning]);
260
- const projectionZoom = presentation === "focus" ? 1 : camera.zoom;
261
248
  const cards = useCanvasCards(); // Projected geometry must follow card drag and resize updates.
262
249
  const cardGeometryKey = cards.map((card) => `${card.id}:${card.x}:${card.y}:${card.width}:${card.height}`).join("|");
263
- const projectionGeometryKey = `${presentation}:${camera.x}:${camera.y}:${projectionZoom}:${cardGeometryKey}`;
250
+ const projectionGeometryKey = `${presentation}:${camera.x}:${camera.y}:${camera.zoom}:${cardGeometryKey}`;
264
251
  const previousProjectionGeometryKey = useRef(projectionGeometryKey);
265
252
  const dragRef = useRef(null);
266
253
  const spacingDragRef = useRef(null);
@@ -268,35 +255,38 @@ export function CanvasElementOverlay() {
268
255
  const [spacingDragBadge, setSpacingDragBadge] = useState(null);
269
256
  const measureAltKeyRef = useRef(false);
270
257
  const dropGuide = useDropGuide("canvas");
271
- const projectedDropGuide = projectGuideToCanvas(dropGuide, projectionZoom);
272
- const selectedFrame = selected?.domElement.ownerDocument.defaultView?.frameElement;
273
- const selectedInCanvas = selectedFrame instanceof HTMLIFrameElement
274
- && selectedFrame.hasAttribute("data-nudge-ui-canvas-renderer");
258
+ const projectedDropGuide = projectGuideToCanvas(dropGuide);
259
+ const selectedFrame = findCanvasFrameByDocument(selected?.domElement.ownerDocument);
260
+ const selectedInCanvas = selectedFrame !== null;
275
261
  const selectedRects = selectedInCanvas
276
262
  ? selectedElements.map((candidate) => {
277
- const frame = candidate.domElement.ownerDocument.defaultView?.frameElement;
263
+ const frame = findCanvasFrameByDocument(candidate.domElement.ownerDocument);
278
264
  return frame === selectedFrame ? toRect(candidate.domElement.getBoundingClientRect()) : null;
279
265
  })
280
266
  : [];
281
267
  const selectedPrimaryIndex = selectedElements.findIndex((candidate) => candidate.domElement === selected?.domElement);
282
268
  const selectedLocalRect = selectedRects[selectedPrimaryIndex >= 0 ? selectedPrimaryIndex : 0] ?? null;
283
- const selectedFrameRect = selectedInCanvas
284
- ? toRect(selectedFrame.getBoundingClientRect())
269
+ const selectedFrameViewport = selectedInCanvas ? measureFrameViewport(selectedFrame) : null;
270
+ const selectedRect = selectedFrameViewport && selectedLocalRect
271
+ ? toViewportRect(selectedFrameViewport, selectedLocalRect)
285
272
  : null;
286
- const selectedRect = selectedInCanvas && selectedLocalRect
287
- ? projectRect(selectedFrame, selectedLocalRect, projectionZoom)
288
- : null;
289
- const projectedSelectedGeometry = selectedInCanvas
273
+ const projectedSelectedGeometry = selectedFrameViewport
290
274
  ? selectedRects.flatMap((rect, index) => {
291
275
  const element = selectedElements[index];
292
276
  return rect && element
293
- ? [{ element, rect: projectRect(selectedFrame, rect, projectionZoom) }]
277
+ ? [{ element, rect: toViewportRect(selectedFrameViewport, rect) }]
294
278
  : [];
295
279
  })
296
280
  : [];
297
- // Camera transforms commit on the board before iframe viewport geometry is
298
- // readable. Re-render once after that commit so overlays use the transformed
299
- // frame rectangle rather than the previous camera position.
281
+ const componentProps = useComponentProps(selectedElements.length === 1 ? selected : null);
282
+ const linkedPeers = selectedInCanvas && selectedElements.length === 1 && selected && getEditScope(selected.domElement) === "source-site"
283
+ ? findLinkedPeers(selected.domElement)
284
+ : [];
285
+ const projectedLinkedPeers = selectedFrameViewport
286
+ ? linkedPeers.map((peer) => ({ peer, rect: toViewportRect(selectedFrameViewport, toRect(peer.getBoundingClientRect())) }))
287
+ : [];
288
+ const selectionIsLinked = componentProps !== null || linkedPeers.length > 0;
289
+ // Camera transforms commit before iframe viewport geometry is readable; re-render once so overlays use the new frame rect.
300
290
  useLayoutEffect(() => {
301
291
  const geometryChanged = previousProjectionGeometryKey.current !== projectionGeometryKey;
302
292
  previousProjectionGeometryKey.current = projectionGeometryKey;
@@ -306,17 +296,53 @@ export function CanvasElementOverlay() {
306
296
  const selectedBorders = selectedInCanvas && selected
307
297
  ? readBorderWidths(selected.domElement)
308
298
  : null;
299
+ const outlineNodes = useRef(new Map());
300
+ const outlineRef = (element) => (node) => {
301
+ if (node)
302
+ outlineNodes.current.set(element, node);
303
+ else
304
+ outlineNodes.current.delete(element);
305
+ };
306
+ // React renders a frame or more after a pan or scroll, so outlines follow the live geometry on their own frame loop.
307
+ useEffect(() => {
308
+ if (!selectedFrame)
309
+ return;
310
+ const frameDocument = selectedFrame.contentDocument;
311
+ let raf = null;
312
+ let idleFrames = 0;
313
+ const tick = () => {
314
+ raf = null;
315
+ idleFrames = syncOutlinePositions(selectedFrame, outlineNodes.current) ? 0 : idleFrames + 1;
316
+ if (idleFrames < OUTLINE_IDLE_FRAMES)
317
+ raf = window.requestAnimationFrame(tick);
318
+ };
319
+ const follow = () => {
320
+ idleFrames = 0;
321
+ if (raf === null)
322
+ raf = window.requestAnimationFrame(tick);
323
+ };
324
+ const options = { capture: true, passive: true };
325
+ window.addEventListener("wheel", follow, options);
326
+ frameDocument?.addEventListener("scroll", follow, options);
327
+ return () => {
328
+ window.removeEventListener("wheel", follow, options);
329
+ frameDocument?.removeEventListener("scroll", follow, options);
330
+ if (raf !== null)
331
+ window.cancelAnimationFrame(raf);
332
+ };
333
+ }, [selectedFrame]);
309
334
  useEffect(() => {
310
335
  if (!selectedInCanvas || !selected)
311
336
  return;
312
- const stops = selectedElements.map((candidate) => observeSelectedGeometry(candidate.domElement, refreshSelectedGeometry));
337
+ const stops = [...selectedElements.map((candidate) => candidate.domElement), ...linkedPeers]
338
+ .map((element) => observeSelectedGeometry(element, refreshSelectedGeometry));
313
339
  return () => stops.forEach((stop) => stop());
314
- }, [selected, selectedElements, selectedInCanvas]);
340
+ }, [selected, selectedElements, selectedInCanvas, linkedPeers.length]);
315
341
  useEffect(() => {
316
342
  const broadcastMeasureModifier = (altKey) => {
317
343
  measureAltKeyRef.current = altKey;
318
344
  for (const [cardId, iframe] of getRegisteredFrames()) {
319
- sendMeasureModifier(iframe, cardId, altKey);
345
+ connectFrame(cardId, iframe).post({ type: "measure-modifier", altKey });
320
346
  }
321
347
  };
322
348
  const onKeyDown = (event) => {
@@ -338,9 +364,7 @@ export function CanvasElementOverlay() {
338
364
  window.removeEventListener("blur", onBlur);
339
365
  };
340
366
  }, []);
341
- // The selected element's identity is computed once per selection change
342
- // (never per hover), so the measurement self-rulers exclusion can compare
343
- // identities without a per-hover scan of the frame document.
367
+ // Computed once per selection change, never per hover, so the measurement exclusion needs no per-hover scan.
344
368
  const selectedIdentity = useMemo(() => {
345
369
  const el = selected?.domElement;
346
370
  if (!el)
@@ -348,11 +372,9 @@ export function CanvasElementOverlay() {
348
372
  const elementId = el.getAttribute(RENDERER_ELEMENT_ID_ATTR);
349
373
  return elementId ? { elementId } : null;
350
374
  }, [selected?.domElement]);
351
- // A held spacing preview inline must not outlive the committed rule behind
352
- // it: undo/redo/revert/clear remove the record synchronously, so restore the
353
- // authored declaration before the renderer's next replace-styles lands.
375
+ // Undo/redo/revert/clear remove the record synchronously; restore the authored declaration before the next replace-styles lands.
354
376
  useEffect(() => {
355
- return subscribeChanges(() => {
377
+ return subscribeActiveDraftChanges(() => {
356
378
  reconcilePendingSpacingCommits(pendingSpacingCommitsRef.current);
357
379
  });
358
380
  }, []);
@@ -389,14 +411,14 @@ export function CanvasElementOverlay() {
389
411
  };
390
412
  });
391
413
  };
392
- const unsubscribe = subscribeCanvasRendererMessages(({ cardId: sourceCardId, iframe: sourceIframe, identity: frameIdentity, message: data, }) => {
414
+ const unsubscribe = subscribeCanvasRendererMessages(({ frame, message: data }) => {
393
415
  if (data.type === "renderer-hello" || data.type === "frame-ready") {
394
- sendMeasureModifier(sourceIframe, sourceCardId, measureAltKeyRef.current);
416
+ frame.post({ type: "measure-modifier", altKey: measureAltKeyRef.current });
395
417
  }
396
418
  if (data.type === "renderer-hello")
397
419
  return;
398
420
  if (data.type === "projection-applied") {
399
- releasePendingSpacingCommits(pendingSpacingCommitsRef.current, sourceIframe);
421
+ releasePendingSpacingCommits(pendingSpacingCommitsRef.current, frame.iframe);
400
422
  return;
401
423
  }
402
424
  if (getCanvasLayoutTransitioning())
@@ -406,18 +428,17 @@ export function CanvasElementOverlay() {
406
428
  if (!msg.cid)
407
429
  return;
408
430
  if (msg.rect === null) {
409
- setHover((current) => current?.cardId === sourceCardId ? null : current);
431
+ setHover((current) => current?.cardId === frame.cardId ? null : current);
410
432
  return;
411
433
  }
412
434
  const spacingDescriptor = msg.hoverSpacing ?? msg.spacing ?? null;
413
435
  const hoverPoint = msg.point ?? null;
414
- const hoverElement = spacingDescriptor
415
- ? findFrameElement(sourceIframe, msg.elementId, msg.cid, msg.src)
416
- : null;
436
+ const hoverElement = spacingDescriptor ? frame.element(msg) : null;
437
+ const frameDocument = frame.document();
417
438
  const hoverAffordance = spacingDescriptor && hoverElement
418
439
  ? getSpacingAffordanceForDescriptor(hoverElement, spacingDescriptor)
419
- : spacingDescriptor && hoverPoint && sourceIframe.contentDocument
420
- ? getSpacingHoverAtPoint(sourceIframe.contentDocument, hoverPoint.x, hoverPoint.y)
440
+ : spacingDescriptor && hoverPoint && frameDocument
441
+ ? getSpacingHoverAtPoint(frameDocument, hoverPoint.x, hoverPoint.y)
421
442
  : null;
422
443
  const matchingAffordance = spacingDescriptorMatches(hoverAffordance, spacingDescriptor)
423
444
  ? hoverAffordance
@@ -432,44 +453,49 @@ export function CanvasElementOverlay() {
432
453
  && spacingDescriptorMatches(handleAffordance, msg.spacing)
433
454
  ? { point: hoverPoint, value: handleAffordance.value }
434
455
  : null;
435
- setHover({
436
- iframe: sourceIframe,
456
+ // Hover messages arrive every frame; the peer query runs once per element entered, not per message.
457
+ const hoverRect = msg.rect;
458
+ setHover((current) => ({
459
+ iframe: frame.iframe,
437
460
  identity: { elementId: msg.elementId },
438
- rect: msg.rect,
461
+ rect: hoverRect,
439
462
  borders: msg.borders ?? { top: 0, right: 0, bottom: 0, left: 0 },
440
- cardId: sourceCardId,
463
+ cardId: frame.cardId,
441
464
  spacing: spacingGuides.length > 0 ? spacingDescriptor : null,
442
465
  spacingGuides,
443
466
  spacingAreas,
444
467
  spacingHandleBadge,
445
- });
468
+ linked: current?.iframe === frame.iframe && current.identity.elementId === msg.elementId
469
+ ? current.linked
470
+ : isLinkedElement(hoverElement ?? frame.element(msg)),
471
+ }));
446
472
  }
447
473
  else if (data.type === "element-measure-state") {
448
474
  const msg = data;
449
475
  setMeasureState({
450
- iframe: sourceIframe,
476
+ iframe: frame.iframe,
451
477
  altKey: msg.altKey,
452
478
  pointerOverPage: msg.pointerOverPage,
453
479
  });
454
480
  }
455
481
  else if (data.type === "element-click") {
456
- if (!isElementClickMessage(data, frameIdentity))
482
+ if (!isElementClickMessage(data, frame.identity))
457
483
  return;
458
484
  const msg = data;
459
485
  if (!msg.cid)
460
486
  return;
461
- handleElementClick(msg, sourceIframe, sourceCardId);
487
+ handleElementClick(msg, frame);
462
488
  }
463
489
  else if (data.type === "inline-text-intent") {
464
- if (!isInlineTextIntentMessage(data, frameIdentity))
490
+ if (!isInlineTextIntentMessage(data, frame.identity))
465
491
  return;
466
492
  if (getSelectedElements().length > 1)
467
493
  return;
468
494
  const emptyProjection = data.emptyProjectionId
469
- ? Array.from(sourceIframe.contentDocument?.querySelectorAll(`[${EMPTY_TEXT_PROJECTION_ATTR}]`) ?? [])
495
+ ? Array.from(frame.document()?.querySelectorAll(`[${EMPTY_TEXT_PROJECTION_ATTR}]`) ?? [])
470
496
  .find((candidate) => candidate.getAttribute(EMPTY_TEXT_PROJECTION_ATTR) === data.emptyProjectionId)
471
497
  : null;
472
- const element = emptyProjection ?? findFrameElement(sourceIframe, data.elementId, data.cid, data.src);
498
+ const element = emptyProjection ?? frame.element(data);
473
499
  if (!element)
474
500
  return;
475
501
  handleInlineTextEditIntent(data.intent === "double-click"
@@ -492,23 +518,24 @@ export function CanvasElementOverlay() {
492
518
  if (getSelectedElements().length > 1)
493
519
  return;
494
520
  const msg = data;
495
- const element = findFrameElement(sourceIframe, msg.elementId, msg.cid, msg.src);
521
+ const element = frame.element(msg);
496
522
  if (!element)
497
523
  return;
498
524
  clearSpacingDrag(spacingDragRef);
499
525
  dragRef.current = null;
500
526
  const startPoint = msg.startPoint ?? msg.point;
527
+ const frameDocument = frame.document();
501
528
  const spacing = msg.spacing
502
529
  ? getSpacingAffordanceForDescriptor(element, msg.spacing)
503
- : sourceIframe.contentDocument
504
- ? getSpacingAffordanceAtPoint(sourceIframe.contentDocument, startPoint.x, startPoint.y)
530
+ : frameDocument
531
+ ? getSpacingAffordanceAtPoint(frameDocument, startPoint.x, startPoint.y)
505
532
  : null;
506
533
  const isSpacingDrag = spacing
507
534
  && spacing.element === element
508
535
  && (!msg.spacing || spacingDescriptorMatches(spacing, msg.spacing));
509
536
  if (isSpacingDrag) {
510
537
  spacingDragRef.current = {
511
- iframe: sourceIframe,
538
+ iframe: frame.iframe,
512
539
  element,
513
540
  affordance: spacing,
514
541
  start: startPoint,
@@ -517,34 +544,30 @@ export function CanvasElementOverlay() {
517
544
  originalInlineValue: element.style.getPropertyValue(spacing.property),
518
545
  originalInlinePriority: element.style.getPropertyPriority(spacing.property),
519
546
  };
520
- const selectedElement = resolveSelectionFromElement(element);
521
- if (selectedElement)
522
- setSelectedElement(selectedElement);
547
+ selectGestureElement(element);
523
548
  applySpacingPreview(spacingDragRef.current, msg.point, msg.shiftKey === true);
524
549
  setSpacingDragBadge(spacingBadgeForDrag(spacingDragRef.current, msg.point));
525
550
  refreshSpacingPreviewOverlay(spacingDragRef.current);
526
551
  return;
527
552
  }
528
- dragRef.current = { iframe: sourceIframe, element };
529
- const selectedElement = resolveSelectionFromElement(element);
530
- if (selectedElement)
531
- setSelectedElement(selectedElement);
532
- updateDropGuide(msg.point, sourceIframe);
553
+ dragRef.current = { iframe: frame.iframe, element };
554
+ selectGestureElement(element);
555
+ updateDropGuide(msg.point);
533
556
  }
534
557
  else if (data.type === "element-drag-move") {
535
558
  const spacing = spacingDragRef.current;
536
- if (spacing && spacing.iframe === sourceIframe) {
559
+ if (spacing && spacing.iframe === frame.iframe) {
537
560
  applySpacingPreview(spacing, data.point, data.shiftKey === true);
538
561
  setSpacingDragBadge(spacingBadgeForDrag(spacing, data.point));
539
562
  refreshSpacingPreviewOverlay(spacing);
540
563
  return;
541
564
  }
542
- updateDropGuide(data.point, sourceIframe);
565
+ updateDropGuide(data.point);
543
566
  }
544
567
  else if (data.type === "element-drag-end") {
545
568
  const msg = data;
546
569
  const spacing = spacingDragRef.current;
547
- if (spacing && spacing.iframe === sourceIframe) {
570
+ if (spacing && spacing.iframe === frame.iframe) {
548
571
  spacingDragRef.current = null;
549
572
  setSpacingDragBadge(null);
550
573
  if (msg.cancelled) {
@@ -556,7 +579,7 @@ export function CanvasElementOverlay() {
556
579
  const records = commitSpacingDrag(spacing);
557
580
  if (records.length > 0) {
558
581
  pushPendingSpacingCommit(pendingSpacingCommitsRef.current, {
559
- iframe: sourceIframe,
582
+ iframe: frame.iframe,
560
583
  element: spacing.element,
561
584
  property: spacing.affordance.property,
562
585
  committedValue: spacingValueCss(spacing.currentValue),
@@ -569,20 +592,17 @@ export function CanvasElementOverlay() {
569
592
  }
570
593
  clearDropGuide("canvas");
571
594
  if (!msg.cancelled) {
572
- const selectedElement = resolveSelectionFromElement(spacing.element);
573
- if (selectedElement)
574
- setSelectedElement(selectedElement);
595
+ selectGestureElement(spacing.element);
575
596
  }
576
597
  return;
577
598
  }
578
599
  const current = dragRef.current;
579
- if (!msg.cancelled && current && current.iframe === sourceIframe && sourceIframe.contentDocument) {
580
- const drop = getDropLocationAtPoint(sourceIframe.contentDocument, current.element, msg.point.x, msg.point.y);
600
+ const frameDocument = frame.document();
601
+ if (!msg.cancelled && current && current.iframe === frame.iframe && frameDocument) {
602
+ const drop = getDropLocationAtPoint(frameDocument, current.element, msg.point.x, msg.point.y);
581
603
  if (drop)
582
604
  moveElement(current.element, drop);
583
- const selectedElement = resolveSelectionFromElement(current.element);
584
- if (selectedElement)
585
- setSelectedElement(selectedElement);
605
+ selectGestureElement(current.element);
586
606
  }
587
607
  dragRef.current = null;
588
608
  clearDropGuide("canvas");
@@ -590,8 +610,7 @@ export function CanvasElementOverlay() {
590
610
  else if (data.type === "element-delete") {
591
611
  if (getSelectedElements().length !== 1)
592
612
  return;
593
- const msg = data;
594
- const element = findFrameElement(sourceIframe, msg.elementId, msg.cid, msg.src);
613
+ const element = frame.element(data);
595
614
  const selectedElement = element ? resolveSelectionFromElement(element) : null;
596
615
  if (selectedElement && deleteElement(selectedElement))
597
616
  setSelectedElement(null);
@@ -599,13 +618,10 @@ export function CanvasElementOverlay() {
599
618
  else if (data.type === "element-nudge") {
600
619
  if (getSelectedElements().length !== 1)
601
620
  return;
602
- const msg = data;
603
- const element = findFrameElement(sourceIframe, msg.elementId, msg.cid, msg.src);
604
- const record = element ? nudgeElement(element, msg.key) : null;
621
+ const element = frame.element(data);
622
+ const record = element ? nudgeElement(element, data.key) : null;
605
623
  if (element && record) {
606
- const selectedElement = resolveSelectionFromElement(element);
607
- if (selectedElement)
608
- setSelectedElement(selectedElement);
624
+ selectGestureElement(element);
609
625
  }
610
626
  }
611
627
  else if (data.type === "history-request") {
@@ -623,16 +639,17 @@ export function CanvasElementOverlay() {
623
639
  else if (data.type === "inspector-open-request") {
624
640
  setInspectorOpen(true);
625
641
  }
626
- function updateDropGuide(point, iframe) {
642
+ function updateDropGuide(point) {
627
643
  const current = dragRef.current;
628
- if (!current || current.iframe !== iframe || !iframe.contentDocument)
644
+ const frameDocument = frame.document();
645
+ if (!current || current.iframe !== frame.iframe || !frameDocument)
629
646
  return;
630
- const drop = getDropLocationAtPoint(iframe.contentDocument, current.element, point.x, point.y);
647
+ const drop = getDropLocationAtPoint(frameDocument, current.element, point.x, point.y);
631
648
  if (!drop) {
632
649
  clearDropGuide("canvas");
633
650
  return;
634
651
  }
635
- showDropGuide("canvas", iframe.contentDocument, drop);
652
+ showDropGuide("canvas", frameDocument, drop);
636
653
  }
637
654
  });
638
655
  return () => {
@@ -647,41 +664,46 @@ export function CanvasElementOverlay() {
647
664
  return null;
648
665
  if (!hover && projectedSelectedGeometry.length === 0 && !projectedDropGuide)
649
666
  return null;
650
- const projectedHoverRect = hover ? projectRect(hover.iframe, hover.rect, projectionZoom) : null;
651
- const projectedSpacingGuides = hover?.spacingGuides.map((guide) => projectRect(hover.iframe, guide, projectionZoom)) ?? [];
652
- const projectedSpacingAreas = hover?.spacingAreas.map((area) => projectRect(hover.iframe, area, projectionZoom)) ?? [];
667
+ const hoverViewport = hover ? measureFrameViewport(hover.iframe) : null;
668
+ const projectedHoverRect = hover && hoverViewport ? toViewportRect(hoverViewport, hover.rect) : null;
669
+ const projectedSpacingGuides = hover && hoverViewport ? hover.spacingGuides.map((guide) => toViewportRect(hoverViewport, guide)) : [];
670
+ const projectedSpacingAreas = hover && hoverViewport ? hover.spacingAreas.map((area) => toViewportRect(hoverViewport, area)) : [];
653
671
  const spacingBadge = spacingDragBadge
654
672
  ?? (hover?.spacingHandleBadge ? { iframe: hover.iframe, ...hover.spacingHandleBadge } : null);
655
673
  const projectedSpacingBadge = spacingBadge
656
- ? projectPoint(spacingBadge.iframe, spacingBadge.point.x, spacingBadge.point.y, projectionZoom)
674
+ ? toViewportPoint(measureFrameViewport(spacingBadge.iframe), spacingBadge.point)
657
675
  : null;
658
676
  const hoverSpacing = hover?.spacing ?? null;
659
677
  const measureStateForSelectedFrame = measureState?.iframe === selectedFrame ? measureState : null;
660
678
  const hoverInSelectedFrame = hover?.iframe === selectedFrame ? hover : null;
661
679
  const showGuideOverlay = Boolean(selectedElements.length === 1
662
680
  && selectedRect
663
- && selectedFrameRect
681
+ && selectedFrameViewport
664
682
  && measureStateForSelectedFrame?.altKey
665
683
  && measureStateForSelectedFrame.pointerOverPage);
666
684
  const isSelfHover = Boolean(hoverInSelectedFrame
667
685
  && selectedIdentity
668
686
  && hoverInSelectedFrame.identity.elementId === selectedIdentity.elementId);
669
- // Selected elements already have a live geometry outline. The hover outline
670
- // is based on a cached renderer message and can lag during spacing previews.
687
+ // Selected elements already have a live outline; the hover outline is cached and can lag during spacing previews.
671
688
  const showHoverOutline = Boolean(projectedHoverRect && !isSelfHover);
672
689
  const showMeasurement = Boolean(showGuideOverlay
673
690
  && selectedLocalRect
674
691
  && hoverInSelectedFrame
675
692
  && !isSelfHover);
676
- const measurementSegments = showMeasurement && selectedFrameRect && selectedLocalRect && hoverInSelectedFrame
677
- ? projectMeasurementSegments(selectedFrameRect, getMeasurementGeometry(selectedLocalRect, hoverInSelectedFrame.rect, {
693
+ // Segment distances stay in frame CSS pixels so labels read the same at any board zoom.
694
+ const measurementSegments = showMeasurement && selectedFrameViewport && selectedLocalRect && hoverInSelectedFrame
695
+ ? getMeasurementGeometry(selectedLocalRect, hoverInSelectedFrame.rect, {
678
696
  selectedBorders: selectedBorders ?? undefined,
679
697
  hoveredBorders: hoverInSelectedFrame.borders,
680
- }).segments, projectionZoom)
698
+ }).segments.map((segment) => ({
699
+ ...segment,
700
+ from: toViewportPoint(selectedFrameViewport, segment.from),
701
+ to: toViewportPoint(selectedFrameViewport, segment.to),
702
+ }))
681
703
  : [];
682
704
  if (presentationTransitioning || layoutTransitioning || temporaryAppInteraction)
683
- return _jsx("style", { "data-test": "canvas-element-overlay-styles", children: overlayStyles });
684
- return (_jsxs(_Fragment, { children: [_jsx("style", { "data-test": "canvas-element-overlay-styles", children: overlayStyles }), showGuideOverlay && selectedRect && selectedFrameRect ? (_jsx(MeasurementGuideOverlay, { testId: "canvas-measurement-overlay", selectedRect: selectedRect, guideViewport: selectedFrameRect, segments: measurementSegments })) : null, projectedHoverRect ? (_jsxs(_Fragment, { children: [hoverSpacing ? projectedSpacingAreas.map((area, index) => (_jsx("div", { className: "canvas-spacing-fill", "data-test": "canvas-spacing-fill", "data-kind": hoverSpacing.kind, "data-property": hoverSpacing.property, "data-side": hoverSpacing.side ?? undefined, "data-area-index": index, style: overlayStyle(area), "aria-hidden": "true" }, `${hoverSpacing.property}-area-${index}`))) : null, showHoverOutline ? (_jsx("div", { className: "canvas-element-overlay", "data-test": "canvas-hover-outline", style: overlayStyle(projectedHoverRect), "aria-hidden": "true" })) : null, hoverSpacing ? projectedSpacingGuides.map((guide, index) => (_jsx("div", { className: "canvas-spacing-guide", "data-test": "canvas-spacing-guide", "data-kind": hoverSpacing.kind, "data-property": hoverSpacing.property, "data-side": hoverSpacing.side ?? undefined, "data-guide-index": index, style: spacingGuideStyle(guide), "aria-hidden": "true" }, `${hoverSpacing.property}-${index}`))) : null] })) : null, projectedSelectedGeometry.map(({ element, rect }, index) => (_jsx("div", { className: "canvas-selected-outline", "data-test": "canvas-selected-outline", "data-selected-cid": element.cid, "data-selected-index": index, "data-selected-src": element.src, style: overlayStyle(rect), "aria-hidden": "true" }, `${element.cid}-${index}`))), projectedSpacingBadge && spacingBadge ? (_jsx("div", { className: "canvas-spacing-value-badge", "data-test": "canvas-spacing-value-badge", style: { left: projectedSpacingBadge.x, top: projectedSpacingBadge.y }, "aria-hidden": "true", children: spacingValueCss(spacingBadge.value) })) : null, domNavigationEnabled && !inlineTextSession && selectedElements.length === 1 && selected && selectedRect && selectedFrame instanceof HTMLIFrameElement ? (_jsx(DomNavigator, { selected: selected, hierarchy: hierarchy, anchor: selectedRect, project: (element) => element.ownerDocument === selected.domElement.ownerDocument
685
- ? projectRect(selectedFrame, toRect(element.getBoundingClientRect()), projectionZoom)
705
+ return _jsx(InspectorStyle, { testId: "canvas-element-overlay-styles", css: overlayStyles });
706
+ return (_jsxs(_Fragment, { children: [_jsx(InspectorStyle, { testId: "canvas-element-overlay-styles", css: overlayStyles }), showGuideOverlay && selectedRect && selectedFrameViewport ? (_jsx(MeasurementGuideOverlay, { testId: "canvas-measurement-overlay", selectedRect: selectedRect, guideViewport: selectedFrameViewport, segments: measurementSegments })) : null, projectedHoverRect ? (_jsxs(_Fragment, { children: [hoverSpacing ? projectedSpacingAreas.map((area, index) => (_jsx("div", { className: "canvas-spacing-fill", "data-test": "canvas-spacing-fill", "data-kind": hoverSpacing.kind, "data-property": hoverSpacing.property, "data-side": hoverSpacing.side ?? undefined, "data-area-index": index, style: overlayStyle(area), "aria-hidden": "true" }, `${hoverSpacing.property}-area-${index}`))) : null, showHoverOutline ? (_jsx("div", { className: "canvas-element-overlay", "data-linked": hover?.linked ? "true" : undefined, "data-test": "canvas-hover-outline", style: overlayStyle(projectedHoverRect), "aria-hidden": "true" })) : null, hoverSpacing ? projectedSpacingGuides.map((guide, index) => (_jsx("div", { className: "canvas-spacing-guide", "data-test": "canvas-spacing-guide", "data-kind": hoverSpacing.kind, "data-property": hoverSpacing.property, "data-side": hoverSpacing.side ?? undefined, "data-guide-index": index, style: spacingGuideStyle(guide), "aria-hidden": "true" }, `${hoverSpacing.property}-${index}`))) : null] })) : null, projectedLinkedPeers.map(({ peer, rect }, index) => (_jsx("div", { ref: outlineRef(peer), className: "canvas-linked-outline", "data-test": "canvas-linked-outline", style: overlayStyle(rect), "aria-hidden": "true" }, `${peer.getAttribute("data-cid")}-${index}`))), projectedSelectedGeometry.map(({ element, rect }, index) => (_jsx("div", { ref: outlineRef(element.domElement), className: "canvas-selected-outline", "data-linked": selectionIsLinked ? "true" : undefined, "data-test": "canvas-selected-outline", "data-selected-cid": element.cid, "data-selected-index": index, "data-selected-src": element.src, style: overlayStyle(rect), "aria-hidden": "true" }, `${element.cid}-${index}`))), projectedSpacingBadge && spacingBadge ? (_jsx("div", { className: "canvas-spacing-value-badge", "data-test": "canvas-spacing-value-badge", style: { left: projectedSpacingBadge.x, top: projectedSpacingBadge.y }, "aria-hidden": "true", children: spacingValueCss(spacingBadge.value) })) : null, domNavigationEnabled && !inlineTextSession && !measureStateForSelectedFrame?.altKey && selectedElements.length === 1 && selected && selectedRect && selectedFrameViewport ? (_jsx(DomNavigator, { selected: selected, hierarchy: hierarchy, anchor: selectedRect, linked: selectionIsLinked, project: (element) => element.ownerDocument === selected.domElement.ownerDocument
707
+ ? toViewportRect(selectedFrameViewport, toRect(element.getBoundingClientRect()))
686
708
  : null })) : null, _jsx(DropGuideOverlay, { guide: projectedDropGuide, lineClassName: "canvas-dom-drop-line", lineTestId: "canvas-dom-drop-line", targetClassName: "canvas-dom-drop-target", targetTestId: "canvas-dom-drop-target" })] }));
687
709
  }