@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,28 @@
1
+ import { Comment as CommentType } from "../../types";
2
+ export declare const COMMENT_THREAD_AGENT_LINK_LABEL = "Resolve with agent";
3
+ /**
4
+ * Put this class on the element whose hover reveals the link (the thread card
5
+ * or the popover body). Touch devices get the link permanently.
6
+ */
7
+ export declare const COMMENT_THREAD_HOVER_GROUP_CLASS = "group/comment-thread";
8
+ type CommentThreadAgentLinkProps = {
9
+ rootComment: CommentType;
10
+ /** Every comment of the thread; order does not matter. */
11
+ threadComments: readonly CommentType[];
12
+ resolvedAuthorNames?: Record<string, string>;
13
+ className?: string;
14
+ /**
15
+ * Shares a single line with other actions (margin balloon): never wraps;
16
+ * the label truncates before it would push the line apart.
17
+ */
18
+ compact?: boolean;
19
+ onStarted?: () => void;
20
+ };
21
+ /**
22
+ * Link rendered at the end of a comment conversation that starts an agent
23
+ * seeded with the complete thread. Renders nothing when agents are not
24
+ * available or the thread cannot be worked on (resolved, read-only, unsaved).
25
+ * Hidden until the surrounding thread is hovered or the link has focus.
26
+ */
27
+ export declare function CommentThreadAgentLink({ rootComment, threadComments, resolvedAuthorNames, className, compact, onStarted, }: CommentThreadAgentLinkProps): import("react").JSX.Element | null;
28
+ export {};
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Sparkles } from "lucide-react";
3
+ import { useEditContext } from "../client/editContext";
4
+ import { LicenseFeatures, useFeature } from "../../licensing";
5
+ import { hasAgentsPanel } from "../validation/validationFixAgent";
6
+ import { openAiAgentForCommentThread } from "./commentAi";
7
+ import { cn } from "../../lib/utils";
8
+ export const COMMENT_THREAD_AGENT_LINK_LABEL = "Resolve with agent";
9
+ /**
10
+ * Put this class on the element whose hover reveals the link (the thread card
11
+ * or the popover body). Touch devices get the link permanently.
12
+ */
13
+ export const COMMENT_THREAD_HOVER_GROUP_CLASS = "group/comment-thread";
14
+ /**
15
+ * Link rendered at the end of a comment conversation that starts an agent
16
+ * seeded with the complete thread. Renders nothing when agents are not
17
+ * available or the thread cannot be worked on (resolved, read-only, unsaved).
18
+ * Hidden until the surrounding thread is hovered or the link has focus.
19
+ */
20
+ export function CommentThreadAgentLink({ rootComment, threadComments, resolvedAuthorNames, className, compact = false, onStarted, }) {
21
+ const editContext = useEditContext();
22
+ const canUseAi = useFeature(LicenseFeatures.AI);
23
+ if (!canUseAi ||
24
+ !hasAgentsPanel(editContext) ||
25
+ rootComment.isNew ||
26
+ rootComment.isResolved ||
27
+ editContext?.readonly) {
28
+ return null;
29
+ }
30
+ return (_jsx("div", { className: cn("flex", compact && "min-w-0", className), children: _jsxs("button", { type: "button", className: cn("text-neutral-grey-50 hover:text-neutral-grey-100 inline-flex items-start text-left text-xs leading-4 underline-offset-2 transition-opacity hover:underline focus-visible:opacity-100", compact ? "max-w-full min-w-0 gap-1" : "gap-1.5", !editContext?.isMobile &&
31
+ "opacity-0 group-hover/comment-thread:opacity-100"), title: compact ? COMMENT_THREAD_AGENT_LINK_LABEL : undefined, "data-testid": "comment-thread-start-agent", onClick: (event) => {
32
+ event.stopPropagation();
33
+ openAiAgentForCommentThread(rootComment, threadComments, editContext, resolvedAuthorNames);
34
+ onStarted?.();
35
+ }, children: [_jsx(Sparkles, { className: "mt-px h-3.5 w-3.5 shrink-0", strokeWidth: 1 }), compact ? (_jsx("span", { className: "truncate", children: COMMENT_THREAD_AGENT_LINK_LABEL })) : (COMMENT_THREAD_AGENT_LINK_LABEL)] }) }));
36
+ }
37
+ //# sourceMappingURL=CommentThreadAgentLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentThreadAgentLink.js","sourceRoot":"","sources":["../../../src/editor/reviews/CommentThreadAgentLink.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,CAAC,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AAEpE;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAgBvE;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,OAAO,GAAG,KAAK,EACf,SAAS,GACmB;IAC5B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAEhD,IACE,CAAC,QAAQ;QACT,CAAC,cAAc,CAAC,WAAW,CAAC;QAC5B,WAAW,CAAC,KAAK;QACjB,WAAW,CAAC,UAAU;QACtB,WAAW,EAAE,QAAQ,EACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,IAAI,SAAS,EAAE,SAAS,CAAC,YACzD,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CACX,sLAAsL,EACtL,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,SAAS,EAChD,CAAC,WAAW,EAAE,QAAQ;gBACpB,kDAAkD,CACrD,EACD,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,SAAS,iBAChD,4BAA4B,EACxC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,2BAA2B,CACzB,WAAW,EACX,cAAc,EACd,WAAW,EACX,mBAAmB,CACpB,CAAC;gBACF,SAAS,EAAE,EAAE,CAAC;YAChB,CAAC,aAED,KAAC,QAAQ,IAAC,SAAS,EAAC,4BAA4B,EAAC,WAAW,EAAE,CAAC,GAAI,EAClE,OAAO,CAAC,CAAC,CAAC,CACT,eAAM,SAAS,EAAC,UAAU,YAAE,+BAA+B,GAAQ,CACpE,CAAC,CAAC,CAAC,CACF,+BAA+B,CAChC,IACM,GACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type Ref } from "react";
2
+ import type { FeedbackNavigation } from "./CommentQuote";
3
+ import type { CommentThread } from "./feedbackThreads";
4
+ import type { FeedbackItem } from "./feedbackOrdering";
5
+ export type CommentThreadCardProps = {
6
+ thread: CommentThread;
7
+ availableTags: {
8
+ label: string;
9
+ color: string;
10
+ }[];
11
+ getAuthorName: (item: FeedbackItem) => string;
12
+ resolvedAuthorNames: Record<string, string>;
13
+ selected: boolean;
14
+ navigation?: FeedbackNavigation;
15
+ className?: string;
16
+ /** Bounds the thread body (which then scrolls) so one long thread never
17
+ * exceeds the page beside it. */
18
+ bodyMaxHeight?: number;
19
+ /**
20
+ * Word-style margin balloon: flat frame without the context header, small
21
+ * type, replies collapsed and the reply composer opened on demand.
22
+ */
23
+ balloon?: boolean;
24
+ /** Name what the thread is about (a balloon that is not beside it). */
25
+ showContext?: boolean;
26
+ onHoverChange?: (hovered: boolean) => void;
27
+ cardRef?: Ref<HTMLDivElement>;
28
+ };
29
+ /**
30
+ * One comment thread: the root comment, its replies (collapsible), the agent
31
+ * link and the reply composer. Reply target, reply text and collapse state
32
+ * live in the thread's draft so the card can be re-homed without losing them.
33
+ */
34
+ export declare function CommentThreadCard({ thread, availableTags, getAuthorName, resolvedAuthorNames, selected, navigation, className, bodyMaxHeight, balloon, showContext, onHoverChange, cardRef, }: CommentThreadCardProps): import("react").JSX.Element;
@@ -0,0 +1,156 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { ChevronDown, ChevronRight, Reply } from "lucide-react";
4
+ import uuid from "react-uuid";
5
+ import { toast } from "sonner";
6
+ import { useEditContext, useFieldsEditContext } from "../client/editContext";
7
+ import { CloseButton } from "../../components/ui/close-button";
8
+ import { cn } from "../../lib/utils";
9
+ import { createOrUpdateComment } from "../services/reviewsService";
10
+ import { Comment as CommentComponent } from "./Comment";
11
+ import { CommentEditor, COMMENT_INPUT_PLACEHOLDER } from "./CommentEditor";
12
+ import { COMMENT_THREAD_HOVER_GROUP_CLASS, CommentThreadAgentLink, } from "./CommentThreadAgentLink";
13
+ import { FeedbackCardFrame, getCommentContextSegments } from "./FeedbackCard";
14
+ import { canReplyToComment } from "./feedbackCommentRules";
15
+ import { useFeedbackDraft } from "./feedbackDrafts";
16
+ import { isTextSelectionClick, selectFeedbackComment, } from "./feedbackSelection";
17
+ import { activateCommentsMode } from "./openCommentsFeedback";
18
+ function buildReplyFrom(base, text, quoteParent, context) {
19
+ return {
20
+ id: uuid(),
21
+ isNew: false,
22
+ parentCommentId: base.id,
23
+ quoteParentComment: quoteParent,
24
+ itemId: base.itemId,
25
+ itemName: base.itemName,
26
+ fieldId: base.fieldId,
27
+ fieldName: base.fieldName,
28
+ mainItemId: base.mainItemId,
29
+ language: base.language || context.language,
30
+ version: base.version || context.version,
31
+ position: 0,
32
+ rangeStart: base.rangeStart,
33
+ rangeEnd: base.rangeEnd,
34
+ author: context.author,
35
+ authorDisplayName: context.authorDisplayName,
36
+ created: new Date().toISOString(),
37
+ text,
38
+ tags: "",
39
+ fieldValue: base.fieldValue,
40
+ };
41
+ }
42
+ /**
43
+ * One comment thread: the root comment, its replies (collapsible), the agent
44
+ * link and the reply composer. Reply target, reply text and collapse state
45
+ * live in the thread's draft so the card can be re-homed without losing them.
46
+ */
47
+ export function CommentThreadCard({ thread, availableTags, getAuthorName, resolvedAuthorNames, selected, navigation = "dom", className, bodyMaxHeight, balloon = false, showContext = false, onHoverChange, cardRef, }) {
48
+ const editContext = useEditContext();
49
+ const fieldsContext = useFieldsEditContext();
50
+ const { root, replies } = thread;
51
+ const [draft, updateDraft, clearDraft] = useFeedbackDraft(thread.id);
52
+ const [isSavingReply, setIsSavingReply] = useState(false);
53
+ // Balloons keep replies folded until asked; the list shows them.
54
+ const isCollapsed = draft.collapsed ?? balloon;
55
+ const replyTarget = draft.replyTargetCommentId
56
+ ? [root, ...replies].find((comment) => comment.id === draft.replyTargetCommentId)
57
+ : undefined;
58
+ // Closing the composer discards its draft: the editor has already revoked
59
+ // its pasted images, which must not come back in the next composer.
60
+ const setReplyTarget = (target) => updateDraft(target
61
+ ? { replyTargetCommentId: target.id, collapsed: false }
62
+ : {
63
+ replyTargetCommentId: undefined,
64
+ replyText: undefined,
65
+ replyAttachments: undefined,
66
+ });
67
+ // A card can unmount under the pointer (deleted, resolved, re-homed by the
68
+ // margin) without a mouseleave; do not leave its hover behind.
69
+ const onHoverChangeRef = useRef(onHoverChange);
70
+ onHoverChangeRef.current = onHoverChange;
71
+ useEffect(() => () => onHoverChangeRef.current?.(false), []);
72
+ const contextSegments = getCommentContextSegments(root, editContext?.currentItemDescriptor?.name);
73
+ const cancelNewComment = (event) => {
74
+ event.stopPropagation();
75
+ if (!root.isNew)
76
+ return;
77
+ editContext?.setComments?.((comments) => comments.filter((comment) => comment.id !== root.id));
78
+ if (editContext?.selectedComment?.id === root.id) {
79
+ editContext.setSelectedComment(undefined);
80
+ }
81
+ // Every draft comment has a fresh id; nothing would ever reuse this entry.
82
+ clearDraft();
83
+ };
84
+ const handleReplySave = async (target, text) => {
85
+ if (!editContext?.currentItemDescriptor)
86
+ return;
87
+ activateCommentsMode(editContext, { reason: "comment-reply" });
88
+ const descriptor = editContext.currentItemDescriptor;
89
+ // A balloon opens its composer by targeting the root; that is a plain
90
+ // reply to the thread, not a quote of it.
91
+ const quotesTarget = replyTarget?.id === target.id && !(balloon && target.id === root.id);
92
+ const newReply = buildReplyFrom(target, text, quotesTarget, {
93
+ language: descriptor.language,
94
+ version: descriptor.version,
95
+ author: editContext.user?.name,
96
+ authorDisplayName: editContext.user?.fullName,
97
+ });
98
+ setIsSavingReply(true);
99
+ try {
100
+ const result = await createOrUpdateComment(newReply);
101
+ if (result.type === "error" || result.type === "unauthorized") {
102
+ console.error("Failed to save reply comment:", result);
103
+ toast.error(result.details || result.summary || "Failed to save reply comment");
104
+ return;
105
+ }
106
+ updateDraft({
107
+ replyTargetCommentId: undefined,
108
+ replyText: undefined,
109
+ replyAttachments: undefined,
110
+ });
111
+ await editContext.loadComments?.();
112
+ }
113
+ catch (error) {
114
+ console.error("Failed to save reply comment:", error);
115
+ toast.error(error instanceof Error ? error.message : "Failed to save reply comment");
116
+ }
117
+ finally {
118
+ setIsSavingReply(false);
119
+ }
120
+ };
121
+ const canReplyToRoot = !!editContext && canReplyToComment(root, root, editContext.readonly);
122
+ const renderReplyEditor = () => {
123
+ if (!editContext)
124
+ return null;
125
+ // The list always offers the composer; a balloon only after "Reply".
126
+ if (balloon && !replyTarget)
127
+ return null;
128
+ const target = replyTarget ?? root;
129
+ if (!canReplyToComment(target, root, editContext.readonly)) {
130
+ return null;
131
+ }
132
+ return (_jsxs("div", { className: balloon ? "mt-2 pl-7" : "mt-3 pt-3", onClick: (event) => event.stopPropagation(), children: [replyTarget && (!balloon || replyTarget.id !== root.id) && (_jsxs("div", { className: "text-neutral-grey-50 mb-2 flex items-center justify-between gap-2 text-xs", children: [_jsxs("span", { className: "truncate", children: ["Replying to ", getAuthorName(replyTarget)] }), _jsx("button", { type: "button", className: "badge-pad-sm text-neutral-grey-50 hover:bg-neutral-grey-5 shrink-0 rounded", onClick: () => setReplyTarget(undefined), children: "Cancel" })] })), _jsx(CommentEditor, { onSave: (text) => handleReplySave(target, text), onCancel: () => setReplyTarget(undefined), isSaving: isSavingReply, placeholder: balloon ? "Reply or @mention" : COMMENT_INPUT_PLACEHOLDER, submitLabel: "Reply", showTagSelector: false, showCancelButton: balloon, balloon: balloon, clearOnSave: true, compact: true, autoFocus: !!replyTarget, value: draft.replyText, onValueChange: (replyText) => updateDraft({ replyText }), attachments: draft.replyAttachments, onAttachmentsChange: (replyAttachments) => updateDraft({ replyAttachments }) }, target.id)] }));
133
+ };
134
+ const repliesLabel = `${replies.length} ${replies.length === 1 ? "reply" : "replies"}`;
135
+ const agentLink = (_jsx(CommentThreadAgentLink, { rootComment: root, threadComments: [root, ...replies], resolvedAuthorNames: resolvedAuthorNames, className: balloon ? "ml-auto" : "mt-1", compact: balloon }));
136
+ return (_jsx("div", { ref: cardRef, "data-feedback-thread-id": thread.id, onMouseEnter: onHoverChange ? () => onHoverChange(true) : undefined, onMouseLeave: onHoverChange ? () => onHoverChange(false) : undefined, children: _jsxs(FeedbackCardFrame, { variant: balloon ? "balloon" : "card", contextSegments: contextSegments, showBalloonContext: showContext, selected: selected, className: cn("cursor-pointer", COMMENT_THREAD_HOVER_GROUP_CLASS, className), bodyClassName: bodyMaxHeight ? "overflow-auto" : undefined, bodyStyle: bodyMaxHeight ? { maxHeight: bodyMaxHeight } : undefined, bodyScrollable: !!bodyMaxHeight, testId: "comment-thread", headerAction:
137
+ // The list's frame header holds the draft's close button; a balloon
138
+ // has no header, its input carries the cancel button instead.
139
+ root.isNew && !balloon ? (_jsx(CloseButton, { onClick: cancelNewComment, "data-testid": "add-comment-cancel", label: "Cancel" })) : undefined, onClick: (event) => {
140
+ // A mouse release that ends a text drag-selection also clicks; keep
141
+ // the selection instead of jumping.
142
+ if (isTextSelectionClick(event.currentTarget, event))
143
+ return;
144
+ void selectFeedbackComment(root, editContext, fieldsContext);
145
+ }, children: [_jsx(CommentComponent, { comment: root, availableTags: availableTags, rootCommentId: root.id, resolvedAuthorName: getAuthorName(root), variant: "inline", showContextHeader: false, showEditorCancelButton: !root.isNew, navigation: navigation, balloon: balloon, onReply: (target) => setReplyTarget(target) }), (replies.length > 0 || (balloon && canReplyToRoot && !root.isNew)) && (_jsxs("div", { className: cn("text-neutral-grey-50 flex items-center",
146
+ // One line, always: a wrapped (hover-only) agent link would
147
+ // reserve an empty line in every balloon.
148
+ balloon ? "mt-1 gap-2 pl-7 whitespace-nowrap" : "mb-3 gap-3"), children: [replies.length > 0 && (_jsxs("button", { type: "button", "data-testid": "comment-thread-replies-toggle", "aria-expanded": !isCollapsed, className: cn("hover:text-neutral-grey-100 flex items-center gap-1 text-left", !balloon && "text-neutral-grey-100 text-sm"), onClick: (event) => {
149
+ event.stopPropagation();
150
+ updateDraft({ collapsed: !isCollapsed });
151
+ }, children: [isCollapsed ? (_jsx(ChevronRight, { size: 12, strokeWidth: 1.5 })) : (_jsx(ChevronDown, { size: 12, strokeWidth: 1.5 })), repliesLabel] })), balloon && canReplyToRoot && !root.isNew && !replyTarget && (_jsxs("button", { type: "button", "data-testid": "comment-reply-button", className: "hover:text-neutral-grey-100 flex items-center gap-1", onClick: (event) => {
152
+ event.stopPropagation();
153
+ setReplyTarget(root);
154
+ }, children: [_jsx(Reply, { size: 12, strokeWidth: 1.5 }), "Reply"] })), balloon && agentLink] })), replies.length > 0 && !isCollapsed && (_jsx("div", { className: cn(balloon && "border-border-default mt-1.5 ml-2.5 border-l pl-3"), children: replies.map((reply) => (_jsx(CommentComponent, { comment: reply, availableTags: availableTags, rootCommentId: root.id, resolvedAuthorName: getAuthorName(reply), variant: "inline", showContextHeader: false, navigation: navigation, balloon: balloon, onReply: (target) => setReplyTarget(target) }, reply.id))) })), !balloon && agentLink, renderReplyEditor()] }) }));
155
+ }
156
+ //# sourceMappingURL=CommentThreadCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentThreadCard.js","sourceRoot":"","sources":["../../../src/editor/reviews/CommentThreadCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA6B,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EACL,gCAAgC,EAChC,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAyB9D,SAAS,cAAc,CACrB,IAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,OAKC;IAED,OAAO;QACL,EAAE,EAAE,IAAI,EAAE;QACV,KAAK,EAAE,KAAK;QACZ,eAAe,EAAE,IAAI,CAAC,EAAE;QACxB,kBAAkB,EAAE,WAAW;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;QACxC,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,IAAI;QACJ,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,QAAQ,EACR,UAAU,GAAG,KAAK,EAClB,SAAS,EACT,aAAa,EACb,OAAO,GAAG,KAAK,EACf,WAAW,GAAG,KAAK,EACnB,aAAa,EACb,OAAO,GACgB;IACvB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAC7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1D,iEAAiE;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,oBAAoB;QAC5C,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CACrB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,oBAAoB,CACvD;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,cAAc,GAAG,CAAC,MAA+B,EAAE,EAAE,CACzD,WAAW,CACT,MAAM;QACJ,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;QACvD,CAAC,CAAC;YACE,oBAAoB,EAAE,SAAS;YAC/B,SAAS,EAAE,SAAS;YACpB,gBAAgB,EAAE,SAAS;SAC5B,CACN,CAAC;IAEJ,2EAA2E;IAC3E,+DAA+D;IAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/C,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IACzC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAE7D,MAAM,eAAe,GAAG,yBAAyB,CAC/C,IAAI,EACJ,WAAW,EAAE,qBAAqB,EAAE,IAAI,CACzC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAE,EAAE;QAC7C,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CACrD,CAAC;QAEF,IAAI,WAAW,EAAE,eAAe,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACjD,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,2EAA2E;QAC3E,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,EAAE,MAAmB,EAAE,IAAY,EAAE,EAAE;QAClE,IAAI,CAAC,WAAW,EAAE,qBAAqB;YAAE,OAAO;QAEhD,oBAAoB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAE/D,MAAM,UAAU,GAAG,WAAW,CAAC,qBAAqB,CAAC;QACrD,sEAAsE;QACtE,0CAA0C;QAC1C,MAAM,YAAY,GAChB,WAAW,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1D,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI;YAC9B,iBAAiB,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ;SAC9C,CAAC,CAAC;QACH,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC9D,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;gBACvD,KAAK,CAAC,KAAK,CACT,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,8BAA8B,CACnE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,WAAW,CAAC;gBACV,oBAAoB,EAAE,SAAS;gBAC/B,SAAS,EAAE,SAAS;gBACpB,gBAAgB,EAAE,SAAS;aAC5B,CAAC,CAAC;YACH,MAAM,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CACxE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAClB,CAAC,CAAC,WAAW,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEvE,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC9B,qEAAqE;QACrE,IAAI,OAAO,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,MAAM,GAAG,WAAW,IAAI,IAAI,CAAC;QACnC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CACL,eACE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAC9C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,aAE1C,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,IAAI,CAC1D,eAAK,SAAS,EAAC,2EAA2E,aACxF,gBAAM,SAAS,EAAC,UAAU,6BACX,aAAa,CAAC,WAAW,CAAC,IAClC,EACP,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4EAA4E,EACtF,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,uBAGjC,IACL,CACP,EACD,KAAC,aAAa,IAEZ,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,EAC/C,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,EACzC,QAAQ,EAAE,aAAa,EACvB,WAAW,EACT,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,yBAAyB,EAE3D,WAAW,EAAC,OAAO,EACnB,eAAe,EAAE,KAAK,EACtB,gBAAgB,EAAE,OAAO,EACzB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,IAAI,EACjB,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,CAAC,CAAC,WAAW,EACxB,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,EACxD,WAAW,EAAE,KAAK,CAAC,gBAAgB,EACnC,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,EAAE,CACxC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC,IAlB9B,MAAM,CAAC,EAAE,CAoBd,IACE,CACP,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACvF,MAAM,SAAS,GAAG,CAChB,KAAC,sBAAsB,IACrB,WAAW,EAAE,IAAI,EACjB,cAAc,EAAE,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,EAClC,mBAAmB,EAAE,mBAAmB,EACxC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EACvC,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;IAEF,OAAO,CACL,cACE,GAAG,EAAE,OAAO,6BACa,MAAM,CAAC,EAAE,EAClC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EACnE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,YAEpE,MAAC,iBAAiB,IAChB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EACrC,eAAe,EAAE,eAAe,EAChC,kBAAkB,EAAE,WAAW,EAC/B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,EAAE,CACX,gBAAgB,EAChB,gCAAgC,EAChC,SAAS,CACV,EACD,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,EAC1D,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,EACnE,cAAc,EAAE,CAAC,CAAC,aAAa,EAC/B,MAAM,EAAC,gBAAgB,EACvB,YAAY;YACV,oEAAoE;YACpE,8DAA8D;YAC9D,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CACvB,KAAC,WAAW,IACV,OAAO,EAAE,gBAAgB,iBACb,oBAAoB,EAChC,KAAK,EAAC,QAAQ,GACd,CACH,CAAC,CAAC,CAAC,SAAS,EAEf,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,oEAAoE;gBACpE,oCAAoC;gBACpC,IAAI,oBAAoB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;oBAAE,OAAO;gBAC7D,KAAK,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YAC/D,CAAC,aAED,KAAC,gBAAgB,IACf,OAAO,EAAE,IAAI,EACb,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,IAAI,CAAC,EAAE,EACtB,kBAAkB,EAAE,aAAa,CAAC,IAAI,CAAC,EACvC,OAAO,EAAC,QAAQ,EAChB,iBAAiB,EAAE,KAAK,EACxB,sBAAsB,EAAE,CAAC,IAAI,CAAC,KAAK,EACnC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,GAC3C,EACD,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CACrE,eACE,SAAS,EAAE,EAAE,CACX,wCAAwC;oBACxC,4DAA4D;oBAC5D,0CAA0C;oBAC1C,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,YAAY,CAC7D,aAEA,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,kBACE,IAAI,EAAC,QAAQ,iBACD,+BAA+B,mBAC5B,CAAC,WAAW,EAC3B,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,CAAC,OAAO,IAAI,+BAA+B,CAC5C,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gCACjB,KAAK,CAAC,eAAe,EAAE,CAAC;gCACxB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;4BAC3C,CAAC,aAEA,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,CAC7C,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,CAC5C,EACA,YAAY,IACN,CACV,EACA,OAAO,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,IAAI,CAC3D,kBACE,IAAI,EAAC,QAAQ,iBACD,sBAAsB,EAClC,SAAS,EAAC,qDAAqD,EAC/D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gCACjB,KAAK,CAAC,eAAe,EAAE,CAAC;gCACxB,cAAc,CAAC,IAAI,CAAC,CAAC;4BACvB,CAAC,aAED,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,aAE9B,CACV,EAIA,OAAO,IAAI,SAAS,IACjB,CACP,EACA,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CACrC,cACE,SAAS,EAAE,EAAE,CACX,OAAO,IAAI,mDAAmD,CAC/D,YAEA,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,KAAC,gBAAgB,IAEf,OAAO,EAAE,KAAK,EACd,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,IAAI,CAAC,EAAE,EACtB,kBAAkB,EAAE,aAAa,CAAC,KAAK,CAAC,EACxC,OAAO,EAAC,QAAQ,EAChB,iBAAiB,EAAE,KAAK,EACxB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,IATtC,KAAK,CAAC,EAAE,CAUb,CACH,CAAC,GACE,CACP,EACA,CAAC,OAAO,IAAI,SAAS,EACrB,iBAAiB,EAAE,IACF,GAChB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type Ref } from "react";
2
+ import type { FeedbackNavigation } from "./CommentQuote";
3
+ import type { FeedbackItem } from "./feedbackOrdering";
4
+ import type { SuggestionThread } from "./feedbackThreads";
5
+ export type SuggestionThreadCardProps = {
6
+ thread: SuggestionThread;
7
+ getAuthorName: (item: FeedbackItem) => string;
8
+ resolvedAuthorNames: Record<string, string>;
9
+ navigation?: FeedbackNavigation;
10
+ bodyMaxHeight?: number;
11
+ /** Word-style margin balloon; the comment thread is folded until asked. */
12
+ balloon?: boolean;
13
+ /** Name what the suggestion is about (a balloon that is not beside it). */
14
+ showContext?: boolean;
15
+ onHoverChange?: (hovered: boolean) => void;
16
+ cardRef?: Ref<HTMLDivElement>;
17
+ };
18
+ /** One suggested edit with its comment thread. */
19
+ export declare function SuggestionThreadCard({ thread, getAuthorName, resolvedAuthorNames, navigation, bodyMaxHeight, balloon, showContext, onHoverChange, cardRef, }: SuggestionThreadCardProps): import("react").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { ChevronDown, ChevronRight, Reply } from "lucide-react";
4
+ import { useEditContext } from "../client/editContext";
5
+ import { cn } from "../../lib/utils";
6
+ import { useFeedbackDraft } from "./feedbackDrafts";
7
+ import { SuggestedEditComponent } from "./SuggestedEdit";
8
+ import { SuggestionCommentThread } from "./SuggestionCommentThread";
9
+ /** One suggested edit with its comment thread. */
10
+ export function SuggestionThreadCard({ thread, getAuthorName, resolvedAuthorNames, navigation = "dom", bodyMaxHeight, balloon = false, showContext = false, onHoverChange, cardRef, }) {
11
+ const editContext = useEditContext();
12
+ const { suggestion, comments } = thread;
13
+ const [draft, updateDraft] = useFeedbackDraft(thread.id);
14
+ const canComment = !editContext?.readonly;
15
+ const showThread = !editContext?.readonly || comments.length > 0;
16
+ // Balloons fold the comment thread (and its composer) until asked.
17
+ const expanded = balloon ? draft.collapsed === false : true;
18
+ const commentsLabel = `${comments.length} ${comments.length === 1 ? "comment" : "comments"}`;
19
+ // See CommentThreadCard: an unmount under the pointer sends no mouseleave.
20
+ const onHoverChangeRef = useRef(onHoverChange);
21
+ onHoverChangeRef.current = onHoverChange;
22
+ useEffect(() => () => onHoverChangeRef.current?.(false), []);
23
+ return (_jsx("div", { ref: cardRef, "data-testid": "suggestion-thread", "data-feedback-thread-id": thread.id, "data-suggestion-id": suggestion.id, onMouseEnter: onHoverChange ? () => onHoverChange(true) : undefined, onMouseLeave: onHoverChange ? () => onHoverChange(false) : undefined, children: _jsxs(SuggestedEditComponent, { edit: suggestion, resolvedAuthorName: getAuthorName(suggestion), navigation: navigation, bodyMaxHeight: bodyMaxHeight, balloon: balloon, showContext: showContext, children: [balloon && showThread && (_jsxs("div", { className: "text-neutral-grey-50 mt-1.5 flex items-center gap-3 pl-7", onClick: (event) => event.stopPropagation(), children: [comments.length > 0 && (_jsxs("button", { type: "button", "data-testid": "suggestion-thread-comments-toggle", "aria-expanded": expanded, className: "hover:text-neutral-grey-100 flex items-center gap-1 text-left", onClick: () => updateDraft({ collapsed: expanded }), children: [expanded ? (_jsx(ChevronDown, { size: 12, strokeWidth: 1.5 })) : (_jsx(ChevronRight, { size: 12, strokeWidth: 1.5 })), commentsLabel] })), canComment && !expanded && (_jsxs("button", { type: "button", "data-testid": "suggestion-reply-button", className: "hover:text-neutral-grey-100 flex items-center gap-1", onClick: () => updateDraft({ collapsed: false }), children: [_jsx(Reply, { size: 12, strokeWidth: 1.5 }), "Reply"] }))] })), showThread && expanded && (_jsx("div", { className: cn(balloon && "mt-1.5 pl-7"), children: _jsx(SuggestionCommentThread, { suggestion: suggestion, comments: comments, resolvedAuthorNames: resolvedAuthorNames, compact: true, navigation: navigation, balloon: balloon }) }))] }) }));
24
+ }
25
+ //# sourceMappingURL=SuggestionThreadCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuggestionThreadCard.js","sourceRoot":"","sources":["../../../src/editor/reviews/SuggestionThreadCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AddCommentOptions, EditContextType, SelectionRange } from "../client/editContext";
2
+ /**
3
+ * "Add comment" on a known target (a field's comment button, the formatting
4
+ * toolbar, the context menu): the composer opens as a draft card in the
5
+ * comment margin, beside the target, exactly as after picking it with the
6
+ * comment target picker. A text selection inside the target field becomes
7
+ * the comment's range.
8
+ *
9
+ * On mobile the comments panel below the canvas is that margin. Only where
10
+ * neither can show (fullscreen presentation) the composer still opens as a
11
+ * popover at `fallbackAnchor`.
12
+ */
13
+ export declare function addCommentOnTarget(editContext: EditContextType, target: AddCommentOptions, fallbackAnchor: {
14
+ element: Element | null | undefined;
15
+ range?: SelectionRange;
16
+ } | {
17
+ position: {
18
+ x: number;
19
+ y: number;
20
+ };
21
+ range?: SelectionRange;
22
+ }): void;
@@ -0,0 +1,32 @@
1
+ import { showCommentPopoverAt } from "./CommentPopover";
2
+ /**
3
+ * "Add comment" on a known target (a field's comment button, the formatting
4
+ * toolbar, the context menu): the composer opens as a draft card in the
5
+ * comment margin, beside the target, exactly as after picking it with the
6
+ * comment target picker. A text selection inside the target field becomes
7
+ * the comment's range.
8
+ *
9
+ * On mobile the comments panel below the canvas is that margin. Only where
10
+ * neither can show (fullscreen presentation) the composer still opens as a
11
+ * popover at `fallbackAnchor`.
12
+ */
13
+ export function addCommentOnTarget(editContext, target, fallbackAnchor) {
14
+ const marginAvailable = !editContext.fullscreen;
15
+ if (marginAvailable) {
16
+ editContext.addComment(target);
17
+ return;
18
+ }
19
+ const rect = "element" in fallbackAnchor
20
+ ? fallbackAnchor.element?.getBoundingClientRect()
21
+ : undefined;
22
+ const position = "position" in fallbackAnchor
23
+ ? fallbackAnchor.position
24
+ : rect
25
+ ? { x: rect.left, y: rect.bottom }
26
+ : { x: window.innerWidth / 2, y: window.innerHeight / 2 };
27
+ showCommentPopoverAt(position, editContext, {
28
+ field: target.field,
29
+ range: fallbackAnchor.range,
30
+ });
31
+ }
32
+ //# sourceMappingURL=addCommentOnTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addCommentOnTarget.js","sourceRoot":"","sources":["../../../src/editor/reviews/addCommentOnTarget.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAA4B,EAC5B,MAAyB,EACzB,cAEkE;IAElE,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC;IAChD,IAAI,eAAe,EAAE,CAAC;QACpB,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GACR,SAAS,IAAI,cAAc;QACzB,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE;QACjD,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,QAAQ,GACZ,UAAU,IAAI,cAAc;QAC1B,CAAC,CAAC,cAAc,CAAC,QAAQ;QACzB,CAAC,CAAC,IAAI;YACJ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;YAClC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;IAChE,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE;QAC1C,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,cAAc,CAAC,KAAK;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Word-style balloon layout for the comment margin.
3
+ *
4
+ * Every card wants to sit at the top of the text it is anchored to. Cards are
5
+ * placed top to bottom without overlapping; the selected ("pinned") card stays
6
+ * at its anchor and pushes its neighbours away in both directions; and the
7
+ * whole stack is kept inside `[minY, maxY]` (the column below the header and
8
+ * above the footer, in document coordinates), shifting cards above their
9
+ * anchor when the page end is near.
10
+ *
11
+ * Precedence: bounds > pinned card at its anchor > other cards at their
12
+ * anchors > no overlap. When the cards cannot fit at all the layout reports
13
+ * `overflow` and the caller switches to a scrolling presentation.
14
+ */
15
+ export type BalloonInput = {
16
+ id: string;
17
+ /** Document-space y of the anchored text; items must be sorted by it. */
18
+ anchorY: number;
19
+ /** Measured card height; 0 while unknown. */
20
+ height: number;
21
+ };
22
+ export type BalloonLayoutOptions = {
23
+ /** Vertical gap between cards. */
24
+ gap: number;
25
+ /** Top of the usable column. */
26
+ minY: number;
27
+ /** Bottom of the usable column. */
28
+ maxY: number;
29
+ /** Card kept at its anchor (the selected thread). */
30
+ pinnedId?: string | null;
31
+ };
32
+ export type BalloonPosition = {
33
+ id: string;
34
+ top: number;
35
+ };
36
+ export type BalloonLayout = {
37
+ positions: BalloonPosition[];
38
+ /** The cards do not fit between minY and maxY; positions are clamped. */
39
+ overflow: boolean;
40
+ };
41
+ export declare function layoutBalloons(items: readonly BalloonInput[], { gap, minY, maxY, pinnedId }: BalloonLayoutOptions): BalloonLayout;
42
+ /** Sort helper: by anchor, then creation time, then id for a stable order. */
43
+ export declare function compareBalloonAnchors(a: {
44
+ anchorY: number;
45
+ created: number;
46
+ id: string;
47
+ }, b: {
48
+ anchorY: number;
49
+ created: number;
50
+ id: string;
51
+ }): number;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Word-style balloon layout for the comment margin.
3
+ *
4
+ * Every card wants to sit at the top of the text it is anchored to. Cards are
5
+ * placed top to bottom without overlapping; the selected ("pinned") card stays
6
+ * at its anchor and pushes its neighbours away in both directions; and the
7
+ * whole stack is kept inside `[minY, maxY]` (the column below the header and
8
+ * above the footer, in document coordinates), shifting cards above their
9
+ * anchor when the page end is near.
10
+ *
11
+ * Precedence: bounds > pinned card at its anchor > other cards at their
12
+ * anchors > no overlap. When the cards cannot fit at all the layout reports
13
+ * `overflow` and the caller switches to a scrolling presentation.
14
+ */
15
+ function clamp(value, min, max) {
16
+ return Math.min(max, Math.max(min, value));
17
+ }
18
+ export function layoutBalloons(items, { gap, minY, maxY, pinnedId }) {
19
+ const n = items.length;
20
+ if (n === 0)
21
+ return { positions: [], overflow: false };
22
+ const heights = items.map((item) => Math.max(0, item.height));
23
+ const total = heights.reduce((sum, height) => sum + height, 0) + gap * (n - 1);
24
+ const available = maxY - minY;
25
+ const top = new Array(n);
26
+ if (total > available) {
27
+ // Nothing can make this fit; report it. A caller that renders anyway
28
+ // (while a switch to the scrolling presentation is deferred) gets the
29
+ // plain downward stack: no overlap, the tail simply runs past maxY.
30
+ for (let i = 0; i < n; i++) {
31
+ const previousBottom = i === 0 ? -Infinity : top[i - 1] + heights[i - 1] + gap;
32
+ top[i] = Math.max(minY, items[i].anchorY, previousBottom);
33
+ }
34
+ return {
35
+ overflow: true,
36
+ positions: items.map((item, index) => ({ id: item.id, top: top[index] })),
37
+ };
38
+ }
39
+ const pinnedIndex = pinnedId
40
+ ? items.findIndex((item) => item.id === pinnedId)
41
+ : -1;
42
+ // Room the cards above index i need at minimum (each height plus a gap).
43
+ const stackAbove = new Array(n + 1);
44
+ stackAbove[0] = 0;
45
+ for (let i = 0; i < n; i++) {
46
+ stackAbove[i + 1] = stackAbove[i] + heights[i] + gap;
47
+ }
48
+ // Room the cards below index i need at minimum.
49
+ const stackBelow = new Array(n + 1);
50
+ stackBelow[n] = 0;
51
+ for (let i = n - 1; i >= 0; i--) {
52
+ stackBelow[i] = stackBelow[i + 1] + heights[i] + gap;
53
+ }
54
+ // Plain downward stacking of cards [from, to): each at its anchor, or below
55
+ // the card before it.
56
+ const placeForward = (from, to) => {
57
+ for (let i = from; i < to; i++) {
58
+ const previousBottom = i === 0 ? -Infinity : top[i - 1] + heights[i - 1] + gap;
59
+ top[i] = Math.max(minY, items[i].anchorY, previousBottom);
60
+ }
61
+ };
62
+ if (pinnedIndex < 0) {
63
+ placeForward(0, n);
64
+ }
65
+ else {
66
+ const p = pinnedIndex;
67
+ // The pinned card can only sit where the cards above still fit over it
68
+ // and the cards below still fit under it.
69
+ const lo = minY + stackAbove[p];
70
+ const hi = maxY - heights[p] - stackBelow[p + 1];
71
+ top[p] = clamp(items[p].anchorY, lo, hi);
72
+ // Cards above the pin lay out exactly as without a pin, so selecting a
73
+ // card far away moves nothing; only the ones that would run into the
74
+ // pinned card are pushed up (never above what the cards over them need).
75
+ placeForward(0, p);
76
+ for (let i = p - 1; i >= 0; i--) {
77
+ const ceiling = top[i + 1] - gap - heights[i];
78
+ if (top[i] > ceiling) {
79
+ top[i] = Math.max(minY + stackAbove[i], ceiling);
80
+ }
81
+ }
82
+ // Cards below the pin: pushed down.
83
+ placeForward(p + 1, n);
84
+ }
85
+ // Back pass: keep everything above maxY by shifting cards up. The pinned
86
+ // card never needs to move because `hi` already reserved the room below it.
87
+ for (let i = n - 1; i >= 0; i--) {
88
+ const limit = (i === n - 1 ? maxY : top[i + 1] - gap) - heights[i];
89
+ if (top[i] > limit)
90
+ top[i] = Math.max(minY, limit);
91
+ }
92
+ return {
93
+ overflow: false,
94
+ positions: items.map((item, index) => ({ id: item.id, top: top[index] })),
95
+ };
96
+ }
97
+ /** Sort helper: by anchor, then creation time, then id for a stable order. */
98
+ export function compareBalloonAnchors(a, b) {
99
+ return a.anchorY - b.anchorY || a.created - b.created || a.id.localeCompare(b.id);
100
+ }
101
+ //# sourceMappingURL=balloonLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balloonLayout.js","sourceRoot":"","sources":["../../../src/editor/reviews/balloonLayout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type AgentMessageAttachment, type AgentMetadata } from "../services/agentService";
2
+ /** Copy authorized comment images into the agent document store, whose images
3
+ * are included as visual inputs by the backend message builder. Keep successful
4
+ * uploads in the caller's cache so a failed submission can be retried. */
5
+ export declare function prepareCommentAgentAttachments(agentId: string, comment: AgentMetadata["comment"], profileId: string | undefined, cache: Map<string, AgentMessageAttachment>): Promise<AgentMessageAttachment[]>;
@@ -0,0 +1,51 @@
1
+ import { uploadDocument, } from "../services/agentService";
2
+ import { COMMENT_IMAGE_MAX_BYTES, splitCommentImages } from "./commentImages";
3
+ /** Copy authorized comment images into the agent document store, whose images
4
+ * are included as visual inputs by the backend message builder. Keep successful
5
+ * uploads in the caller's cache so a failed submission can be retried. */
6
+ export async function prepareCommentAgentAttachments(agentId, comment, profileId, cache) {
7
+ const images = new Map();
8
+ for (const entry of comment?.thread ?? (comment ? [comment] : [])) {
9
+ for (const segment of splitCommentImages(entry.text || "")) {
10
+ if (segment.type === "image")
11
+ images.set(segment.imageId, segment.src);
12
+ }
13
+ }
14
+ const attachments = [];
15
+ for (const [imageId, src] of images) {
16
+ const key = `${agentId}:${imageId}`;
17
+ const cached = cache.get(key);
18
+ if (cached) {
19
+ attachments.push(cached);
20
+ continue;
21
+ }
22
+ // Only the recognized local comment-image endpoint is fetched. It enforces
23
+ // the current user's access to the comment before returning image bytes.
24
+ const response = await fetch(src, { credentials: "include" });
25
+ if (!response.ok) {
26
+ throw new Error("Could not load a comment screenshot. Please try again.");
27
+ }
28
+ const blob = await response.blob();
29
+ const extension = {
30
+ "image/png": "png",
31
+ "image/jpeg": "jpg",
32
+ "image/gif": "gif",
33
+ "image/webp": "webp",
34
+ }[blob.type];
35
+ if (!extension || !blob.size || blob.size > COMMENT_IMAGE_MAX_BYTES) {
36
+ throw new Error("A comment screenshot is invalid or too large to attach.");
37
+ }
38
+ const file = new File([blob], `comment-image-${imageId}.${extension}`, {
39
+ type: blob.type,
40
+ });
41
+ const result = await uploadDocument(agentId, file, profileId);
42
+ if (!result.success || !result.document) {
43
+ throw new Error(result.error || "Could not attach a comment screenshot.");
44
+ }
45
+ const { extractedText: _extractedText, ...attachment } = result.document;
46
+ cache.set(key, attachment);
47
+ attachments.push(attachment);
48
+ }
49
+ return attachments;
50
+ }
51
+ //# sourceMappingURL=commentAgentAttachments.js.map