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,108 @@
1
+ import { type NormalizedUrl } from "./normalizeUrl.js";
2
+ export type CanvasMode = "inspect" | "canvas";
3
+ export interface CanvasCard {
4
+ id: string;
5
+ url: string;
6
+ title: string | null;
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ /** The agent-created comparison group that owns this card, when present. */
12
+ comparisonGroupId?: string;
13
+ }
14
+ /** A durable, agent-owned collection of Canvas cards. */
15
+ export interface CanvasComparisonGroup {
16
+ id: string;
17
+ label: string;
18
+ /** Public protocol marker. Canvas currently exposes only agent-created groups. */
19
+ owner: "agent";
20
+ /** Pairing identity used to authorize removal of this group. */
21
+ agentId: string;
22
+ cardIds: string[];
23
+ routes: CanvasComparisonGroupRoute[];
24
+ }
25
+ export interface CanvasComparisonGroupRoute {
26
+ url: string;
27
+ title?: string | null;
28
+ label?: string;
29
+ }
30
+ export interface CanvasCamera {
31
+ x: number;
32
+ y: number;
33
+ zoom: number;
34
+ }
35
+ export declare const MIN_CAMERA_ZOOM = 0.25;
36
+ export declare const MAX_CAMERA_ZOOM = 3;
37
+ export declare const CARD_GAP = 40;
38
+ export declare const FIT_ALL_PADDING = 80;
39
+ declare function subscribe(cb: () => void): () => void;
40
+ declare function getMode(): CanvasMode;
41
+ declare function getCards(): CanvasCard[];
42
+ declare function getComparisonGroups(): CanvasComparisonGroup[];
43
+ export declare function setCanvasMode(newMode: CanvasMode): void;
44
+ export declare function enterCanvas(): void;
45
+ export declare function exitCanvas(): void;
46
+ /** Return to inspect mode on a canvas card's route. */
47
+ export declare function exitCanvasToCard(card: CanvasCard): void;
48
+ /** Adds one card while retaining the existing placement policy. */
49
+ export declare function addCanvasCard(url: string, title?: string): CanvasCard;
50
+ /**
51
+ * Appends an agent-created comparison group without disturbing existing cards.
52
+ * Callers validate route URLs and labels at the command boundary; this store
53
+ * function only enforces the durable identity and placement invariants.
54
+ */
55
+ export declare function appendCanvasComparisonGroup(input: {
56
+ id: string;
57
+ label: string;
58
+ agentId: string;
59
+ owner?: "agent";
60
+ routes: readonly CanvasComparisonGroupRoute[];
61
+ }): {
62
+ group: CanvasComparisonGroup;
63
+ cards: CanvasCard[];
64
+ } | null;
65
+ export declare function getCanvasComparisonGroup(id: string): CanvasComparisonGroup | undefined;
66
+ /** Removes a group and exactly the cards owned by that group. */
67
+ export declare function removeCanvasComparisonGroup(id: string): CanvasComparisonGroup | null;
68
+ /** Clears group metadata while leaving ordinary cards intact. */
69
+ export declare function clearCanvasComparisonGroups(): void;
70
+ export declare function removeCanvasCard(id: string): void;
71
+ export declare function updateCardTitle(id: string, title: string): void;
72
+ export declare function updateCardUrl(id: string, url: string): void;
73
+ export declare function duplicateCard(sourceId: string): CanvasCard | null;
74
+ export declare function resizeCard(id: string, width: number, height: number): void;
75
+ export declare function getBoardCamera(): CanvasCamera;
76
+ export declare function setBoardCamera(camera: CanvasCamera): void;
77
+ export declare function updateBoardCamera(partial: Partial<CanvasCamera>): void;
78
+ export declare function fitAllCards(viewport?: {
79
+ width: number;
80
+ height: number;
81
+ }): void;
82
+ /** Fits a selected set of cards while preserving cards outside that set. */
83
+ export declare function fitCanvasCards(cardIds: readonly string[], viewport?: {
84
+ width: number;
85
+ height: number;
86
+ }): boolean;
87
+ /** Centers a selected set of cards without changing the current zoom. */
88
+ export declare function focusCanvasCards(cardIds: readonly string[], viewport?: {
89
+ width: number;
90
+ height: number;
91
+ }): boolean;
92
+ export declare function hasFitAllRan(): boolean;
93
+ export declare function resetFitAllFlag(): void;
94
+ export declare function findCardByNormalizedUrl(normalized: NormalizedUrl): CanvasCard | undefined;
95
+ export declare function focusCard(id: string): void;
96
+ export declare function getFocusedCardId(): string | null;
97
+ export declare function selectCard(id: string): void;
98
+ export declare function deselectCard(): void;
99
+ export declare function getSelectedCardId(): string | null;
100
+ export declare function useSelectedCardId(): string | null;
101
+ export declare function useFocusedCardId(): string | null;
102
+ export declare function setCardPosition(id: string, x: number, y: number): void;
103
+ export declare function hydrateCanvasStore(newMode: CanvasMode, newCards: CanvasCard[], newCamera: CanvasCamera, newComparisonGroups?: CanvasComparisonGroup[]): void;
104
+ export { subscribe, getMode, getCards, getComparisonGroups, getMode as getCanvasMode, getCards as getCanvasCards, getComparisonGroups as getCanvasComparisonGroups, };
105
+ export declare function useCanvasMode(): CanvasMode;
106
+ export declare function useCanvasCards(): CanvasCard[];
107
+ export declare function useCanvasComparisonGroups(): CanvasComparisonGroup[];
108
+ export declare function useBoardCamera(): CanvasCamera;
@@ -0,0 +1,448 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { normalizeUrl, normalizedUrlKey } from "./normalizeUrl.js";
3
+ export const MIN_CAMERA_ZOOM = 0.25;
4
+ export const MAX_CAMERA_ZOOM = 3;
5
+ export const CARD_GAP = 40;
6
+ export const FIT_ALL_PADDING = 80;
7
+ const DEFAULT_CAMERA = { x: 0, y: 0, zoom: 1 };
8
+ function defaultViewportSize() {
9
+ return {
10
+ width: window.innerWidth || 1024,
11
+ height: window.innerHeight || 768,
12
+ };
13
+ }
14
+ let mode = "inspect";
15
+ let cards = [];
16
+ let comparisonGroups = [];
17
+ let focusedCardId = null;
18
+ let selectedCardId = null;
19
+ let cardIdCounter = 0;
20
+ let cachedBoardCamera = { ...DEFAULT_CAMERA };
21
+ let lastUsedCardSize = null;
22
+ let fitAllRan = false;
23
+ const listeners = new Set();
24
+ function subscribe(cb) {
25
+ listeners.add(cb);
26
+ return () => {
27
+ listeners.delete(cb);
28
+ };
29
+ }
30
+ function getMode() {
31
+ return mode;
32
+ }
33
+ function getCards() {
34
+ return cards;
35
+ }
36
+ function getComparisonGroups() {
37
+ return comparisonGroups;
38
+ }
39
+ function notify() {
40
+ listeners.forEach((l) => l());
41
+ }
42
+ function computeNewCardPosition(existingCards, gap) {
43
+ if (existingCards.length === 0)
44
+ return { x: 0, y: 0 };
45
+ let rightmostEdge = -Infinity;
46
+ for (const c of existingCards) {
47
+ const edge = c.x + c.width + gap;
48
+ if (edge > rightmostEdge)
49
+ rightmostEdge = edge;
50
+ }
51
+ const rowY = existingCards[0].y;
52
+ return { x: rightmostEdge, y: rowY };
53
+ }
54
+ function boundsOf(cards) {
55
+ let minX = Infinity;
56
+ let minY = Infinity;
57
+ let maxX = -Infinity;
58
+ let maxY = -Infinity;
59
+ for (const card of cards) {
60
+ minX = Math.min(minX, card.x);
61
+ minY = Math.min(minY, card.y);
62
+ maxX = Math.max(maxX, card.x + card.width);
63
+ maxY = Math.max(maxY, card.y + card.height);
64
+ }
65
+ return { minX, minY, maxX, maxY };
66
+ }
67
+ export function setCanvasMode(newMode) {
68
+ if (mode === newMode)
69
+ return;
70
+ mode = newMode;
71
+ notify();
72
+ }
73
+ export function enterCanvas() {
74
+ if (mode === "canvas")
75
+ return;
76
+ mode = "canvas";
77
+ if (cards.length === 0) {
78
+ const size = lastUsedCardSize ?? defaultViewportSize();
79
+ const card = {
80
+ id: `card-${++cardIdCounter}`,
81
+ url: window.location.href,
82
+ title: document.title,
83
+ x: 0,
84
+ y: 0,
85
+ width: size.width,
86
+ height: size.height,
87
+ };
88
+ cards = [card];
89
+ lastUsedCardSize = { width: size.width, height: size.height };
90
+ cachedBoardCamera = { ...DEFAULT_CAMERA };
91
+ fitAllRan = false;
92
+ }
93
+ else {
94
+ const currentRoute = normalizeUrl(window.location.href);
95
+ const existing = currentRoute ? findCardByNormalizedUrl(currentRoute) : undefined;
96
+ if (existing) {
97
+ focusCard(existing.id);
98
+ }
99
+ else {
100
+ const added = addCanvasCard(window.location.href, document.title);
101
+ focusCard(added.id);
102
+ fitAllRan = false;
103
+ }
104
+ }
105
+ notify();
106
+ }
107
+ export function exitCanvas() {
108
+ if (mode === "inspect")
109
+ return;
110
+ mode = "inspect";
111
+ notify();
112
+ }
113
+ /** Return to inspect mode on a canvas card's route. */
114
+ export function exitCanvasToCard(card) {
115
+ exitCanvas();
116
+ resetFitAllFlag();
117
+ if (card.url !== window.location.href) {
118
+ window.location.href = card.url;
119
+ }
120
+ }
121
+ /** Adds one card while retaining the existing placement policy. */
122
+ export function addCanvasCard(url, title) {
123
+ const size = lastUsedCardSize ?? defaultViewportSize();
124
+ const pos = computeNewCardPosition(cards, CARD_GAP);
125
+ const card = {
126
+ id: `card-${++cardIdCounter}`,
127
+ url,
128
+ title: title ?? null,
129
+ x: pos.x,
130
+ y: pos.y,
131
+ width: size.width,
132
+ height: size.height,
133
+ };
134
+ cards = [...cards, card];
135
+ lastUsedCardSize = { width: size.width, height: size.height };
136
+ notify();
137
+ return card;
138
+ }
139
+ /**
140
+ * Appends an agent-created comparison group without disturbing existing cards.
141
+ * Callers validate route URLs and labels at the command boundary; this store
142
+ * function only enforces the durable identity and placement invariants.
143
+ */
144
+ export function appendCanvasComparisonGroup(input) {
145
+ if (!input.id || !input.label || !input.agentId || input.routes.length === 0)
146
+ return null;
147
+ if (comparisonGroups.some((group) => group.id === input.id))
148
+ return null;
149
+ const nextCards = [];
150
+ let nextCardsSnapshot = cards;
151
+ for (const route of input.routes) {
152
+ const size = lastUsedCardSize ?? defaultViewportSize();
153
+ const pos = computeNewCardPosition(nextCardsSnapshot, CARD_GAP);
154
+ const card = {
155
+ id: `card-${++cardIdCounter}`,
156
+ url: route.url,
157
+ title: route.title ?? null,
158
+ x: pos.x,
159
+ y: pos.y,
160
+ width: size.width,
161
+ height: size.height,
162
+ comparisonGroupId: input.id,
163
+ };
164
+ nextCards.push(card);
165
+ nextCardsSnapshot = [...nextCardsSnapshot, card];
166
+ lastUsedCardSize = { width: size.width, height: size.height };
167
+ }
168
+ const group = {
169
+ id: input.id,
170
+ label: input.label,
171
+ owner: "agent",
172
+ agentId: input.agentId,
173
+ cardIds: nextCards.map((card) => card.id),
174
+ routes: input.routes.map((route) => ({ ...route })),
175
+ };
176
+ cards = [...cards, ...nextCards];
177
+ comparisonGroups = [...comparisonGroups, group];
178
+ notify();
179
+ return { group, cards: nextCards };
180
+ }
181
+ export function getCanvasComparisonGroup(id) {
182
+ return comparisonGroups.find((group) => group.id === id);
183
+ }
184
+ /** Removes a group and exactly the cards owned by that group. */
185
+ export function removeCanvasComparisonGroup(id) {
186
+ const group = getCanvasComparisonGroup(id);
187
+ if (!group)
188
+ return null;
189
+ const groupCardIds = new Set(group.cardIds);
190
+ cards = cards.filter((card) => !groupCardIds.has(card.id));
191
+ comparisonGroups = comparisonGroups.filter((candidate) => candidate.id !== id);
192
+ if (groupCardIds.has(selectedCardId ?? ""))
193
+ selectedCardId = null;
194
+ if (groupCardIds.has(focusedCardId ?? ""))
195
+ focusedCardId = null;
196
+ if (cards.length === 0 && mode === "canvas")
197
+ mode = "inspect";
198
+ notify();
199
+ return group;
200
+ }
201
+ /** Clears group metadata while leaving ordinary cards intact. */
202
+ export function clearCanvasComparisonGroups() {
203
+ if (comparisonGroups.length === 0 && !cards.some((card) => card.comparisonGroupId))
204
+ return;
205
+ cards = cards.map(({ comparisonGroupId: _comparisonGroupId, ...card }) => card);
206
+ comparisonGroups = [];
207
+ notify();
208
+ }
209
+ /**
210
+ * Finds the route paired with `cardId` inside the agent group `groupId` and
211
+ * replaces that group with `patchGroup`, which receives the paired route
212
+ * index.
213
+ */
214
+ function updateComparisonGroupRoutes(groupId, cardId, patchGroup) {
215
+ comparisonGroups = comparisonGroups.map((group) => {
216
+ if (group.id !== groupId)
217
+ return group;
218
+ const routeIndex = group.cardIds.indexOf(cardId);
219
+ if (routeIndex < 0)
220
+ return group;
221
+ return patchGroup(group, routeIndex);
222
+ });
223
+ }
224
+ export function removeCanvasCard(id) {
225
+ const removed = cards.find((card) => card.id === id);
226
+ cards = cards.filter((c) => c.id !== id);
227
+ if (selectedCardId === id) {
228
+ selectedCardId = null;
229
+ }
230
+ if (focusedCardId === id) {
231
+ focusedCardId = null;
232
+ }
233
+ if (removed?.comparisonGroupId) {
234
+ updateComparisonGroupRoutes(removed.comparisonGroupId, id, (group, routeIndex) => ({
235
+ ...group,
236
+ cardIds: group.cardIds.filter((_cardId, index) => index !== routeIndex),
237
+ routes: group.routes.filter((_route, index) => index !== routeIndex),
238
+ }));
239
+ comparisonGroups = comparisonGroups.filter((group) => group.cardIds.length > 0);
240
+ }
241
+ if (cards.length === 0 && mode === "canvas") {
242
+ mode = "inspect";
243
+ }
244
+ notify();
245
+ }
246
+ export function updateCardTitle(id, title) {
247
+ const card = cards.find((candidate) => candidate.id === id);
248
+ cards = cards.map((c) => (c.id === id ? { ...c, title } : c));
249
+ if (card?.comparisonGroupId) {
250
+ updateComparisonGroupRoutes(card.comparisonGroupId, id, (group, routeIndex) => ({
251
+ ...group,
252
+ routes: group.routes.map((route, index) => index === routeIndex ? { ...route, title } : route),
253
+ }));
254
+ }
255
+ notify();
256
+ }
257
+ export function updateCardUrl(id, url) {
258
+ const card = cards.find((candidate) => candidate.id === id);
259
+ cards = cards.map((c) => (c.id === id ? { ...c, url } : c));
260
+ if (card?.comparisonGroupId) {
261
+ updateComparisonGroupRoutes(card.comparisonGroupId, id, (group, routeIndex) => ({
262
+ ...group,
263
+ routes: group.routes.map((route, index) => index === routeIndex ? { ...route, url } : route),
264
+ }));
265
+ }
266
+ notify();
267
+ }
268
+ export function duplicateCard(sourceId) {
269
+ const source = cards.find((c) => c.id === sourceId);
270
+ if (!source)
271
+ return null;
272
+ const size = lastUsedCardSize ?? { width: source.width, height: source.height };
273
+ const pos = computeNewCardPosition(cards, CARD_GAP);
274
+ const card = {
275
+ id: `card-${++cardIdCounter}`,
276
+ url: source.url,
277
+ title: source.title,
278
+ x: pos.x,
279
+ y: pos.y,
280
+ width: size.width,
281
+ height: size.height,
282
+ };
283
+ cards = [...cards, card];
284
+ lastUsedCardSize = { width: size.width, height: size.height };
285
+ notify();
286
+ return card;
287
+ }
288
+ export function resizeCard(id, width, height) {
289
+ cards = cards.map((c) => (c.id === id ? { ...c, width, height } : c));
290
+ lastUsedCardSize = { width, height };
291
+ notify();
292
+ }
293
+ export function getBoardCamera() {
294
+ return cachedBoardCamera;
295
+ }
296
+ export function setBoardCamera(camera) {
297
+ cachedBoardCamera = {
298
+ x: camera.x,
299
+ y: camera.y,
300
+ zoom: Math.max(MIN_CAMERA_ZOOM, Math.min(MAX_CAMERA_ZOOM, camera.zoom)),
301
+ };
302
+ notify();
303
+ }
304
+ export function updateBoardCamera(partial) {
305
+ const next = { ...cachedBoardCamera, ...partial };
306
+ if (partial.zoom !== undefined) {
307
+ next.zoom = Math.max(MIN_CAMERA_ZOOM, Math.min(MAX_CAMERA_ZOOM, partial.zoom));
308
+ }
309
+ cachedBoardCamera = next;
310
+ notify();
311
+ }
312
+ export function fitAllCards(viewport) {
313
+ fitCanvasCards(cards.map((card) => card.id), viewport);
314
+ }
315
+ /** Fits a selected set of cards while preserving cards outside that set. */
316
+ export function fitCanvasCards(cardIds, viewport) {
317
+ const selectedIds = new Set(cardIds);
318
+ const selectedCards = cards.filter((card) => selectedIds.has(card.id));
319
+ if (selectedCards.length === 0)
320
+ return false;
321
+ const { minX, minY, maxX, maxY } = boundsOf(selectedCards);
322
+ const contentW = maxX - minX;
323
+ const contentH = maxY - minY;
324
+ if (contentW <= 0 || contentH <= 0) {
325
+ cachedBoardCamera = { ...DEFAULT_CAMERA };
326
+ fitAllRan = true;
327
+ notify();
328
+ return true;
329
+ }
330
+ const viewW = Math.max(1, (viewport?.width ?? window.innerWidth) - FIT_ALL_PADDING * 2);
331
+ const viewH = Math.max(1, (viewport?.height ?? window.innerHeight) - FIT_ALL_PADDING * 2);
332
+ const zoomX = viewW / contentW;
333
+ const zoomY = viewH / contentH;
334
+ const zoom = Math.max(MIN_CAMERA_ZOOM, Math.min(zoomX, zoomY, MAX_CAMERA_ZOOM));
335
+ const contentCenterX = minX + contentW / 2;
336
+ const contentCenterY = minY + contentH / 2;
337
+ cachedBoardCamera = {
338
+ x: -(contentCenterX * zoom) + (viewport?.width ?? window.innerWidth) / 2,
339
+ y: -(contentCenterY * zoom) + (viewport?.height ?? window.innerHeight) / 2,
340
+ zoom,
341
+ };
342
+ fitAllRan = true;
343
+ notify();
344
+ return true;
345
+ }
346
+ /** Centers a selected set of cards without changing the current zoom. */
347
+ export function focusCanvasCards(cardIds, viewport) {
348
+ const selectedIds = new Set(cardIds);
349
+ const selectedCards = cards.filter((card) => selectedIds.has(card.id));
350
+ if (selectedCards.length === 0)
351
+ return false;
352
+ const { minX, minY, maxX, maxY } = boundsOf(selectedCards);
353
+ const viewW = viewport?.width ?? window.innerWidth;
354
+ const viewH = viewport?.height ?? window.innerHeight;
355
+ const contentCenterX = minX + (maxX - minX) / 2;
356
+ const contentCenterY = minY + (maxY - minY) / 2;
357
+ cachedBoardCamera = {
358
+ x: -(contentCenterX * cachedBoardCamera.zoom) + viewW / 2,
359
+ y: -(contentCenterY * cachedBoardCamera.zoom) + viewH / 2,
360
+ zoom: cachedBoardCamera.zoom,
361
+ };
362
+ fitAllRan = true;
363
+ notify();
364
+ return true;
365
+ }
366
+ export function hasFitAllRan() {
367
+ return fitAllRan;
368
+ }
369
+ export function resetFitAllFlag() {
370
+ fitAllRan = false;
371
+ }
372
+ export function findCardByNormalizedUrl(normalized) {
373
+ return cards.find((c) => {
374
+ const n = normalizeUrl(c.url);
375
+ if (!n)
376
+ return false;
377
+ return normalizedUrlKey(n) === normalizedUrlKey(normalized);
378
+ });
379
+ }
380
+ export function focusCard(id) {
381
+ focusedCardId = id;
382
+ selectedCardId = id;
383
+ notify();
384
+ }
385
+ export function getFocusedCardId() {
386
+ return focusedCardId;
387
+ }
388
+ export function selectCard(id) {
389
+ selectedCardId = id;
390
+ notify();
391
+ }
392
+ export function deselectCard() {
393
+ selectedCardId = null;
394
+ notify();
395
+ }
396
+ export function getSelectedCardId() {
397
+ return selectedCardId;
398
+ }
399
+ export function useSelectedCardId() {
400
+ return useSyncExternalStore(subscribe, getSelectedCardId, getSelectedCardId);
401
+ }
402
+ export function useFocusedCardId() {
403
+ return useSyncExternalStore(subscribe, getFocusedCardId, getFocusedCardId);
404
+ }
405
+ export function setCardPosition(id, x, y) {
406
+ cards = cards.map((c) => (c.id === id ? { ...c, x, y } : c));
407
+ notify();
408
+ }
409
+ export function hydrateCanvasStore(newMode, newCards, newCamera, newComparisonGroups = []) {
410
+ mode = newMode;
411
+ cards = newCards.map((card) => ({ ...card }));
412
+ comparisonGroups = newComparisonGroups.map((group) => ({
413
+ ...group,
414
+ owner: "agent",
415
+ cardIds: [...group.cardIds],
416
+ routes: group.routes.map((route) => ({ ...route })),
417
+ }));
418
+ focusedCardId = null;
419
+ selectedCardId = null;
420
+ cachedBoardCamera = { ...newCamera };
421
+ if (newCards.length > 0) {
422
+ let maxNum = 0;
423
+ for (const c of newCards) {
424
+ const match = /^card-(\d+)$/.exec(c.id);
425
+ if (match) {
426
+ const n = Number(match[1]);
427
+ if (n > maxNum)
428
+ maxNum = n;
429
+ }
430
+ }
431
+ cardIdCounter = Math.max(cardIdCounter, maxNum);
432
+ }
433
+ fitAllRan = true;
434
+ notify();
435
+ }
436
+ export { subscribe, getMode, getCards, getComparisonGroups, getMode as getCanvasMode, getCards as getCanvasCards, getComparisonGroups as getCanvasComparisonGroups, };
437
+ export function useCanvasMode() {
438
+ return useSyncExternalStore(subscribe, getMode, getMode);
439
+ }
440
+ export function useCanvasCards() {
441
+ return useSyncExternalStore(subscribe, getCards, getCards);
442
+ }
443
+ export function useCanvasComparisonGroups() {
444
+ return useSyncExternalStore(subscribe, getComparisonGroups, getComparisonGroups);
445
+ }
446
+ export function useBoardCamera() {
447
+ return useSyncExternalStore(subscribe, getBoardCamera, getBoardCamera);
448
+ }