nudge-ui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +66 -0
  2. package/bin/nudge-ui.mjs +7 -0
  3. package/dist/LICENSE +21 -0
  4. package/dist/client.mjs +261 -0
  5. package/dist/compiler/ast.d.ts +18 -0
  6. package/dist/compiler/ast.js +75 -0
  7. package/dist/compiler/componentContractTypes.d.ts +19 -0
  8. package/dist/compiler/componentContractTypes.js +1 -0
  9. package/dist/compiler/componentContracts.d.ts +2 -0
  10. package/dist/compiler/componentContracts.js +260 -0
  11. package/dist/compiler/componentInstrumentation.d.ts +32 -0
  12. package/dist/compiler/componentInstrumentation.js +140 -0
  13. package/dist/compiler/componentPolicyResolution.d.ts +71 -0
  14. package/dist/compiler/componentPolicyResolution.js +388 -0
  15. package/dist/compiler/index.d.ts +9 -0
  16. package/dist/compiler/index.js +9 -0
  17. package/dist/compiler/packageComponentContracts.d.ts +32 -0
  18. package/dist/compiler/packageComponentContracts.js +308 -0
  19. package/dist/compiler/reactComponentProtocols.d.ts +145 -0
  20. package/dist/compiler/reactComponentProtocols.js +47 -0
  21. package/dist/compiler/reactIdentity.d.ts +15 -0
  22. package/dist/compiler/reactIdentity.js +339 -0
  23. package/dist/compiler/sourcePaths.d.ts +12 -0
  24. package/dist/compiler/sourcePaths.js +27 -0
  25. package/dist/css/dialects/index.d.ts +62 -0
  26. package/dist/css/dialects/index.js +103 -0
  27. package/dist/css/dialects/tailwind.d.ts +46 -0
  28. package/dist/css/dialects/tailwind.js +119 -0
  29. package/dist/css/dialects/vanillaExtract.d.ts +20 -0
  30. package/dist/css/dialects/vanillaExtract.js +32 -0
  31. package/dist/css/index.d.ts +10 -0
  32. package/dist/css/index.js +10 -0
  33. package/dist/css/model/index.d.ts +190 -0
  34. package/dist/css/model/index.js +10 -0
  35. package/dist/css/token-inventory/index.d.ts +26 -0
  36. package/dist/css/token-inventory/index.js +24 -0
  37. package/dist/css/token-inventory/inventory.d.ts +8 -0
  38. package/dist/css/token-inventory/inventory.js +421 -0
  39. package/dist/css/token-inventory/parseStylesheet.d.ts +16 -0
  40. package/dist/css/token-inventory/parseStylesheet.js +155 -0
  41. package/dist/css/token-inventory/policy.d.ts +47 -0
  42. package/dist/css/token-inventory/policy.js +50 -0
  43. package/dist/css/token-inventory/types.d.ts +97 -0
  44. package/dist/css/token-inventory/types.js +1 -0
  45. package/dist/css/value-semantics/borderSemantics.d.ts +28 -0
  46. package/dist/css/value-semantics/borderSemantics.js +91 -0
  47. package/dist/css/value-semantics/boxSemantics.d.ts +37 -0
  48. package/dist/css/value-semantics/boxSemantics.js +71 -0
  49. package/dist/css/value-semantics/colorSemantics.d.ts +99 -0
  50. package/dist/css/value-semantics/colorSemantics.js +526 -0
  51. package/dist/css/value-semantics/cssSyntax.d.ts +19 -0
  52. package/dist/css/value-semantics/cssSyntax.js +111 -0
  53. package/dist/css/value-semantics/fontSemantics.d.ts +35 -0
  54. package/dist/css/value-semantics/fontSemantics.js +131 -0
  55. package/dist/css/value-semantics/index.d.ts +20 -0
  56. package/dist/css/value-semantics/index.js +15 -0
  57. package/dist/css/value-semantics/propertyPolicy.d.ts +118 -0
  58. package/dist/css/value-semantics/propertyPolicy.js +356 -0
  59. package/dist/css/value-semantics/stringMaps.d.ts +2 -0
  60. package/dist/css/value-semantics/stringMaps.js +1 -0
  61. package/dist/css/value-semantics/structuredValues.d.ts +64 -0
  62. package/dist/css/value-semantics/structuredValues.js +250 -0
  63. package/dist/css/value-semantics/tokenInterpretation.d.ts +90 -0
  64. package/dist/css/value-semantics/tokenInterpretation.js +193 -0
  65. package/dist/css/virtual-design-tokens.d.ts +17 -0
  66. package/dist/hosts/astro/astroRuntimeConfig.d.ts +12 -0
  67. package/dist/hosts/astro/astroRuntimeConfig.js +26 -0
  68. package/dist/hosts/astro/clientAsset.d.ts +12 -0
  69. package/dist/hosts/astro/clientAsset.js +51 -0
  70. package/dist/hosts/astro/clientTransport.d.ts +3 -0
  71. package/dist/hosts/astro/clientTransport.js +57 -0
  72. package/dist/hosts/astro/index.d.ts +3 -0
  73. package/dist/hosts/astro/index.js +2 -0
  74. package/dist/hosts/astro/integration.d.ts +35 -0
  75. package/dist/hosts/astro/integration.js +96 -0
  76. package/dist/hosts/astro/middleware.d.ts +13 -0
  77. package/dist/hosts/astro/middleware.js +22 -0
  78. package/dist/hosts/astro/projectContext.d.ts +11 -0
  79. package/dist/hosts/astro/projectContext.js +34 -0
  80. package/dist/hosts/astro/responseInstrumentation.d.ts +41 -0
  81. package/dist/hosts/astro/responseInstrumentation.js +80 -0
  82. package/dist/hosts/next/index.d.ts +4 -0
  83. package/dist/hosts/next/index.js +7 -0
  84. package/dist/hosts/next/loader.d.ts +66 -0
  85. package/dist/hosts/next/loader.js +346 -0
  86. package/dist/hosts/next/loaders/identity-loader.cjs +228257 -0
  87. package/dist/hosts/next/loaders/loader-plugin.cjs +228257 -0
  88. package/dist/hosts/next/manifest.d.ts +38 -0
  89. package/dist/hosts/next/manifest.js +30 -0
  90. package/dist/hosts/next/mount.d.ts +12 -0
  91. package/dist/hosts/next/mount.js +23 -0
  92. package/dist/hosts/next/repositoryScope.d.ts +20 -0
  93. package/dist/hosts/next/repositoryScope.js +33 -0
  94. package/dist/hosts/next/sidecar.d.ts +27 -0
  95. package/dist/hosts/next/sidecar.js +526 -0
  96. package/dist/hosts/next/wrapper.d.ts +67 -0
  97. package/dist/hosts/next/wrapper.js +310 -0
  98. package/dist/hosts/static/cli.d.ts +12 -0
  99. package/dist/hosts/static/cli.js +77 -0
  100. package/dist/hosts/static/html/bootstrap.d.ts +27 -0
  101. package/dist/hosts/static/html/bootstrap.js +93 -0
  102. package/dist/hosts/static/index.d.ts +4 -0
  103. package/dist/hosts/static/index.js +4 -0
  104. package/dist/hosts/static/manifest.d.ts +18 -0
  105. package/dist/hosts/static/manifest.js +51 -0
  106. package/dist/hosts/static/server.d.ts +72 -0
  107. package/dist/hosts/static/server.js +554 -0
  108. package/dist/hosts/vite/index.d.ts +20 -0
  109. package/dist/hosts/vite/index.js +48 -0
  110. package/dist/hosts/vite/react.d.ts +67 -0
  111. package/dist/hosts/vite/react.js +231 -0
  112. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +28 -0
  113. package/dist/hosts/vite/tokens/activeStylesheets.js +70 -0
  114. package/dist/hosts/vite/tokens/fileMap.d.ts +2 -0
  115. package/dist/hosts/vite/tokens/fileMap.js +1 -0
  116. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +46 -0
  117. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +104 -0
  118. package/dist/hosts/vite/virtual/design-tokens.d.ts +9 -0
  119. package/dist/hosts/vite/virtual/design-tokens.js +7 -0
  120. package/dist/hosts/vite/virtual-design-tokens.d.ts +1 -0
  121. package/dist/hosts/vite/vite.d.ts +62 -0
  122. package/dist/hosts/vite/vite.js +854 -0
  123. package/dist/html/dom.d.ts +13 -0
  124. package/dist/html/dom.js +46 -0
  125. package/dist/html/identity.d.ts +40 -0
  126. package/dist/html/identity.js +196 -0
  127. package/dist/html/insertions.d.ts +26 -0
  128. package/dist/html/insertions.js +59 -0
  129. package/dist/inspector/agent/McpConnectionDialog.d.ts +26 -0
  130. package/dist/inspector/agent/McpConnectionDialog.js +135 -0
  131. package/dist/inspector/agent/client.d.ts +98 -0
  132. package/dist/inspector/agent/client.js +728 -0
  133. package/dist/inspector/agent/connectionStatus.d.ts +13 -0
  134. package/dist/inspector/agent/connectionStatus.js +35 -0
  135. package/dist/inspector/agent/httpTransport.d.ts +21 -0
  136. package/dist/inspector/agent/httpTransport.js +347 -0
  137. package/dist/inspector/agent/protocol.d.ts +95 -0
  138. package/dist/inspector/agent/protocol.js +9 -0
  139. package/dist/inspector/agent/verification.d.ts +39 -0
  140. package/dist/inspector/agent/verification.js +207 -0
  141. package/dist/inspector/canvas/CanvasCard.d.ts +10 -0
  142. package/dist/inspector/canvas/CanvasCard.js +275 -0
  143. package/dist/inspector/canvas/CanvasElementOverlay.d.ts +2 -0
  144. package/dist/inspector/canvas/CanvasElementOverlay.js +301 -0
  145. package/dist/inspector/canvas/CanvasWorkspace.d.ts +2 -0
  146. package/dist/inspector/canvas/CanvasWorkspace.js +301 -0
  147. package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +6 -0
  148. package/dist/inspector/canvas/LockedWorkspaceNotice.js +17 -0
  149. package/dist/inspector/canvas/StaleChangeIndicator.d.ts +7 -0
  150. package/dist/inspector/canvas/StaleChangeIndicator.js +43 -0
  151. package/dist/inspector/canvas/agentPresentation.d.ts +87 -0
  152. package/dist/inspector/canvas/agentPresentation.js +421 -0
  153. package/dist/inspector/canvas/canvasGestures.d.ts +12 -0
  154. package/dist/inspector/canvas/canvasGestures.js +21 -0
  155. package/dist/inspector/canvas/canvasStore.d.ts +108 -0
  156. package/dist/inspector/canvas/canvasStore.js +448 -0
  157. package/dist/inspector/canvas/frameProtocol.d.ts +231 -0
  158. package/dist/inspector/canvas/frameProtocol.js +165 -0
  159. package/dist/inspector/canvas/linkEligibility.d.ts +8 -0
  160. package/dist/inspector/canvas/linkEligibility.js +68 -0
  161. package/dist/inspector/canvas/measurementProjection.d.ts +8 -0
  162. package/dist/inspector/canvas/measurementProjection.js +16 -0
  163. package/dist/inspector/canvas/normalizeUrl.d.ts +7 -0
  164. package/dist/inspector/canvas/normalizeUrl.js +27 -0
  165. package/dist/inspector/canvas/projection.d.ts +41 -0
  166. package/dist/inspector/canvas/projection.js +232 -0
  167. package/dist/inspector/canvas/rendererBootstrap.d.ts +4 -0
  168. package/dist/inspector/canvas/rendererBootstrap.js +410 -0
  169. package/dist/inspector/canvas/rendererCidIndex.d.ts +11 -0
  170. package/dist/inspector/canvas/rendererCidIndex.js +21 -0
  171. package/dist/inspector/canvas/rendererElementSelector.d.ts +2 -0
  172. package/dist/inspector/canvas/rendererElementSelector.js +378 -0
  173. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +2 -0
  174. package/dist/inspector/canvas/rendererSelectionProxy.js +61 -0
  175. package/dist/inspector/canvas/rendererStylesheet.d.ts +16 -0
  176. package/dist/inspector/canvas/rendererStylesheet.js +221 -0
  177. package/dist/inspector/canvas/resizeHandleScale.d.ts +13 -0
  178. package/dist/inspector/canvas/resizeHandleScale.js +20 -0
  179. package/dist/inspector/canvas/roleDetection.d.ts +5 -0
  180. package/dist/inspector/canvas/roleDetection.js +21 -0
  181. package/dist/inspector/canvas/sessionStore.d.ts +71 -0
  182. package/dist/inspector/canvas/sessionStore.js +453 -0
  183. package/dist/inspector/canvas/staleChangeDetector.d.ts +11 -0
  184. package/dist/inspector/canvas/staleChangeDetector.js +217 -0
  185. package/dist/inspector/canvas/toolbarScale.d.ts +7 -0
  186. package/dist/inspector/canvas/toolbarScale.js +11 -0
  187. package/dist/inspector/canvas/workspaceLease.d.ts +26 -0
  188. package/dist/inspector/canvas/workspaceLease.js +214 -0
  189. package/dist/inspector/changes/changesLog.d.ts +46 -0
  190. package/dist/inspector/changes/changesLog.js +209 -0
  191. package/dist/inspector/changes/codecs.d.ts +98 -0
  192. package/dist/inspector/changes/codecs.js +389 -0
  193. package/dist/inspector/changes/editModel.d.ts +74 -0
  194. package/dist/inspector/changes/editModel.js +120 -0
  195. package/dist/inspector/changes/managedStyleProjection.d.ts +6 -0
  196. package/dist/inspector/changes/managedStyleProjection.js +109 -0
  197. package/dist/inspector/changes/model.d.ts +13 -0
  198. package/dist/inspector/changes/model.js +163 -0
  199. package/dist/inspector/changes/presentation.d.ts +14 -0
  200. package/dist/inspector/changes/presentation.js +81 -0
  201. package/dist/inspector/changes/previewDiagnostics.d.ts +39 -0
  202. package/dist/inspector/changes/previewDiagnostics.js +172 -0
  203. package/dist/inspector/changes/structuralTypes.d.ts +35 -0
  204. package/dist/inspector/changes/structuralTypes.js +1 -0
  205. package/dist/inspector/changes/types.d.ts +76 -0
  206. package/dist/inspector/changes/types.js +16 -0
  207. package/dist/inspector/changes/workspaceChanges.d.ts +43 -0
  208. package/dist/inspector/changes/workspaceChanges.js +239 -0
  209. package/dist/inspector/clientManifest.d.ts +24 -0
  210. package/dist/inspector/clientManifest.js +69 -0
  211. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +5 -0
  212. package/dist/inspector/componentSemantics/ComponentPropsSection.js +44 -0
  213. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +11 -0
  214. package/dist/inspector/componentSemantics/adapterRegistry.js +75 -0
  215. package/dist/inspector/componentSemantics/boundaries.d.ts +2 -0
  216. package/dist/inspector/componentSemantics/boundaries.js +10 -0
  217. package/dist/inspector/componentSemantics/changeAction.d.ts +3 -0
  218. package/dist/inspector/componentSemantics/changeAction.js +6 -0
  219. package/dist/inspector/componentSemantics/changeModel.d.ts +8 -0
  220. package/dist/inspector/componentSemantics/changeModel.js +60 -0
  221. package/dist/inspector/componentSemantics/index.d.ts +4 -0
  222. package/dist/inspector/componentSemantics/index.js +2 -0
  223. package/dist/inspector/componentSemantics/reactRuntime.d.ts +10 -0
  224. package/dist/inspector/componentSemantics/reactRuntime.js +186 -0
  225. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +25 -0
  226. package/dist/inspector/componentSemantics/runtimeBridge.js +161 -0
  227. package/dist/inspector/componentSemantics/runtimeTypes.d.ts +2 -0
  228. package/dist/inspector/componentSemantics/runtimeTypes.js +1 -0
  229. package/dist/inspector/componentSemantics/textBinding.d.ts +69 -0
  230. package/dist/inspector/componentSemantics/textBinding.js +514 -0
  231. package/dist/inspector/componentSemantics/types.d.ts +96 -0
  232. package/dist/inspector/componentSemantics/types.js +5 -0
  233. package/dist/inspector/conformance/borderCases.d.ts +7 -0
  234. package/dist/inspector/conformance/borderCases.js +428 -0
  235. package/dist/inspector/conformance/colorCases.d.ts +8 -0
  236. package/dist/inspector/conformance/colorCases.js +470 -0
  237. package/dist/inspector/conformance/fixture.d.ts +68 -0
  238. package/dist/inspector/conformance/fixture.js +153 -0
  239. package/dist/inspector/conformance/projection.d.ts +2 -0
  240. package/dist/inspector/conformance/projection.js +3 -0
  241. package/dist/inspector/conformance/spacingCases.d.ts +6 -0
  242. package/dist/inspector/conformance/spacingCases.js +417 -0
  243. package/dist/inspector/conformance/typographyCases.d.ts +7 -0
  244. package/dist/inspector/conformance/typographyCases.js +174 -0
  245. package/dist/inspector/editScope.d.ts +4 -0
  246. package/dist/inspector/editScope.js +5 -0
  247. package/dist/inspector/index.d.ts +20 -0
  248. package/dist/inspector/index.js +236 -0
  249. package/dist/inspector/inline-text/inlineTextEditor.d.ts +74 -0
  250. package/dist/inspector/inline-text/inlineTextEditor.js +1207 -0
  251. package/dist/inspector/inline-text/inlineTextLifecycle.d.ts +2 -0
  252. package/dist/inspector/inline-text/inlineTextLifecycle.js +17 -0
  253. package/dist/inspector/inline-text/textChangeBoundary.d.ts +6 -0
  254. package/dist/inspector/inline-text/textChangeBoundary.js +1 -0
  255. package/dist/inspector/inspection/bridge.d.ts +72 -0
  256. package/dist/inspector/inspection/bridge.js +134 -0
  257. package/dist/inspector/inspection/browserCssInspection.d.ts +74 -0
  258. package/dist/inspector/inspection/browserCssInspection.js +317 -0
  259. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +12 -0
  260. package/dist/inspector/inspection/browserCssInspectionRegistry.js +66 -0
  261. package/dist/inspector/inspection/selectionProperty.d.ts +32 -0
  262. package/dist/inspector/inspection/selectionProperty.js +33 -0
  263. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +20 -0
  264. package/dist/inspector/inspection/useBrowserCssInspection.js +159 -0
  265. package/dist/inspector/overlay/DropGuideOverlay.d.ts +17 -0
  266. package/dist/inspector/overlay/DropGuideOverlay.js +17 -0
  267. package/dist/inspector/overlay/InspectorOverlay.d.ts +5 -0
  268. package/dist/inspector/overlay/InspectorOverlay.js +328 -0
  269. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +19 -0
  270. package/dist/inspector/overlay/MeasurementGuideOverlay.js +40 -0
  271. package/dist/inspector/overlay/clickPolicy.d.ts +7 -0
  272. package/dist/inspector/overlay/clickPolicy.js +13 -0
  273. package/dist/inspector/overlay/dropGuide.d.ts +22 -0
  274. package/dist/inspector/overlay/dropGuide.js +48 -0
  275. package/dist/inspector/overlay/elementSelector.d.ts +1 -0
  276. package/dist/inspector/overlay/elementSelector.js +100 -0
  277. package/dist/inspector/overlay/frameThrottle.d.ts +10 -0
  278. package/dist/inspector/overlay/frameThrottle.js +38 -0
  279. package/dist/inspector/overlay/interactionStyles.d.ts +3 -0
  280. package/dist/inspector/overlay/interactionStyles.js +70 -0
  281. package/dist/inspector/overlay/measurementGeometry.d.ts +25 -0
  282. package/dist/inspector/overlay/measurementGeometry.js +104 -0
  283. package/dist/inspector/overlay/overlayGeometry.d.ts +40 -0
  284. package/dist/inspector/overlay/overlayGeometry.js +59 -0
  285. package/dist/inspector/overlay/selectedGeometry.d.ts +7 -0
  286. package/dist/inspector/overlay/selectedGeometry.js +51 -0
  287. package/dist/inspector/overlay/structuralGestures.d.ts +28 -0
  288. package/dist/inspector/overlay/structuralGestures.js +180 -0
  289. package/dist/inspector/projection/cssEscapes.d.ts +3 -0
  290. package/dist/inspector/projection/cssEscapes.js +20 -0
  291. package/dist/inspector/projection/managedStylesheet.d.ts +33 -0
  292. package/dist/inspector/projection/managedStylesheet.js +240 -0
  293. package/dist/inspector/projection/renderedInstance.d.ts +56 -0
  294. package/dist/inspector/projection/renderedInstance.js +306 -0
  295. package/dist/inspector/projection/structuralProjection.d.ts +93 -0
  296. package/dist/inspector/projection/structuralProjection.js +560 -0
  297. package/dist/inspector/projection/structuralProjectionBoundary.d.ts +5 -0
  298. package/dist/inspector/projection/structuralProjectionBoundary.js +65 -0
  299. package/dist/inspector/projection/textProjection.d.ts +53 -0
  300. package/dist/inspector/projection/textProjection.js +705 -0
  301. package/dist/inspector/projection/workspaceProjection.d.ts +43 -0
  302. package/dist/inspector/projection/workspaceProjection.js +58 -0
  303. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +15 -0
  304. package/dist/inspector/prompt/PromptSettingsDialog.js +17 -0
  305. package/dist/inspector/prompt/clipboardHandoff.d.ts +34 -0
  306. package/dist/inspector/prompt/clipboardHandoff.js +212 -0
  307. package/dist/inspector/prompt/copyToClipboard.d.ts +1 -0
  308. package/dist/inspector/prompt/copyToClipboard.js +34 -0
  309. package/dist/inspector/prompt/detectFramework.d.ts +6 -0
  310. package/dist/inspector/prompt/detectFramework.js +4 -0
  311. package/dist/inspector/prompt/generatePrompt.d.ts +7 -0
  312. package/dist/inspector/prompt/generatePrompt.js +391 -0
  313. package/dist/inspector/prompt/promptSettings.d.ts +8 -0
  314. package/dist/inspector/prompt/promptSettings.js +28 -0
  315. package/dist/inspector/runtime/devFlag.d.ts +28 -0
  316. package/dist/inspector/runtime/devFlag.js +50 -0
  317. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +19 -0
  318. package/dist/inspector/runtime/documentStylesheetOrder.js +89 -0
  319. package/dist/inspector/runtime/domRealm.d.ts +4 -0
  320. package/dist/inspector/runtime/domRealm.js +11 -0
  321. package/dist/inspector/runtime/runtimeConfig.d.ts +119 -0
  322. package/dist/inspector/runtime/runtimeConfig.js +276 -0
  323. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +32 -0
  324. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +149 -0
  325. package/dist/inspector/runtime/useRuntimeConfig.d.ts +10 -0
  326. package/dist/inspector/runtime/useRuntimeConfig.js +13 -0
  327. package/dist/inspector/selection/editScope.d.ts +32 -0
  328. package/dist/inspector/selection/editScope.js +140 -0
  329. package/dist/inspector/selection/editTarget.d.ts +8 -0
  330. package/dist/inspector/selection/editTarget.js +11 -0
  331. package/dist/inspector/selection/hierarchy.d.ts +7 -0
  332. package/dist/inspector/selection/hierarchy.js +42 -0
  333. package/dist/inspector/selection/resolveSelection.d.ts +10 -0
  334. package/dist/inspector/selection/resolveSelection.js +60 -0
  335. package/dist/inspector/selection/selectionStore.d.ts +41 -0
  336. package/dist/inspector/selection/selectionStore.js +262 -0
  337. package/dist/inspector/selection/selectionTarget.d.ts +5 -0
  338. package/dist/inspector/selection/selectionTarget.js +50 -0
  339. package/dist/inspector/selection/sourceSite.d.ts +2 -0
  340. package/dist/inspector/selection/sourceSite.js +12 -0
  341. package/dist/inspector/selection/styleSelection.d.ts +22 -0
  342. package/dist/inspector/selection/styleSelection.js +104 -0
  343. package/dist/inspector/session/index.d.ts +3 -0
  344. package/dist/inspector/session/index.js +2 -0
  345. package/dist/inspector/session/lifecycle.d.ts +22 -0
  346. package/dist/inspector/session/lifecycle.js +63 -0
  347. package/dist/inspector/session/sessionContext.d.ts +21 -0
  348. package/dist/inspector/session/sessionContext.js +28 -0
  349. package/dist/inspector/session/sessionFactory.d.ts +29 -0
  350. package/dist/inspector/session/sessionFactory.js +73 -0
  351. package/dist/inspector/settings/SettingsDialog.d.ts +12 -0
  352. package/dist/inspector/settings/SettingsDialog.js +46 -0
  353. package/dist/inspector/shell/AppShell.d.ts +2 -0
  354. package/dist/inspector/shell/AppShell.js +9 -0
  355. package/dist/inspector/shell/ChangesLog.d.ts +6 -0
  356. package/dist/inspector/shell/ChangesLog.js +92 -0
  357. package/dist/inspector/shell/CopyPromptButton.d.ts +9 -0
  358. package/dist/inspector/shell/CopyPromptButton.js +159 -0
  359. package/dist/inspector/shell/DomNavigation.d.ts +8 -0
  360. package/dist/inspector/shell/DomNavigation.js +30 -0
  361. package/dist/inspector/shell/EmptyState.d.ts +2 -0
  362. package/dist/inspector/shell/EmptyState.js +15 -0
  363. package/dist/inspector/shell/InspectorShell.d.ts +11 -0
  364. package/dist/inspector/shell/InspectorShell.js +268 -0
  365. package/dist/inspector/shell/openStore.d.ts +6 -0
  366. package/dist/inspector/shell/openStore.js +29 -0
  367. package/dist/inspector/shell/panelLayout.d.ts +2 -0
  368. package/dist/inspector/shell/panelLayout.js +29 -0
  369. package/dist/inspector/shell/shortcuts.d.ts +3 -0
  370. package/dist/inspector/shell/shortcuts.js +25 -0
  371. package/dist/inspector/shell/stateValue.d.ts +3 -0
  372. package/dist/inspector/shell/stateValue.js +34 -0
  373. package/dist/inspector/shell/styleState.d.ts +7 -0
  374. package/dist/inspector/shell/styleState.js +13 -0
  375. package/dist/inspector/spacing/projection.d.ts +43 -0
  376. package/dist/inspector/spacing/projection.js +136 -0
  377. package/dist/inspector/styleEditors/AppearanceSection.d.ts +13 -0
  378. package/dist/inspector/styleEditors/AppearanceSection.js +6 -0
  379. package/dist/inspector/styleEditors/AspectRatioField.d.ts +17 -0
  380. package/dist/inspector/styleEditors/AspectRatioField.js +10 -0
  381. package/dist/inspector/styleEditors/BorderEditor.d.ts +13 -0
  382. package/dist/inspector/styleEditors/BorderEditor.js +295 -0
  383. package/dist/inspector/styleEditors/BorderRadiusEditor.d.ts +14 -0
  384. package/dist/inspector/styleEditors/BorderRadiusEditor.js +108 -0
  385. package/dist/inspector/styleEditors/BoxShadowEditor.d.ts +13 -0
  386. package/dist/inspector/styleEditors/BoxShadowEditor.js +13 -0
  387. package/dist/inspector/styleEditors/ColorPicker.d.ts +15 -0
  388. package/dist/inspector/styleEditors/ColorPicker.js +73 -0
  389. package/dist/inspector/styleEditors/GapField.d.ts +17 -0
  390. package/dist/inspector/styleEditors/GapField.js +12 -0
  391. package/dist/inspector/styleEditors/GridChildSection.d.ts +14 -0
  392. package/dist/inspector/styleEditors/GridChildSection.js +91 -0
  393. package/dist/inspector/styleEditors/GridPicker.d.ts +13 -0
  394. package/dist/inspector/styleEditors/GridPicker.js +179 -0
  395. package/dist/inspector/styleEditors/GridSection.d.ts +17 -0
  396. package/dist/inspector/styleEditors/GridSection.js +27 -0
  397. package/dist/inspector/styleEditors/GridValueField.d.ts +17 -0
  398. package/dist/inspector/styleEditors/GridValueField.js +70 -0
  399. package/dist/inspector/styleEditors/InsetSection.d.ts +15 -0
  400. package/dist/inspector/styleEditors/InsetSection.js +15 -0
  401. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +6 -0
  402. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +6 -0
  403. package/dist/inspector/styleEditors/LayoutComboField.d.ts +18 -0
  404. package/dist/inspector/styleEditors/LayoutComboField.js +138 -0
  405. package/dist/inspector/styleEditors/LayoutDropdown.d.ts +14 -0
  406. package/dist/inspector/styleEditors/LayoutDropdown.js +34 -0
  407. package/dist/inspector/styleEditors/LayoutSection.d.ts +13 -0
  408. package/dist/inspector/styleEditors/LayoutSection.js +342 -0
  409. package/dist/inspector/styleEditors/OpacityEditor.d.ts +13 -0
  410. package/dist/inspector/styleEditors/OpacityEditor.js +34 -0
  411. package/dist/inspector/styleEditors/PositionInsets.d.ts +15 -0
  412. package/dist/inspector/styleEditors/PositionInsets.js +12 -0
  413. package/dist/inspector/styleEditors/SpacingBox.d.ts +29 -0
  414. package/dist/inspector/styleEditors/SpacingBox.js +189 -0
  415. package/dist/inspector/styleEditors/Typography.d.ts +13 -0
  416. package/dist/inspector/styleEditors/Typography.js +137 -0
  417. package/dist/inspector/styleEditors/completeCssValue.d.ts +8 -0
  418. package/dist/inspector/styleEditors/completeCssValue.js +34 -0
  419. package/dist/inspector/styleEditors/gridChildModel.d.ts +74 -0
  420. package/dist/inspector/styleEditors/gridChildModel.js +138 -0
  421. package/dist/inspector/styleEditors/layoutValue.d.ts +24 -0
  422. package/dist/inspector/styleEditors/layoutValue.js +103 -0
  423. package/dist/inspector/styleEditors/nudgeValue.d.ts +8 -0
  424. package/dist/inspector/styleEditors/nudgeValue.js +71 -0
  425. package/dist/inspector/styleEditors/rowLookup.d.ts +11 -0
  426. package/dist/inspector/styleEditors/rowLookup.js +13 -0
  427. package/dist/inspector/styleEditors/stringRecord.d.ts +4 -0
  428. package/dist/inspector/styleEditors/stringRecord.js +1 -0
  429. package/dist/inspector/styleEditors/valuePolicy.d.ts +20 -0
  430. package/dist/inspector/styleEditors/valuePolicy.js +82 -0
  431. package/dist/inspector/testing.d.ts +10 -0
  432. package/dist/inspector/testing.js +9 -0
  433. package/dist/inspector/tokens/TokenChip.d.ts +24 -0
  434. package/dist/inspector/tokens/TokenChip.js +23 -0
  435. package/dist/inspector/tokens/TokenDropdown.d.ts +13 -0
  436. package/dist/inspector/tokens/TokenDropdown.js +59 -0
  437. package/dist/inspector/tokens/TokenField.d.ts +68 -0
  438. package/dist/inspector/tokens/TokenField.js +485 -0
  439. package/dist/inspector/tokens/TokenLabel.d.ts +7 -0
  440. package/dist/inspector/tokens/TokenLabel.js +23 -0
  441. package/dist/inspector/tokens/TokensPanel.d.ts +5 -0
  442. package/dist/inspector/tokens/TokensPanel.js +47 -0
  443. package/dist/inspector/tokens/catalog.d.ts +51 -0
  444. package/dist/inspector/tokens/catalog.js +184 -0
  445. package/dist/inspector/tokens/editActions.d.ts +35 -0
  446. package/dist/inspector/tokens/editActions.js +164 -0
  447. package/dist/inspector/tokens/resolution/cascade.d.ts +14 -0
  448. package/dist/inspector/tokens/resolution/cascade.js +31 -0
  449. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +43 -0
  450. package/dist/inspector/tokens/resolution/cssomCollector.js +528 -0
  451. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +12 -0
  452. package/dist/inspector/tokens/resolution/selectorSemantics.js +106 -0
  453. package/dist/inspector/tokens/resolution.d.ts +56 -0
  454. package/dist/inspector/tokens/resolution.js +1401 -0
  455. package/dist/inspector/tokens/tokenEdits.d.ts +3 -0
  456. package/dist/inspector/tokens/tokenEdits.js +22 -0
  457. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +6 -0
  458. package/dist/inspector/tokens/valueSemanticsAdapter.js +68 -0
  459. package/dist/inspector/ui/AtRuleContext.d.ts +18 -0
  460. package/dist/inspector/ui/AtRuleContext.js +54 -0
  461. package/dist/inspector/ui/Button.d.ts +9 -0
  462. package/dist/inspector/ui/Button.js +4 -0
  463. package/dist/inspector/ui/ColorSwatch.d.ts +7 -0
  464. package/dist/inspector/ui/ColorSwatch.js +6 -0
  465. package/dist/inspector/ui/ControlSurface.d.ts +14 -0
  466. package/dist/inspector/ui/ControlSurface.js +10 -0
  467. package/dist/inspector/ui/FieldRow.d.ts +14 -0
  468. package/dist/inspector/ui/FieldRow.js +15 -0
  469. package/dist/inspector/ui/IconButton.d.ts +14 -0
  470. package/dist/inspector/ui/IconButton.js +5 -0
  471. package/dist/inspector/ui/InspectorPopover.d.ts +17 -0
  472. package/dist/inspector/ui/InspectorPopover.js +13 -0
  473. package/dist/inspector/ui/PopoverListbox.d.ts +37 -0
  474. package/dist/inspector/ui/PopoverListbox.js +21 -0
  475. package/dist/inspector/ui/SegmentedControl.d.ts +24 -0
  476. package/dist/inspector/ui/SegmentedControl.js +16 -0
  477. package/dist/inspector/ui/Select.d.ts +25 -0
  478. package/dist/inspector/ui/Select.js +56 -0
  479. package/dist/inspector/ui/SideValuesField.d.ts +44 -0
  480. package/dist/inspector/ui/SideValuesField.js +76 -0
  481. package/dist/inspector/ui/StatusCallout.d.ts +9 -0
  482. package/dist/inspector/ui/StatusCallout.js +4 -0
  483. package/dist/inspector/ui/TextInput.d.ts +12 -0
  484. package/dist/inspector/ui/TextInput.js +5 -0
  485. package/dist/inspector/ui/ToggleButton.d.ts +11 -0
  486. package/dist/inspector/ui/ToggleButton.js +6 -0
  487. package/dist/inspector/ui/assets/grid.svg +14 -0
  488. package/dist/inspector/ui/css.d.ts +9 -0
  489. package/dist/inspector/ui/labels.d.ts +1 -0
  490. package/dist/inspector/ui/labels.js +7 -0
  491. package/dist/inspector/ui/styles.d.ts +1 -0
  492. package/dist/inspector/ui/styles.js +68 -0
  493. package/dist/inspector/virtual-modules.d.ts +7 -0
  494. package/dist/inspector/vite-env.d.ts +10 -0
  495. package/dist/internal/agent-protocol.d.ts +232 -0
  496. package/dist/internal/agent-protocol.js +237 -0
  497. package/dist/nudge-ui.mjs +15722 -0
  498. package/dist/project/files.d.ts +19 -0
  499. package/dist/project/files.js +226 -0
  500. package/dist/project/identity.d.ts +6 -0
  501. package/dist/project/identity.js +19 -0
  502. package/dist/project/pathPolicy.d.ts +8 -0
  503. package/dist/project/pathPolicy.js +12 -0
  504. package/dist/project/tokens.d.ts +36 -0
  505. package/dist/project/tokens.js +223 -0
  506. package/dist/transport/index.d.ts +8 -0
  507. package/dist/transport/index.js +8 -0
  508. package/dist/transport/routes.d.ts +13 -0
  509. package/dist/transport/routes.js +16 -0
  510. package/package.json +137 -0
@@ -0,0 +1,207 @@
1
+ import { changeKey, tokenReference } from "../changes/model.js";
2
+ import { selectorForManagedChange } from "../changes/managedStyleProjection.js";
3
+ import { getWorkspaceChanges } from "../changes/workspaceChanges.js";
4
+ import { getChangesList, isComponentChange, isTextContentChange, isTokenChange, reconcileVerifiedWorkspaceChanges, } from "../changes/changesLog.js";
5
+ import { verifyPreview } from "../projection/managedStylesheet.js";
6
+ import { resolveRenderedInstance } from "../projection/renderedInstance.js";
7
+ import { getStructuralChanges, } from "../projection/structuralProjection.js";
8
+ import { resolveTextProjectionTarget, resolveTextProjectionTextNode, } from "../projection/textProjection.js";
9
+ import { applyHostWorkspaceProjection, compileWorkspaceProjection, } from "../projection/workspaceProjection.js";
10
+ const dispatches = new Map();
11
+ function stableJsonValue(value) {
12
+ if (Array.isArray(value))
13
+ return value.map(stableJsonValue);
14
+ if (!value || typeof value !== "object")
15
+ return value;
16
+ return Object.fromEntries(Object.entries(value)
17
+ .filter(([, entry]) => entry !== undefined)
18
+ .sort(([left], [right]) => left.localeCompare(right))
19
+ .map(([key, entry]) => [key, stableJsonValue(entry)]));
20
+ }
21
+ function stableSerialized(value) {
22
+ return JSON.stringify(stableJsonValue(value));
23
+ }
24
+ /** Stable, preview-metadata-free identity for one prompt handoff record. */
25
+ export function handoffChangeFingerprint(change) {
26
+ return stableSerialized(change);
27
+ }
28
+ /** Stable identity for one structural record included in a prompt handoff. */
29
+ export function handoffStructuralFingerprint(change) {
30
+ return stableSerialized(change);
31
+ }
32
+ function requestedStyleValue(change) {
33
+ if (isTokenChange(change))
34
+ return change.rawValue;
35
+ if (change.newToken)
36
+ return tokenReference(change.newToken);
37
+ return change.rawValue ?? "";
38
+ }
39
+ function verifyStyle(change, doc) {
40
+ if (!isTokenChange(change) && (change.state ?? "base") !== "base")
41
+ return false;
42
+ const selector = selectorForManagedChange(change);
43
+ if (!selector)
44
+ return false;
45
+ let targets;
46
+ try {
47
+ targets = Array.from(doc.querySelectorAll(selector));
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ const requested = requestedStyleValue(change);
53
+ return requested.length > 0
54
+ && targets.length > 0
55
+ && targets.every((target) => verifyPreview(target, change.property, requested).status === "applied");
56
+ }
57
+ function verifyText(change, doc) {
58
+ const resolved = resolveTextProjectionTarget(doc, change.target, change.after);
59
+ if (resolved.status !== "resolved")
60
+ return false;
61
+ const node = resolveTextProjectionTextNode(resolved.element, change.target, change.after);
62
+ if (node)
63
+ return node.nodeValue === change.after;
64
+ return change.target.textNodePath === undefined
65
+ && change.after.length === 0
66
+ && (resolved.element.textContent ?? "") === "";
67
+ }
68
+ /**
69
+ * A delete verifies when its target no longer resolves in the document once
70
+ * the preview is lifted: the source really removed it. Ambiguous evidence
71
+ * still means identical elements are present, so only a definitive miss
72
+ * verifies.
73
+ */
74
+ function verifyStructuralDelete(change, doc) {
75
+ return resolveRenderedInstance(doc, change.target).status === "missing";
76
+ }
77
+ /**
78
+ * A move verifies when the element sits at its recorded destination without
79
+ * the preview holding it there. The projection rebuild returns a cleanly
80
+ * applied move preview to its captured origin, so such records conservatively
81
+ * stay unverified instead of trusting rendered placement alone.
82
+ */
83
+ function verifyStructuralMove(change, doc) {
84
+ const target = resolveRenderedInstance(doc, change.target);
85
+ if (target.status !== "resolved")
86
+ return false;
87
+ const parent = resolveRenderedInstance(doc, change.destination.parent);
88
+ if (parent.status !== "resolved")
89
+ return false;
90
+ if (target.element.parentElement !== parent.element)
91
+ return false;
92
+ if (!change.destination.before)
93
+ return target.element.nextElementSibling === null;
94
+ const before = resolveRenderedInstance(doc, change.destination.before);
95
+ return before.status === "resolved" && target.element.nextElementSibling === before.element;
96
+ }
97
+ function verifiedStructuralChangeIds(eligible, doc) {
98
+ const verified = new Set();
99
+ for (const change of eligible) {
100
+ const applied = change.kind === "delete"
101
+ ? verifyStructuralDelete(change, doc)
102
+ : verifyStructuralMove(change, doc);
103
+ if (applied)
104
+ verified.add(change.id);
105
+ }
106
+ return verified;
107
+ }
108
+ /**
109
+ * Positively verifies browser-observable source results after the inspector's
110
+ * own projections have been removed. Component props and interaction states
111
+ * intentionally remain unresolved because rendered output alone cannot prove
112
+ * that their source was updated.
113
+ */
114
+ export function verifiedChangeKeys(sentChanges, doc = document) {
115
+ const verified = new Set();
116
+ for (const change of sentChanges) {
117
+ if (isComponentChange(change))
118
+ continue;
119
+ const applied = isTextContentChange(change)
120
+ ? verifyText(change, doc)
121
+ : verifyStyle(change, doc);
122
+ if (applied)
123
+ verified.add(changeKey(change));
124
+ }
125
+ return verified;
126
+ }
127
+ /** Captures the exact canonical edits associated with one dispatched prompt. */
128
+ export function recordAgentDispatch(revision, changes, structuralChanges = []) {
129
+ dispatches.set(revision, {
130
+ changes: changes.map((change) => structuredClone(change)),
131
+ structuralChanges: structuralChanges.map((change) => structuredClone(change)),
132
+ });
133
+ }
134
+ /** Drops a captured revision when the bridge rejects its dispatch. */
135
+ export function discardAgentDispatch(revision) {
136
+ dispatches.delete(revision);
137
+ }
138
+ /** Returns how many canonical edits were in flight for one dispatch. */
139
+ export function getAgentDispatchSize(revision) {
140
+ const snapshot = dispatches.get(revision);
141
+ if (!snapshot)
142
+ return 0;
143
+ return snapshot.changes.length + snapshot.structuralChanges.length;
144
+ }
145
+ function afterBrowserPaint() {
146
+ if (typeof requestAnimationFrame !== "function")
147
+ return Promise.resolve();
148
+ return new Promise((resolve) => {
149
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
150
+ });
151
+ }
152
+ /**
153
+ * Reconciles only records that still equal the sent snapshot and that remain
154
+ * observable after removing Nudge's own preview. Newer edits and ambiguous
155
+ * records are preserved.
156
+ */
157
+ export async function verifyAndReconcileHandoff(snapshot) {
158
+ const sentByKey = new Map(snapshot.changes.map((change) => [changeKey(change), handoffChangeFingerprint(change)]));
159
+ const current = getChangesList();
160
+ const eligible = current.filter((change) => sentByKey.get(changeKey(change)) === handoffChangeFingerprint(change));
161
+ const eligibleKeys = new Set(eligible.map(changeKey));
162
+ const remaining = current.filter((change) => !eligibleKeys.has(changeKey(change)));
163
+ // The same "still unchanged" rule for structural intent: only canonical
164
+ // records byte-identical to the dispatched snapshot may be reconciled.
165
+ const sentStructural = new Map(snapshot.structuralChanges.map((change) => [change.id, handoffStructuralFingerprint(change)]));
166
+ const currentStructural = getStructuralChanges();
167
+ const eligibleStructural = currentStructural.filter((change) => sentStructural.get(change.id) === handoffStructuralFingerprint(change));
168
+ const eligibleStructuralIds = new Set(eligibleStructural.map((change) => change.id));
169
+ const remainingStructural = currentStructural.filter((change) => !eligibleStructuralIds.has(change.id));
170
+ try {
171
+ const currentWorkspace = getWorkspaceChanges();
172
+ applyHostWorkspaceProjection(compileWorkspaceProjection({
173
+ revision: currentWorkspace.revision,
174
+ changes: remaining,
175
+ structuralChanges: remainingStructural,
176
+ }));
177
+ await afterBrowserPaint();
178
+ const verified = verifiedChangeKeys(eligible);
179
+ const verifiedStructural = verifiedStructuralChangeIds(eligibleStructural, document);
180
+ // A user can make another inspector edit while the two-frame verification
181
+ // window is open. Recheck byte identity immediately before reconciliation
182
+ // so a newer value at the same key can never be removed.
183
+ const currentByKey = new Map(getChangesList().map((change) => [changeKey(change), handoffChangeFingerprint(change)]));
184
+ const stillVerified = new Set([...verified].filter((key) => currentByKey.get(key) === sentByKey.get(key)));
185
+ const currentStructuralById = new Map(getStructuralChanges().map((change) => [change.id, handoffStructuralFingerprint(change)]));
186
+ const stillVerifiedStructural = new Set([...verifiedStructural].filter((id) => currentStructuralById.get(id) === sentStructural.get(id)));
187
+ return reconcileVerifiedWorkspaceChanges(stillVerified, stillVerifiedStructural);
188
+ }
189
+ finally {
190
+ // Reconciliation reapplies the canonical set. If it was unable to write
191
+ // (for example, a read-only Canvas lease), restore the untouched set here.
192
+ const canonicalWorkspace = getWorkspaceChanges();
193
+ applyHostWorkspaceProjection(compileWorkspaceProjection(canonicalWorkspace));
194
+ }
195
+ }
196
+ /** Reconciles the captured records for one completed connected-agent request. */
197
+ export async function verifyAndReconcileAgentDispatch(revision) {
198
+ const snapshot = dispatches.get(revision);
199
+ if (!snapshot)
200
+ return 0;
201
+ dispatches.delete(revision);
202
+ return verifyAndReconcileHandoff(snapshot);
203
+ }
204
+ /** Test/session reset for in-memory dispatch snapshots. */
205
+ export function resetAgentVerification() {
206
+ dispatches.clear();
207
+ }
@@ -0,0 +1,10 @@
1
+ import { type ReactElement } from "react";
2
+ import { type CanvasCard } from "./canvasStore.js";
3
+ import type { InspectorSession } from "../session/sessionFactory.js";
4
+ interface CanvasCardProps {
5
+ card: CanvasCard;
6
+ onEdit?: (card: CanvasCard) => void;
7
+ documentOwner?: InspectorSession;
8
+ }
9
+ export declare function CanvasCard({ card, onEdit, documentOwner }: CanvasCardProps): ReactElement;
10
+ export {};
@@ -0,0 +1,275 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { CANVAS_RENDERER_ATTR } from "./roleDetection.js";
4
+ import { removeCanvasCard, duplicateCard, updateCardTitle, updateCardUrl, resizeCard, setCardPosition, selectCard, getSelectedCardId, useSelectedCardId, useFocusedCardId, useBoardCamera } from "./canvasStore.js";
5
+ import { IconRefresh, IconPlayerPlay, IconCopy, IconArrowsDiagonal } from "@tabler/icons-react";
6
+ import { PROTOCOL_VERSION, isRendererMessageFor, } from "./frameProtocol.js";
7
+ import { registerCardFrame, registerCardFrameSource, unregisterCardFrame, sendProjectionToCard, invalidateCanvasPreviewDocument, PROJECT_ID, WORKSPACE_ID } from "./projection.js";
8
+ import { IconButton } from "../ui/IconButton.js";
9
+ import { Button } from "../ui/Button.js";
10
+ import { setSelectedElement } from "../selection/selectionStore.js";
11
+ import { clearCanvasStructuralProjectionReports } from "../projection/structuralProjection.js";
12
+ import { clearCanvasRenderedInstanceProjectionReports } from "../projection/renderedInstance.js";
13
+ import { clearCanvasTextProjectionReports } from "../projection/textProjection.js";
14
+ import { getCanvasToolbarScale } from "./toolbarScale.js";
15
+ import { getCanvasResizeHandleScale } from "./resizeHandleScale.js";
16
+ import { disposeBrowserCssInspection } from "../inspection/browserCssInspectionRegistry.js";
17
+ import { releaseDocumentProjection } from "../projection/structuralProjection.js";
18
+ const MIN_CARD_WIDTH = 200;
19
+ const MIN_CARD_HEIGHT = 150;
20
+ export function CanvasCard({ card, onEdit, documentOwner }) {
21
+ const iframeRef = useRef(null);
22
+ const documentSessionRef = useRef(null);
23
+ const [loadState, setLoadState] = useState("loading");
24
+ const [errorMessage, setErrorMessage] = useState(null);
25
+ const camera = useBoardCamera();
26
+ const selectedCardId = useSelectedCardId();
27
+ const focusedCardId = useFocusedCardId();
28
+ const isSelected = selectedCardId === card.id;
29
+ const isFocused = focusedCardId === card.id;
30
+ const toolbarScale = getCanvasToolbarScale(camera.zoom);
31
+ const resizeHandleScale = getCanvasResizeHandleScale(camera.zoom);
32
+ const disposeDocumentSession = useCallback(() => {
33
+ documentSessionRef.current?.session.dispose();
34
+ documentSessionRef.current = null;
35
+ }, []);
36
+ const bindDocumentSession = useCallback(() => {
37
+ const frameDocument = iframeRef.current?.contentDocument;
38
+ if (!documentOwner || !frameDocument)
39
+ return;
40
+ if (documentSessionRef.current?.document === frameDocument)
41
+ return;
42
+ disposeDocumentSession();
43
+ const session = documentOwner.createDocumentSession(frameDocument);
44
+ session.registerCleanup(() => disposeBrowserCssInspection(frameDocument));
45
+ session.registerCleanup(() => releaseDocumentProjection(frameDocument));
46
+ documentSessionRef.current = { document: frameDocument, session };
47
+ }, [disposeDocumentSession, documentOwner]);
48
+ useEffect(() => {
49
+ const iframe = iframeRef.current;
50
+ if (!iframe)
51
+ return;
52
+ registerCardFrameSource(card.id, iframe);
53
+ bindDocumentSession();
54
+ return () => {
55
+ disposeDocumentSession();
56
+ unregisterCardFrame(card.id);
57
+ };
58
+ }, [bindDocumentSession, card.id, disposeDocumentSession]);
59
+ function handleReload() {
60
+ if (iframeRef.current) {
61
+ if (getSelectedCardId() === card.id)
62
+ setSelectedElement(null);
63
+ disposeDocumentSession();
64
+ invalidateCanvasPreviewDocument(card.id);
65
+ setLoadState("loading");
66
+ setErrorMessage(null);
67
+ const currentSrc = iframeRef.current.src;
68
+ iframeRef.current.setAttribute("src", currentSrc);
69
+ }
70
+ }
71
+ function handleRemove() {
72
+ if (getSelectedCardId() === card.id)
73
+ setSelectedElement(null);
74
+ removeCanvasCard(card.id);
75
+ }
76
+ function handleEdit() {
77
+ onEdit?.(card);
78
+ }
79
+ function handleDuplicate() {
80
+ duplicateCard(card.id);
81
+ }
82
+ /** The controller half of the handshake: announce workspace identity. */
83
+ function sendParentReady() {
84
+ iframeRef.current?.contentWindow?.postMessage({
85
+ type: "parent-ready",
86
+ protocolVersion: PROTOCOL_VERSION,
87
+ projectId: PROJECT_ID,
88
+ workspaceId: WORKSPACE_ID,
89
+ cardId: card.id,
90
+ }, window.location.origin);
91
+ }
92
+ useEffect(() => {
93
+ function onMessage(event) {
94
+ if (event.origin !== window.location.origin)
95
+ return;
96
+ if (event.source !== iframeRef.current?.contentWindow)
97
+ return;
98
+ const msg = event.data;
99
+ if (!msg || typeof msg !== "object")
100
+ return;
101
+ // A renderer whose runtime finished booting after the iframe load event
102
+ // asks for the identity announcement it may have missed.
103
+ // SAFETY: Renderer messages arrive as unvalidated structured clones, so the discriminant must be read structurally.
104
+ if (msg.type === "renderer-hello") {
105
+ // SAFETY: The `type === "renderer-hello"` branch above selects exactly the hello payload shape.
106
+ const hello = msg;
107
+ if (hello.protocolVersion !== PROTOCOL_VERSION)
108
+ return;
109
+ sendParentReady();
110
+ return;
111
+ }
112
+ if (!isRendererMessageFor(msg, {
113
+ projectId: PROJECT_ID,
114
+ workspaceId: WORKSPACE_ID,
115
+ cardId: card.id,
116
+ }))
117
+ return;
118
+ // SAFETY: isRendererMessageFor validated the frame identity and message shape above.
119
+ const data = msg;
120
+ if (data.type === "frame-ready") {
121
+ setLoadState("ready");
122
+ setErrorMessage(null);
123
+ if (data.title)
124
+ updateCardTitle(card.id, data.title);
125
+ if (data.url)
126
+ updateCardUrl(card.id, data.url);
127
+ if (iframeRef.current) {
128
+ registerCardFrame(card.id, iframeRef.current);
129
+ sendProjectionToCard(card, iframeRef.current);
130
+ }
131
+ return;
132
+ }
133
+ if (data.type === "frame-metadata") {
134
+ if (data.title)
135
+ updateCardTitle(card.id, data.title);
136
+ if (data.url)
137
+ updateCardUrl(card.id, data.url);
138
+ return;
139
+ }
140
+ if (data.type === "frame-error") {
141
+ setLoadState("error");
142
+ setErrorMessage(data.message || "Frame failed to load");
143
+ return;
144
+ }
145
+ }
146
+ window.addEventListener("message", onMessage);
147
+ return () => {
148
+ window.removeEventListener("message", onMessage);
149
+ };
150
+ }, [card.id]);
151
+ useEffect(() => {
152
+ if (loadState !== "loading")
153
+ return;
154
+ const timeout = setTimeout(() => {
155
+ setLoadState("error");
156
+ setErrorMessage("Frame load timed out");
157
+ }, 15000);
158
+ return () => clearTimeout(timeout);
159
+ }, [loadState]);
160
+ // A late handshake still recovers: the message listener stays installed in
161
+ // the error state, so a slow renderer's eventual frame-ready flips the card
162
+ // back to "ready" without user action.
163
+ useEffect(() => {
164
+ const iframe = iframeRef.current;
165
+ if (!iframe)
166
+ return;
167
+ function onLoad() {
168
+ if (getSelectedCardId() === card.id)
169
+ setSelectedElement(null);
170
+ disposeDocumentSession();
171
+ // A reload creates a new renderer document; do not show diagnostics
172
+ // produced by the old frame while its replacement is handshaking.
173
+ invalidateCanvasPreviewDocument(card.id);
174
+ clearCanvasStructuralProjectionReports(card.id);
175
+ clearCanvasRenderedInstanceProjectionReports(card.id);
176
+ clearCanvasTextProjectionReports(card.id);
177
+ bindDocumentSession();
178
+ sendParentReady();
179
+ }
180
+ iframe.addEventListener("load", onLoad);
181
+ return () => iframe.removeEventListener("load", onLoad);
182
+ }, [bindDocumentSession, card.id, disposeDocumentSession]);
183
+ const [isDragging, setIsDragging] = useState(false);
184
+ const dragRef = useRef({ startX: 0, startY: 0, cardX: 0, cardY: 0 });
185
+ const handleToolbarPointerDown = useCallback((e) => {
186
+ // SAFETY: pointer events on the card target are HTMLElements in this DOM context.
187
+ const target = e.target;
188
+ if (target.closest("button"))
189
+ return;
190
+ if (getSelectedCardId() !== card.id)
191
+ setSelectedElement(null);
192
+ selectCard(card.id);
193
+ e.stopPropagation();
194
+ e.preventDefault();
195
+ dragRef.current = {
196
+ startX: e.clientX,
197
+ startY: e.clientY,
198
+ cardX: card.x,
199
+ cardY: card.y,
200
+ };
201
+ setIsDragging(true);
202
+ // SAFETY: pointerdown targets are HTMLElements in the card DOM.
203
+ e.target.setPointerCapture(e.pointerId);
204
+ function onMove(ev) {
205
+ const dx = (ev.clientX - dragRef.current.startX) / camera.zoom;
206
+ const dy = (ev.clientY - dragRef.current.startY) / camera.zoom;
207
+ setCardPosition(card.id, dragRef.current.cardX + dx, dragRef.current.cardY + dy);
208
+ }
209
+ function onUp() {
210
+ setIsDragging(false);
211
+ window.removeEventListener("pointermove", onMove);
212
+ window.removeEventListener("pointerup", onUp);
213
+ }
214
+ window.addEventListener("pointermove", onMove);
215
+ window.addEventListener("pointerup", onUp);
216
+ }, [card.id, card.x, card.y, camera.zoom]);
217
+ const handleCardPointerDown = useCallback(() => {
218
+ if (getSelectedCardId() !== card.id)
219
+ setSelectedElement(null);
220
+ selectCard(card.id);
221
+ }, [card.id]);
222
+ const handleResizeStart = useCallback((e) => {
223
+ e.stopPropagation();
224
+ e.preventDefault();
225
+ const startX = e.clientX;
226
+ const startY = e.clientY;
227
+ const startWidth = card.width;
228
+ const startHeight = card.height;
229
+ // SAFETY: pointerdown targets are HTMLElements in the card DOM.
230
+ e.target.setPointerCapture(e.pointerId);
231
+ function onMove(ev) {
232
+ const dx = (ev.clientX - startX) / camera.zoom;
233
+ const dy = (ev.clientY - startY) / camera.zoom;
234
+ const newWidth = Math.max(MIN_CARD_WIDTH, startWidth + dx);
235
+ const newHeight = Math.max(MIN_CARD_HEIGHT, startHeight + dy);
236
+ resizeCard(card.id, newWidth, newHeight);
237
+ }
238
+ function onUp() {
239
+ window.removeEventListener("pointermove", onMove);
240
+ window.removeEventListener("pointerup", onUp);
241
+ }
242
+ window.addEventListener("pointermove", onMove);
243
+ window.addEventListener("pointerup", onUp);
244
+ }, [card.id, card.width, card.height, camera.zoom]);
245
+ function handleResizeKeyDown(event) {
246
+ const step = event.shiftKey ? 40 : 20;
247
+ if (event.key === "ArrowRight")
248
+ resizeCard(card.id, card.width + step, card.height);
249
+ else if (event.key === "ArrowLeft")
250
+ resizeCard(card.id, Math.max(MIN_CARD_WIDTH, card.width - step), card.height);
251
+ else if (event.key === "ArrowDown")
252
+ resizeCard(card.id, card.width, card.height + step);
253
+ else if (event.key === "ArrowUp")
254
+ resizeCard(card.id, card.width, Math.max(MIN_CARD_HEIGHT, card.height - step));
255
+ else
256
+ return;
257
+ event.preventDefault();
258
+ }
259
+ return (_jsxs("div", { className: `canvas-card${isDragging ? " is-dragging" : ""}${isSelected ? " is-selected" : ""}${isFocused ? " is-focused" : ""}`, "data-card-id": card.id, style: {
260
+ position: "absolute",
261
+ left: card.x,
262
+ top: card.y,
263
+ width: card.width,
264
+ height: card.height,
265
+ }, onPointerDown: handleCardPointerDown, children: [_jsxs("div", { className: "canvas-card__toolbar", onPointerDown: handleToolbarPointerDown, children: [_jsx("div", { className: "canvas-card__drag-surface", "data-test": `canvas-card-drag-${card.id}`, children: _jsxs("span", { className: "canvas-card__dimensions", "data-test": `canvas-card-dimensions-${card.id}`, style: {
266
+ transform: `scale(${toolbarScale})`,
267
+ transformOrigin: "left bottom",
268
+ }, children: [Math.round(card.width), " \u00D7 ", Math.round(card.height), " px"] }) }), _jsxs("div", { className: "canvas-card__actions", style: {
269
+ transform: `scale(${toolbarScale})`,
270
+ transformOrigin: "right bottom",
271
+ }, children: [_jsxs(Button, { variant: "secondary", size: "default", "data-test": `canvas-card-preview-${card.id}`, onClick: handleEdit, children: [_jsx(IconPlayerPlay, { size: 14, stroke: 1.8, "aria-hidden": "true" }), "Page view"] }), _jsx(IconButton, { label: "Duplicate card", variant: "secondary", size: "default", "data-test": `canvas-card-duplicate-${card.id}`, onClick: handleDuplicate, children: _jsx(IconCopy, { size: 14, stroke: 1.8, "aria-hidden": "true" }) }), _jsx(IconButton, { label: "Reload card", variant: "secondary", size: "default", "data-test": `canvas-card-reload-${card.id}`, onClick: handleReload, children: _jsx(IconRefresh, { size: 14, stroke: 1.8, "aria-hidden": "true" }) })] })] }), _jsxs("div", { className: "canvas-card__frame", children: [loadState === "loading" ? (_jsx("div", { className: "canvas-card__loading", "data-test": `canvas-card-loading-${card.id}`, children: "Loading preview..." })) : loadState === "error" ? (_jsxs("div", { className: "canvas-card__error", "data-test": `canvas-card-error-${card.id}`, children: [_jsx("p", { children: errorMessage || "Frame could not be loaded" }), _jsxs("div", { className: "canvas-card__error-actions", children: [_jsx(Button, { size: "compact", variant: "secondary", onClick: handleReload, children: "Retry" }), _jsx(Button, { size: "compact", variant: "danger", onClick: handleRemove, children: "Remove" })] })] })) : null, _jsx("iframe", { ref: iframeRef, className: "canvas-card__iframe", src: card.url, title: card.title || card.url, [CANVAS_RENDERER_ATTR]: "", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", "data-test": `canvas-card-iframe-${card.id}` })] }), _jsx("div", { className: "canvas-card__resize-handle", "data-test": `canvas-card-resize-${card.id}`, style: {
272
+ transform: `scale(${resizeHandleScale})`,
273
+ transformOrigin: "right bottom",
274
+ }, onPointerDown: handleResizeStart, onKeyDown: handleResizeKeyDown, role: "button", "aria-label": "Resize card", tabIndex: 0, children: _jsx(IconArrowsDiagonal, { size: 12, "aria-hidden": "true" }) })] }));
275
+ }
@@ -0,0 +1,2 @@
1
+ import { type ReactElement } from "react";
2
+ export declare function CanvasElementOverlay(): ReactElement | null;