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,36 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { assignSketchToDraft } from "../drafts/store.js";
3
- import { getActiveDraftChanges } from "../changes/draftChanges.js";
2
+ import { canvasFrameHost } from "../canvas/canvasFrame.js";
3
+ import { getRegisteredFrames } from "../canvas/projection.js";
4
+ import { setSelectedElement } from "../selection/selectionStore.js";
5
+ import { selectCard } from "../canvas/canvasStore.js";
6
+ import { activateDraftForCard, assignSketchToDraft, getActiveDraftChanges } from "../drafts/store.js";
4
7
  import { useEffect, useState } from "react";
5
8
  import { renderAnnotatedPng } from "./raster.js";
9
+ import { sketchFrameHeading } from "./frameHeading.js";
6
10
  import { closeSketchEditor, completeSketchCapture, beginSketchCapture, cancelSketchInteraction, openSketchEditor, useSketchInteraction } from "./interaction.js";
7
- import { initializeSketchStore, saveSketch, useSketchStore } from "./store.js";
11
+ import { recordCanvasChange } from "../workspace/timeline.js";
12
+ import { getSketch, initializeSketchStore, removeSketch, saveSketch, useSketchStore } from "./store.js";
8
13
  import { clearSketchClipboardHandoff } from "./handoff.js";
14
+ import { copySketchImage, saveAndCopySketch } from "./copySketch.js";
9
15
  import { SketchEditor } from "./SketchEditor.js";
10
16
  import { SketchOverlay } from "./SketchOverlay.js";
11
17
  import { closeSketchNote, useSketchNote } from "./sketchNote.js";
12
18
  import { SketchPromptPanel } from "./SketchPromptPanel.js";
19
+ function recordSketchCreation(document, owner) {
20
+ let snapshot = document;
21
+ recordCanvasChange({
22
+ cardIds: [],
23
+ undo: () => {
24
+ snapshot = getSketch(document.id)?.document ?? snapshot;
25
+ void removeSketch(document.id);
26
+ },
27
+ redo: () => {
28
+ void saveSketch({ ...snapshot, annotations: snapshot.annotations ?? [] })
29
+ .then((saved) => assignSketchToDraft(owner, saved.id));
30
+ },
31
+ dispose: () => undefined,
32
+ });
33
+ }
13
34
  function clamp(value, maximum) {
14
35
  return Math.max(0, Math.min(maximum, value));
15
36
  }
@@ -37,26 +58,6 @@ export function projectLiveStrokes(draft, captured) {
37
58
  }];
38
59
  });
39
60
  }
40
- function projectLiveAnnotations(draft, captured) {
41
- const scaleX = captured.imageWidth / Math.max(1, draft.viewport.width);
42
- const scaleY = captured.imageHeight / Math.max(1, draft.viewport.height);
43
- const captureScrollX = captured.capture.scrollX;
44
- const captureScrollY = captured.capture.scrollY;
45
- const visibleRight = captureScrollX + draft.viewport.width;
46
- const visibleBottom = captureScrollY + draft.viewport.height;
47
- return draft.annotations
48
- .filter((annotation) => annotation.point.x >= captureScrollX
49
- && annotation.point.x <= visibleRight
50
- && annotation.point.y >= captureScrollY
51
- && annotation.point.y <= visibleBottom)
52
- .map((annotation) => ({
53
- ...annotation,
54
- point: {
55
- x: clamp((annotation.point.x - captureScrollX) * scaleX, captured.imageWidth),
56
- y: clamp((annotation.point.y - captureScrollY) * scaleY, captured.imageHeight),
57
- },
58
- }));
59
- }
60
61
  export function SketchWorkspace({ hostElement, projectId }) {
61
62
  const interaction = useSketchInteraction();
62
63
  const store = useSketchStore();
@@ -64,9 +65,8 @@ export function SketchWorkspace({ hostElement, projectId }) {
64
65
  const editingDocument = interaction.editingId
65
66
  ? store.items.find((item) => item.document.id === interaction.editingId)?.document ?? null
66
67
  : null;
67
- // IndexedDB hydration is deliberately independent from the localStorage
68
- // session schema. A failed hydration leaves the inspector usable and gives
69
- // the Changes log a recovery message.
68
+ // Deliberately independent of the localStorage session schema; a failed
69
+ // hydration leaves the inspector usable.
70
70
  useEffect(() => {
71
71
  clearSketchClipboardHandoff();
72
72
  closeSketchNote();
@@ -77,39 +77,71 @@ export function SketchWorkspace({ hostElement, projectId }) {
77
77
  const noteDocument = note.sketchId
78
78
  ? store.items.find((item) => item.document.id === note.sketchId)?.document ?? null
79
79
  : null;
80
+ function selectTarget(point, lockedTarget) {
81
+ for (const [cardId, frame] of getRegisteredFrames()) {
82
+ const target = canvasFrameHost(frame);
83
+ if (!target || !frame.isConnected || getComputedStyle(target).visibility === "hidden")
84
+ continue;
85
+ const bounds = frame.getBoundingClientRect();
86
+ if (bounds.width <= 0 || bounds.height <= 0)
87
+ continue;
88
+ if (point.x < bounds.left || point.x > bounds.right || point.y < bounds.top || point.y > bounds.bottom)
89
+ continue;
90
+ if (lockedTarget && target !== lockedTarget)
91
+ return null;
92
+ if (target !== hostElement) {
93
+ setSelectedElement(null);
94
+ selectCard(cardId);
95
+ activateDraftForCard(cardId);
96
+ beginSketchCapture();
97
+ }
98
+ return target;
99
+ }
100
+ return null;
101
+ }
80
102
  async function save(input) {
81
103
  const owner = interaction.draftId ?? getActiveDraftChanges().draftId;
82
104
  const saved = await saveSketch(input);
83
- if (!input.id)
105
+ if (!input.id) {
84
106
  assignSketchToDraft(owner, saved.id);
107
+ recordSketchCreation(saved, owner);
108
+ }
85
109
  closeSketchEditor();
110
+ void copySketchImage(input.annotatedImage);
111
+ }
112
+ function saveLive(draft) {
113
+ return saveAndCopySketch(() => saveLiveSketch(draft));
86
114
  }
87
- async function saveLive(draft) {
115
+ async function saveLiveSketch(draft) {
88
116
  if (!hostElement)
89
117
  throw new Error("The inspector is no longer available.");
90
118
  const owner = interaction.draftId ?? getActiveDraftChanges().draftId;
91
119
  const captured = await completeSketchCapture(hostElement);
92
120
  const strokes = projectLiveStrokes(draft, captured);
93
- const annotations = projectLiveAnnotations(draft, captured);
94
- const rendered = await renderAnnotatedPng(captured.originalImage, captured.imageWidth, captured.imageHeight, strokes, annotations, draft.description);
121
+ const rendered = await renderAnnotatedPng(captured.originalImage, captured.imageWidth, captured.imageHeight, strokes, [], draft.description, sketchFrameHeading(captured.capture.url));
95
122
  const saved = await saveSketch({
96
123
  capture: captured.capture,
97
124
  description: draft.description,
98
125
  strokes,
99
- annotations,
126
+ annotations: [],
100
127
  imageWidth: rendered.width,
101
128
  imageHeight: rendered.height,
102
129
  originalImage: captured.originalImage,
103
130
  annotatedImage: rendered.blob,
104
131
  });
105
132
  assignSketchToDraft(owner, saved.id);
133
+ recordSketchCreation(saved, owner);
106
134
  closeSketchEditor();
135
+ return rendered.blob;
107
136
  }
108
- async function saveNote(description) {
137
+ function saveNote(description) {
109
138
  if (!noteDocument)
110
- return;
139
+ return Promise.resolve();
140
+ return saveAndCopySketch(() => saveNoteSketch(noteDocument, description));
141
+ }
142
+ async function saveNoteSketch(noteDocument, description) {
111
143
  const nextDescription = description.trim();
112
- const rendered = await renderAnnotatedPng(noteDocument.originalImage, noteDocument.capture.imageWidth, noteDocument.capture.imageHeight, noteDocument.strokes, noteDocument.annotations ?? [], nextDescription);
144
+ const rendered = await renderAnnotatedPng(noteDocument.originalImage, noteDocument.capture.imageWidth, noteDocument.capture.imageHeight, noteDocument.strokes, noteDocument.annotations ?? [], nextDescription, sketchFrameHeading(noteDocument.capture.url));
113
145
  await saveSketch({
114
146
  id: noteDocument.id,
115
147
  capture: noteDocument.capture,
@@ -122,8 +154,9 @@ export function SketchWorkspace({ hostElement, projectId }) {
122
154
  annotatedImage: rendered.blob,
123
155
  });
124
156
  closeSketchNote();
157
+ return rendered.blob;
125
158
  }
126
- return (_jsxs(_Fragment, { children: [hostElement ? (_jsx(SketchOverlay, { open: liveOpen, hostElement: hostElement, initialTool: interaction.initialTool, onCancel: cancelSketchInteraction, onDone: saveLive })) : null, _jsx(SketchEditor, { open: editorOpen, document: editingDocument, captured: interaction.captured, onCancel: cancelSketchInteraction, onSave: save }), noteDocument ? (_jsx(SavedSketchNote, { document: noteDocument, onSave: saveNote, onCancel: closeSketchNote })) : null] }));
159
+ return (_jsxs(_Fragment, { children: [hostElement ? (_jsx(SketchOverlay, { open: liveOpen, hostElement: hostElement, selectTarget: selectTarget, onCancel: cancelSketchInteraction, onDone: saveLive })) : null, _jsx(SketchEditor, { open: editorOpen, document: editingDocument, captured: interaction.captured, onCancel: cancelSketchInteraction, onSave: save }), noteDocument ? (_jsx(SavedSketchNote, { document: noteDocument, onSave: saveNote, onCancel: closeSketchNote })) : null] }));
127
160
  }
128
161
  function SavedSketchNote({ document, onSave, onCancel, }) {
129
162
  const [description, setDescription] = useState(document.description);
@@ -148,10 +181,10 @@ function SavedSketchNote({ document, onSave, onCancel, }) {
148
181
  }
149
182
  return (_jsx(SketchPromptPanel, { dataTest: "sketch-note-prompt", className: "sketch__saved-note-panel", description: description, error: error, saving: saving, autoFocus: true, onDescriptionChange: setDescription, onDone: done, onCancel: onCancel }));
150
183
  }
151
- export function startSketchCapture(hostElement, initialTool = "pen") {
184
+ export function startSketchCapture(hostElement) {
152
185
  if (!hostElement)
153
186
  return;
154
- beginSketchCapture(initialTool);
187
+ beginSketchCapture();
155
188
  }
156
189
  export function editSketch(sketchId) {
157
190
  openSketchEditor(sketchId);
@@ -1,3 +1,5 @@
1
+ import { type Options } from "modern-screenshot";
2
+ import { getPngDimensions } from "./raster.js";
1
3
  export type SketchCaptureErrorCode = "unsupported" | "cancelled" | "capture-failed" | "processing-timeout";
2
4
  export declare class SketchCaptureError extends Error {
3
5
  readonly code: SketchCaptureErrorCode;
@@ -29,6 +31,13 @@ export interface SketchCaptureOptions {
29
31
  readonly signal?: AbortSignal;
30
32
  readonly processingTimeoutMs?: number;
31
33
  }
34
+ /** The `domToBlob` call shape this module uses: a node plus render options. */
35
+ export type DomCaptureToBlob = (node: Node, options?: Options) => Promise<Blob>;
36
+ /** Replaces the DOM renderer and PNG reader for callers that cannot rasterize, such as jsdom tests. */
37
+ export interface SketchCaptureResources {
38
+ readonly toBlob?: DomCaptureToBlob;
39
+ readonly pngDimensions?: typeof getPngDimensions;
40
+ }
32
41
  export interface SketchViewport {
33
42
  readonly width: number;
34
43
  readonly height: number;
@@ -44,11 +53,11 @@ export interface SketchScrollPosition {
44
53
  readonly x: number;
45
54
  readonly y: number;
46
55
  }
47
- /** Reads root scrolling from both window and document APIs. */
56
+ /** Browsers expose root scrolling through different APIs. */
48
57
  export declare function getSketchScrollPosition(targetWindow: Window): SketchScrollPosition;
49
58
  export declare function getSketchViewport(hostElement: HTMLElement): SketchViewport;
50
- /** Renders the current viewport from its DOM without invoking screen capture permissions. */
51
- export declare function captureViewport(options: SketchCaptureOptions): Promise<CapturedSketch>;
59
+ /** DOM-rendered, so no screen-capture permission is required. */
60
+ export declare function captureViewport(options: SketchCaptureOptions, resources?: SketchCaptureResources): Promise<CapturedSketch>;
52
61
  export declare function createSketchCaptureOperation(options: SketchCaptureOptions): {
53
62
  readonly promise: Promise<CapturedSketch>;
54
63
  readonly cancel: () => void;
@@ -2,6 +2,7 @@ import { domToBlob } from "modern-screenshot";
2
2
  import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
3
3
  import { SKETCH_LIMITS } from "./model.js";
4
4
  import { getPngDimensions } from "./raster.js";
5
+ import { prepareSketchVideoFrames } from "./videoFrames.js";
5
6
  const MEDIA_LOAD_TIMEOUT_MS = 500;
6
7
  const FONT_READY_TIMEOUT_MS = 2_000;
7
8
  const DEFAULT_PROCESSING_TIMEOUT_MS = 20_000;
@@ -73,7 +74,7 @@ async function waitForLayout(signal, targetDocument) {
73
74
  }
74
75
  }
75
76
  catch {
76
- // Font readiness is best effort; the animation-frame settle still runs.
77
+ // Font readiness is best effort.
77
78
  }
78
79
  await waitForAnimationFrame(signal);
79
80
  await waitForAnimationFrame(signal);
@@ -88,7 +89,7 @@ function domContentWidth(hostElement) {
88
89
  function nonNegativeOffset(...values) {
89
90
  return Math.max(0, ...values.filter((value) => Number.isFinite(value)));
90
91
  }
91
- /** Reads root scrolling from both window and document APIs. */
92
+ /** Browsers expose root scrolling through different APIs. */
92
93
  export function getSketchScrollPosition(targetWindow) {
93
94
  const targetDocument = targetWindow.document;
94
95
  const scrollingElement = targetDocument.scrollingElement;
@@ -252,16 +253,28 @@ async function runWithProcessingTimeout(operation, timeoutMs, parentSignal) {
252
253
  controller.abort();
253
254
  }
254
255
  }
255
- async function captureDomFrame(options, signal) {
256
+ async function captureDomFrame(options, resources, signal) {
257
+ const toBlob = resources.toBlob ?? domToBlob;
258
+ const readPngDimensions = resources.pngDimensions ?? getPngDimensions;
256
259
  const surface = getSketchSurface(options.hostElement);
257
260
  const viewport = domViewportDimensions(options.hostElement);
258
261
  let scale = viewport.scale;
259
262
  for (let attempt = 0; attempt < 7; attempt += 1) {
260
263
  assertNotAborted(signal);
264
+ const videoFrames = prepareSketchVideoFrames(surface.document);
261
265
  const restoreMedia = suspendOffscreenLazyImages(surface.document, viewport);
266
+ let restored = false;
267
+ const restore = () => {
268
+ if (restored)
269
+ return;
270
+ restored = true;
271
+ videoFrames.restore();
272
+ restoreMedia();
273
+ };
274
+ signal?.addEventListener("abort", restore, { once: true });
262
275
  let blob;
263
276
  try {
264
- blob = await domToBlob(surface.document.documentElement, {
277
+ blob = await toBlob(surface.document.documentElement, {
265
278
  type: "image/png",
266
279
  width: viewport.width,
267
280
  height: viewport.height,
@@ -272,21 +285,25 @@ async function captureDomFrame(options, signal) {
272
285
  height: `${viewport.height}px`,
273
286
  overflow: "hidden",
274
287
  },
275
- filter: (node) => node !== options.hostElement && !isGoogleFontStylesheet(node),
288
+ filter: (node) => node !== options.hostElement && !isGoogleFontStylesheet(node) && videoFrames.filter(node),
276
289
  features: { restoreScrollPosition: true },
277
290
  timeout: MEDIA_LOAD_TIMEOUT_MS,
278
- // Cross-origin Google CSS cannot be read by modern-screenshot. Skipping
279
- // its font embedding avoids waiting on a stylesheet that the renderer
280
- // cannot serialize anyway; computed font styles still remain inline.
291
+ // modern-screenshot cannot serialize cross-origin Google CSS; computed
292
+ // font styles still remain inline.
281
293
  font: hasGoogleFontStylesheet(surface.document) ? false : undefined,
282
- onCloneEachNode: prepareDomClone,
294
+ onCloneEachNode: (node) => {
295
+ prepareDomClone(node);
296
+ videoFrames.prepareClone(node);
297
+ },
298
+ onCloneNode: restore,
283
299
  });
284
300
  }
285
301
  finally {
286
- restoreMedia();
302
+ signal?.removeEventListener("abort", restore);
303
+ restore();
287
304
  }
288
305
  assertNotAborted(signal);
289
- const dimensions = await getPngDimensions(blob);
306
+ const dimensions = await readPngDimensions(blob);
290
307
  if (!dimensions
291
308
  || dimensions.width > SKETCH_LIMITS.imageEdge
292
309
  || dimensions.height > SKETCH_LIMITS.imageEdge) {
@@ -299,8 +316,8 @@ async function captureDomFrame(options, signal) {
299
316
  }
300
317
  throw new SketchCaptureError("capture-failed", "This viewport is too detailed to save within the 2 MiB image limit.");
301
318
  }
302
- /** Renders the current viewport from its DOM without invoking screen capture permissions. */
303
- export async function captureViewport(options) {
319
+ /** DOM-rendered, so no screen-capture permission is required. */
320
+ export async function captureViewport(options, resources = {}) {
304
321
  if (typeof document === "undefined" || typeof window === "undefined") {
305
322
  throw new SketchCaptureError("unsupported", "Viewport capture is only available in a browser.");
306
323
  }
@@ -309,7 +326,7 @@ export async function captureViewport(options) {
309
326
  const surface = getSketchSurface(options.hostElement);
310
327
  const frame = await runWithProcessingTimeout(async (processingSignal) => {
311
328
  await waitForLayout(processingSignal, surface.document);
312
- return captureDomFrame(options, processingSignal);
329
+ return captureDomFrame(options, resources, processingSignal);
313
330
  }, options.processingTimeoutMs ?? DEFAULT_PROCESSING_TIMEOUT_MS, options.signal);
314
331
  assertNotAborted(options.signal);
315
332
  const runtime = getNudgeUiRuntimeConfig();
@@ -0,0 +1,4 @@
1
+ export declare function copySketchImage(image: Blob): Promise<void>;
2
+ export declare function copySketchImageOnRequest(image: Blob): Promise<void>;
3
+ /** A failed save skips the toast and rethrows so the caller can show its own error; the clipboard write starts before `save` resolves. */
4
+ export declare function saveAndCopySketch(save: () => Promise<Blob>): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import { showToast } from "../ui/Toast.js";
2
+ import { copyImageToClipboard } from "./raster.js";
3
+ function reportCopyFailure(title, error) {
4
+ showToast({
5
+ tone: "error",
6
+ title,
7
+ description: error instanceof Error ? error.message : "The sketch image could not be copied.",
8
+ });
9
+ }
10
+ /** The toast is the only sign the clipboard changed, so success is announced too. */
11
+ function reportAutoCopy(copied) {
12
+ void copied.then(() => showToast({ title: "Copied to clipboard" }), (error) => reportCopyFailure("Sketch saved, but not copied", error));
13
+ }
14
+ export function copySketchImage(image) {
15
+ const copied = copyImageToClipboard(image);
16
+ reportAutoCopy(copied);
17
+ return copied.catch(() => undefined);
18
+ }
19
+ export function copySketchImageOnRequest(image) {
20
+ const copied = copyImageToClipboard(image);
21
+ void copied.catch((error) => reportCopyFailure("Sketch not copied", error));
22
+ return copied.catch(() => undefined);
23
+ }
24
+ /** A failed save skips the toast and rethrows so the caller can show its own error; the clipboard write starts before `save` resolves. */
25
+ export async function saveAndCopySketch(save) {
26
+ let resolveImage = () => undefined;
27
+ let rejectImage = () => undefined;
28
+ const image = new Promise((resolve, reject) => {
29
+ resolveImage = resolve;
30
+ rejectImage = reject;
31
+ });
32
+ image.catch(() => undefined);
33
+ const copied = copyImageToClipboard(image);
34
+ copied.catch(() => undefined);
35
+ try {
36
+ resolveImage(await save());
37
+ }
38
+ catch (error) {
39
+ rejectImage(error);
40
+ throw error;
41
+ }
42
+ reportAutoCopy(copied);
43
+ }
@@ -0,0 +1,15 @@
1
+ import { type SketchPenColor } from "./model.js";
2
+ export type SketchDrawingTool = "pen" | "eraser" | "rectangle";
3
+ export interface SketchDrawingToolsSnapshot {
4
+ readonly tool: SketchDrawingTool;
5
+ readonly color: SketchPenColor;
6
+ }
7
+ export declare function getSketchDrawingTools(): SketchDrawingToolsSnapshot;
8
+ export declare function subscribeSketchDrawingTools(listener: () => void): () => void;
9
+ export declare function useSketchDrawingTools(): SketchDrawingToolsSnapshot;
10
+ export declare function setSketchDrawingTool(tool: SketchDrawingTool): void;
11
+ /** Choosing a color implies drawing with it, so the eraser hands back to the pen. */
12
+ export declare function setSketchStrokeColor(color: SketchPenColor): void;
13
+ /** Resets the tool only; the chosen color is kept. */
14
+ export declare function resetSketchDrawingTool(): void;
15
+ export declare function restoreDefaultSketchDrawingTools(): void;
@@ -0,0 +1,46 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { SKETCH_PEN_COLORS, SKETCH_STROKE_COLOR } from "./model.js";
3
+ const DEFAULT_COLOR = SKETCH_PEN_COLORS.find((color) => color.value === SKETCH_STROKE_COLOR) ?? SKETCH_PEN_COLORS[0];
4
+ const DEFAULT_SNAPSHOT = {
5
+ tool: "pen",
6
+ color: DEFAULT_COLOR,
7
+ };
8
+ let snapshot = DEFAULT_SNAPSHOT;
9
+ const listeners = new Set();
10
+ function publish(next) {
11
+ if (next.tool === snapshot.tool && next.color === snapshot.color)
12
+ return;
13
+ snapshot = next;
14
+ for (const listener of listeners) {
15
+ try {
16
+ listener();
17
+ }
18
+ catch {
19
+ // A view subscriber must not stop the others from seeing the new tool.
20
+ }
21
+ }
22
+ }
23
+ export function getSketchDrawingTools() {
24
+ return snapshot;
25
+ }
26
+ export function subscribeSketchDrawingTools(listener) {
27
+ listeners.add(listener);
28
+ return () => listeners.delete(listener);
29
+ }
30
+ export function useSketchDrawingTools() {
31
+ return useSyncExternalStore(subscribeSketchDrawingTools, getSketchDrawingTools, getSketchDrawingTools);
32
+ }
33
+ export function setSketchDrawingTool(tool) {
34
+ publish({ ...snapshot, tool });
35
+ }
36
+ /** Choosing a color implies drawing with it, so the eraser hands back to the pen. */
37
+ export function setSketchStrokeColor(color) {
38
+ publish({ tool: snapshot.tool === "eraser" ? "pen" : snapshot.tool, color });
39
+ }
40
+ /** Resets the tool only; the chosen color is kept. */
41
+ export function resetSketchDrawingTool() {
42
+ setSketchDrawingTool("pen");
43
+ }
44
+ export function restoreDefaultSketchDrawingTools() {
45
+ snapshot = DEFAULT_SNAPSHOT;
46
+ }
@@ -0,0 +1,3 @@
1
+ import { type CanvasCard } from "../canvas/canvasStore.js";
2
+ /** Iterations also name their artifact folder: iteration numbers are live labels that nothing persists. */
3
+ export declare function sketchFrameHeading(captureUrl: string, frameCards?: readonly CanvasCard[]): string;
@@ -0,0 +1,23 @@
1
+ import { getCanvasCards } from "../canvas/canvasStore.js";
2
+ import { contentSourceUrl } from "../canvas/frameContent.js";
3
+ import { artifactIdFromUrl, htmlTarget } from "../drafts/model.js";
4
+ function routePath(url) {
5
+ try {
6
+ return new URL(url).pathname || "/";
7
+ }
8
+ catch {
9
+ return url;
10
+ }
11
+ }
12
+ /** Iterations also name their artifact folder: iteration numbers are live labels that nothing persists. */
13
+ export function sketchFrameHeading(captureUrl, frameCards = getCanvasCards()) {
14
+ const artifactId = artifactIdFromUrl(captureUrl);
15
+ if (!artifactId)
16
+ return `Implement these changes for "${routePath(captureUrl)}"`;
17
+ const card = frameCards.find((candidate) => candidate.content.kind === "iteration"
18
+ && candidate.content.artifactId === artifactId);
19
+ const path = htmlTarget(artifactId).path;
20
+ return card
21
+ ? `Implement these changes for the HTML iteration "${routePath(contentSourceUrl(card.content))}" (${path})`
22
+ : `Implement these changes for the HTML iteration (${path})`;
23
+ }
@@ -9,5 +9,4 @@ export interface SketchSvgLayerProps {
9
9
  readonly annotations?: readonly SketchAnnotation[];
10
10
  readonly annotationScale?: number;
11
11
  }
12
- /** Renders sketch geometry as DOM-native SVG shapes. */
13
12
  export declare function SketchSvgLayer({ strokes, annotations, annotationScale, }: SketchSvgLayerProps): ReactElement;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { getStroke } from "perfect-freehand";
3
- import { SKETCH_STROKE_COLOR, } from "./model.js";
3
+ import { SKETCH_ACCENT_COLOR, SKETCH_RECTANGLE_FILL_OPACITY, SKETCH_STROKE_COLOR, } from "./model.js";
4
4
  const FREEHAND_OPTIONS = {
5
5
  thinning: 0.45,
6
6
  smoothing: 0.5,
@@ -49,16 +49,15 @@ export function sketchStrokePath(stroke, scaleX = 1, scaleY = scaleX) {
49
49
  return linePath(stroke.points, scaleX, scaleY);
50
50
  return getSvgPathFromStroke(sketchStrokeOutline(stroke, scaleX, scaleY));
51
51
  }
52
- /** Renders sketch geometry as DOM-native SVG shapes. */
53
52
  export function SketchSvgLayer({ strokes, annotations = [], annotationScale = 1, }) {
54
53
  return (_jsxs("g", { "data-test": "sketch-svg-layer", children: [strokes.map((stroke) => {
55
54
  const path = sketchStrokePath(stroke);
56
55
  if (!path)
57
56
  return null;
58
57
  const rectangle = stroke.kind === "rectangle";
59
- return (_jsx("path", { d: path, fill: rectangle ? "none" : stroke.color || SKETCH_STROKE_COLOR, stroke: rectangle ? stroke.color || SKETCH_STROKE_COLOR : "none", strokeWidth: rectangle ? stroke.width : undefined, strokeLinecap: "round", strokeLinejoin: "round", pointerEvents: "none" }, stroke.id));
58
+ return (_jsx("path", { d: path, fill: stroke.color || SKETCH_STROKE_COLOR, fillOpacity: rectangle ? SKETCH_RECTANGLE_FILL_OPACITY : undefined, stroke: rectangle ? stroke.color || SKETCH_STROKE_COLOR : "none", strokeWidth: rectangle ? stroke.width : undefined, strokeLinecap: "round", strokeLinejoin: "round", pointerEvents: "none" }, stroke.id));
60
59
  }), annotations.map((annotation) => {
61
60
  const radius = 16 * annotationScale;
62
- return (_jsxs("g", { transform: `translate(${number(annotation.point.x)} ${number(annotation.point.y)})`, pointerEvents: "none", children: [_jsx("circle", { r: radius, fill: SKETCH_STROKE_COLOR }), _jsx("text", { x: "0", y: "0", fill: "#ffffff", fontFamily: "system-ui, sans-serif", fontSize: 12 * annotationScale, fontWeight: "600", textAnchor: "middle", dominantBaseline: "central", children: annotation.number })] }, annotation.id));
61
+ return (_jsxs("g", { transform: `translate(${number(annotation.point.x)} ${number(annotation.point.y)})`, pointerEvents: "none", children: [_jsx("circle", { r: radius, fill: SKETCH_ACCENT_COLOR }), _jsx("text", { x: "0", y: "0", fill: "#ffffff", fontFamily: "system-ui, sans-serif", fontSize: 12 * annotationScale, fontWeight: "600", textAnchor: "middle", dominantBaseline: "central", children: annotation.number })] }, annotation.id));
63
62
  })] }));
64
63
  }
@@ -11,7 +11,8 @@ export type SketchElementReference = {
11
11
  readonly id: string;
12
12
  };
13
13
  export declare function distanceToSegment(point: SketchPoint, start: SketchPoint, end: SketchPoint): number;
14
- /** Returns the topmost drawable object under a point in canvas coordinates. */
15
14
  export declare function findSketchElementAt(point: SketchPoint, strokes: readonly SketchStroke[], annotations: readonly SketchAnnotation[]): SketchElementReference | null;
16
15
  export declare function translateSketchStroke(stroke: SketchStroke, delta: SketchPoint, bounds: SketchBounds): SketchStroke;
17
16
  export declare function translateSketchAnnotation(annotation: SketchAnnotation, delta: SketchPoint, bounds: SketchBounds): SketchAnnotation;
17
+ /** Rectangles are hit on their outline only, so erasing inside a box leaves it in place. */
18
+ export declare function findErasedSketchStrokeIds(start: SketchPoint, end: SketchPoint, strokes: readonly SketchStroke[], radius: number): string[];
@@ -37,7 +37,6 @@ function pointBounds(points) {
37
37
  }
38
38
  return { minX, maxX, minY, maxY };
39
39
  }
40
- /** Returns the topmost drawable object under a point in canvas coordinates. */
41
40
  export function findSketchElementAt(point, strokes, annotations) {
42
41
  for (let index = annotations.length - 1; index >= 0; index -= 1) {
43
42
  const annotation = annotations[index];
@@ -96,3 +95,18 @@ export function translateSketchAnnotation(annotation, delta, bounds) {
96
95
  },
97
96
  };
98
97
  }
98
+ /** Rectangles are hit on their outline only, so erasing inside a box leaves it in place. */
99
+ export function findErasedSketchStrokeIds(start, end, strokes, radius) {
100
+ const steps = Math.max(1, Math.ceil(distance(start, end) / Math.max(1, radius / 2)));
101
+ const samples = [];
102
+ for (let step = 0; step <= steps; step += 1) {
103
+ const position = step / steps;
104
+ samples.push({ x: start.x + (end.x - start.x) * position, y: start.y + (end.y - start.y) * position });
105
+ }
106
+ return strokes
107
+ .filter((stroke) => {
108
+ const tolerance = radius + stroke.width / 2;
109
+ return samples.some((sample) => distanceToStroke(sample, stroke) <= tolerance);
110
+ })
111
+ .map((stroke) => stroke.id);
112
+ }
@@ -20,7 +20,6 @@ function randomId() {
20
20
  return crypto.randomUUID();
21
21
  }
22
22
  catch {
23
- // Use the fallback below.
24
23
  }
25
24
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
26
25
  }
@@ -0,0 +1,26 @@
1
+ import type { SketchStroke } from "./model.js";
2
+ interface ErasedStroke {
3
+ readonly stroke: SketchStroke;
4
+ /** Position in the stroke list at the moment it was erased. */
5
+ readonly index: number;
6
+ }
7
+ type SketchHistoryEntry = {
8
+ readonly kind: "add";
9
+ readonly stroke: SketchStroke;
10
+ } | {
11
+ readonly kind: "erase";
12
+ readonly gesture: number;
13
+ readonly erased: readonly ErasedStroke[];
14
+ };
15
+ export interface SketchHistory {
16
+ readonly strokes: readonly SketchStroke[];
17
+ readonly undo: readonly SketchHistoryEntry[];
18
+ readonly redo: readonly SketchHistoryEntry[];
19
+ }
20
+ export declare const EMPTY_SKETCH_HISTORY: SketchHistory;
21
+ export declare function addSketchStroke(history: SketchHistory, stroke: SketchStroke): SketchHistory;
22
+ /** Strokes erased by the same `gesture` share one undo entry, so an eraser drag undoes in one step. */
23
+ export declare function eraseSketchStrokes(history: SketchHistory, ids: readonly string[], gesture: number): SketchHistory;
24
+ export declare function undoSketchEdit(history: SketchHistory): SketchHistory;
25
+ export declare function redoSketchEdit(history: SketchHistory): SketchHistory;
26
+ export {};
@@ -0,0 +1,55 @@
1
+ export const EMPTY_SKETCH_HISTORY = { strokes: [], undo: [], redo: [] };
2
+ export function addSketchStroke(history, stroke) {
3
+ return {
4
+ strokes: [...history.strokes, stroke],
5
+ undo: [...history.undo, { kind: "add", stroke }],
6
+ redo: [],
7
+ };
8
+ }
9
+ function removeStrokes(strokes, ids) {
10
+ const remaining = [];
11
+ const erased = [];
12
+ strokes.forEach((stroke, index) => {
13
+ if (ids.has(stroke.id))
14
+ erased.push({ stroke, index: index - erased.length });
15
+ else
16
+ remaining.push(stroke);
17
+ });
18
+ return { strokes: remaining, erased };
19
+ }
20
+ /** Strokes erased by the same `gesture` share one undo entry, so an eraser drag undoes in one step. */
21
+ export function eraseSketchStrokes(history, ids, gesture) {
22
+ const { strokes, erased } = removeStrokes(history.strokes, new Set(ids));
23
+ if (erased.length === 0)
24
+ return history;
25
+ const last = history.undo.at(-1);
26
+ const undo = last?.kind === "erase" && last.gesture === gesture
27
+ ? [...history.undo.slice(0, -1), { ...last, erased: [...last.erased, ...erased] }]
28
+ : [...history.undo, { kind: "erase", gesture, erased }];
29
+ return { strokes, undo, redo: [] };
30
+ }
31
+ function restoreErased(strokes, erased) {
32
+ const restored = [...strokes];
33
+ // Reinsert in reverse removal order so each recorded index is valid again.
34
+ for (const { stroke, index } of [...erased].reverse())
35
+ restored.splice(index, 0, stroke);
36
+ return restored;
37
+ }
38
+ export function undoSketchEdit(history) {
39
+ const entry = history.undo.at(-1);
40
+ if (!entry)
41
+ return history;
42
+ const strokes = entry.kind === "add"
43
+ ? history.strokes.filter((stroke) => stroke.id !== entry.stroke.id)
44
+ : restoreErased(history.strokes, entry.erased);
45
+ return { strokes, undo: history.undo.slice(0, -1), redo: [...history.redo, entry] };
46
+ }
47
+ export function redoSketchEdit(history) {
48
+ const entry = history.redo.at(-1);
49
+ if (!entry)
50
+ return history;
51
+ const strokes = entry.kind === "add"
52
+ ? [...history.strokes, entry.stroke]
53
+ : removeStrokes(history.strokes, new Set(entry.erased.map(({ stroke }) => stroke.id))).strokes;
54
+ return { strokes, undo: [...history.undo, entry], redo: history.redo.slice(0, -1) };
55
+ }