@parhelia/core 0.1.12880 → 0.1.12881
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.
- package/dist/components/ui/card.d.ts +3 -1
- package/dist/components/ui/card.js +2 -2
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/context-menu.js +2 -2
- package/dist/config/config.js +6 -5
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +0 -7
- package/dist/config/types.js.map +1 -1
- package/dist/editor/FieldActionsOverlay.d.ts +0 -1
- package/dist/editor/FieldActionsOverlay.js +1 -45
- package/dist/editor/FieldActionsOverlay.js.map +1 -1
- package/dist/editor/FieldListField.d.ts +1 -1
- package/dist/editor/FieldListField.js +20 -18
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/ImageEditor.d.ts +6 -1
- package/dist/editor/ImageEditor.js +19 -3
- package/dist/editor/ImageEditor.js.map +1 -1
- package/dist/editor/PictureEditor.d.ts +2 -1
- package/dist/editor/PictureEditor.js +5 -14
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/ai/Agents.js +2 -2
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/GuidanceOverlay.js +1 -11
- package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
- package/dist/editor/ai/InlineAiDialog.js +22 -11
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +17 -57
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/dialogs/capturePageDom.js +66 -36
- package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
- package/dist/editor/ai/dialogs/capturePageScreenshot.js +281 -162
- package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
- package/dist/editor/ai/terminal/agentSessionState.d.ts +3 -0
- package/dist/editor/ai/terminal/agentSessionState.js +3 -1
- package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
- package/dist/editor/ai/terminal/agentStartRequest.d.ts +2 -1
- package/dist/editor/ai/terminal/agentStartRequest.js +2 -1
- package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
- package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +7 -0
- package/dist/editor/ai/terminal/components/AgentDocumentList.js +55 -13
- package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +5 -0
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +12 -0
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +1 -0
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +3 -1
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +22 -14
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
- package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
- package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +8 -11
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +1 -4
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +31 -14
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
- package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +2 -4
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalView.js +13 -2
- package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
- package/dist/editor/ai/terminal/components/AiResponseMessage.js +16 -14
- package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/terminal/components/ContextInfoBar.js +22 -2
- package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +37 -26
- package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
- package/dist/editor/ai/terminal/components/UserMessage.d.ts +2 -1
- package/dist/editor/ai/terminal/components/UserMessage.js +144 -8
- package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
- package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +1 -0
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +3 -1
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +9 -3
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalController.js +7 -0
- package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +3 -1
- package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
- package/dist/editor/ai/useInlineAiPosition.d.ts +1 -1
- package/dist/editor/ai/useInlineAiPosition.js +22 -52
- package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
- package/dist/editor/ai-image-editor/AiImageResultOverlay.js +30 -62
- package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
- package/dist/editor/bridge/BridgeClient.d.ts +80 -0
- package/dist/editor/bridge/BridgeClient.js +417 -0
- package/dist/editor/bridge/BridgeClient.js.map +1 -0
- package/dist/editor/client/EditorShell.d.ts +5 -1
- package/dist/editor/client/EditorShell.js +282 -126
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +33 -5
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +14 -17
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.d.ts +2 -0
- package/dist/editor/client/itemsRepository.js +15 -8
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +1 -1
- package/dist/editor/client/operations.js +41 -17
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +24 -7
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +10 -3
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/RawEditor.js +8 -1
- package/dist/editor/field-types/RawEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +156 -45
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +10 -3
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.js +8 -2
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +1 -2
- package/dist/editor/field-types/richtext/contextMenuFactory.js +100 -303
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +2 -0
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +13 -0
- package/dist/editor/field-types/useFormFieldCaretPresence.js +92 -0
- package/dist/editor/field-types/useFormFieldCaretPresence.js.map +1 -0
- package/dist/editor/media-selector/TreeSelector.js +15 -15
- package/dist/editor/media-selector/TreeSelector.js.map +1 -1
- package/dist/editor/menubar/PageSelector.js +8 -2
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/VersionPreviewCard.js +4 -249
- package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
- package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +0 -10
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +63 -462
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +6 -0
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +123 -0
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -0
- package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +5 -2
- package/dist/editor/page-editor-chrome/CommentHighlightings.js +340 -215
- package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +5 -1
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +11 -4
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js +21 -13
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +23 -29
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +110 -19
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +3 -2
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +148 -45
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +2 -0
- package/dist/editor/page-editor-chrome/PageEditorChrome.js +25 -21
- package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +163 -128
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +6 -3
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +1 -2
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +83 -146
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +5 -2
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +144 -63
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +1 -2
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +101 -30
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +10 -1
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +105 -122
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +11 -4
- package/dist/editor/page-editor-chrome/overlay/geometry.js +139 -36
- package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +26 -0
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +222 -0
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -0
- package/dist/editor/page-viewer/EditorForm.js +17 -1
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
- package/dist/editor/page-viewer/MiniMap.js +176 -364
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.js +40 -13
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +0 -5
- package/dist/editor/page-viewer/PageViewerFrame.js +1529 -1511
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +20 -0
- package/dist/editor/page-viewer/bridgeFieldPatch.js +33 -0
- package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -0
- package/dist/editor/page-viewer/pageViewContext.d.ts +32 -0
- package/dist/editor/page-viewer/pageViewContext.js +37 -6
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/reviews/Comment.d.ts +2 -1
- package/dist/editor/reviews/Comment.js +9 -4
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentEditor.js +1 -1
- package/dist/editor/reviews/CommentEditor.js.map +1 -1
- package/dist/editor/reviews/CommentPopover.js +68 -9
- package/dist/editor/reviews/CommentPopover.js.map +1 -1
- package/dist/editor/reviews/CommentView.js +24 -4
- package/dist/editor/reviews/CommentView.js.map +1 -1
- package/dist/editor/reviews/Comments.d.ts +0 -2
- package/dist/editor/reviews/Comments.js +29 -30
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/FeedbackCard.d.ts +4 -2
- package/dist/editor/reviews/FeedbackCard.js +5 -5
- package/dist/editor/reviews/FeedbackCard.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +4 -6
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionDisplayPopover.js +3 -2
- package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/commentAi.js +96 -27
- package/dist/editor/reviews/commentAi.js.map +1 -1
- package/dist/editor/reviews/commentTransientSelection.d.ts +23 -0
- package/dist/editor/reviews/commentTransientSelection.js +7 -0
- package/dist/editor/reviews/commentTransientSelection.js.map +1 -0
- package/dist/editor/reviews/feedbackOrdering.d.ts +5 -0
- package/dist/editor/reviews/feedbackOrdering.js +27 -0
- package/dist/editor/reviews/feedbackOrdering.js.map +1 -0
- package/dist/editor/reviews/feedbackSelection.js +32 -4
- package/dist/editor/reviews/feedbackSelection.js.map +1 -1
- package/dist/editor/reviews/suggestedEditState.d.ts +12 -0
- package/dist/editor/reviews/suggestedEditState.js +90 -0
- package/dist/editor/reviews/suggestedEditState.js.map +1 -0
- package/dist/editor/reviews/suggestionDisplayValue.d.ts +43 -0
- package/dist/editor/reviews/suggestionDisplayValue.js +93 -0
- package/dist/editor/reviews/suggestionDisplayValue.js.map +1 -0
- package/dist/editor/services/agentService.d.ts +15 -0
- package/dist/editor/services/agentService.js +11 -1
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/reviewsService.d.ts +2 -2
- package/dist/editor/services/reviewsService.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +2 -2
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.js +2 -3
- package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
- package/dist/editor/sidebar/MorePanelsButton.js +1 -1
- package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
- package/dist/editor/sidebar/Workbox.js +1 -1
- package/dist/editor/sidebar/Workbox.js.map +1 -1
- package/dist/editor/ui/IconSelectorDialog.js +1 -1
- package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
- package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
- package/dist/editor/ui/SimpleIconButton.js +1 -1
- package/dist/editor/ui/SimpleIconButton.js.map +1 -1
- package/dist/editor/utils.d.ts +1 -17
- package/dist/editor/utils.js +0 -143
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/version-diff/versionDiffTargets.d.ts +3 -8
- package/dist/editor/version-diff/versionDiffTargets.js +37 -94
- package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/DialogWrappers.js +2 -2
- package/dist/splash-screen/DialogWrappers.js.map +1 -1
- package/dist/splash-screen/ModernSplashScreen.js +11 -3
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +7 -5
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/OpenPage.js +5 -3
- package/dist/splash-screen/OpenPage.js.map +1 -1
- package/dist/splash-screen/RecentPages.js +3 -3
- package/dist/splash-screen/RecentPages.js.map +1 -1
- package/package.json +2 -1
- package/styles.css +49 -0
- package/dist/editor/page-editor-chrome/InlineEditor.d.ts +0 -7
- package/dist/editor/page-editor-chrome/InlineEditor.js +0 -1719
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +0 -1
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +0 -2
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +0 -21
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +0 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +0 -7
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +0 -758
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +0 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +0 -3
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +0 -796
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +0 -1
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef, useMemo, } from "react";
|
|
3
|
-
import { useEditContext, useFieldsEditContext } from "../client/editContext";
|
|
4
|
-
import {
|
|
2
|
+
import { forwardRef, useEffect, useMemo, useRef, useState, } from "react";
|
|
3
|
+
import { useEditContext, useFieldsEditContext, } from "../client/editContext";
|
|
4
|
+
import { normalizeMarkerId } from "../utils";
|
|
5
5
|
import { CommentDisplayPopover } from "../reviews/CommentDisplayPopover";
|
|
6
|
-
import {
|
|
7
|
-
import { getAccessibleIframeDocument } from "./overlay/iframeAccess";
|
|
6
|
+
import { measureBridgeComponentRect, measureBridgeFieldRect, measureBridgeTextRangeRects, rectListEquals, toOverlayRect, } from "./overlay/geometry";
|
|
8
7
|
import { useOverlayMeasurement } from "./overlay/useOverlayMeasurement";
|
|
8
|
+
import { getComponentById } from "../componentTreeHelper";
|
|
9
9
|
import { dedupeFeedbackHighlightItems, FeedbackHighlightBadge, FeedbackHighlightBadgeTray, } from "./FeedbackHighlightBadge";
|
|
10
|
+
import { COMMENT_DRAFT_SELECTION_EVENT, COMMENT_TRANSIENT_ELEMENT_KEY, COMMENT_TRANSIENT_SELECTION_RECT, } from "../reviews/commentTransientSelection";
|
|
11
|
+
const COMMENT_DRAFT_TEXT_RANGE_KEY = "comment-draft-selection";
|
|
12
|
+
const COMMENT_BRIDGE_SOURCE = "comments";
|
|
10
13
|
function commentMeasurementsEqual(previous, next) {
|
|
11
14
|
const previousKeys = Object.keys(previous);
|
|
12
15
|
const nextKeys = Object.keys(next);
|
|
@@ -24,56 +27,189 @@ function commentMeasurementsEqual(previous, next) {
|
|
|
24
27
|
}
|
|
25
28
|
return true;
|
|
26
29
|
}
|
|
27
|
-
export function CommentHighlightings({
|
|
30
|
+
export function CommentHighlightings({ pageViewContext, variant = "default", }) {
|
|
28
31
|
const editContext = useEditContext();
|
|
32
|
+
const modifiedFields = useFieldsEditContext();
|
|
33
|
+
const lastMeasurementsRef = useRef({});
|
|
34
|
+
const bridgeTextRangeRequestRef = useRef({
|
|
35
|
+
signature: "",
|
|
36
|
+
requestedSignature: "",
|
|
37
|
+
hasSeenAnyTarget: false,
|
|
38
|
+
});
|
|
39
|
+
const [commentDraftRange, setCommentDraftRange] = useState();
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const handleDraftSelection = (event) => {
|
|
42
|
+
const detail = event
|
|
43
|
+
.detail;
|
|
44
|
+
setCommentDraftRange(detail?.range);
|
|
45
|
+
};
|
|
46
|
+
window.addEventListener(COMMENT_DRAFT_SELECTION_EVENT, handleDraftSelection);
|
|
47
|
+
return () => {
|
|
48
|
+
window.removeEventListener(COMMENT_DRAFT_SELECTION_EVENT, handleDraftSelection);
|
|
49
|
+
};
|
|
50
|
+
}, []);
|
|
29
51
|
const visibleComments = useMemo(() => (editContext?.comments || []).filter((comment) => !comment.suggestedEditId &&
|
|
30
52
|
(editContext?.showResolvedComments ? true : !comment.isResolved)), [editContext?.comments, editContext?.showResolvedComments]);
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
53
|
+
const bridgeTextRanges = useMemo(() => {
|
|
54
|
+
const commentRanges = visibleComments.flatMap((comment) => {
|
|
55
|
+
const range = getCommentTextRange(comment);
|
|
56
|
+
if (!comment.fieldId || !range)
|
|
57
|
+
return [];
|
|
58
|
+
return getCommentFieldDescriptors(comment).map((descriptor) => ({
|
|
59
|
+
key: getCommentTextRangeKey(comment),
|
|
60
|
+
elementKey: getCommentTransientElementKey(comment),
|
|
61
|
+
fieldId: descriptor.fieldId,
|
|
62
|
+
item: descriptor.item,
|
|
63
|
+
start: range[0],
|
|
64
|
+
end: range[1],
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
const draftRange = getDraftBridgeTextRange(commentDraftRange);
|
|
68
|
+
return draftRange ? [...commentRanges, draftRange] : commentRanges;
|
|
69
|
+
}, [visibleComments, commentDraftRange]);
|
|
70
|
+
const bridgeTextRangeSignature = useMemo(() => bridgeTextRanges
|
|
71
|
+
.map((range) => [
|
|
72
|
+
range.key,
|
|
73
|
+
range.elementKey,
|
|
74
|
+
range.fieldId,
|
|
75
|
+
range.item.id,
|
|
76
|
+
range.item.language,
|
|
77
|
+
range.item.version,
|
|
78
|
+
range.start,
|
|
79
|
+
range.end,
|
|
80
|
+
].join(":"))
|
|
81
|
+
.join("|"), [bridgeTextRanges]);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
const requestState = bridgeTextRangeRequestRef.current;
|
|
84
|
+
if (!pageViewContext.bridgeReady || bridgeTextRanges.length === 0) {
|
|
85
|
+
if (pageViewContext.bridgeReady && requestState.signature !== "") {
|
|
86
|
+
// Drop our contribution from the shared union so the highlights clear
|
|
87
|
+
// instead of lingering as phantom geometry targets.
|
|
88
|
+
pageViewContext.requestBridgeGeometry?.({
|
|
89
|
+
source: COMMENT_BRIDGE_SOURCE,
|
|
90
|
+
textRanges: [],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
requestState.signature = "";
|
|
94
|
+
requestState.requestedSignature = "";
|
|
95
|
+
requestState.hasSeenAnyTarget = false;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const signatureChanged = requestState.signature !== bridgeTextRangeSignature;
|
|
99
|
+
if (signatureChanged) {
|
|
100
|
+
requestState.signature = bridgeTextRangeSignature;
|
|
101
|
+
requestState.requestedSignature = "";
|
|
102
|
+
requestState.hasSeenAnyTarget = false;
|
|
103
|
+
}
|
|
104
|
+
const bridgeGeometry = pageViewContext.bridgeGeometry;
|
|
105
|
+
const hasAnyTarget = hasAnyExpectedBridgeTextRange(bridgeGeometry, bridgeTextRanges);
|
|
106
|
+
const hasAllTargets = hasAllExpectedBridgeTextRanges(bridgeGeometry, bridgeTextRanges);
|
|
107
|
+
if (hasAnyTarget) {
|
|
108
|
+
requestState.hasSeenAnyTarget = true;
|
|
109
|
+
}
|
|
110
|
+
if (hasAllTargets && !signatureChanged) {
|
|
111
|
+
requestState.requestedSignature = "";
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const shouldRequest = signatureChanged ||
|
|
115
|
+
requestState.requestedSignature !== bridgeTextRangeSignature ||
|
|
116
|
+
(requestState.hasSeenAnyTarget && !hasAnyTarget);
|
|
117
|
+
if (!shouldRequest)
|
|
118
|
+
return;
|
|
119
|
+
requestState.requestedSignature = bridgeTextRangeSignature;
|
|
120
|
+
pageViewContext.requestBridgeGeometry?.({
|
|
121
|
+
source: COMMENT_BRIDGE_SOURCE,
|
|
122
|
+
textRanges: bridgeTextRanges,
|
|
123
|
+
});
|
|
124
|
+
}, [
|
|
125
|
+
pageViewContext,
|
|
126
|
+
pageViewContext.bridgeReady,
|
|
127
|
+
pageViewContext.bridgeGeometry,
|
|
128
|
+
bridgeTextRanges,
|
|
129
|
+
bridgeTextRangeSignature,
|
|
130
|
+
commentDraftRange,
|
|
131
|
+
]);
|
|
132
|
+
const measurements = useOverlayMeasurement((metrics, reasons) => {
|
|
133
|
+
if (!editContext)
|
|
34
134
|
return {};
|
|
135
|
+
const bridgeGeometry = pageViewContext.bridgeGeometry;
|
|
136
|
+
const canReusePreviousMeasurement = !reasons.has("viewport") &&
|
|
137
|
+
!reasons.has("layout") &&
|
|
138
|
+
!reasons.has("text");
|
|
35
139
|
const nextMeasurements = {};
|
|
36
140
|
for (const comment of visibleComments) {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
:
|
|
47
|
-
const range = fieldElement
|
|
48
|
-
? resolveCommentRange(comment, fieldElement, iframeDocument)
|
|
49
|
-
: null;
|
|
141
|
+
const textRange = getCommentTextRange(comment);
|
|
142
|
+
const fieldDescriptors = getCommentFieldDescriptors(comment);
|
|
143
|
+
const hasTextRange = !!comment.fieldId && !!textRange;
|
|
144
|
+
const textRangeRects = hasTextRange
|
|
145
|
+
? dedupeOverlayRects(measureBridgeTextRangeRects(bridgeGeometry, getCommentTextRangeKey(comment), metrics))
|
|
146
|
+
: [];
|
|
147
|
+
const previousMeasurement = lastMeasurementsRef.current[comment.id];
|
|
148
|
+
const previousTextRangeRects = canReusePreviousMeasurement && previousMeasurement?.isTextRange
|
|
149
|
+
? previousMeasurement.rects
|
|
150
|
+
: [];
|
|
50
151
|
let rects = [];
|
|
51
152
|
let isTextRange = false;
|
|
52
|
-
if (
|
|
53
|
-
rects =
|
|
153
|
+
if (hasTextRange) {
|
|
154
|
+
rects = textRangeRects.length
|
|
155
|
+
? textRangeRects
|
|
156
|
+
: previousTextRangeRects.length
|
|
157
|
+
? previousTextRangeRects
|
|
158
|
+
: getTransientSelectionRects(comment, metrics, pageViewContext.editorIframe);
|
|
54
159
|
isTextRange = rects.length > 0;
|
|
55
160
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
161
|
+
else {
|
|
162
|
+
const fallbackRect = fieldDescriptors
|
|
163
|
+
.map((descriptor) => measureBridgeFieldRect(bridgeGeometry, pageViewContext.bridgeStructure, descriptor, metrics))
|
|
164
|
+
.find((rect) => !!rect) ??
|
|
165
|
+
measureBridgeCommentComponentRect(comment, pageViewContext, bridgeGeometry, metrics);
|
|
166
|
+
rects = fallbackRect
|
|
167
|
+
? [fallbackRect]
|
|
168
|
+
: canReusePreviousMeasurement && previousMeasurement?.rects.length
|
|
169
|
+
? previousMeasurement.rects
|
|
170
|
+
: [];
|
|
171
|
+
isTextRange =
|
|
172
|
+
!fallbackRect &&
|
|
173
|
+
canReusePreviousMeasurement &&
|
|
174
|
+
previousMeasurement?.isTextRange === true;
|
|
66
175
|
}
|
|
67
176
|
if (rects.length > 0) {
|
|
68
|
-
nextMeasurements[comment.id] = {
|
|
177
|
+
nextMeasurements[comment.id] = {
|
|
178
|
+
rects,
|
|
179
|
+
isTextRange,
|
|
180
|
+
};
|
|
69
181
|
}
|
|
70
182
|
}
|
|
71
183
|
return nextMeasurements;
|
|
72
|
-
}, [
|
|
184
|
+
}, [
|
|
185
|
+
editContext,
|
|
186
|
+
pageViewContext.bridgeGeometry,
|
|
187
|
+
pageViewContext.bridgeStructure,
|
|
188
|
+
visibleComments,
|
|
189
|
+
], {
|
|
73
190
|
initialValue: {},
|
|
74
191
|
equals: commentMeasurementsEqual,
|
|
75
192
|
interests: ["viewport", "layout", "text", "adornment-data"],
|
|
76
193
|
});
|
|
194
|
+
const draftRects = useOverlayMeasurement((metrics) => {
|
|
195
|
+
if (!commentDraftRange)
|
|
196
|
+
return [];
|
|
197
|
+
const bridgeRects = dedupeOverlayRects(measureBridgeTextRangeRects(pageViewContext.bridgeGeometry, COMMENT_DRAFT_TEXT_RANGE_KEY, metrics));
|
|
198
|
+
const fallbackRects = getSelectionRangeClientRects(commentDraftRange, metrics, pageViewContext.editorIframe);
|
|
199
|
+
const rects = bridgeRects.length ? bridgeRects : fallbackRects;
|
|
200
|
+
return rects;
|
|
201
|
+
}, [
|
|
202
|
+
commentDraftRange,
|
|
203
|
+
pageViewContext.bridgeGeometry,
|
|
204
|
+
pageViewContext.editorIframe,
|
|
205
|
+
], {
|
|
206
|
+
initialValue: [],
|
|
207
|
+
equals: rectListEquals,
|
|
208
|
+
interests: ["viewport", "layout", "text", "adornment-data"],
|
|
209
|
+
});
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
lastMeasurementsRef.current = measurements;
|
|
212
|
+
}, [measurements]);
|
|
77
213
|
const overlayGroups = useMemo(() => {
|
|
78
214
|
const groups = new Map();
|
|
79
215
|
for (const comment of visibleComments) {
|
|
@@ -97,11 +233,22 @@ export function CommentHighlightings({ iframe, }) {
|
|
|
97
233
|
isSelected: comment.id === editContext?.selectedComment?.id,
|
|
98
234
|
});
|
|
99
235
|
}
|
|
100
|
-
|
|
236
|
+
const nextGroups = Array.from(groups.values());
|
|
237
|
+
return nextGroups;
|
|
101
238
|
}, [visibleComments, measurements, editContext?.selectedComment?.id]);
|
|
102
239
|
if (!editContext)
|
|
103
240
|
return null;
|
|
104
|
-
return (_jsxs(_Fragment, { children: [_jsx("style", { children: commentHighlightingStyles }),
|
|
241
|
+
return (_jsxs(_Fragment, { children: [_jsx("style", { children: commentHighlightingStyles }), draftRects.map((rect, index) => (_jsx("div", { style: {
|
|
242
|
+
position: "absolute",
|
|
243
|
+
top: rect.y,
|
|
244
|
+
left: rect.x,
|
|
245
|
+
width: rect.width,
|
|
246
|
+
height: rect.height,
|
|
247
|
+
pointerEvents: "none",
|
|
248
|
+
}, children: _jsx("div", { "data-testid": "comment-draft-highlight", className: "absolute right-0 bottom-[0.08em] left-0 h-[0.82em] min-h-[10px]", style: {
|
|
249
|
+
...getDraftCommentRangeStyle(),
|
|
250
|
+
zIndex: 0,
|
|
251
|
+
} }) }, `comment-draft-${index}`))), overlayGroups.flatMap((group) => {
|
|
105
252
|
const badgeComments = dedupeFeedbackHighlightItems(group.comments, (comment) => comment.id === editContext.selectedComment?.id);
|
|
106
253
|
return group.rects.map((rect, index) => (_jsxs("div", { style: {
|
|
107
254
|
position: "absolute",
|
|
@@ -110,26 +257,38 @@ export function CommentHighlightings({ iframe, }) {
|
|
|
110
257
|
width: rect.width,
|
|
111
258
|
height: rect.height,
|
|
112
259
|
pointerEvents: "none",
|
|
113
|
-
}, children: [group.isTextRange ? (_jsx("div", { className: "absolute right-0 bottom-[0.08em] left-0 h-[0.82em] min-h-[10px]", style: {
|
|
260
|
+
}, children: [group.isTextRange ? (_jsx("div", { "data-testid": "comment-highlight", className: "absolute right-0 bottom-[0.08em] left-0 h-[0.82em] min-h-[10px]", style: {
|
|
114
261
|
...getCommentRangeStyle(group.comments, group.isSelected),
|
|
115
262
|
zIndex: 0,
|
|
116
|
-
} })) : (_jsx("div", { className: "absolute inset-0 rounded-[3px]", style: {
|
|
263
|
+
} })) : (_jsx("div", { "data-testid": "comment-highlight", className: "absolute inset-0 rounded-[3px]", style: {
|
|
117
264
|
...getCommentFallbackStyle(group.comments, group.isSelected),
|
|
118
265
|
zIndex: 0,
|
|
119
|
-
} })), index === 0 && (_jsx(FeedbackHighlightBadgeTray, { style: {
|
|
120
|
-
top:
|
|
121
|
-
|
|
266
|
+
} })), index === 0 && (_jsx(FeedbackHighlightBadgeTray, { variant: variant, style: {
|
|
267
|
+
top: variant === "minimap"
|
|
268
|
+
? group.isTextRange
|
|
269
|
+
? -11
|
|
270
|
+
: -8
|
|
271
|
+
: group.isTextRange
|
|
272
|
+
? -24
|
|
273
|
+
: -16,
|
|
274
|
+
left: variant === "minimap"
|
|
275
|
+
? group.isTextRange
|
|
276
|
+
? -4
|
|
277
|
+
: 4
|
|
278
|
+
: group.isTextRange
|
|
279
|
+
? -9
|
|
280
|
+
: 8,
|
|
122
281
|
}, children: badgeComments.map((comment, badgeIndex) => {
|
|
123
282
|
const isSelected = comment.id === editContext.selectedComment?.id;
|
|
124
283
|
return (_jsx(CommentDisplayPopover, { comment: comment, onCommentUpdated: () => {
|
|
125
284
|
editContext?.loadComments?.();
|
|
126
|
-
}, children: _jsx(CommentHighlightBadge, { comment: comment, isSelected: isSelected, zIndex: isSelected
|
|
285
|
+
}, children: _jsx(CommentHighlightBadge, { comment: comment, isSelected: isSelected, variant: variant, minimapColorClassName: "bg-highlight-100", zIndex: isSelected
|
|
127
286
|
? badgeComments.length + 101
|
|
128
287
|
: badgeComments.length - badgeIndex + 100 }) }, comment.id));
|
|
129
288
|
}) }))] }, `${group.key}-${index}`)));
|
|
130
289
|
})] }));
|
|
131
290
|
}
|
|
132
|
-
const CommentHighlightBadge = forwardRef(function CommentHighlightBadge({ comment, isSelected, zIndex, className, style, onClick, ...buttonProps }, ref) {
|
|
291
|
+
const CommentHighlightBadge = forwardRef(function CommentHighlightBadge({ comment, isSelected, variant, minimapColorClassName, zIndex, className, style, onClick, ...buttonProps }, ref) {
|
|
133
292
|
const editContext = useEditContext();
|
|
134
293
|
const modifiedFields = useFieldsEditContext();
|
|
135
294
|
const handleClick = (event) => {
|
|
@@ -150,7 +309,7 @@ const CommentHighlightBadge = forwardRef(function CommentHighlightBadge({ commen
|
|
|
150
309
|
}, false);
|
|
151
310
|
}
|
|
152
311
|
};
|
|
153
|
-
return (_jsx(FeedbackHighlightBadge, { ref: ref, item: comment, isSelected: isSelected, zIndex: zIndex, testId: "comment-highlight-icon", ariaSubject: "comment", className: className, style: style, onClick: handleClick, ...buttonProps }));
|
|
312
|
+
return (_jsx(FeedbackHighlightBadge, { ref: ref, item: comment, isSelected: isSelected, variant: variant, minimapColorClassName: minimapColorClassName, zIndex: zIndex, testId: "comment-highlight-icon", ariaSubject: "comment", className: className, style: style, onClick: handleClick, ...buttonProps }));
|
|
154
313
|
});
|
|
155
314
|
function getCommentMeasurementKey(measurement) {
|
|
156
315
|
const rectKey = measurement.rects
|
|
@@ -161,77 +320,140 @@ function getCommentMeasurementKey(measurement) {
|
|
|
161
320
|
function roundMeasurement(value) {
|
|
162
321
|
return Math.round(value * 2) / 2;
|
|
163
322
|
}
|
|
164
|
-
function
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
323
|
+
function getCommentTextRangeKey(comment) {
|
|
324
|
+
return `comment:${comment.id}`;
|
|
325
|
+
}
|
|
326
|
+
function getDraftBridgeTextRange(range) {
|
|
327
|
+
const textRange = getSelectionTextRange(range);
|
|
328
|
+
if (!range?.fieldId || !range.itemId || !textRange)
|
|
329
|
+
return undefined;
|
|
330
|
+
return {
|
|
331
|
+
key: COMMENT_DRAFT_TEXT_RANGE_KEY,
|
|
332
|
+
elementKey: range.elementKey,
|
|
333
|
+
fieldId: range.fieldId,
|
|
334
|
+
item: {
|
|
335
|
+
id: range.itemId,
|
|
336
|
+
language: range.language || "",
|
|
337
|
+
version: typeof range.version === "number" ? range.version : undefined,
|
|
338
|
+
},
|
|
339
|
+
start: textRange[0],
|
|
340
|
+
end: textRange[1],
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
function getSelectionTextRange(range) {
|
|
344
|
+
if (!range?.text?.trim() ||
|
|
345
|
+
typeof range.startOffset !== "number" ||
|
|
346
|
+
typeof range.endOffset !== "number") {
|
|
347
|
+
return null;
|
|
186
348
|
}
|
|
187
|
-
|
|
349
|
+
const start = Math.max(0, Math.min(range.startOffset, range.endOffset));
|
|
350
|
+
const end = Math.max(start, range.startOffset, range.endOffset);
|
|
351
|
+
return end > start ? [start, end] : null;
|
|
188
352
|
}
|
|
189
|
-
function
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
353
|
+
function getCommentTransientElementKey(comment) {
|
|
354
|
+
return comment[COMMENT_TRANSIENT_ELEMENT_KEY];
|
|
355
|
+
}
|
|
356
|
+
function hasAnyExpectedBridgeTextRange(geometry, textRanges) {
|
|
357
|
+
if (!geometry)
|
|
358
|
+
return false;
|
|
359
|
+
const expectedKeys = new Set(textRanges.map((range) => range.key));
|
|
360
|
+
return geometry.targets.some((target) => target.kind === "textRange" && expectedKeys.has(target.key));
|
|
361
|
+
}
|
|
362
|
+
function hasAllExpectedBridgeTextRanges(geometry, textRanges) {
|
|
363
|
+
if (!geometry)
|
|
364
|
+
return false;
|
|
365
|
+
const availableKeys = new Set(geometry.targets
|
|
366
|
+
.filter((target) => target.kind === "textRange")
|
|
367
|
+
.map((target) => target.key));
|
|
368
|
+
return textRanges.every((range) => availableKeys.has(range.key));
|
|
369
|
+
}
|
|
370
|
+
function getCommentTextRange(comment) {
|
|
371
|
+
if (typeof comment.rangeStart !== "number" ||
|
|
372
|
+
typeof comment.rangeEnd !== "number") {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
const start = Math.max(0, Math.min(comment.rangeStart, comment.rangeEnd));
|
|
376
|
+
const end = Math.max(start, comment.rangeStart, comment.rangeEnd);
|
|
377
|
+
return end > start ? [start, end] : null;
|
|
378
|
+
}
|
|
379
|
+
function getCommentFieldDescriptors(comment) {
|
|
380
|
+
if (!comment.fieldId)
|
|
381
|
+
return [];
|
|
382
|
+
const items = getCommentCandidateItems(comment);
|
|
383
|
+
return items.map((item) => ({
|
|
384
|
+
fieldId: comment.fieldId,
|
|
385
|
+
item,
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
function getCommentCandidateItems(comment) {
|
|
389
|
+
const candidates = [];
|
|
390
|
+
const addCandidate = (id) => {
|
|
391
|
+
if (!id)
|
|
392
|
+
return;
|
|
393
|
+
const normalizedId = normalizeMarkerId(id);
|
|
394
|
+
if (candidates.some((candidate) => normalizeMarkerId(candidate.id) === normalizedId)) {
|
|
395
|
+
return;
|
|
226
396
|
}
|
|
397
|
+
candidates.push({
|
|
398
|
+
id,
|
|
399
|
+
language: comment.language,
|
|
400
|
+
version: comment.version,
|
|
401
|
+
});
|
|
402
|
+
};
|
|
403
|
+
addCandidate(comment.itemId);
|
|
404
|
+
addCandidate(comment.mainItemId);
|
|
405
|
+
comment.relatedItems?.forEach((item) => addCandidate(item.itemId));
|
|
406
|
+
return candidates;
|
|
407
|
+
}
|
|
408
|
+
function measureBridgeCommentComponentRect(comment, pageViewContext, bridgeGeometry, metrics) {
|
|
409
|
+
const page = pageViewContext?.page;
|
|
410
|
+
if (!page)
|
|
411
|
+
return null;
|
|
412
|
+
for (const item of getCommentCandidateItems(comment)) {
|
|
413
|
+
const component = getComponentById(item.id, page);
|
|
414
|
+
if (!component)
|
|
415
|
+
continue;
|
|
416
|
+
const measurement = measureBridgeComponentRect(bridgeGeometry, component, metrics);
|
|
417
|
+
if (measurement?.rect)
|
|
418
|
+
return measurement.rect;
|
|
227
419
|
}
|
|
228
|
-
return
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
function getTransientSelectionRects(comment, metrics, iframe) {
|
|
423
|
+
const rect = comment[COMMENT_TRANSIENT_SELECTION_RECT];
|
|
424
|
+
return rect ? viewportSelectionRectToOverlayRects(rect, metrics, iframe) : [];
|
|
229
425
|
}
|
|
230
|
-
function
|
|
231
|
-
|
|
426
|
+
function getSelectionRangeClientRects(range, metrics, iframe) {
|
|
427
|
+
const rect = range.clientRect;
|
|
428
|
+
return rect ? viewportSelectionRectToOverlayRects(rect, metrics, iframe) : [];
|
|
232
429
|
}
|
|
233
|
-
function
|
|
234
|
-
|
|
430
|
+
function viewportSelectionRectToOverlayRects(rect, metrics, iframe) {
|
|
431
|
+
if (!rect || rect.width <= 0 || rect.height <= 0)
|
|
432
|
+
return [];
|
|
433
|
+
const iframeRect = iframe?.getBoundingClientRect();
|
|
434
|
+
return [
|
|
435
|
+
toOverlayRect({
|
|
436
|
+
left: iframeRect ? rect.left - iframeRect.left : rect.left,
|
|
437
|
+
top: iframeRect ? rect.top - iframeRect.top : rect.top,
|
|
438
|
+
width: rect.width,
|
|
439
|
+
height: rect.height,
|
|
440
|
+
}, metrics),
|
|
441
|
+
];
|
|
442
|
+
}
|
|
443
|
+
function dedupeOverlayRects(rects) {
|
|
444
|
+
const seen = new Set();
|
|
445
|
+
return rects.filter((rect) => {
|
|
446
|
+
const key = [
|
|
447
|
+
Math.round(rect.x * 100),
|
|
448
|
+
Math.round(rect.y * 100),
|
|
449
|
+
Math.round(rect.width * 100),
|
|
450
|
+
Math.round(rect.height * 100),
|
|
451
|
+
].join(":");
|
|
452
|
+
if (seen.has(key))
|
|
453
|
+
return false;
|
|
454
|
+
seen.add(key);
|
|
455
|
+
return true;
|
|
456
|
+
});
|
|
235
457
|
}
|
|
236
458
|
function getCommentRangeStyle(comments, isSelected) {
|
|
237
459
|
const allResolved = comments.every((comment) => comment.isResolved);
|
|
@@ -253,6 +475,13 @@ function getCommentRangeStyle(comments, isSelected) {
|
|
|
253
475
|
: {}),
|
|
254
476
|
};
|
|
255
477
|
}
|
|
478
|
+
function getDraftCommentRangeStyle() {
|
|
479
|
+
return {
|
|
480
|
+
background: "color-mix(in srgb, var(--color-highlight-100) 32%, transparent)",
|
|
481
|
+
borderRadius: "2px",
|
|
482
|
+
boxShadow: "0 1px 4px color-mix(in srgb, var(--color-highlight-100) 18%, transparent)",
|
|
483
|
+
};
|
|
484
|
+
}
|
|
256
485
|
function getCommentFallbackStyle(comments, isSelected) {
|
|
257
486
|
const allResolved = comments.every((comment) => comment.isResolved);
|
|
258
487
|
const color = allResolved
|
|
@@ -273,108 +502,4 @@ const commentHighlightingStyles = `
|
|
|
273
502
|
}
|
|
274
503
|
}
|
|
275
504
|
`;
|
|
276
|
-
function resolveCommentRange(comment, fieldElement, iframeDocument) {
|
|
277
|
-
if (comment.rangeStart === undefined || comment.rangeEnd === undefined) {
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
const originalRange = [
|
|
281
|
-
Math.max(0, comment.rangeStart),
|
|
282
|
-
Math.max(comment.rangeStart, comment.rangeEnd),
|
|
283
|
-
];
|
|
284
|
-
const storedText = getStoredFieldText(comment, fieldElement, iframeDocument);
|
|
285
|
-
const currentText = fieldElement.textContent || "";
|
|
286
|
-
if (!storedText || storedText === currentText) {
|
|
287
|
-
return originalRange;
|
|
288
|
-
}
|
|
289
|
-
const mapping = computeMapping(currentText, storedText);
|
|
290
|
-
const mappedStart = mapping[originalRange[0]];
|
|
291
|
-
const mappedEnd = mapping[originalRange[1]];
|
|
292
|
-
if (mappedStart === undefined || mappedEnd === undefined) {
|
|
293
|
-
return originalRange;
|
|
294
|
-
}
|
|
295
|
-
return [mappedStart, Math.max(mappedStart, mappedEnd)];
|
|
296
|
-
}
|
|
297
|
-
function getStoredFieldText(comment, fieldElement, iframeDocument) {
|
|
298
|
-
if (!comment.fieldValue)
|
|
299
|
-
return "";
|
|
300
|
-
const isRichText = fieldElement.getAttribute("data-is-richtext") === "true";
|
|
301
|
-
if (!isRichText)
|
|
302
|
-
return comment.fieldValue;
|
|
303
|
-
const template = iframeDocument.createElement("template");
|
|
304
|
-
template.innerHTML = comment.fieldValue;
|
|
305
|
-
return template.content.textContent || "";
|
|
306
|
-
}
|
|
307
|
-
function computeMapping(s1, s2) {
|
|
308
|
-
const n = s1.length;
|
|
309
|
-
const m = s2.length;
|
|
310
|
-
const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
311
|
-
const back = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(""));
|
|
312
|
-
for (let i = 0; i <= n; i++) {
|
|
313
|
-
dp[i][0] = i;
|
|
314
|
-
if (i > 0)
|
|
315
|
-
back[i][0] = "D";
|
|
316
|
-
}
|
|
317
|
-
for (let j = 0; j <= m; j++) {
|
|
318
|
-
dp[0][j] = j;
|
|
319
|
-
if (j > 0)
|
|
320
|
-
back[0][j] = "I";
|
|
321
|
-
}
|
|
322
|
-
for (let i = 1; i <= n; i++) {
|
|
323
|
-
for (let j = 1; j <= m; j++) {
|
|
324
|
-
const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;
|
|
325
|
-
const deletion = dp[i - 1][j] + 1;
|
|
326
|
-
const insertion = dp[i][j - 1] + 1;
|
|
327
|
-
const substitution = dp[i - 1][j - 1] + cost;
|
|
328
|
-
let bestVal = deletion;
|
|
329
|
-
let op = "D";
|
|
330
|
-
if (insertion < bestVal) {
|
|
331
|
-
bestVal = insertion;
|
|
332
|
-
op = "I";
|
|
333
|
-
}
|
|
334
|
-
if (substitution < bestVal) {
|
|
335
|
-
bestVal = substitution;
|
|
336
|
-
op = cost === 0 ? "M" : "S";
|
|
337
|
-
}
|
|
338
|
-
dp[i][j] = bestVal;
|
|
339
|
-
back[i][j] = op;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
const ops = [];
|
|
343
|
-
let i = n;
|
|
344
|
-
let j = m;
|
|
345
|
-
while (i > 0 || j > 0) {
|
|
346
|
-
const op = back[i][j];
|
|
347
|
-
ops.push(op);
|
|
348
|
-
if (op === "M" || op === "S") {
|
|
349
|
-
i--;
|
|
350
|
-
j--;
|
|
351
|
-
}
|
|
352
|
-
else if (op === "D") {
|
|
353
|
-
i--;
|
|
354
|
-
}
|
|
355
|
-
else if (op === "I") {
|
|
356
|
-
j--;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
ops.reverse();
|
|
360
|
-
const mapping = new Array(m + 1);
|
|
361
|
-
let iPos = 0;
|
|
362
|
-
let jPos = 0;
|
|
363
|
-
mapping[jPos] = iPos;
|
|
364
|
-
for (const op of ops) {
|
|
365
|
-
if (op === "M" || op === "S") {
|
|
366
|
-
iPos++;
|
|
367
|
-
jPos++;
|
|
368
|
-
mapping[jPos] = iPos;
|
|
369
|
-
}
|
|
370
|
-
else if (op === "I") {
|
|
371
|
-
jPos++;
|
|
372
|
-
mapping[jPos] = iPos;
|
|
373
|
-
}
|
|
374
|
-
else if (op === "D") {
|
|
375
|
-
iPos++;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
return mapping;
|
|
379
|
-
}
|
|
380
505
|
//# sourceMappingURL=CommentHighlightings.js.map
|