@parhelia/core 0.3.12832 → 0.3.12833

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 (472) hide show
  1. package/dist/components/emoji/EmojiPicker.d.ts +18 -0
  2. package/dist/components/emoji/EmojiPicker.js +102 -0
  3. package/dist/components/emoji/EmojiPicker.js.map +1 -0
  4. package/dist/components/emoji/EmojiText.d.ts +19 -0
  5. package/dist/components/emoji/EmojiText.js +30 -0
  6. package/dist/components/emoji/EmojiText.js.map +1 -0
  7. package/dist/components/emoji/emojiData.generated.d.ts +2 -0
  8. package/dist/components/emoji/emojiData.generated.js +1878 -0
  9. package/dist/components/emoji/emojiData.generated.js.map +1 -0
  10. package/dist/components/emoji/emojiIndex.d.ts +46 -0
  11. package/dist/components/emoji/emojiIndex.js +173 -0
  12. package/dist/components/emoji/emojiIndex.js.map +1 -0
  13. package/dist/components/emoji/emoticons.d.ts +21 -0
  14. package/dist/components/emoji/emoticons.js +167 -0
  15. package/dist/components/emoji/emoticons.js.map +1 -0
  16. package/dist/components/emoji/textareaInsert.d.ts +19 -0
  17. package/dist/components/emoji/textareaInsert.js +29 -0
  18. package/dist/components/emoji/textareaInsert.js.map +1 -0
  19. package/dist/components/emoji/twemoji.d.ts +30 -0
  20. package/dist/components/emoji/twemoji.js +84 -0
  21. package/dist/components/emoji/twemoji.js.map +1 -0
  22. package/dist/editor/agent-changes/agentChangeTargets.js +6 -0
  23. package/dist/editor/agent-changes/agentChangeTargets.js.map +1 -1
  24. package/dist/editor/agent-changes/agentChangeTextHighlight.d.ts +48 -4
  25. package/dist/editor/agent-changes/agentChangeTextHighlight.js +67 -9
  26. package/dist/editor/agent-changes/agentChangeTextHighlight.js.map +1 -1
  27. package/dist/editor/ai/AgentImagePreview.d.ts +13 -0
  28. package/dist/editor/ai/AgentImagePreview.js +41 -0
  29. package/dist/editor/ai/AgentImagePreview.js.map +1 -0
  30. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js +1 -1
  31. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js.map +1 -1
  32. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js +1 -2
  33. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js.map +1 -1
  34. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.d.ts +6 -0
  35. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js +61 -0
  36. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js.map +1 -0
  37. package/dist/editor/ai/terminal/toolCallDiagnostics.d.ts +34 -0
  38. package/dist/editor/ai/terminal/toolCallDiagnostics.js +218 -0
  39. package/dist/editor/ai/terminal/toolCallDiagnostics.js.map +1 -0
  40. package/dist/editor/bridge/linkDownload.d.ts +3 -0
  41. package/dist/editor/bridge/linkDownload.js +52 -0
  42. package/dist/editor/bridge/linkDownload.js.map +1 -0
  43. package/dist/editor/client/clipboardStorage.d.ts +10 -0
  44. package/dist/editor/client/clipboardStorage.js +57 -0
  45. package/dist/editor/client/clipboardStorage.js.map +1 -0
  46. package/dist/editor/client/hooks/useRepositoryItemRefresh.d.ts +4 -0
  47. package/dist/editor/client/hooks/useRepositoryItemRefresh.js +62 -0
  48. package/dist/editor/client/hooks/useRepositoryItemRefresh.js.map +1 -0
  49. package/dist/editor/client/liveEditState.d.ts +16 -0
  50. package/dist/editor/client/liveEditState.js +25 -0
  51. package/dist/editor/client/liveEditState.js.map +1 -0
  52. package/dist/editor/client/liveSessionState.d.ts +6 -0
  53. package/dist/editor/client/liveSessionState.js +20 -0
  54. package/dist/editor/client/liveSessionState.js.map +1 -0
  55. package/dist/editor/client/valueStore.d.ts +22 -0
  56. package/dist/editor/client/valueStore.js +29 -0
  57. package/dist/editor/client/valueStore.js.map +1 -0
  58. package/dist/editor/commands/componentClipboardCommands.d.ts +35 -0
  59. package/dist/editor/commands/componentClipboardCommands.js +271 -0
  60. package/dist/editor/commands/componentClipboardCommands.js.map +1 -0
  61. package/dist/editor/commands/componentMenuGroups.d.ts +2 -0
  62. package/dist/editor/commands/componentMenuGroups.js +43 -0
  63. package/dist/editor/commands/componentMenuGroups.js.map +1 -0
  64. package/dist/editor/component-conversion/ComponentTypePickerDialog.d.ts +12 -0
  65. package/dist/editor/component-conversion/ComponentTypePickerDialog.js +40 -0
  66. package/dist/editor/component-conversion/ComponentTypePickerDialog.js.map +1 -0
  67. package/dist/editor/component-conversion/ConversionAiDebugButton.d.ts +17 -0
  68. package/dist/editor/component-conversion/ConversionAiDebugButton.js +80 -0
  69. package/dist/editor/component-conversion/ConversionAiDebugButton.js.map +1 -0
  70. package/dist/editor/component-conversion/ConvertComponentDialog.d.ts +28 -0
  71. package/dist/editor/component-conversion/ConvertComponentDialog.js +633 -0
  72. package/dist/editor/component-conversion/ConvertComponentDialog.js.map +1 -0
  73. package/dist/editor/component-conversion/conversionModel.d.ts +109 -0
  74. package/dist/editor/component-conversion/conversionModel.js +519 -0
  75. package/dist/editor/component-conversion/conversionModel.js.map +1 -0
  76. package/dist/editor/component-conversion/conversionService.d.ts +12 -0
  77. package/dist/editor/component-conversion/conversionService.js +16 -0
  78. package/dist/editor/component-conversion/conversionService.js.map +1 -0
  79. package/dist/editor/component-conversion/conversionTypes.d.ts +214 -0
  80. package/dist/editor/component-conversion/conversionTypes.js +2 -0
  81. package/dist/editor/component-conversion/conversionTypes.js.map +1 -0
  82. package/dist/editor/component-conversion/convertComponentsCommand.d.ts +25 -0
  83. package/dist/editor/component-conversion/convertComponentsCommand.js +196 -0
  84. package/dist/editor/component-conversion/convertComponentsCommand.js.map +1 -0
  85. package/dist/editor/field-types/FieldHistoryBoundary.js +28 -7
  86. package/dist/editor/field-types/FieldHistoryBoundary.js.map +1 -1
  87. package/dist/editor/field-types/fieldStyles.d.ts +21 -0
  88. package/dist/editor/field-types/fieldStyles.js +22 -0
  89. package/dist/editor/field-types/fieldStyles.js.map +1 -0
  90. package/dist/editor/field-types/richtext/utils/changeHighlight.d.ts +14 -0
  91. package/dist/editor/field-types/richtext/utils/changeHighlight.js +12 -1
  92. package/dist/editor/field-types/richtext/utils/changeHighlight.js.map +1 -1
  93. package/dist/editor/field-types/richtext/utils/spellCheckText.d.ts +31 -0
  94. package/dist/editor/field-types/richtext/utils/spellCheckText.js +82 -0
  95. package/dist/editor/field-types/richtext/utils/spellCheckText.js.map +1 -0
  96. package/dist/editor/field-types/useFocusedFieldInput.d.ts +13 -0
  97. package/dist/editor/field-types/useFocusedFieldInput.js +50 -0
  98. package/dist/editor/field-types/useFocusedFieldInput.js.map +1 -0
  99. package/dist/editor/field-types/useFormFieldSelectionRange.d.ts +43 -0
  100. package/dist/editor/field-types/useFormFieldSelectionRange.js +149 -0
  101. package/dist/editor/field-types/useFormFieldSelectionRange.js.map +1 -0
  102. package/dist/editor/find-replace/FindReplacePanel.d.ts +11 -0
  103. package/dist/editor/find-replace/FindReplacePanel.js +311 -0
  104. package/dist/editor/find-replace/FindReplacePanel.js.map +1 -0
  105. package/dist/editor/find-replace/findReplaceCommand.d.ts +8 -0
  106. package/dist/editor/find-replace/findReplaceCommand.js +25 -0
  107. package/dist/editor/find-replace/findReplaceCommand.js.map +1 -0
  108. package/dist/editor/find-replace/findReplaceMatches.d.ts +42 -0
  109. package/dist/editor/find-replace/findReplaceMatches.js +66 -0
  110. package/dist/editor/find-replace/findReplaceMatches.js.map +1 -0
  111. package/dist/editor/find-replace/findReplaceStore.d.ts +30 -0
  112. package/dist/editor/find-replace/findReplaceStore.js +61 -0
  113. package/dist/editor/find-replace/findReplaceStore.js.map +1 -0
  114. package/dist/editor/find-replace/findReplaceTargets.d.ts +51 -0
  115. package/dist/editor/find-replace/findReplaceTargets.js +110 -0
  116. package/dist/editor/find-replace/findReplaceTargets.js.map +1 -0
  117. package/dist/editor/find-replace/findReplaceText.d.ts +50 -0
  118. package/dist/editor/find-replace/findReplaceText.js +189 -0
  119. package/dist/editor/find-replace/findReplaceText.js.map +1 -0
  120. package/dist/editor/itemContextMenuGroups.js +10 -1
  121. package/dist/editor/itemContextMenuGroups.js.map +1 -1
  122. package/dist/editor/media-selector/MediaDetailsView.d.ts +14 -0
  123. package/dist/editor/media-selector/MediaDetailsView.js +152 -0
  124. package/dist/editor/media-selector/MediaDetailsView.js.map +1 -0
  125. package/dist/editor/media-selector/useMediaFolderDrag.d.ts +26 -0
  126. package/dist/editor/media-selector/useMediaFolderDrag.js +153 -0
  127. package/dist/editor/media-selector/useMediaFolderDrag.js.map +1 -0
  128. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.d.ts +11 -0
  129. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js +65 -0
  130. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js.map +1 -0
  131. package/dist/editor/menubar/toolbar-sections/FindReplaceControls.d.ts +6 -0
  132. package/dist/editor/menubar/toolbar-sections/FindReplaceControls.js +31 -0
  133. package/dist/editor/menubar/toolbar-sections/FindReplaceControls.js.map +1 -0
  134. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.d.ts +5 -0
  135. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js +16 -0
  136. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js.map +1 -0
  137. package/dist/editor/mobileBottomPanel.d.ts +40 -0
  138. package/dist/editor/mobileBottomPanel.js +63 -0
  139. package/dist/editor/mobileBottomPanel.js.map +1 -0
  140. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.d.ts +3 -6
  141. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js +8 -6
  142. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js.map +1 -1
  143. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.d.ts +6 -0
  144. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js +100 -0
  145. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js.map +1 -0
  146. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.d.ts +9 -0
  147. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js +32 -0
  148. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js.map +1 -0
  149. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.d.ts +14 -0
  150. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js +110 -0
  151. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js.map +1 -0
  152. package/dist/editor/page-editor-chrome/ConversionIndicators.d.ts +8 -0
  153. package/dist/editor/page-editor-chrome/ConversionIndicators.js +75 -0
  154. package/dist/editor/page-editor-chrome/ConversionIndicators.js.map +1 -0
  155. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.d.ts +9 -13
  156. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js +25 -20
  157. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js.map +1 -1
  158. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.d.ts +15 -0
  159. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js +31 -0
  160. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js.map +1 -0
  161. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.d.ts +11 -0
  162. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js +120 -0
  163. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js.map +1 -0
  164. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.d.ts +12 -0
  165. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js +197 -0
  166. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js.map +1 -0
  167. package/dist/editor/page-editor-chrome/ValidationRulerMarks.d.ts +11 -0
  168. package/dist/editor/page-editor-chrome/ValidationRulerMarks.js +56 -0
  169. package/dist/editor/page-editor-chrome/ValidationRulerMarks.js.map +1 -0
  170. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.d.ts +44 -0
  171. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js +89 -0
  172. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js.map +1 -0
  173. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.d.ts +17 -0
  174. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js +53 -0
  175. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js.map +1 -0
  176. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.d.ts +11 -0
  177. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js +84 -0
  178. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js.map +1 -0
  179. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.d.ts +34 -0
  180. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js +229 -0
  181. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js.map +1 -0
  182. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.d.ts +9 -0
  183. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js +34 -0
  184. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js.map +1 -0
  185. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.d.ts +49 -0
  186. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js +241 -0
  187. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js.map +1 -0
  188. package/dist/editor/page-viewer/CanvasOverviewRuler.d.ts +11 -0
  189. package/dist/editor/page-viewer/CanvasOverviewRuler.js +65 -0
  190. package/dist/editor/page-viewer/CanvasOverviewRuler.js.map +1 -0
  191. package/dist/editor/page-viewer/DynamicRenderingsBar.d.ts +23 -0
  192. package/dist/editor/page-viewer/DynamicRenderingsBar.js +28 -0
  193. package/dist/editor/page-viewer/DynamicRenderingsBar.js.map +1 -0
  194. package/dist/editor/page-viewer/DynamicRenderingsStrip.d.ts +18 -0
  195. package/dist/editor/page-viewer/DynamicRenderingsStrip.js +29 -0
  196. package/dist/editor/page-viewer/DynamicRenderingsStrip.js.map +1 -0
  197. package/dist/editor/page-viewer/FeedbackMargin.d.ts +57 -0
  198. package/dist/editor/page-viewer/FeedbackMargin.js +377 -0
  199. package/dist/editor/page-viewer/FeedbackMargin.js.map +1 -0
  200. package/dist/editor/page-viewer/FeedbackMarginController.d.ts +76 -0
  201. package/dist/editor/page-viewer/FeedbackMarginController.js +241 -0
  202. package/dist/editor/page-viewer/FeedbackMarginController.js.map +1 -0
  203. package/dist/editor/page-viewer/FeedbackMarginMarker.d.ts +16 -0
  204. package/dist/editor/page-viewer/FeedbackMarginMarker.js +24 -0
  205. package/dist/editor/page-viewer/FeedbackMarginMarker.js.map +1 -0
  206. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.d.ts +23 -0
  207. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js +105 -0
  208. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js.map +1 -0
  209. package/dist/editor/page-viewer/InteractivePreviewBar.d.ts +24 -0
  210. package/dist/editor/page-viewer/InteractivePreviewBar.js +31 -0
  211. package/dist/editor/page-viewer/InteractivePreviewBar.js.map +1 -0
  212. package/dist/editor/page-viewer/MobileCommentsPanel.d.ts +16 -0
  213. package/dist/editor/page-viewer/MobileCommentsPanel.js +112 -0
  214. package/dist/editor/page-viewer/MobileCommentsPanel.js.map +1 -0
  215. package/dist/editor/page-viewer/RenderingAiCheck.d.ts +18 -0
  216. package/dist/editor/page-viewer/RenderingAiCheck.js +45 -0
  217. package/dist/editor/page-viewer/RenderingAiCheck.js.map +1 -0
  218. package/dist/editor/page-viewer/RenderingApprovalDialog.d.ts +32 -0
  219. package/dist/editor/page-viewer/RenderingApprovalDialog.js +191 -0
  220. package/dist/editor/page-viewer/RenderingApprovalDialog.js.map +1 -0
  221. package/dist/editor/page-viewer/SealedClientCodePreview.d.ts +17 -0
  222. package/dist/editor/page-viewer/SealedClientCodePreview.js +38 -0
  223. package/dist/editor/page-viewer/SealedClientCodePreview.js.map +1 -0
  224. package/dist/editor/page-viewer/canvasFrameNavigation.d.ts +18 -0
  225. package/dist/editor/page-viewer/canvasFrameNavigation.js +36 -0
  226. package/dist/editor/page-viewer/canvasFrameNavigation.js.map +1 -0
  227. package/dist/editor/page-viewer/canvasLoadSettling.d.ts +42 -0
  228. package/dist/editor/page-viewer/canvasLoadSettling.js +46 -0
  229. package/dist/editor/page-viewer/canvasLoadSettling.js.map +1 -0
  230. package/dist/editor/page-viewer/canvasScrollHandoff.d.ts +34 -0
  231. package/dist/editor/page-viewer/canvasScrollHandoff.js +55 -0
  232. package/dist/editor/page-viewer/canvasScrollHandoff.js.map +1 -0
  233. package/dist/editor/page-viewer/compareFrameWidth.d.ts +8 -0
  234. package/dist/editor/page-viewer/compareFrameWidth.js +25 -0
  235. package/dist/editor/page-viewer/compareFrameWidth.js.map +1 -0
  236. package/dist/editor/page-viewer/feedbackMarginLayout.d.ts +119 -0
  237. package/dist/editor/page-viewer/feedbackMarginLayout.js +155 -0
  238. package/dist/editor/page-viewer/feedbackMarginLayout.js.map +1 -0
  239. package/dist/editor/page-viewer/feedbackMarginSources.d.ts +36 -0
  240. package/dist/editor/page-viewer/feedbackMarginSources.js +196 -0
  241. package/dist/editor/page-viewer/feedbackMarginSources.js.map +1 -0
  242. package/dist/editor/page-viewer/feedbackMarginWidth.d.ts +43 -0
  243. package/dist/editor/page-viewer/feedbackMarginWidth.js +107 -0
  244. package/dist/editor/page-viewer/feedbackMarginWidth.js.map +1 -0
  245. package/dist/editor/page-viewer/interactivePreview.d.ts +168 -0
  246. package/dist/editor/page-viewer/interactivePreview.js +344 -0
  247. package/dist/editor/page-viewer/interactivePreview.js.map +1 -0
  248. package/dist/editor/page-viewer/minimapViewport.d.ts +2 -0
  249. package/dist/editor/page-viewer/minimapViewport.js +34 -0
  250. package/dist/editor/page-viewer/minimapViewport.js.map +1 -0
  251. package/dist/editor/page-viewer/openPageItems.d.ts +29 -0
  252. package/dist/editor/page-viewer/openPageItems.js +73 -0
  253. package/dist/editor/page-viewer/openPageItems.js.map +1 -0
  254. package/dist/editor/page-viewer/overviewRuler.d.ts +128 -0
  255. package/dist/editor/page-viewer/overviewRuler.js +226 -0
  256. package/dist/editor/page-viewer/overviewRuler.js.map +1 -0
  257. package/dist/editor/page-viewer/renderingApproval.d.ts +59 -0
  258. package/dist/editor/page-viewer/renderingApproval.js +186 -0
  259. package/dist/editor/page-viewer/renderingApproval.js.map +1 -0
  260. package/dist/editor/page-viewer/renderingChanges.d.ts +29 -0
  261. package/dist/editor/page-viewer/renderingChanges.js +40 -0
  262. package/dist/editor/page-viewer/renderingChanges.js.map +1 -0
  263. package/dist/editor/page-viewer/scrollIntoViewTextRanges.d.ts +23 -0
  264. package/dist/editor/page-viewer/scrollIntoViewTextRanges.js +26 -0
  265. package/dist/editor/page-viewer/scrollIntoViewTextRanges.js.map +1 -0
  266. package/dist/editor/page-viewer/useInteractivePreview.d.ts +77 -0
  267. package/dist/editor/page-viewer/useInteractivePreview.js +210 -0
  268. package/dist/editor/page-viewer/useInteractivePreview.js.map +1 -0
  269. package/dist/editor/reviews/CollapsibleText.d.ts +13 -0
  270. package/dist/editor/reviews/CollapsibleText.js +41 -0
  271. package/dist/editor/reviews/CollapsibleText.js.map +1 -0
  272. package/dist/editor/reviews/CommentImageAttachments.d.ts +12 -0
  273. package/dist/editor/reviews/CommentImageAttachments.js +19 -0
  274. package/dist/editor/reviews/CommentImageAttachments.js.map +1 -0
  275. package/dist/editor/reviews/CommentQuote.d.ts +13 -0
  276. package/dist/editor/reviews/CommentQuote.js +35 -0
  277. package/dist/editor/reviews/CommentQuote.js.map +1 -0
  278. package/dist/editor/reviews/CommentTargetOutline.d.ts +13 -0
  279. package/dist/editor/reviews/CommentTargetOutline.js +21 -0
  280. package/dist/editor/reviews/CommentTargetOutline.js.map +1 -0
  281. package/dist/editor/reviews/CommentTargetPickerDomLayer.d.ts +7 -0
  282. package/dist/editor/reviews/CommentTargetPickerDomLayer.js +117 -0
  283. package/dist/editor/reviews/CommentTargetPickerDomLayer.js.map +1 -0
  284. package/dist/editor/reviews/CommentThreadAgentLink.d.ts +28 -0
  285. package/dist/editor/reviews/CommentThreadAgentLink.js +37 -0
  286. package/dist/editor/reviews/CommentThreadAgentLink.js.map +1 -0
  287. package/dist/editor/reviews/CommentThreadCard.d.ts +34 -0
  288. package/dist/editor/reviews/CommentThreadCard.js +156 -0
  289. package/dist/editor/reviews/CommentThreadCard.js.map +1 -0
  290. package/dist/editor/reviews/SuggestionThreadCard.d.ts +19 -0
  291. package/dist/editor/reviews/SuggestionThreadCard.js +25 -0
  292. package/dist/editor/reviews/SuggestionThreadCard.js.map +1 -0
  293. package/dist/editor/reviews/addCommentOnTarget.d.ts +22 -0
  294. package/dist/editor/reviews/addCommentOnTarget.js +32 -0
  295. package/dist/editor/reviews/addCommentOnTarget.js.map +1 -0
  296. package/dist/editor/reviews/balloonLayout.d.ts +51 -0
  297. package/dist/editor/reviews/balloonLayout.js +101 -0
  298. package/dist/editor/reviews/balloonLayout.js.map +1 -0
  299. package/dist/editor/reviews/commentAgentAttachments.d.ts +5 -0
  300. package/dist/editor/reviews/commentAgentAttachments.js +51 -0
  301. package/dist/editor/reviews/commentAgentAttachments.js.map +1 -0
  302. package/dist/editor/reviews/commentImages.d.ts +48 -0
  303. package/dist/editor/reviews/commentImages.js +128 -0
  304. package/dist/editor/reviews/commentImages.js.map +1 -0
  305. package/dist/editor/reviews/commentTargetPicker.d.ts +114 -0
  306. package/dist/editor/reviews/commentTargetPicker.js +153 -0
  307. package/dist/editor/reviews/commentTargetPicker.js.map +1 -0
  308. package/dist/editor/reviews/feedbackBalloonDate.d.ts +8 -0
  309. package/dist/editor/reviews/feedbackBalloonDate.js +22 -0
  310. package/dist/editor/reviews/feedbackBalloonDate.js.map +1 -0
  311. package/dist/editor/reviews/feedbackDrafts.d.ts +49 -0
  312. package/dist/editor/reviews/feedbackDrafts.js +74 -0
  313. package/dist/editor/reviews/feedbackDrafts.js.map +1 -0
  314. package/dist/editor/reviews/feedbackHoverState.d.ts +18 -0
  315. package/dist/editor/reviews/feedbackHoverState.js +35 -0
  316. package/dist/editor/reviews/feedbackHoverState.js.map +1 -0
  317. package/dist/editor/reviews/feedbackPersonFilter.d.ts +3 -0
  318. package/dist/editor/reviews/feedbackPersonFilter.js +32 -0
  319. package/dist/editor/reviews/feedbackPersonFilter.js.map +1 -0
  320. package/dist/editor/reviews/feedbackThreadSelection.d.ts +10 -0
  321. package/dist/editor/reviews/feedbackThreadSelection.js +31 -0
  322. package/dist/editor/reviews/feedbackThreadSelection.js.map +1 -0
  323. package/dist/editor/reviews/feedbackThreads.d.ts +50 -0
  324. package/dist/editor/reviews/feedbackThreads.js +135 -0
  325. package/dist/editor/reviews/feedbackThreads.js.map +1 -0
  326. package/dist/editor/reviews/feedbackWheelForwarding.d.ts +34 -0
  327. package/dist/editor/reviews/feedbackWheelForwarding.js +108 -0
  328. package/dist/editor/reviews/feedbackWheelForwarding.js.map +1 -0
  329. package/dist/editor/reviews/reviewUrlScope.d.ts +23 -0
  330. package/dist/editor/reviews/reviewUrlScope.js +86 -0
  331. package/dist/editor/reviews/reviewUrlScope.js.map +1 -0
  332. package/dist/editor/reviews/scrollWithin.d.ts +29 -0
  333. package/dist/editor/reviews/scrollWithin.js +87 -0
  334. package/dist/editor/reviews/scrollWithin.js.map +1 -0
  335. package/dist/editor/reviews/subtreeFeedback.d.ts +57 -0
  336. package/dist/editor/reviews/subtreeFeedback.js +137 -0
  337. package/dist/editor/reviews/subtreeFeedback.js.map +1 -0
  338. package/dist/editor/reviews/useCommentImagePaste.d.ts +80 -0
  339. package/dist/editor/reviews/useCommentImagePaste.js +252 -0
  340. package/dist/editor/reviews/useCommentImagePaste.js.map +1 -0
  341. package/dist/editor/reviews/useFeedbackThreads.d.ts +35 -0
  342. package/dist/editor/reviews/useFeedbackThreads.js +137 -0
  343. package/dist/editor/reviews/useFeedbackThreads.js.map +1 -0
  344. package/dist/editor/reviews/useMeasuredHeights.d.ts +25 -0
  345. package/dist/editor/reviews/useMeasuredHeights.js +176 -0
  346. package/dist/editor/reviews/useMeasuredHeights.js.map +1 -0
  347. package/dist/editor/reviews/usePendingFeedbackFocus.d.ts +7 -0
  348. package/dist/editor/reviews/usePendingFeedbackFocus.js +42 -0
  349. package/dist/editor/reviews/usePendingFeedbackFocus.js.map +1 -0
  350. package/dist/editor/services/mcpAccessService.d.ts +93 -0
  351. package/dist/editor/services/mcpAccessService.js +41 -0
  352. package/dist/editor/services/mcpAccessService.js.map +1 -0
  353. package/dist/editor/services/previewTokenService.d.ts +14 -0
  354. package/dist/editor/services/previewTokenService.js +34 -0
  355. package/dist/editor/services/previewTokenService.js.map +1 -0
  356. package/dist/editor/services/renderingsService.d.ts +117 -0
  357. package/dist/editor/services/renderingsService.js +245 -0
  358. package/dist/editor/services/renderingsService.js.map +1 -0
  359. package/dist/editor/services/spellCheckService.d.ts +13 -0
  360. package/dist/editor/services/spellCheckService.js +33 -0
  361. package/dist/editor/services/spellCheckService.js.map +1 -0
  362. package/dist/editor/settings/panels/McpAccessPanel.d.ts +7 -0
  363. package/dist/editor/settings/panels/McpAccessPanel.js +95 -0
  364. package/dist/editor/settings/panels/McpAccessPanel.js.map +1 -0
  365. package/dist/editor/settings/panels/McpAccessSettingsView.d.ts +8 -0
  366. package/dist/editor/settings/panels/McpAccessSettingsView.js +221 -0
  367. package/dist/editor/settings/panels/McpAccessSettingsView.js.map +1 -0
  368. package/dist/editor/settings/panels/SpellCheckPanel.d.ts +8 -0
  369. package/dist/editor/settings/panels/SpellCheckPanel.js +253 -0
  370. package/dist/editor/settings/panels/SpellCheckPanel.js.map +1 -0
  371. package/dist/editor/sidebar/FeedbackSidebar.d.ts +7 -0
  372. package/dist/editor/sidebar/FeedbackSidebar.js +300 -0
  373. package/dist/editor/sidebar/FeedbackSidebar.js.map +1 -0
  374. package/dist/editor/sidebar/OperationDetailsContent.js +50 -0
  375. package/dist/editor/sidebar/OperationDetailsContent.js.map +1 -1
  376. package/dist/editor/sidebar/liveComponentThumbnails.d.ts +19 -6
  377. package/dist/editor/sidebar/liveComponentThumbnails.js +39 -18
  378. package/dist/editor/sidebar/liveComponentThumbnails.js.map +1 -1
  379. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.d.ts +30 -0
  380. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js +69 -0
  381. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js.map +1 -0
  382. package/dist/editor/spellcheck/htmlSpellDocument.d.ts +60 -0
  383. package/dist/editor/spellcheck/htmlSpellDocument.js +181 -0
  384. package/dist/editor/spellcheck/htmlSpellDocument.js.map +1 -0
  385. package/dist/editor/spellcheck/htmlSpellTokenizer.d.ts +45 -0
  386. package/dist/editor/spellcheck/htmlSpellTokenizer.js +277 -0
  387. package/dist/editor/spellcheck/htmlSpellTokenizer.js.map +1 -0
  388. package/dist/editor/spellcheck/replacementGuard.d.ts +27 -0
  389. package/dist/editor/spellcheck/replacementGuard.js +29 -0
  390. package/dist/editor/spellcheck/replacementGuard.js.map +1 -0
  391. package/dist/editor/spellcheck/spellCheckCanvasStore.d.ts +17 -0
  392. package/dist/editor/spellcheck/spellCheckCanvasStore.js +37 -0
  393. package/dist/editor/spellcheck/spellCheckCanvasStore.js.map +1 -0
  394. package/dist/editor/spellcheck/spellCheckCanvasTargets.d.ts +71 -0
  395. package/dist/editor/spellcheck/spellCheckCanvasTargets.js +126 -0
  396. package/dist/editor/spellcheck/spellCheckCanvasTargets.js.map +1 -0
  397. package/dist/editor/spellcheck/spellCheckClient.d.ts +66 -0
  398. package/dist/editor/spellcheck/spellCheckClient.js +0 -0
  399. package/dist/editor/spellcheck/spellCheckClient.js.map +1 -0
  400. package/dist/editor/spellcheck/spellCheckContextMenu.d.ts +52 -0
  401. package/dist/editor/spellcheck/spellCheckContextMenu.js +120 -0
  402. package/dist/editor/spellcheck/spellCheckContextMenu.js.map +1 -0
  403. package/dist/editor/spellcheck/spellCheckReplace.d.ts +8 -0
  404. package/dist/editor/spellcheck/spellCheckReplace.js +20 -0
  405. package/dist/editor/spellcheck/spellCheckReplace.js.map +1 -0
  406. package/dist/editor/spellcheck/spellCheckStyles.d.ts +11 -0
  407. package/dist/editor/spellcheck/spellCheckStyles.js +12 -0
  408. package/dist/editor/spellcheck/spellCheckStyles.js.map +1 -0
  409. package/dist/editor/spellcheck/spellCheckTypes.d.ts +94 -0
  410. package/dist/editor/spellcheck/spellCheckTypes.js +2 -0
  411. package/dist/editor/spellcheck/spellCheckTypes.js.map +1 -0
  412. package/dist/editor/spellcheck/textMarkHitTest.d.ts +14 -0
  413. package/dist/editor/spellcheck/textMarkHitTest.js +39 -0
  414. package/dist/editor/spellcheck/textMarkHitTest.js.map +1 -0
  415. package/dist/editor/spellcheck/useSpellCheck.d.ts +16 -0
  416. package/dist/editor/spellcheck/useSpellCheck.js +57 -0
  417. package/dist/editor/spellcheck/useSpellCheck.js.map +1 -0
  418. package/dist/editor/ui/DynamicRenderingsPublishWarning.d.ts +14 -0
  419. package/dist/editor/ui/DynamicRenderingsPublishWarning.js +40 -0
  420. package/dist/editor/ui/DynamicRenderingsPublishWarning.js.map +1 -0
  421. package/dist/editor/ui/ParheliaMark.d.ts +15 -0
  422. package/dist/editor/ui/ParheliaMark.js +12 -0
  423. package/dist/editor/ui/ParheliaMark.js.map +1 -0
  424. package/dist/editor/ui/RootItemPicker.d.ts +18 -0
  425. package/dist/editor/ui/RootItemPicker.js +112 -0
  426. package/dist/editor/ui/RootItemPicker.js.map +1 -0
  427. package/dist/editor/undoEligibility.d.ts +2 -0
  428. package/dist/editor/undoEligibility.js +8 -0
  429. package/dist/editor/undoEligibility.js.map +1 -0
  430. package/dist/editor/utils/dataTransferImages.d.ts +7 -0
  431. package/dist/editor/utils/dataTransferImages.js +43 -0
  432. package/dist/editor/utils/dataTransferImages.js.map +1 -0
  433. package/dist/editor/validation/navigateToValidationIssue.d.ts +2 -2
  434. package/dist/editor/validation/navigateToValidationIssue.js +1 -1
  435. package/dist/editor/validation/navigateToValidationIssue.js.map +1 -1
  436. package/dist/editor/validation/validationRulerIssues.d.ts +17 -0
  437. package/dist/editor/validation/validationRulerIssues.js +44 -0
  438. package/dist/editor/validation/validationRulerIssues.js.map +1 -0
  439. package/dist/revision.d.ts +2 -2
  440. package/dist/revision.js +2 -2
  441. package/dist/task-board/components/AttentionPromptDialog.d.ts +13 -0
  442. package/dist/task-board/components/AttentionPromptDialog.js +45 -0
  443. package/dist/task-board/components/AttentionPromptDialog.js.map +1 -0
  444. package/dist/task-board/components/GoalFindingsTable.d.ts +43 -0
  445. package/dist/task-board/components/GoalFindingsTable.js +160 -0
  446. package/dist/task-board/components/GoalFindingsTable.js.map +1 -0
  447. package/dist/task-board/components/IssuePanel.d.ts +31 -0
  448. package/dist/task-board/components/IssuePanel.js +268 -0
  449. package/dist/task-board/components/IssuePanel.js.map +1 -0
  450. package/dist/task-board/components/SubgoalFindings.d.ts +40 -0
  451. package/dist/task-board/components/SubgoalFindings.js +88 -0
  452. package/dist/task-board/components/SubgoalFindings.js.map +1 -0
  453. package/dist/task-board/services/issueService.d.ts +193 -0
  454. package/dist/task-board/services/issueService.js +97 -0
  455. package/dist/task-board/services/issueService.js.map +1 -0
  456. package/dist/task-board/taskBlockers.d.ts +10 -0
  457. package/dist/task-board/taskBlockers.js +66 -0
  458. package/dist/task-board/taskBlockers.js.map +1 -0
  459. package/dist/task-board/utils/projectDashboardModel.js +14 -0
  460. package/dist/task-board/utils/projectDashboardModel.js.map +1 -1
  461. package/dist/task-board/views/ProjectDashboardView.js +5 -13
  462. package/dist/task-board/views/ProjectDashboardView.js.map +1 -1
  463. package/dist/tour/sandbox-tour-copy.d.ts +8 -0
  464. package/dist/tour/sandbox-tour-copy.js +8 -0
  465. package/dist/tour/sandbox-tour-copy.js.map +1 -1
  466. package/dist/tour/sandbox-tour.d.ts +3 -0
  467. package/dist/tour/sandbox-tour.js +107 -3
  468. package/dist/tour/sandbox-tour.js.map +1 -1
  469. package/package.json +1 -1
  470. package/dist/editor/page-editor-chrome/bridgeLinkValue.d.ts +0 -10
  471. package/dist/editor/page-editor-chrome/bridgeLinkValue.js +0 -55
  472. package/dist/editor/page-editor-chrome/bridgeLinkValue.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ import { type PageViewContext } from "../page-viewer/pageViewContext";
2
+ export declare const FIND_REPLACE_HIGHLIGHT_TEST_ID = "find-replace-highlight";
3
+ /**
4
+ * Paints every match of the open "Find and replace" panel on the canvas, the
5
+ * current one stronger. The bridge measures the text ranges (same primitive
6
+ * as comments, suggestions and version diff); this component only publishes
7
+ * the ranges into the per-source geometry union and draws the reported rects.
8
+ */
9
+ export declare function FindReplaceHighlightings({ pageViewContext, }: {
10
+ pageViewContext: PageViewContext;
11
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,120 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef } from "react";
3
+ import { usePageViewState, } from "../page-viewer/pageViewContext";
4
+ import { FIND_REPLACE_BRIDGE_SOURCE, toBridgeTextRange, } from "../find-replace/findReplaceMatches";
5
+ import { useFindReplaceState } from "../find-replace/findReplaceStore";
6
+ import { measureBridgeTextRangeRects, rectListEquals, } from "./overlay/geometry";
7
+ import { useOverlayMeasurement } from "./overlay/useOverlayMeasurement";
8
+ export const FIND_REPLACE_HIGHLIGHT_TEST_ID = "find-replace-highlight";
9
+ const EMPTY_MATCHES = [];
10
+ function measuredMatchesEqual(previous, next) {
11
+ if (previous.length !== next.length)
12
+ return false;
13
+ for (let i = 0; i < previous.length; i++) {
14
+ const a = previous[i];
15
+ const b = next[i];
16
+ if (a.key !== b.key || a.active !== b.active)
17
+ return false;
18
+ if (!rectListEquals(a.rects, b.rects))
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ /**
24
+ * Paints every match of the open "Find and replace" panel on the canvas, the
25
+ * current one stronger. The bridge measures the text ranges (same primitive
26
+ * as comments, suggestions and version diff); this component only publishes
27
+ * the ranges into the per-source geometry union and draws the reported rects.
28
+ */
29
+ export function FindReplaceHighlightings({ pageViewContext, }) {
30
+ const { highlighting } = useFindReplaceState();
31
+ const matches = highlighting?.matches ?? EMPTY_MATCHES;
32
+ const activeIndex = highlighting?.activeIndex ?? -1;
33
+ const bridgeReady = usePageViewState(pageViewContext, (state) => state.bridgeReady);
34
+ const bridgeGeometry = usePageViewState(pageViewContext, (state) => state.bridgeGeometry);
35
+ const textRanges = useMemo(() => matches.map(toBridgeTextRange), [matches]);
36
+ const lastPublishedSignatureRef = useRef("");
37
+ useEffect(() => {
38
+ if (!bridgeReady) {
39
+ lastPublishedSignatureRef.current = "";
40
+ return;
41
+ }
42
+ // Empty maps to "" so the initial empty set is a no-op, while going from
43
+ // matches back to none still publishes the clearing update.
44
+ const signature = textRanges.length > 0 ? JSON.stringify(textRanges) : "";
45
+ if (signature === lastPublishedSignatureRef.current)
46
+ return;
47
+ let cancelled = false;
48
+ let retryTimer;
49
+ let retryCount = 0;
50
+ const publish = () => {
51
+ if (cancelled)
52
+ return;
53
+ // The frame installs requestBridgeGeometry after its children mounted
54
+ // and a reconnect can briefly reject commands; only remember the
55
+ // signature once the bridge accepted it.
56
+ const accepted = pageViewContext.requestBridgeGeometry?.({
57
+ source: FIND_REPLACE_BRIDGE_SOURCE,
58
+ textRanges,
59
+ });
60
+ if (accepted) {
61
+ lastPublishedSignatureRef.current = signature;
62
+ return;
63
+ }
64
+ const delay = Math.min(50 * 2 ** retryCount, 500);
65
+ retryCount += 1;
66
+ retryTimer = window.setTimeout(publish, delay);
67
+ };
68
+ publish();
69
+ return () => {
70
+ cancelled = true;
71
+ if (retryTimer !== undefined)
72
+ window.clearTimeout(retryTimer);
73
+ };
74
+ }, [pageViewContext, bridgeReady, textRanges]);
75
+ useEffect(() => () => {
76
+ // Drop this feature's entry from the geometry union on unmount.
77
+ pageViewContext.requestBridgeGeometry?.({
78
+ source: FIND_REPLACE_BRIDGE_SOURCE,
79
+ textRanges: [],
80
+ });
81
+ }, [pageViewContext]);
82
+ const measured = useOverlayMeasurement((metrics) => {
83
+ const geometry = bridgeGeometry;
84
+ if (!geometry || matches.length === 0)
85
+ return [];
86
+ const result = [];
87
+ matches.forEach((match, index) => {
88
+ // Scrolling to a match queries the same key under the
89
+ // "scroll-into-view" source, so the bridge can report each line box
90
+ // twice until that request is cleared. Paint every box once.
91
+ const seen = new Set();
92
+ const rects = measureBridgeTextRangeRects(geometry, match.key, metrics).filter((rect) => {
93
+ const rectKey = `${Math.round(rect.x)}:${Math.round(rect.y)}:${Math.round(rect.width)}:${Math.round(rect.height)}`;
94
+ if (seen.has(rectKey))
95
+ return false;
96
+ seen.add(rectKey);
97
+ return true;
98
+ });
99
+ if (rects.length === 0)
100
+ return;
101
+ result.push({ key: match.key, active: index === activeIndex, rects });
102
+ });
103
+ return result;
104
+ }, [bridgeGeometry, matches, activeIndex], {
105
+ initialValue: [],
106
+ equals: measuredMatchesEqual,
107
+ interests: ["viewport", "layout", "text", "adornment-data"],
108
+ });
109
+ if (measured.length === 0)
110
+ return null;
111
+ return (_jsx(_Fragment, { children: measured.flatMap((match) => match.rects.map((rect, index) => (_jsx("div", { className: match.active
112
+ ? "bg-feedback-orange/45 pointer-events-none absolute rounded-sm shadow-[0_0_0_2px_color-mix(in_srgb,var(--color-feedback-orange)_60%,transparent)]"
113
+ : "bg-feedback-orange/25 pointer-events-none absolute rounded-sm", "data-testid": FIND_REPLACE_HIGHLIGHT_TEST_ID, "data-active": match.active ? "true" : undefined, style: {
114
+ top: rect.y,
115
+ left: rect.x,
116
+ width: Math.max(rect.width, 2),
117
+ height: Math.max(rect.height, 2),
118
+ } }, `${match.key}-${index}`)))) }));
119
+ }
120
+ //# sourceMappingURL=FindReplaceHighlightings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindReplaceHighlightings.js","sourceRoot":"","sources":["../../../src/editor/page-editor-chrome/FindReplaceHighlightings.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type PageViewContext } from "../page-viewer/pageViewContext";
2
+ export declare const SPELLCHECK_HIGHLIGHT_TEST_ID = "spellcheck-highlight";
3
+ /**
4
+ * Underlines misspelled words on the canvas without touching the site DOM:
5
+ * the writable text fields of the page's items are checked through the shared
6
+ * client, every misspelling is published as a bridge text range (the same
7
+ * primitive find-and-replace, comments and version diff use), and the rects
8
+ * the bridge reports get a wavy strip along their bottom edge.
9
+ */
10
+ export declare function SpellCheckHighlightings({ pageViewContext, }: {
11
+ pageViewContext: PageViewContext;
12
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,197 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
3
+ import { useEditContext } from "../client/editContext";
4
+ import { collectFindReplaceItemSources, descriptorKey, } from "../find-replace/findReplaceTargets";
5
+ import { usePageViewState, } from "../page-viewer/pageViewContext";
6
+ import { spellCheckCanvasStore } from "../spellcheck/spellCheckCanvasStore";
7
+ import { collectSpellCheckCanvasMatches, collectSpellCheckTargets, getSpellCheckCanvasClientKey, SPELLCHECK_BRIDGE_SOURCE, toSpellCheckBridgeTextRange, } from "../spellcheck/spellCheckCanvasTargets";
8
+ import { spellCheckClient } from "../spellcheck/spellCheckClient";
9
+ import { SPELLCHECK_UNDERLINE_HEIGHT, spellCheckUnderlineClass, } from "../spellcheck/spellCheckStyles";
10
+ import { useSpellCheckEnabled } from "../spellcheck/useSpellCheck";
11
+ import { measureBridgeTextRangeRects, rectListEquals, } from "./overlay/geometry";
12
+ import { useOverlayMeasurement } from "./overlay/useOverlayMeasurement";
13
+ import { buildOverviewRulerMarks, usePublishOverviewRulerMarks, } from "../page-viewer/overviewRuler";
14
+ export const SPELLCHECK_HIGHLIGHT_TEST_ID = "spellcheck-highlight";
15
+ const EMPTY_ITEMS = [];
16
+ function measuredMatchesEqual(previous, next) {
17
+ if (previous.length !== next.length)
18
+ return false;
19
+ for (let i = 0; i < previous.length; i++) {
20
+ const a = previous[i];
21
+ const b = next[i];
22
+ if (a.key !== b.key || a.word !== b.word)
23
+ return false;
24
+ if (!rectListEquals(a.rects, b.rects))
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ /**
30
+ * Underlines misspelled words on the canvas without touching the site DOM:
31
+ * the writable text fields of the page's items are checked through the shared
32
+ * client, every misspelling is published as a bridge text range (the same
33
+ * primitive find-and-replace, comments and version diff use), and the rects
34
+ * the bridge reports get a wavy strip along their bottom edge.
35
+ */
36
+ export function SpellCheckHighlightings({ pageViewContext, }) {
37
+ const editContext = useEditContext();
38
+ const preferenceEnabled = useSpellCheckEnabled();
39
+ const enabled = preferenceEnabled && !!editContext && editContext.mode === "edit";
40
+ const sources = useMemo(() => editContext
41
+ ? collectFindReplaceItemSources({
42
+ page: editContext.page,
43
+ item: editContext.item,
44
+ currentItemDescriptor: editContext.currentItemDescriptor,
45
+ scope: editContext.page?.rootComponent ? "page" : "item",
46
+ })
47
+ : [], [editContext?.page, editContext?.item, editContext?.currentItemDescriptor]);
48
+ // The page object is replaced on every canvas refresh; reload only when the
49
+ // set of items changed or a field value changed underneath us.
50
+ const signature = sources.map((source) => descriptorKey(source.descriptor)).join("|");
51
+ const sourcesRef = useRef(sources);
52
+ sourcesRef.current = sources;
53
+ const [items, setItems] = useState(EMPTY_ITEMS);
54
+ const [reloadTick, setReloadTick] = useState(0);
55
+ const itemsRepository = editContext?.itemsRepository;
56
+ useEffect(() => {
57
+ if (!enabled || !itemsRepository)
58
+ return;
59
+ let cancelled = false;
60
+ itemsRepository
61
+ .getItems(sourcesRef.current.map((source) => source.descriptor))
62
+ .then((loaded) => {
63
+ if (!cancelled)
64
+ setItems(loaded);
65
+ })
66
+ .catch((error) => {
67
+ console.error("[SpellCheckHighlightings] Could not load items", error);
68
+ });
69
+ return () => {
70
+ cancelled = true;
71
+ };
72
+ }, [enabled, itemsRepository, signature, reloadTick]);
73
+ useEffect(() => {
74
+ if (!enabled || !itemsRepository)
75
+ return;
76
+ let timer;
77
+ const unsubscribe = itemsRepository.subscribeItemsChanged(() => {
78
+ if (timer !== undefined)
79
+ window.clearTimeout(timer);
80
+ timer = window.setTimeout(() => setReloadTick((tick) => tick + 1), 150);
81
+ });
82
+ return () => {
83
+ unsubscribe();
84
+ if (timer !== undefined)
85
+ window.clearTimeout(timer);
86
+ };
87
+ }, [enabled, itemsRepository]);
88
+ const targets = useMemo(() => (enabled ? collectSpellCheckTargets(items, sources) : []), [enabled, items, sources]);
89
+ // Register every target's text with the client and follow its results.
90
+ const revision = useSyncExternalStore(spellCheckClient.subscribe, spellCheckClient.getRevision, spellCheckClient.getRevision);
91
+ useEffect(() => {
92
+ targets.forEach((target) => spellCheckClient.request(getSpellCheckCanvasClientKey(target), target.language, target.text));
93
+ return () => {
94
+ targets.forEach((target) => spellCheckClient.release(getSpellCheckCanvasClientKey(target)));
95
+ };
96
+ }, [targets]);
97
+ const matches = useMemo(() => collectSpellCheckCanvasMatches(targets, (language, text) => spellCheckClient.getResult(language, text)?.misspellings),
98
+ // The client revision is what makes fresh results visible.
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ [targets, revision]);
101
+ useEffect(() => {
102
+ spellCheckCanvasStore.set(matches, targets);
103
+ }, [matches, targets]);
104
+ useEffect(() => () => spellCheckCanvasStore.reset(), []);
105
+ const textRanges = useMemo(() => matches.map(toSpellCheckBridgeTextRange), [matches]);
106
+ const lastPublishedSignatureRef = useRef("");
107
+ const bridgeReady = usePageViewState(pageViewContext, (state) => state.bridgeReady);
108
+ const bridgeGeometry = usePageViewState(pageViewContext, (state) => state.bridgeGeometry);
109
+ useEffect(() => {
110
+ if (!bridgeReady) {
111
+ lastPublishedSignatureRef.current = "";
112
+ return;
113
+ }
114
+ const rangesSignature = textRanges.length > 0 ? JSON.stringify(textRanges) : "";
115
+ if (rangesSignature === lastPublishedSignatureRef.current)
116
+ return;
117
+ let cancelled = false;
118
+ let retryTimer;
119
+ let retryCount = 0;
120
+ const publish = () => {
121
+ if (cancelled)
122
+ return;
123
+ // The frame installs requestBridgeGeometry after its children mounted
124
+ // and a reconnect can briefly reject commands; only remember the
125
+ // signature once the bridge accepted it.
126
+ const accepted = pageViewContext.requestBridgeGeometry?.({
127
+ source: SPELLCHECK_BRIDGE_SOURCE,
128
+ textRanges,
129
+ });
130
+ if (accepted) {
131
+ lastPublishedSignatureRef.current = rangesSignature;
132
+ return;
133
+ }
134
+ const delay = Math.min(50 * 2 ** retryCount, 500);
135
+ retryCount += 1;
136
+ retryTimer = window.setTimeout(publish, delay);
137
+ };
138
+ publish();
139
+ return () => {
140
+ cancelled = true;
141
+ if (retryTimer !== undefined)
142
+ window.clearTimeout(retryTimer);
143
+ };
144
+ }, [pageViewContext, bridgeReady, textRanges]);
145
+ useEffect(() => () => {
146
+ pageViewContext.requestBridgeGeometry?.({
147
+ source: SPELLCHECK_BRIDGE_SOURCE,
148
+ textRanges: [],
149
+ });
150
+ }, [pageViewContext]);
151
+ const measured = useOverlayMeasurement((metrics) => {
152
+ const geometry = bridgeGeometry;
153
+ if (!geometry || matches.length === 0)
154
+ return [];
155
+ const result = [];
156
+ matches.forEach((match) => {
157
+ const seen = new Set();
158
+ const rects = measureBridgeTextRangeRects(geometry, match.key, metrics).filter((rect) => {
159
+ const rectKey = `${Math.round(rect.x)}:${Math.round(rect.y)}:${Math.round(rect.width)}:${Math.round(rect.height)}`;
160
+ if (seen.has(rectKey))
161
+ return false;
162
+ seen.add(rectKey);
163
+ return true;
164
+ });
165
+ if (rects.length === 0)
166
+ return;
167
+ result.push({ key: match.key, word: match.word, rects });
168
+ });
169
+ return result;
170
+ }, [bridgeGeometry, matches], {
171
+ initialValue: [],
172
+ equals: measuredMatchesEqual,
173
+ interests: ["viewport", "layout", "text", "adornment-data"],
174
+ });
175
+ // The canvas overview ruler marks every misspelled word on the page; a
176
+ // click scrolls to it.
177
+ const rulerMarks = useMemo(() => {
178
+ if (!enabled || measured.length === 0)
179
+ return null;
180
+ return buildOverviewRulerMarks(measured.map((match) => ({
181
+ tone: "spelling",
182
+ rects: match.rects,
183
+ ids: [match.key],
184
+ details: [match.word],
185
+ })));
186
+ }, [enabled, measured]);
187
+ usePublishOverviewRulerMarks("spelling", rulerMarks);
188
+ if (!enabled || measured.length === 0)
189
+ return null;
190
+ return (_jsx(_Fragment, { children: measured.flatMap((match) => match.rects.map((rect, index) => (_jsx("div", { className: `${spellCheckUnderlineClass} pointer-events-none absolute`, "data-testid": SPELLCHECK_HIGHLIGHT_TEST_ID, "data-word": match.word, style: {
191
+ top: rect.y + rect.height - SPELLCHECK_UNDERLINE_HEIGHT,
192
+ left: rect.x,
193
+ width: Math.max(rect.width, 2),
194
+ height: SPELLCHECK_UNDERLINE_HEIGHT,
195
+ } }, `${match.key}-${index}`)))) }));
196
+ }
197
+ //# sourceMappingURL=SpellCheckHighlightings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpellCheckHighlightings.js","sourceRoot":"","sources":["../../../src/editor/page-editor-chrome/SpellCheckHighlightings.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type PageViewContext } from "../page-viewer/pageViewContext";
2
+ /**
3
+ * Marks the page's validation issues on the canvas overview ruler, one dash
4
+ * per field in its worst severity's colour, the messages as its tooltip. A
5
+ * click scrolls to the field, selects its component and focuses the field, so
6
+ * the form shows the issue. Issues on fields the canvas does not render have
7
+ * no place on the ruler; the Validation sidebar lists them.
8
+ */
9
+ export declare function ValidationRulerMarks({ pageViewContext, }: {
10
+ pageViewContext: PageViewContext;
11
+ }): null;
@@ -0,0 +1,56 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { useEditContext, useFieldsEditContext } from "../client/editContext";
3
+ import { usePageViewState, } from "../page-viewer/pageViewContext";
4
+ import { buildOverviewRulerMarks, overviewRulerMarksEqual, usePublishOverviewRulerMarks, } from "../page-viewer/overviewRuler";
5
+ import { collectValidationRulerIssues } from "../validation/validationRulerIssues";
6
+ import { measureBridgeFieldRect } from "./overlay/geometry";
7
+ import { useOverlayMeasurement } from "./overlay/useOverlayMeasurement";
8
+ /**
9
+ * Marks the page's validation issues on the canvas overview ruler, one dash
10
+ * per field in its worst severity's colour, the messages as its tooltip. A
11
+ * click scrolls to the field, selects its component and focuses the field, so
12
+ * the form shows the issue. Issues on fields the canvas does not render have
13
+ * no place on the ruler; the Validation sidebar lists them.
14
+ */
15
+ export function ValidationRulerMarks({ pageViewContext, }) {
16
+ const editContext = useEditContext();
17
+ const fieldsContext = useFieldsEditContext();
18
+ const bridgeGeometry = usePageViewState(pageViewContext, (state) => state.bridgeGeometry);
19
+ const bridgeStructure = usePageViewState(pageViewContext, (state) => state.bridgeStructure);
20
+ const issues = useMemo(() => collectValidationRulerIssues(editContext?.validationResult), [editContext?.validationResult]);
21
+ const marks = useOverlayMeasurement((metrics) => {
22
+ if (!bridgeGeometry || issues.length === 0)
23
+ return null;
24
+ const measured = buildOverviewRulerMarks(issues.flatMap((issue) => {
25
+ const rect = measureBridgeFieldRect(bridgeGeometry, bridgeStructure, issue.field, metrics);
26
+ return rect
27
+ ? [
28
+ {
29
+ tone: `validation-${issue.severity}`,
30
+ rects: [rect],
31
+ ids: [issue.key],
32
+ details: issue.messages,
33
+ },
34
+ ]
35
+ : [];
36
+ }));
37
+ return measured.length > 0 ? measured : null;
38
+ }, [bridgeGeometry, bridgeStructure, issues], {
39
+ initialValue: null,
40
+ equals: overviewRulerMarksEqual,
41
+ interests: ["viewport", "layout", "text"],
42
+ });
43
+ const select = editContext?.select;
44
+ const setFocusedField = fieldsContext?.setFocusedField;
45
+ const focusIssue = useCallback((mark, scrollToMark) => {
46
+ scrollToMark();
47
+ const issue = issues.find((candidate) => candidate.key === mark.ids?.[0]);
48
+ if (!issue)
49
+ return;
50
+ select?.([issue.field.item.id]);
51
+ void setFocusedField?.(issue.field, false);
52
+ }, [issues, select, setFocusedField]);
53
+ usePublishOverviewRulerMarks("validation", marks, focusIssue);
54
+ return null;
55
+ }
56
+ //# sourceMappingURL=ValidationRulerMarks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationRulerMarks.js","sourceRoot":"","sources":["../../../src/editor/page-editor-chrome/ValidationRulerMarks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAEL,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,uBAAuB,EAGvB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,eAAe,GAGhB;IACC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAC7C,MAAM,cAAc,GAAG,gBAAgB,CACrC,eAAe,EACf,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAChC,CAAC;IACF,MAAM,eAAe,GAAG,gBAAgB,CACtC,eAAe,EACf,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CACjC,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,4BAA4B,CAAC,WAAW,EAAE,gBAAgB,CAAC,EACjE,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAChC,CAAC;IAEF,MAAM,KAAK,GAAG,qBAAqB,CACjC,CAAC,OAAO,EAAE,EAAE;QACV,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,MAAM,QAAQ,GAAG,uBAAuB,CACtC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,sBAAsB,CACjC,cAAc,EACd,eAAe,EACf,KAAK,CAAC,KAAK,EACX,OAAO,CACR,CAAC;YACF,OAAO,IAAI;gBACT,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,cAAc,KAAK,CAAC,QAAQ,EAAW;wBAC7C,KAAK,EAAE,CAAC,IAAI,CAAC;wBACb,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;wBAChB,OAAO,EAAE,KAAK,CAAC,QAAQ;qBACxB;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;QACT,CAAC,CAAC,CACH,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC,EACD,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC,EACzC;QACE,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;KAC1C,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,EAAE,MAAM,CAAC;IACnC,MAAM,eAAe,GAAG,aAAa,EAAE,eAAe,CAAC;IACvD,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE;QACrB,YAAY,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,KAAK,eAAe,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAClC,CAAC;IACF,4BAA4B,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAE9D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { PageViewState } from "../../page-viewer/pageViewContext";
2
+ import { OverlayRect } from "./geometry";
3
+ /**
4
+ * Measured canvas geometry of one feedback item (comment thread or suggested
5
+ * edit): the document-space rects of its anchored text, or of the field /
6
+ * component it falls back to when no text range can be resolved.
7
+ */
8
+ export type AnchorMeasurement = {
9
+ rects: OverlayRect[];
10
+ isTextRange: boolean;
11
+ };
12
+ export type AnchorMeasurements = Record<string, AnchorMeasurement>;
13
+ export declare function anchorMeasurementsEqual(previous: AnchorMeasurements, next: AnchorMeasurements): boolean;
14
+ export declare function roundMeasurement(value: number): number;
15
+ /** Groups feedback items that share the same measured rects. */
16
+ export declare function getAnchorMeasurementKey(measurement: AnchorMeasurement): string;
17
+ export declare function dedupeOverlayRects(rects: OverlayRect[]): OverlayRect[];
18
+ /**
19
+ * The point a margin card and its leader line attach to: the top of the
20
+ * anchored text, the vertical middle of its first line, and where that first
21
+ * line ends so a leader can leave the text without crossing it.
22
+ */
23
+ export type FeedbackAnchor = {
24
+ y: number;
25
+ lineMidY: number;
26
+ /** Where the first line starts (for a tick mark at the text). */
27
+ xStart: number;
28
+ xEnd: number;
29
+ height: number;
30
+ };
31
+ export declare function getFeedbackAnchor(measurement: AnchorMeasurement | undefined): FeedbackAnchor | null;
32
+ export declare function hasAnyExpectedBridgeTextRange(geometry: PageViewState["bridgeGeometry"], textRanges: {
33
+ key: string;
34
+ }[]): boolean;
35
+ /** Range key of the `index`-th item a feedback range may live on (0 = primary). */
36
+ export declare function getFallbackTextRangeKey(key: string, index: number): string;
37
+ /**
38
+ * Whether every expected range is there. A range queried on several candidate
39
+ * items (`getFallbackTextRangeKey`) only ever resolves on one of them, so it
40
+ * counts as soon as any of its keys does.
41
+ */
42
+ export declare function hasAllExpectedBridgeTextRanges(geometry: PageViewState["bridgeGeometry"], textRanges: {
43
+ key: string;
44
+ }[]): boolean;
@@ -0,0 +1,89 @@
1
+ import { rectListEquals } from "./geometry";
2
+ export function anchorMeasurementsEqual(previous, next) {
3
+ const previousKeys = Object.keys(previous);
4
+ const nextKeys = Object.keys(next);
5
+ if (previousKeys.length !== nextKeys.length)
6
+ return false;
7
+ for (const key of previousKeys) {
8
+ const previousValue = previous[key];
9
+ const nextValue = next[key];
10
+ if (!previousValue || !nextValue)
11
+ return false;
12
+ if (previousValue.isTextRange !== nextValue.isTextRange)
13
+ return false;
14
+ if (!rectListEquals(previousValue.rects, nextValue.rects))
15
+ return false;
16
+ }
17
+ return true;
18
+ }
19
+ export function roundMeasurement(value) {
20
+ return Math.round(value * 2) / 2;
21
+ }
22
+ /** Groups feedback items that share the same measured rects. */
23
+ export function getAnchorMeasurementKey(measurement) {
24
+ const rectKey = measurement.rects
25
+ .map((rect) => `${roundMeasurement(rect.x)}:${roundMeasurement(rect.y)}:${roundMeasurement(rect.width)}:${roundMeasurement(rect.height)}`)
26
+ .join("|");
27
+ return `${measurement.isTextRange ? "text" : "box"}:${rectKey}`;
28
+ }
29
+ export function dedupeOverlayRects(rects) {
30
+ const seen = new Set();
31
+ return rects.filter((rect) => {
32
+ const key = [
33
+ Math.round(rect.x * 100),
34
+ Math.round(rect.y * 100),
35
+ Math.round(rect.width * 100),
36
+ Math.round(rect.height * 100),
37
+ ].join(":");
38
+ if (seen.has(key))
39
+ return false;
40
+ seen.add(key);
41
+ return true;
42
+ });
43
+ }
44
+ export function getFeedbackAnchor(measurement) {
45
+ if (!measurement || measurement.rects.length === 0)
46
+ return null;
47
+ let first = measurement.rects[0];
48
+ for (const rect of measurement.rects) {
49
+ if (rect.y < first.y - 0.5 ||
50
+ (Math.abs(rect.y - first.y) <= 0.5 && rect.x < first.x)) {
51
+ first = rect;
52
+ }
53
+ }
54
+ const y = Math.min(...measurement.rects.map((rect) => rect.y));
55
+ const bottom = Math.max(...measurement.rects.map((rect) => rect.y + rect.height));
56
+ return {
57
+ y,
58
+ lineMidY: first.y + first.height / 2,
59
+ xStart: first.x,
60
+ xEnd: first.x + first.width,
61
+ height: Math.max(0, bottom - y),
62
+ };
63
+ }
64
+ export function hasAnyExpectedBridgeTextRange(geometry, textRanges) {
65
+ if (!geometry)
66
+ return false;
67
+ const expectedKeys = new Set(textRanges.map((range) => range.key));
68
+ return geometry.targets.some((target) => target.kind === "textRange" && expectedKeys.has(target.key));
69
+ }
70
+ const FALLBACK_RANGE_KEY_SUFFIX = /:alt\d+$/;
71
+ /** Range key of the `index`-th item a feedback range may live on (0 = primary). */
72
+ export function getFallbackTextRangeKey(key, index) {
73
+ return index === 0 ? key : `${key}:alt${index}`;
74
+ }
75
+ /**
76
+ * Whether every expected range is there. A range queried on several candidate
77
+ * items (`getFallbackTextRangeKey`) only ever resolves on one of them, so it
78
+ * counts as soon as any of its keys does.
79
+ */
80
+ export function hasAllExpectedBridgeTextRanges(geometry, textRanges) {
81
+ if (!geometry)
82
+ return false;
83
+ const baseKey = (key) => key.replace(FALLBACK_RANGE_KEY_SUFFIX, "");
84
+ const availableKeys = new Set(geometry.targets
85
+ .filter((target) => target.kind === "textRange")
86
+ .map((target) => baseKey(target.key)));
87
+ return textRanges.every((range) => availableKeys.has(baseKey(range.key)));
88
+ }
89
+ //# sourceMappingURL=feedbackAnchorMeasurements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedbackAnchorMeasurements.js","sourceRoot":"","sources":["../../../../src/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { AnchorMeasurements } from "./feedbackAnchorMeasurements";
2
+ /**
3
+ * The canvas overlay's measured comment and suggestion anchors, shared per
4
+ * iframe with the comment margin beside it. The margin never measures on its
5
+ * own: its cards must sit exactly where the highlights are, and one source of
6
+ * truth is the only way to guarantee that.
7
+ */
8
+ export type FeedbackAnchorSnapshot = {
9
+ comments: AnchorMeasurements;
10
+ suggestions: AnchorMeasurements;
11
+ };
12
+ export declare function publishCommentAnchors(key: object | null | undefined, comments: AnchorMeasurements): void;
13
+ export declare function publishSuggestionAnchors(key: object | null | undefined, suggestions: AnchorMeasurements): void;
14
+ export declare function getFeedbackAnchors(key: object | null | undefined): FeedbackAnchorSnapshot;
15
+ export declare function subscribeFeedbackAnchors(key: object | null | undefined, listener: () => void): () => void;
16
+ /** The canvas anchors published for `key` (the page iframe element). */
17
+ export declare function useFeedbackAnchors(key: object | null | undefined): FeedbackAnchorSnapshot;