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,217 @@
1
+ import { isPreviewableChange, isTokenChange, } from "../changes/changesLog.js";
2
+ import { changeKey } from "../changes/model.js";
3
+ import { beginPreviewAttempt, clearPreviewDiagnostics, getHostPreviewDocument, notifyPreviewDiagnostics, publishPreviewDiagnostic, } from "../changes/previewDiagnostics.js";
4
+ import { getWorkspaceChanges } from "../changes/workspaceChanges.js";
5
+ import { getCanvasPreviewDocument, getRegisteredFrames } from "./projection.js";
6
+ import { findCanvasFrameBySource, PROJECT_ID, WORKSPACE_ID } from "./projection.js";
7
+ import { getCanvasCards } from "./canvasStore.js";
8
+ import { isRendererMessageFor } from "./frameProtocol.js";
9
+ import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
10
+ const VERIFICATION_TIMEOUT_MS = 5000;
11
+ const STALE_CHECK_DEBOUNCE_MS = 100;
12
+ let verificationTimer = null;
13
+ let debounceTimer = null;
14
+ let pendingChanges = null;
15
+ let pendingAttempts = new Map();
16
+ function checkSelectorInDocument(doc, selector) {
17
+ try {
18
+ return doc.querySelectorAll(selector).length > 0;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ function checkSelectorInFrame(iframe, selector) {
25
+ try {
26
+ const doc = iframe.contentDocument;
27
+ if (!doc)
28
+ return false;
29
+ return checkSelectorInDocument(doc, selector);
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ function getRequestedValue(change) {
36
+ if (isTokenChange(change))
37
+ return change.rawValue;
38
+ if (change.newToken) {
39
+ return change.newToken.cssValue ?? `var(${change.newToken.cssName ?? change.newToken.name})`;
40
+ }
41
+ return change.rawValue ?? "";
42
+ }
43
+ function buildStaleResult(selector, requestedValue) {
44
+ return {
45
+ requestedValue,
46
+ computedValue: "",
47
+ status: "conflict",
48
+ reason: "target-missing",
49
+ };
50
+ }
51
+ function checkTokenDrift(change) {
52
+ const { tokenCatalog } = getNudgeUiRuntimeConfig();
53
+ const def = tokenCatalog.find((d) => d.name === change.tokenName || d.cssName === change.tokenName);
54
+ if (!def) {
55
+ return {
56
+ requestedValue: change.rawValue,
57
+ computedValue: "",
58
+ status: "conflict",
59
+ reason: "token-drift",
60
+ };
61
+ }
62
+ const primaryDecl = def.declarations[0];
63
+ if (!primaryDecl) {
64
+ return {
65
+ requestedValue: change.rawValue,
66
+ computedValue: "",
67
+ status: "conflict",
68
+ reason: "token-drift",
69
+ };
70
+ }
71
+ if (primaryDecl.value !== change.oldRawValue) {
72
+ return {
73
+ requestedValue: change.rawValue,
74
+ computedValue: primaryDecl.value,
75
+ status: "conflict",
76
+ reason: "token-drift",
77
+ };
78
+ }
79
+ return null;
80
+ }
81
+ function getPreviewDocuments() {
82
+ const documents = [getHostPreviewDocument()];
83
+ const frames = getRegisteredFrames();
84
+ for (const card of getCanvasCards()) {
85
+ if (frames.has(card.id))
86
+ documents.push(getCanvasPreviewDocument(card.id));
87
+ }
88
+ return documents;
89
+ }
90
+ function beginPreviewAttempts() {
91
+ const attempts = new Map();
92
+ const revision = getWorkspaceChanges().revision;
93
+ for (const document of getPreviewDocuments()) {
94
+ const attempt = beginPreviewAttempt(document, revision);
95
+ if (attempt)
96
+ attempts.set(document.logicalDocument, attempt);
97
+ }
98
+ return attempts;
99
+ }
100
+ function gatherMatchEvidence(changes) {
101
+ const evidence = new Map();
102
+ const hostDocument = getHostPreviewDocument();
103
+ for (let i = 0; i < changes.length; i++) {
104
+ const change = changes[i];
105
+ if (isTokenChange(change))
106
+ continue;
107
+ if (checkSelectorInDocument(document, change.selector)) {
108
+ const routes = evidence.get(i) ?? [];
109
+ routes.push(hostDocument);
110
+ evidence.set(i, routes);
111
+ }
112
+ }
113
+ const frames = getRegisteredFrames();
114
+ const cards = getCanvasCards();
115
+ for (const card of cards) {
116
+ const frame = frames.get(card.id);
117
+ if (!frame || !frame.contentWindow)
118
+ continue;
119
+ for (let i = 0; i < changes.length; i++) {
120
+ const change = changes[i];
121
+ if (isTokenChange(change))
122
+ continue;
123
+ if (checkSelectorInFrame(frame, change.selector)) {
124
+ const routes = evidence.get(i) ?? [];
125
+ routes.push(getCanvasPreviewDocument(card.id));
126
+ evidence.set(i, routes);
127
+ }
128
+ }
129
+ }
130
+ return evidence;
131
+ }
132
+ function applyStaleResults(changes, attempts) {
133
+ const evidence = gatherMatchEvidence(changes);
134
+ const hostAttempt = attempts.get(getHostPreviewDocument().logicalDocument);
135
+ for (let i = 0; i < changes.length; i++) {
136
+ const change = changes[i];
137
+ if (isTokenChange(change)) {
138
+ const drift = checkTokenDrift(change);
139
+ if (drift && hostAttempt)
140
+ publishPreviewDiagnostic(hostAttempt, changeKey(change), drift);
141
+ continue;
142
+ }
143
+ const routes = evidence.get(i);
144
+ // A document that does not contain the target says nothing about
145
+ // staleness. Publish target-missing only when the change matches nowhere;
146
+ // a Canvas-only match is verified, not a host conflict. When nowhere,
147
+ // every live document reports the same miss.
148
+ if (!routes || routes.length === 0) {
149
+ for (const attempt of attempts.values()) {
150
+ publishPreviewDiagnostic(attempt, changeKey(change), buildStaleResult(change.selector, getRequestedValue(change)));
151
+ }
152
+ }
153
+ }
154
+ }
155
+ function scheduleStaleCheck() {
156
+ if (debounceTimer)
157
+ clearTimeout(debounceTimer);
158
+ debounceTimer = setTimeout(() => {
159
+ if (pendingChanges) {
160
+ pendingAttempts = beginPreviewAttempts();
161
+ clearPreviewDiagnostics(pendingChanges.map(changeKey));
162
+ applyStaleResults(pendingChanges, pendingAttempts);
163
+ }
164
+ }, STALE_CHECK_DEBOUNCE_MS);
165
+ }
166
+ export function startStaleDetection(changes) {
167
+ const previewableChanges = changes.filter(isPreviewableChange);
168
+ if (previewableChanges.length === 0)
169
+ return;
170
+ clearPreviewDiagnostics(previewableChanges.map(changeKey));
171
+ pendingAttempts = beginPreviewAttempts();
172
+ pendingChanges = previewableChanges;
173
+ if (verificationTimer)
174
+ clearTimeout(verificationTimer);
175
+ verificationTimer = setTimeout(() => {
176
+ if (pendingChanges) {
177
+ applyStaleResults(pendingChanges, pendingAttempts);
178
+ pendingChanges = null;
179
+ }
180
+ pendingAttempts = new Map();
181
+ verificationTimer = null;
182
+ notifyPreviewDiagnostics();
183
+ }, VERIFICATION_TIMEOUT_MS);
184
+ window.addEventListener("message", handleFrameReady);
185
+ }
186
+ function handleFrameReady(event) {
187
+ if (event.origin !== window.location.origin)
188
+ return;
189
+ const msg = event.data;
190
+ const frame = findCanvasFrameBySource(event.source);
191
+ if (!frame || !isRendererMessageFor(msg, {
192
+ projectId: PROJECT_ID,
193
+ workspaceId: WORKSPACE_ID,
194
+ cardId: frame.cardId,
195
+ }) || msg.type !== "frame-ready")
196
+ return;
197
+ if (!pendingChanges)
198
+ return;
199
+ scheduleStaleCheck();
200
+ }
201
+ export function cancelStaleDetection() {
202
+ if (verificationTimer) {
203
+ clearTimeout(verificationTimer);
204
+ verificationTimer = null;
205
+ }
206
+ if (debounceTimer) {
207
+ clearTimeout(debounceTimer);
208
+ debounceTimer = null;
209
+ }
210
+ pendingChanges = null;
211
+ pendingAttempts = new Map();
212
+ window.removeEventListener("message", handleFrameReady);
213
+ notifyPreviewDiagnostics();
214
+ }
215
+ export function isVerificationPending() {
216
+ return pendingChanges !== null && verificationTimer !== null;
217
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Keep canvas card controls usable while the board is zoomed out without
3
+ * letting them grow without bound relative to the card.
4
+ */
5
+ export declare const CANVAS_TOOLBAR_MAX_SCALE = 2;
6
+ export declare const CANVAS_TOOLBAR_SCALE_CAP_ZOOM: number;
7
+ export declare function getCanvasToolbarScale(zoom: number): number;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Keep canvas card controls usable while the board is zoomed out without
3
+ * letting them grow without bound relative to the card.
4
+ */
5
+ export const CANVAS_TOOLBAR_MAX_SCALE = 2;
6
+ export const CANVAS_TOOLBAR_SCALE_CAP_ZOOM = 1 / CANVAS_TOOLBAR_MAX_SCALE;
7
+ export function getCanvasToolbarScale(zoom) {
8
+ if (!Number.isFinite(zoom) || zoom <= 0)
9
+ return CANVAS_TOOLBAR_MAX_SCALE;
10
+ return Math.min(1 / zoom, CANVAS_TOOLBAR_MAX_SCALE);
11
+ }
@@ -0,0 +1,26 @@
1
+ export interface WorkspaceLease {
2
+ ownerId: string;
3
+ projectId: string;
4
+ acquiredAt: number;
5
+ lastHeartbeat: number;
6
+ }
7
+ export declare function readLeaseRaw(): WorkspaceLease | null;
8
+ export declare function isLeaseExpired(lease: WorkspaceLease, now?: number): boolean;
9
+ export declare function acquireLease(): boolean;
10
+ export declare function requestTakeover(): boolean;
11
+ /** Enable lease checks for state-changing controller actions in this document. */
12
+ export declare function enableWriteGuard(): void;
13
+ /**
14
+ * Unit-level modules are also used without the browser controller bootstrap.
15
+ * Once the controller enables the guard, only the current lease owner may
16
+ * mutate or persist its canonical workspace state.
17
+ */
18
+ export declare function canWriteWorkspace(): boolean;
19
+ export declare function releaseLease(): void;
20
+ export declare function hasWriteLease(): boolean;
21
+ export declare function getActiveLeaseOwner(): {
22
+ ownerId: string;
23
+ acquiredAt: number;
24
+ } | null;
25
+ export declare function getOwnerId(): string | null;
26
+ export declare function subscribeOwnership(listener: (hasLease: boolean) => void): () => void;
@@ -0,0 +1,214 @@
1
+ import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
2
+ const LEASE_KEY_PREFIX = "nudge-ui:";
3
+ const HEARTBEAT_INTERVAL_MS = 5000;
4
+ const LEASE_EXPIRY_MS = 15000;
5
+ function leaseKey() {
6
+ return `${LEASE_KEY_PREFIX}${getNudgeUiRuntimeConfig().projectId}:lease`;
7
+ }
8
+ function generateOwnerId() {
9
+ return (crypto.randomUUID?.() ??
10
+ `owner-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
+ }
12
+ export function readLeaseRaw() {
13
+ try {
14
+ const raw = localStorage.getItem(leaseKey());
15
+ if (!raw)
16
+ return null;
17
+ const parsed = JSON.parse(raw);
18
+ if (parsed === null || typeof parsed !== "object")
19
+ return null;
20
+ // SAFETY: JSON.parse returns unknown; we narrow only the known lease fields below.
21
+ const l = parsed;
22
+ if (typeof l.ownerId !== "string" ||
23
+ typeof l.projectId !== "string" ||
24
+ typeof l.acquiredAt !== "number" ||
25
+ typeof l.lastHeartbeat !== "number") {
26
+ return null;
27
+ }
28
+ return {
29
+ ownerId: l.ownerId,
30
+ projectId: l.projectId,
31
+ acquiredAt: l.acquiredAt,
32
+ lastHeartbeat: l.lastHeartbeat,
33
+ };
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function writeLease(lease) {
40
+ try {
41
+ localStorage.setItem(leaseKey(), JSON.stringify(lease));
42
+ }
43
+ catch {
44
+ /* storage unavailable */
45
+ }
46
+ }
47
+ function deleteLease() {
48
+ try {
49
+ localStorage.removeItem(leaseKey());
50
+ }
51
+ catch {
52
+ /* ignore */
53
+ }
54
+ }
55
+ export function isLeaseExpired(lease, now = Date.now()) {
56
+ return now - lease.lastHeartbeat > LEASE_EXPIRY_MS;
57
+ }
58
+ let currentOwnerId = null;
59
+ let heartbeatTimer = null;
60
+ let ownsLease = false;
61
+ let writeGuardEnabled = false;
62
+ const ownershipListeners = new Set();
63
+ function notifyOwnershipListeners() {
64
+ const snapshot = ownsLease;
65
+ for (const listener of ownershipListeners) {
66
+ try {
67
+ listener(snapshot);
68
+ }
69
+ catch {
70
+ /* ignore */
71
+ }
72
+ }
73
+ }
74
+ function startHeartbeat() {
75
+ if (heartbeatTimer)
76
+ return;
77
+ heartbeatTimer = setInterval(() => {
78
+ if (!currentOwnerId || !ownsLease)
79
+ return;
80
+ const existing = readLeaseRaw();
81
+ if (!existing || existing.ownerId !== currentOwnerId) {
82
+ loseOwnership();
83
+ return;
84
+ }
85
+ existing.lastHeartbeat = Date.now();
86
+ writeLease(existing);
87
+ }, HEARTBEAT_INTERVAL_MS);
88
+ }
89
+ function stopHeartbeat() {
90
+ if (heartbeatTimer) {
91
+ clearInterval(heartbeatTimer);
92
+ heartbeatTimer = null;
93
+ }
94
+ }
95
+ function loseOwnership() {
96
+ ownsLease = false;
97
+ stopHeartbeat();
98
+ notifyOwnershipListeners();
99
+ }
100
+ function createLease() {
101
+ return {
102
+ ownerId: currentOwnerId,
103
+ projectId: getNudgeUiRuntimeConfig().projectId,
104
+ acquiredAt: Date.now(),
105
+ lastHeartbeat: Date.now(),
106
+ };
107
+ }
108
+ export function acquireLease() {
109
+ if (currentOwnerId) {
110
+ const existing = readLeaseRaw();
111
+ if (existing &&
112
+ existing.ownerId === currentOwnerId &&
113
+ !isLeaseExpired(existing)) {
114
+ if (!ownsLease) {
115
+ ownsLease = true;
116
+ startHeartbeat();
117
+ notifyOwnershipListeners();
118
+ }
119
+ return true;
120
+ }
121
+ loseOwnership();
122
+ }
123
+ currentOwnerId = generateOwnerId();
124
+ const existing = readLeaseRaw();
125
+ if (existing && !isLeaseExpired(existing)) {
126
+ return false;
127
+ }
128
+ const lease = createLease();
129
+ writeLease(lease);
130
+ ownsLease = true;
131
+ startHeartbeat();
132
+ window.addEventListener("storage", handleStorageEvent);
133
+ notifyOwnershipListeners();
134
+ return true;
135
+ }
136
+ export function requestTakeover() {
137
+ if (!currentOwnerId) {
138
+ currentOwnerId = generateOwnerId();
139
+ }
140
+ const lease = createLease();
141
+ writeLease(lease);
142
+ ownsLease = true;
143
+ startHeartbeat();
144
+ window.addEventListener("storage", handleStorageEvent);
145
+ notifyOwnershipListeners();
146
+ return true;
147
+ }
148
+ /** Enable lease checks for state-changing controller actions in this document. */
149
+ export function enableWriteGuard() {
150
+ writeGuardEnabled = true;
151
+ }
152
+ /**
153
+ * Unit-level modules are also used without the browser controller bootstrap.
154
+ * Once the controller enables the guard, only the current lease owner may
155
+ * mutate or persist its canonical workspace state.
156
+ */
157
+ export function canWriteWorkspace() {
158
+ return !writeGuardEnabled || hasWriteLease();
159
+ }
160
+ export function releaseLease() {
161
+ if (!ownsLease)
162
+ return;
163
+ stopHeartbeat();
164
+ window.removeEventListener("storage", handleStorageEvent);
165
+ const existing = readLeaseRaw();
166
+ if (existing && existing.ownerId === currentOwnerId) {
167
+ deleteLease();
168
+ }
169
+ ownsLease = false;
170
+ currentOwnerId = null;
171
+ notifyOwnershipListeners();
172
+ }
173
+ export function hasWriteLease() {
174
+ if (!ownsLease)
175
+ return false;
176
+ const existing = readLeaseRaw();
177
+ if (!existing ||
178
+ existing.ownerId !== currentOwnerId ||
179
+ isLeaseExpired(existing)) {
180
+ loseOwnership();
181
+ return false;
182
+ }
183
+ return true;
184
+ }
185
+ export function getActiveLeaseOwner() {
186
+ const existing = readLeaseRaw();
187
+ if (!existing || isLeaseExpired(existing))
188
+ return null;
189
+ return { ownerId: existing.ownerId, acquiredAt: existing.acquiredAt };
190
+ }
191
+ export function getOwnerId() {
192
+ return currentOwnerId;
193
+ }
194
+ export function subscribeOwnership(listener) {
195
+ ownershipListeners.add(listener);
196
+ return () => {
197
+ ownershipListeners.delete(listener);
198
+ };
199
+ }
200
+ function handleStorageEvent(event) {
201
+ if (event.key !== leaseKey())
202
+ return;
203
+ if (!ownsLease)
204
+ return;
205
+ if (event.newValue === null) {
206
+ const lease = createLease();
207
+ writeLease(lease);
208
+ return;
209
+ }
210
+ const lease = readLeaseRaw();
211
+ if (!lease || lease.ownerId === currentOwnerId)
212
+ return;
213
+ loseOwnership();
214
+ }
@@ -0,0 +1,46 @@
1
+ import type { StyleRule } from "../projection/managedStylesheet.js";
2
+ import type { ChangeRecord } from "./types.js";
3
+ import { type CommitResult } from "./workspaceChanges.js";
4
+ import type { StructuralChange } from "./structuralTypes.js";
5
+ export { isComponentChange, isElementChange, isTextContentChange, isTextContentChangeValue, isPreviewableChange, isTokenChange, } from "./types.js";
6
+ export type { ChangeRecord, ComponentChangeRecord, ElementChangeRecord, PreviewableChangeRecord, TextContentChangeRecord, TokenChangeRecord, RuntimeElementEvidence, } from "./types.js";
7
+ export interface AppendChangesOptions {
8
+ /** The rendered target captured for each change key at commit time. */
9
+ verificationTargets?: ReadonlyMap<string, HTMLElement | null>;
10
+ }
11
+ declare function subscribe(cb: () => void): () => void;
12
+ declare function getChangesSnapshot(): ChangeRecord[];
13
+ export declare function getPendingRules(): StyleRule[];
14
+ /** Append records and report whether canonical workspace state changed. */
15
+ export declare function appendChanges(incoming: ChangeRecord[], options?: AppendChangesOptions): CommitResult;
16
+ export declare function appendChange(change: ChangeRecord): CommitResult;
17
+ export declare function revertChange(change: ChangeRecord): void;
18
+ /**
19
+ * Removes source-verified records without allowing older undo snapshots to
20
+ * resurrect their managed previews.
21
+ *
22
+ * Agent handoff revisions identify records by the same stable key used by the
23
+ * canonical change model. Verification can therefore reconcile a subset while
24
+ * preserving newer, unsent edits and their remaining undo history.
25
+ */
26
+ export declare function reconcileVerifiedChanges(verifiedKeys: ReadonlySet<string>): number;
27
+ /** Atomically reconciles ordinary and structural intent from one agent handoff. */
28
+ export declare function reconcileVerifiedWorkspaceChanges(verifiedKeys: ReadonlySet<string>, verifiedStructuralIds: ReadonlySet<string>): number;
29
+ export declare function discardChangesForSelector(selector: string): void;
30
+ /** Relink removes every CSS declaration owned by one durable rendered target. */
31
+ export declare function discardChangesForInstanceOverride(overrideId: string): void;
32
+ export declare function undo(): boolean;
33
+ export declare function redo(): boolean;
34
+ /**
35
+ * Replaces ordinary records while preserving structural intent. Restoring any
36
+ * dimension is terminal for the unified workspace timeline, so undo and redo
37
+ * history are reset for both dimensions.
38
+ */
39
+ export declare function restoreChangeRecords(incoming: ChangeRecord[]): void;
40
+ /** Restores every canonical workspace intent as one subscriber-visible snapshot. */
41
+ export declare function loadWorkspaceChanges(incoming: readonly ChangeRecord[], structuralChanges: readonly StructuralChange[]): void;
42
+ /** Clears all workspace intent and its unified undo/redo timeline. */
43
+ export declare function clearWorkspace(): void;
44
+ export declare function getChangesList(): ChangeRecord[];
45
+ export { subscribe as subscribeChanges, getChangesSnapshot as getChanges };
46
+ export declare function useChanges(): ChangeRecord[];