@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.
- package/dist/components/emoji/EmojiPicker.d.ts +18 -0
- package/dist/components/emoji/EmojiPicker.js +102 -0
- package/dist/components/emoji/EmojiPicker.js.map +1 -0
- package/dist/components/emoji/EmojiText.d.ts +19 -0
- package/dist/components/emoji/EmojiText.js +30 -0
- package/dist/components/emoji/EmojiText.js.map +1 -0
- package/dist/components/emoji/emojiData.generated.d.ts +2 -0
- package/dist/components/emoji/emojiData.generated.js +1878 -0
- package/dist/components/emoji/emojiData.generated.js.map +1 -0
- package/dist/components/emoji/emojiIndex.d.ts +46 -0
- package/dist/components/emoji/emojiIndex.js +173 -0
- package/dist/components/emoji/emojiIndex.js.map +1 -0
- package/dist/components/emoji/emoticons.d.ts +21 -0
- package/dist/components/emoji/emoticons.js +167 -0
- package/dist/components/emoji/emoticons.js.map +1 -0
- package/dist/components/emoji/textareaInsert.d.ts +19 -0
- package/dist/components/emoji/textareaInsert.js +29 -0
- package/dist/components/emoji/textareaInsert.js.map +1 -0
- package/dist/components/emoji/twemoji.d.ts +30 -0
- package/dist/components/emoji/twemoji.js +84 -0
- package/dist/components/emoji/twemoji.js.map +1 -0
- package/dist/editor/agent-changes/agentChangeTargets.js +6 -0
- package/dist/editor/agent-changes/agentChangeTargets.js.map +1 -1
- package/dist/editor/agent-changes/agentChangeTextHighlight.d.ts +48 -4
- package/dist/editor/agent-changes/agentChangeTextHighlight.js +67 -9
- package/dist/editor/agent-changes/agentChangeTextHighlight.js.map +1 -1
- package/dist/editor/ai/AgentImagePreview.d.ts +13 -0
- package/dist/editor/ai/AgentImagePreview.js +41 -0
- package/dist/editor/ai/AgentImagePreview.js.map +1 -0
- package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js +1 -1
- package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js.map +1 -1
- package/dist/editor/ai/terminal/components/ResponseTurnDuration.js +1 -2
- package/dist/editor/ai/terminal/components/ResponseTurnDuration.js.map +1 -1
- package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.d.ts +6 -0
- package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js +61 -0
- package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js.map +1 -0
- package/dist/editor/ai/terminal/toolCallDiagnostics.d.ts +34 -0
- package/dist/editor/ai/terminal/toolCallDiagnostics.js +218 -0
- package/dist/editor/ai/terminal/toolCallDiagnostics.js.map +1 -0
- package/dist/editor/bridge/linkDownload.d.ts +3 -0
- package/dist/editor/bridge/linkDownload.js +52 -0
- package/dist/editor/bridge/linkDownload.js.map +1 -0
- package/dist/editor/client/clipboardStorage.d.ts +10 -0
- package/dist/editor/client/clipboardStorage.js +57 -0
- package/dist/editor/client/clipboardStorage.js.map +1 -0
- package/dist/editor/client/hooks/useRepositoryItemRefresh.d.ts +4 -0
- package/dist/editor/client/hooks/useRepositoryItemRefresh.js +62 -0
- package/dist/editor/client/hooks/useRepositoryItemRefresh.js.map +1 -0
- package/dist/editor/client/liveEditState.d.ts +16 -0
- package/dist/editor/client/liveEditState.js +25 -0
- package/dist/editor/client/liveEditState.js.map +1 -0
- package/dist/editor/client/liveSessionState.d.ts +6 -0
- package/dist/editor/client/liveSessionState.js +20 -0
- package/dist/editor/client/liveSessionState.js.map +1 -0
- package/dist/editor/client/valueStore.d.ts +22 -0
- package/dist/editor/client/valueStore.js +29 -0
- package/dist/editor/client/valueStore.js.map +1 -0
- package/dist/editor/commands/componentClipboardCommands.d.ts +35 -0
- package/dist/editor/commands/componentClipboardCommands.js +271 -0
- package/dist/editor/commands/componentClipboardCommands.js.map +1 -0
- package/dist/editor/commands/componentMenuGroups.d.ts +2 -0
- package/dist/editor/commands/componentMenuGroups.js +43 -0
- package/dist/editor/commands/componentMenuGroups.js.map +1 -0
- package/dist/editor/component-conversion/ComponentTypePickerDialog.d.ts +12 -0
- package/dist/editor/component-conversion/ComponentTypePickerDialog.js +40 -0
- package/dist/editor/component-conversion/ComponentTypePickerDialog.js.map +1 -0
- package/dist/editor/component-conversion/ConversionAiDebugButton.d.ts +17 -0
- package/dist/editor/component-conversion/ConversionAiDebugButton.js +80 -0
- package/dist/editor/component-conversion/ConversionAiDebugButton.js.map +1 -0
- package/dist/editor/component-conversion/ConvertComponentDialog.d.ts +28 -0
- package/dist/editor/component-conversion/ConvertComponentDialog.js +633 -0
- package/dist/editor/component-conversion/ConvertComponentDialog.js.map +1 -0
- package/dist/editor/component-conversion/conversionModel.d.ts +109 -0
- package/dist/editor/component-conversion/conversionModel.js +519 -0
- package/dist/editor/component-conversion/conversionModel.js.map +1 -0
- package/dist/editor/component-conversion/conversionService.d.ts +12 -0
- package/dist/editor/component-conversion/conversionService.js +16 -0
- package/dist/editor/component-conversion/conversionService.js.map +1 -0
- package/dist/editor/component-conversion/conversionTypes.d.ts +214 -0
- package/dist/editor/component-conversion/conversionTypes.js +2 -0
- package/dist/editor/component-conversion/conversionTypes.js.map +1 -0
- package/dist/editor/component-conversion/convertComponentsCommand.d.ts +25 -0
- package/dist/editor/component-conversion/convertComponentsCommand.js +196 -0
- package/dist/editor/component-conversion/convertComponentsCommand.js.map +1 -0
- package/dist/editor/field-types/FieldHistoryBoundary.js +28 -7
- package/dist/editor/field-types/FieldHistoryBoundary.js.map +1 -1
- package/dist/editor/field-types/fieldStyles.d.ts +21 -0
- package/dist/editor/field-types/fieldStyles.js +22 -0
- package/dist/editor/field-types/fieldStyles.js.map +1 -0
- package/dist/editor/field-types/richtext/utils/changeHighlight.d.ts +14 -0
- package/dist/editor/field-types/richtext/utils/changeHighlight.js +12 -1
- package/dist/editor/field-types/richtext/utils/changeHighlight.js.map +1 -1
- package/dist/editor/field-types/richtext/utils/spellCheckText.d.ts +31 -0
- package/dist/editor/field-types/richtext/utils/spellCheckText.js +82 -0
- package/dist/editor/field-types/richtext/utils/spellCheckText.js.map +1 -0
- package/dist/editor/field-types/useFocusedFieldInput.d.ts +13 -0
- package/dist/editor/field-types/useFocusedFieldInput.js +50 -0
- package/dist/editor/field-types/useFocusedFieldInput.js.map +1 -0
- package/dist/editor/field-types/useFormFieldSelectionRange.d.ts +43 -0
- package/dist/editor/field-types/useFormFieldSelectionRange.js +149 -0
- package/dist/editor/field-types/useFormFieldSelectionRange.js.map +1 -0
- package/dist/editor/find-replace/FindReplacePanel.d.ts +11 -0
- package/dist/editor/find-replace/FindReplacePanel.js +311 -0
- package/dist/editor/find-replace/FindReplacePanel.js.map +1 -0
- package/dist/editor/find-replace/findReplaceCommand.d.ts +8 -0
- package/dist/editor/find-replace/findReplaceCommand.js +25 -0
- package/dist/editor/find-replace/findReplaceCommand.js.map +1 -0
- package/dist/editor/find-replace/findReplaceMatches.d.ts +42 -0
- package/dist/editor/find-replace/findReplaceMatches.js +66 -0
- package/dist/editor/find-replace/findReplaceMatches.js.map +1 -0
- package/dist/editor/find-replace/findReplaceStore.d.ts +30 -0
- package/dist/editor/find-replace/findReplaceStore.js +61 -0
- package/dist/editor/find-replace/findReplaceStore.js.map +1 -0
- package/dist/editor/find-replace/findReplaceTargets.d.ts +51 -0
- package/dist/editor/find-replace/findReplaceTargets.js +110 -0
- package/dist/editor/find-replace/findReplaceTargets.js.map +1 -0
- package/dist/editor/find-replace/findReplaceText.d.ts +50 -0
- package/dist/editor/find-replace/findReplaceText.js +189 -0
- package/dist/editor/find-replace/findReplaceText.js.map +1 -0
- package/dist/editor/itemContextMenuGroups.js +10 -1
- package/dist/editor/itemContextMenuGroups.js.map +1 -1
- package/dist/editor/media-selector/MediaDetailsView.d.ts +14 -0
- package/dist/editor/media-selector/MediaDetailsView.js +152 -0
- package/dist/editor/media-selector/MediaDetailsView.js.map +1 -0
- package/dist/editor/media-selector/useMediaFolderDrag.d.ts +26 -0
- package/dist/editor/media-selector/useMediaFolderDrag.js +153 -0
- package/dist/editor/media-selector/useMediaFolderDrag.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.d.ts +11 -0
- package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js +65 -0
- package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/FindReplaceControls.d.ts +6 -0
- package/dist/editor/menubar/toolbar-sections/FindReplaceControls.js +31 -0
- package/dist/editor/menubar/toolbar-sections/FindReplaceControls.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.d.ts +5 -0
- package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js +16 -0
- package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js.map +1 -0
- package/dist/editor/mobileBottomPanel.d.ts +40 -0
- package/dist/editor/mobileBottomPanel.js +63 -0
- package/dist/editor/mobileBottomPanel.js.map +1 -0
- package/dist/editor/page-editor-chrome/AgentChangeHighlightings.d.ts +3 -6
- package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js +8 -6
- package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.d.ts +6 -0
- package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js +100 -0
- package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js.map +1 -0
- package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.d.ts +9 -0
- package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js +32 -0
- package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js.map +1 -0
- package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.d.ts +14 -0
- package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js +110 -0
- package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js.map +1 -0
- package/dist/editor/page-editor-chrome/ConversionIndicators.d.ts +8 -0
- package/dist/editor/page-editor-chrome/ConversionIndicators.js +75 -0
- package/dist/editor/page-editor-chrome/ConversionIndicators.js.map +1 -0
- package/dist/editor/page-editor-chrome/DiffHighlightOverlay.d.ts +9 -13
- package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js +25 -20
- package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.d.ts +15 -0
- package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js +31 -0
- package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js.map +1 -0
- package/dist/editor/page-editor-chrome/FindReplaceHighlightings.d.ts +11 -0
- package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js +120 -0
- package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js.map +1 -0
- package/dist/editor/page-editor-chrome/SpellCheckHighlightings.d.ts +12 -0
- package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js +197 -0
- package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js.map +1 -0
- package/dist/editor/page-editor-chrome/ValidationRulerMarks.d.ts +11 -0
- package/dist/editor/page-editor-chrome/ValidationRulerMarks.js +56 -0
- package/dist/editor/page-editor-chrome/ValidationRulerMarks.js.map +1 -0
- package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.d.ts +44 -0
- package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js +89 -0
- package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js.map +1 -0
- package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.d.ts +17 -0
- package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js +53 -0
- package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js.map +1 -0
- package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.d.ts +11 -0
- package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js +84 -0
- package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js.map +1 -0
- package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.d.ts +34 -0
- package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js +229 -0
- package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js.map +1 -0
- package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.d.ts +9 -0
- package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js +34 -0
- package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js.map +1 -0
- package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.d.ts +49 -0
- package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js +241 -0
- package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js.map +1 -0
- package/dist/editor/page-viewer/CanvasOverviewRuler.d.ts +11 -0
- package/dist/editor/page-viewer/CanvasOverviewRuler.js +65 -0
- package/dist/editor/page-viewer/CanvasOverviewRuler.js.map +1 -0
- package/dist/editor/page-viewer/DynamicRenderingsBar.d.ts +23 -0
- package/dist/editor/page-viewer/DynamicRenderingsBar.js +28 -0
- package/dist/editor/page-viewer/DynamicRenderingsBar.js.map +1 -0
- package/dist/editor/page-viewer/DynamicRenderingsStrip.d.ts +18 -0
- package/dist/editor/page-viewer/DynamicRenderingsStrip.js +29 -0
- package/dist/editor/page-viewer/DynamicRenderingsStrip.js.map +1 -0
- package/dist/editor/page-viewer/FeedbackMargin.d.ts +57 -0
- package/dist/editor/page-viewer/FeedbackMargin.js +377 -0
- package/dist/editor/page-viewer/FeedbackMargin.js.map +1 -0
- package/dist/editor/page-viewer/FeedbackMarginController.d.ts +76 -0
- package/dist/editor/page-viewer/FeedbackMarginController.js +241 -0
- package/dist/editor/page-viewer/FeedbackMarginController.js.map +1 -0
- package/dist/editor/page-viewer/FeedbackMarginMarker.d.ts +16 -0
- package/dist/editor/page-viewer/FeedbackMarginMarker.js +24 -0
- package/dist/editor/page-viewer/FeedbackMarginMarker.js.map +1 -0
- package/dist/editor/page-viewer/FeedbackMarginResizeHandle.d.ts +23 -0
- package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js +105 -0
- package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js.map +1 -0
- package/dist/editor/page-viewer/InteractivePreviewBar.d.ts +24 -0
- package/dist/editor/page-viewer/InteractivePreviewBar.js +31 -0
- package/dist/editor/page-viewer/InteractivePreviewBar.js.map +1 -0
- package/dist/editor/page-viewer/MobileCommentsPanel.d.ts +16 -0
- package/dist/editor/page-viewer/MobileCommentsPanel.js +112 -0
- package/dist/editor/page-viewer/MobileCommentsPanel.js.map +1 -0
- package/dist/editor/page-viewer/RenderingAiCheck.d.ts +18 -0
- package/dist/editor/page-viewer/RenderingAiCheck.js +45 -0
- package/dist/editor/page-viewer/RenderingAiCheck.js.map +1 -0
- package/dist/editor/page-viewer/RenderingApprovalDialog.d.ts +32 -0
- package/dist/editor/page-viewer/RenderingApprovalDialog.js +191 -0
- package/dist/editor/page-viewer/RenderingApprovalDialog.js.map +1 -0
- package/dist/editor/page-viewer/SealedClientCodePreview.d.ts +17 -0
- package/dist/editor/page-viewer/SealedClientCodePreview.js +38 -0
- package/dist/editor/page-viewer/SealedClientCodePreview.js.map +1 -0
- package/dist/editor/page-viewer/canvasFrameNavigation.d.ts +18 -0
- package/dist/editor/page-viewer/canvasFrameNavigation.js +36 -0
- package/dist/editor/page-viewer/canvasFrameNavigation.js.map +1 -0
- package/dist/editor/page-viewer/canvasLoadSettling.d.ts +42 -0
- package/dist/editor/page-viewer/canvasLoadSettling.js +46 -0
- package/dist/editor/page-viewer/canvasLoadSettling.js.map +1 -0
- package/dist/editor/page-viewer/canvasScrollHandoff.d.ts +34 -0
- package/dist/editor/page-viewer/canvasScrollHandoff.js +55 -0
- package/dist/editor/page-viewer/canvasScrollHandoff.js.map +1 -0
- package/dist/editor/page-viewer/compareFrameWidth.d.ts +8 -0
- package/dist/editor/page-viewer/compareFrameWidth.js +25 -0
- package/dist/editor/page-viewer/compareFrameWidth.js.map +1 -0
- package/dist/editor/page-viewer/feedbackMarginLayout.d.ts +119 -0
- package/dist/editor/page-viewer/feedbackMarginLayout.js +155 -0
- package/dist/editor/page-viewer/feedbackMarginLayout.js.map +1 -0
- package/dist/editor/page-viewer/feedbackMarginSources.d.ts +36 -0
- package/dist/editor/page-viewer/feedbackMarginSources.js +196 -0
- package/dist/editor/page-viewer/feedbackMarginSources.js.map +1 -0
- package/dist/editor/page-viewer/feedbackMarginWidth.d.ts +43 -0
- package/dist/editor/page-viewer/feedbackMarginWidth.js +107 -0
- package/dist/editor/page-viewer/feedbackMarginWidth.js.map +1 -0
- package/dist/editor/page-viewer/interactivePreview.d.ts +168 -0
- package/dist/editor/page-viewer/interactivePreview.js +344 -0
- package/dist/editor/page-viewer/interactivePreview.js.map +1 -0
- package/dist/editor/page-viewer/minimapViewport.d.ts +2 -0
- package/dist/editor/page-viewer/minimapViewport.js +34 -0
- package/dist/editor/page-viewer/minimapViewport.js.map +1 -0
- package/dist/editor/page-viewer/openPageItems.d.ts +29 -0
- package/dist/editor/page-viewer/openPageItems.js +73 -0
- package/dist/editor/page-viewer/openPageItems.js.map +1 -0
- package/dist/editor/page-viewer/overviewRuler.d.ts +128 -0
- package/dist/editor/page-viewer/overviewRuler.js +226 -0
- package/dist/editor/page-viewer/overviewRuler.js.map +1 -0
- package/dist/editor/page-viewer/renderingApproval.d.ts +59 -0
- package/dist/editor/page-viewer/renderingApproval.js +186 -0
- package/dist/editor/page-viewer/renderingApproval.js.map +1 -0
- package/dist/editor/page-viewer/renderingChanges.d.ts +29 -0
- package/dist/editor/page-viewer/renderingChanges.js +40 -0
- package/dist/editor/page-viewer/renderingChanges.js.map +1 -0
- package/dist/editor/page-viewer/scrollIntoViewTextRanges.d.ts +23 -0
- package/dist/editor/page-viewer/scrollIntoViewTextRanges.js +26 -0
- package/dist/editor/page-viewer/scrollIntoViewTextRanges.js.map +1 -0
- package/dist/editor/page-viewer/useInteractivePreview.d.ts +77 -0
- package/dist/editor/page-viewer/useInteractivePreview.js +210 -0
- package/dist/editor/page-viewer/useInteractivePreview.js.map +1 -0
- package/dist/editor/reviews/CollapsibleText.d.ts +13 -0
- package/dist/editor/reviews/CollapsibleText.js +41 -0
- package/dist/editor/reviews/CollapsibleText.js.map +1 -0
- package/dist/editor/reviews/CommentImageAttachments.d.ts +12 -0
- package/dist/editor/reviews/CommentImageAttachments.js +19 -0
- package/dist/editor/reviews/CommentImageAttachments.js.map +1 -0
- package/dist/editor/reviews/CommentQuote.d.ts +13 -0
- package/dist/editor/reviews/CommentQuote.js +35 -0
- package/dist/editor/reviews/CommentQuote.js.map +1 -0
- package/dist/editor/reviews/CommentTargetOutline.d.ts +13 -0
- package/dist/editor/reviews/CommentTargetOutline.js +21 -0
- package/dist/editor/reviews/CommentTargetOutline.js.map +1 -0
- package/dist/editor/reviews/CommentTargetPickerDomLayer.d.ts +7 -0
- package/dist/editor/reviews/CommentTargetPickerDomLayer.js +117 -0
- package/dist/editor/reviews/CommentTargetPickerDomLayer.js.map +1 -0
- package/dist/editor/reviews/CommentThreadAgentLink.d.ts +28 -0
- package/dist/editor/reviews/CommentThreadAgentLink.js +37 -0
- package/dist/editor/reviews/CommentThreadAgentLink.js.map +1 -0
- package/dist/editor/reviews/CommentThreadCard.d.ts +34 -0
- package/dist/editor/reviews/CommentThreadCard.js +156 -0
- package/dist/editor/reviews/CommentThreadCard.js.map +1 -0
- package/dist/editor/reviews/SuggestionThreadCard.d.ts +19 -0
- package/dist/editor/reviews/SuggestionThreadCard.js +25 -0
- package/dist/editor/reviews/SuggestionThreadCard.js.map +1 -0
- package/dist/editor/reviews/addCommentOnTarget.d.ts +22 -0
- package/dist/editor/reviews/addCommentOnTarget.js +32 -0
- package/dist/editor/reviews/addCommentOnTarget.js.map +1 -0
- package/dist/editor/reviews/balloonLayout.d.ts +51 -0
- package/dist/editor/reviews/balloonLayout.js +101 -0
- package/dist/editor/reviews/balloonLayout.js.map +1 -0
- package/dist/editor/reviews/commentAgentAttachments.d.ts +5 -0
- package/dist/editor/reviews/commentAgentAttachments.js +51 -0
- package/dist/editor/reviews/commentAgentAttachments.js.map +1 -0
- package/dist/editor/reviews/commentImages.d.ts +48 -0
- package/dist/editor/reviews/commentImages.js +128 -0
- package/dist/editor/reviews/commentImages.js.map +1 -0
- package/dist/editor/reviews/commentTargetPicker.d.ts +114 -0
- package/dist/editor/reviews/commentTargetPicker.js +153 -0
- package/dist/editor/reviews/commentTargetPicker.js.map +1 -0
- package/dist/editor/reviews/feedbackBalloonDate.d.ts +8 -0
- package/dist/editor/reviews/feedbackBalloonDate.js +22 -0
- package/dist/editor/reviews/feedbackBalloonDate.js.map +1 -0
- package/dist/editor/reviews/feedbackDrafts.d.ts +49 -0
- package/dist/editor/reviews/feedbackDrafts.js +74 -0
- package/dist/editor/reviews/feedbackDrafts.js.map +1 -0
- package/dist/editor/reviews/feedbackHoverState.d.ts +18 -0
- package/dist/editor/reviews/feedbackHoverState.js +35 -0
- package/dist/editor/reviews/feedbackHoverState.js.map +1 -0
- package/dist/editor/reviews/feedbackPersonFilter.d.ts +3 -0
- package/dist/editor/reviews/feedbackPersonFilter.js +32 -0
- package/dist/editor/reviews/feedbackPersonFilter.js.map +1 -0
- package/dist/editor/reviews/feedbackThreadSelection.d.ts +10 -0
- package/dist/editor/reviews/feedbackThreadSelection.js +31 -0
- package/dist/editor/reviews/feedbackThreadSelection.js.map +1 -0
- package/dist/editor/reviews/feedbackThreads.d.ts +50 -0
- package/dist/editor/reviews/feedbackThreads.js +135 -0
- package/dist/editor/reviews/feedbackThreads.js.map +1 -0
- package/dist/editor/reviews/feedbackWheelForwarding.d.ts +34 -0
- package/dist/editor/reviews/feedbackWheelForwarding.js +108 -0
- package/dist/editor/reviews/feedbackWheelForwarding.js.map +1 -0
- package/dist/editor/reviews/reviewUrlScope.d.ts +23 -0
- package/dist/editor/reviews/reviewUrlScope.js +86 -0
- package/dist/editor/reviews/reviewUrlScope.js.map +1 -0
- package/dist/editor/reviews/scrollWithin.d.ts +29 -0
- package/dist/editor/reviews/scrollWithin.js +87 -0
- package/dist/editor/reviews/scrollWithin.js.map +1 -0
- package/dist/editor/reviews/subtreeFeedback.d.ts +57 -0
- package/dist/editor/reviews/subtreeFeedback.js +137 -0
- package/dist/editor/reviews/subtreeFeedback.js.map +1 -0
- package/dist/editor/reviews/useCommentImagePaste.d.ts +80 -0
- package/dist/editor/reviews/useCommentImagePaste.js +252 -0
- package/dist/editor/reviews/useCommentImagePaste.js.map +1 -0
- package/dist/editor/reviews/useFeedbackThreads.d.ts +35 -0
- package/dist/editor/reviews/useFeedbackThreads.js +137 -0
- package/dist/editor/reviews/useFeedbackThreads.js.map +1 -0
- package/dist/editor/reviews/useMeasuredHeights.d.ts +25 -0
- package/dist/editor/reviews/useMeasuredHeights.js +176 -0
- package/dist/editor/reviews/useMeasuredHeights.js.map +1 -0
- package/dist/editor/reviews/usePendingFeedbackFocus.d.ts +7 -0
- package/dist/editor/reviews/usePendingFeedbackFocus.js +42 -0
- package/dist/editor/reviews/usePendingFeedbackFocus.js.map +1 -0
- package/dist/editor/services/mcpAccessService.d.ts +93 -0
- package/dist/editor/services/mcpAccessService.js +41 -0
- package/dist/editor/services/mcpAccessService.js.map +1 -0
- package/dist/editor/services/previewTokenService.d.ts +14 -0
- package/dist/editor/services/previewTokenService.js +34 -0
- package/dist/editor/services/previewTokenService.js.map +1 -0
- package/dist/editor/services/renderingsService.d.ts +117 -0
- package/dist/editor/services/renderingsService.js +245 -0
- package/dist/editor/services/renderingsService.js.map +1 -0
- package/dist/editor/services/spellCheckService.d.ts +13 -0
- package/dist/editor/services/spellCheckService.js +33 -0
- package/dist/editor/services/spellCheckService.js.map +1 -0
- package/dist/editor/settings/panels/McpAccessPanel.d.ts +7 -0
- package/dist/editor/settings/panels/McpAccessPanel.js +95 -0
- package/dist/editor/settings/panels/McpAccessPanel.js.map +1 -0
- package/dist/editor/settings/panels/McpAccessSettingsView.d.ts +8 -0
- package/dist/editor/settings/panels/McpAccessSettingsView.js +221 -0
- package/dist/editor/settings/panels/McpAccessSettingsView.js.map +1 -0
- package/dist/editor/settings/panels/SpellCheckPanel.d.ts +8 -0
- package/dist/editor/settings/panels/SpellCheckPanel.js +253 -0
- package/dist/editor/settings/panels/SpellCheckPanel.js.map +1 -0
- package/dist/editor/sidebar/FeedbackSidebar.d.ts +7 -0
- package/dist/editor/sidebar/FeedbackSidebar.js +300 -0
- package/dist/editor/sidebar/FeedbackSidebar.js.map +1 -0
- package/dist/editor/sidebar/OperationDetailsContent.js +50 -0
- package/dist/editor/sidebar/OperationDetailsContent.js.map +1 -1
- package/dist/editor/sidebar/liveComponentThumbnails.d.ts +19 -6
- package/dist/editor/sidebar/liveComponentThumbnails.js +39 -18
- package/dist/editor/sidebar/liveComponentThumbnails.js.map +1 -1
- package/dist/editor/spellcheck/canvasSpellCheckContextMenu.d.ts +30 -0
- package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js +69 -0
- package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js.map +1 -0
- package/dist/editor/spellcheck/htmlSpellDocument.d.ts +60 -0
- package/dist/editor/spellcheck/htmlSpellDocument.js +181 -0
- package/dist/editor/spellcheck/htmlSpellDocument.js.map +1 -0
- package/dist/editor/spellcheck/htmlSpellTokenizer.d.ts +45 -0
- package/dist/editor/spellcheck/htmlSpellTokenizer.js +277 -0
- package/dist/editor/spellcheck/htmlSpellTokenizer.js.map +1 -0
- package/dist/editor/spellcheck/replacementGuard.d.ts +27 -0
- package/dist/editor/spellcheck/replacementGuard.js +29 -0
- package/dist/editor/spellcheck/replacementGuard.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckCanvasStore.d.ts +17 -0
- package/dist/editor/spellcheck/spellCheckCanvasStore.js +37 -0
- package/dist/editor/spellcheck/spellCheckCanvasStore.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckCanvasTargets.d.ts +71 -0
- package/dist/editor/spellcheck/spellCheckCanvasTargets.js +126 -0
- package/dist/editor/spellcheck/spellCheckCanvasTargets.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckClient.d.ts +66 -0
- package/dist/editor/spellcheck/spellCheckClient.js +0 -0
- package/dist/editor/spellcheck/spellCheckClient.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckContextMenu.d.ts +52 -0
- package/dist/editor/spellcheck/spellCheckContextMenu.js +120 -0
- package/dist/editor/spellcheck/spellCheckContextMenu.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckReplace.d.ts +8 -0
- package/dist/editor/spellcheck/spellCheckReplace.js +20 -0
- package/dist/editor/spellcheck/spellCheckReplace.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckStyles.d.ts +11 -0
- package/dist/editor/spellcheck/spellCheckStyles.js +12 -0
- package/dist/editor/spellcheck/spellCheckStyles.js.map +1 -0
- package/dist/editor/spellcheck/spellCheckTypes.d.ts +94 -0
- package/dist/editor/spellcheck/spellCheckTypes.js +2 -0
- package/dist/editor/spellcheck/spellCheckTypes.js.map +1 -0
- package/dist/editor/spellcheck/textMarkHitTest.d.ts +14 -0
- package/dist/editor/spellcheck/textMarkHitTest.js +39 -0
- package/dist/editor/spellcheck/textMarkHitTest.js.map +1 -0
- package/dist/editor/spellcheck/useSpellCheck.d.ts +16 -0
- package/dist/editor/spellcheck/useSpellCheck.js +57 -0
- package/dist/editor/spellcheck/useSpellCheck.js.map +1 -0
- package/dist/editor/ui/DynamicRenderingsPublishWarning.d.ts +14 -0
- package/dist/editor/ui/DynamicRenderingsPublishWarning.js +40 -0
- package/dist/editor/ui/DynamicRenderingsPublishWarning.js.map +1 -0
- package/dist/editor/ui/ParheliaMark.d.ts +15 -0
- package/dist/editor/ui/ParheliaMark.js +12 -0
- package/dist/editor/ui/ParheliaMark.js.map +1 -0
- package/dist/editor/ui/RootItemPicker.d.ts +18 -0
- package/dist/editor/ui/RootItemPicker.js +112 -0
- package/dist/editor/ui/RootItemPicker.js.map +1 -0
- package/dist/editor/undoEligibility.d.ts +2 -0
- package/dist/editor/undoEligibility.js +8 -0
- package/dist/editor/undoEligibility.js.map +1 -0
- package/dist/editor/utils/dataTransferImages.d.ts +7 -0
- package/dist/editor/utils/dataTransferImages.js +43 -0
- package/dist/editor/utils/dataTransferImages.js.map +1 -0
- package/dist/editor/validation/navigateToValidationIssue.d.ts +2 -2
- package/dist/editor/validation/navigateToValidationIssue.js +1 -1
- package/dist/editor/validation/navigateToValidationIssue.js.map +1 -1
- package/dist/editor/validation/validationRulerIssues.d.ts +17 -0
- package/dist/editor/validation/validationRulerIssues.js +44 -0
- package/dist/editor/validation/validationRulerIssues.js.map +1 -0
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/task-board/components/AttentionPromptDialog.d.ts +13 -0
- package/dist/task-board/components/AttentionPromptDialog.js +45 -0
- package/dist/task-board/components/AttentionPromptDialog.js.map +1 -0
- package/dist/task-board/components/GoalFindingsTable.d.ts +43 -0
- package/dist/task-board/components/GoalFindingsTable.js +160 -0
- package/dist/task-board/components/GoalFindingsTable.js.map +1 -0
- package/dist/task-board/components/IssuePanel.d.ts +31 -0
- package/dist/task-board/components/IssuePanel.js +268 -0
- package/dist/task-board/components/IssuePanel.js.map +1 -0
- package/dist/task-board/components/SubgoalFindings.d.ts +40 -0
- package/dist/task-board/components/SubgoalFindings.js +88 -0
- package/dist/task-board/components/SubgoalFindings.js.map +1 -0
- package/dist/task-board/services/issueService.d.ts +193 -0
- package/dist/task-board/services/issueService.js +97 -0
- package/dist/task-board/services/issueService.js.map +1 -0
- package/dist/task-board/taskBlockers.d.ts +10 -0
- package/dist/task-board/taskBlockers.js +66 -0
- package/dist/task-board/taskBlockers.js.map +1 -0
- package/dist/task-board/utils/projectDashboardModel.js +14 -0
- package/dist/task-board/utils/projectDashboardModel.js.map +1 -1
- package/dist/task-board/views/ProjectDashboardView.js +5 -13
- package/dist/task-board/views/ProjectDashboardView.js.map +1 -1
- package/dist/tour/sandbox-tour-copy.d.ts +8 -0
- package/dist/tour/sandbox-tour-copy.js +8 -0
- package/dist/tour/sandbox-tour-copy.js.map +1 -1
- package/dist/tour/sandbox-tour.d.ts +3 -0
- package/dist/tour/sandbox-tour.js +107 -3
- package/dist/tour/sandbox-tour.js.map +1 -1
- package/package.json +1 -1
- package/dist/editor/page-editor-chrome/bridgeLinkValue.d.ts +0 -10
- package/dist/editor/page-editor-chrome/bridgeLinkValue.js +0 -55
- package/dist/editor/page-editor-chrome/bridgeLinkValue.js.map +0 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scroll helpers for the feedback surfaces.
|
|
3
|
+
*
|
|
4
|
+
* `Element.scrollIntoView` walks every scrollable ancestor and scrolls each
|
|
5
|
+
* one, and its `block` option only chooses the alignment. Inside the comment
|
|
6
|
+
* margin the nearest such ancestor is the overlay root that must never
|
|
7
|
+
* scroll, and in the list it is the editor shell. So every programmatic
|
|
8
|
+
* reveal names its container and only that container's `scrollTop` changes.
|
|
9
|
+
*/
|
|
10
|
+
export const FEEDBACK_SCROLLABLE_ATTRIBUTE = "data-feedback-scrollable";
|
|
11
|
+
function getPreferredBehavior(behavior) {
|
|
12
|
+
if (behavior !== "smooth")
|
|
13
|
+
return "auto";
|
|
14
|
+
if (typeof window !== "undefined" &&
|
|
15
|
+
typeof window.matchMedia === "function" &&
|
|
16
|
+
window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
|
|
17
|
+
return "auto";
|
|
18
|
+
}
|
|
19
|
+
return "smooth";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Scrolls `container` so that `element` (a descendant) is visible. Only the
|
|
23
|
+
* container's own scroll offset changes.
|
|
24
|
+
*/
|
|
25
|
+
export function scrollElementIntoContainer(element, container, { behavior = "auto", block = "nearest" } = {}) {
|
|
26
|
+
const elementRect = element.getBoundingClientRect();
|
|
27
|
+
const containerRect = container.getBoundingClientRect();
|
|
28
|
+
const viewTop = container.scrollTop;
|
|
29
|
+
const viewHeight = container.clientHeight;
|
|
30
|
+
if (viewHeight <= 0)
|
|
31
|
+
return;
|
|
32
|
+
const offsetTop = elementRect.top - containerRect.top + viewTop;
|
|
33
|
+
const offsetBottom = offsetTop + elementRect.height;
|
|
34
|
+
const viewBottom = viewTop + viewHeight;
|
|
35
|
+
let target;
|
|
36
|
+
if (block === "center") {
|
|
37
|
+
target = offsetTop - (viewHeight - elementRect.height) / 2;
|
|
38
|
+
}
|
|
39
|
+
else if (offsetTop < viewTop) {
|
|
40
|
+
target = offsetTop;
|
|
41
|
+
}
|
|
42
|
+
else if (offsetBottom > viewBottom) {
|
|
43
|
+
target = offsetBottom - viewHeight;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const maxScrollTop = Math.max(0, container.scrollHeight - viewHeight);
|
|
49
|
+
target = Math.min(maxScrollTop, Math.max(0, target));
|
|
50
|
+
if (Math.abs(target - viewTop) < 0.5)
|
|
51
|
+
return;
|
|
52
|
+
const resolvedBehavior = getPreferredBehavior(behavior);
|
|
53
|
+
if (resolvedBehavior === "smooth" && typeof container.scrollTo === "function") {
|
|
54
|
+
container.scrollTo({ top: target, behavior: "smooth" });
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
container.scrollTop = target;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The nearest ancestor (inclusive) marked as a feedback scroll container,
|
|
61
|
+
* stopping at `root` when given.
|
|
62
|
+
*/
|
|
63
|
+
export function findFeedbackScrollContainer(element, root) {
|
|
64
|
+
let current = element;
|
|
65
|
+
while (current) {
|
|
66
|
+
if (current instanceof HTMLElement &&
|
|
67
|
+
current.hasAttribute(FEEDBACK_SCROLLABLE_ATTRIBUTE)) {
|
|
68
|
+
return current;
|
|
69
|
+
}
|
|
70
|
+
if (root && current === root)
|
|
71
|
+
return null;
|
|
72
|
+
current = current.parentElement;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Reveals `element` inside its nearest feedback scroll container. Does nothing
|
|
78
|
+
* when no container is found; it never falls back to `scrollIntoView`.
|
|
79
|
+
*/
|
|
80
|
+
export function revealInFeedbackScrollContainer(element, options) {
|
|
81
|
+
const container = findFeedbackScrollContainer(element.parentElement);
|
|
82
|
+
if (!container)
|
|
83
|
+
return false;
|
|
84
|
+
scrollElementIntoContainer(element, container, options);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=scrollWithin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollWithin.js","sourceRoot":"","sources":["../../../src/editor/reviews/scrollWithin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Comment, SuggestedEdit } from "../../types";
|
|
2
|
+
import { type FeedbackThread } from "./feedbackThreads";
|
|
3
|
+
/** The raw feedback under one root item, as the backend returns it. */
|
|
4
|
+
export type SubtreeFeedback = {
|
|
5
|
+
comments: Comment[];
|
|
6
|
+
suggestedEdits: SuggestedEdit[];
|
|
7
|
+
};
|
|
8
|
+
/** One item under the root together with its (filtered) feedback threads. */
|
|
9
|
+
export type SubtreeFeedbackItemGroup = {
|
|
10
|
+
/** `${itemId}|${language}`, item id normalized. */
|
|
11
|
+
key: string;
|
|
12
|
+
itemId: string;
|
|
13
|
+
language: string;
|
|
14
|
+
/** The latest version of the item; the backend only returns feedback on it. */
|
|
15
|
+
version: number;
|
|
16
|
+
name: string;
|
|
17
|
+
/** The threads that pass the current filters, most recent activity first. */
|
|
18
|
+
threads: FeedbackThread[];
|
|
19
|
+
/** Unresolved threads on the item, regardless of the filters. */
|
|
20
|
+
openCount: number;
|
|
21
|
+
/** Resolved comment threads and applied suggestions, regardless of the filters. */
|
|
22
|
+
resolvedCount: number;
|
|
23
|
+
/** Most recent thread creation time on the item, regardless of the filters. */
|
|
24
|
+
lastActivity: number;
|
|
25
|
+
};
|
|
26
|
+
export type SubtreeFeedbackSummary = {
|
|
27
|
+
items: number;
|
|
28
|
+
open: number;
|
|
29
|
+
resolved: number;
|
|
30
|
+
};
|
|
31
|
+
export declare function normalizeFeedbackItemId(id: string | undefined): string;
|
|
32
|
+
export declare function getSubtreeFeedbackGroupKey(itemId: string, language: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Loads the comments and suggested edits under a root item in one language.
|
|
35
|
+
* Feedback deleted in this session is dropped, like every other surface does.
|
|
36
|
+
*/
|
|
37
|
+
export declare function loadSubtreeFeedback(rootItemId: string, language: string): Promise<SubtreeFeedback>;
|
|
38
|
+
/**
|
|
39
|
+
* Groups the feedback under a root by the item it was given on. Every group
|
|
40
|
+
* carries its counts over all threads (so the header stays informative while
|
|
41
|
+
* filters hide threads) and the threads that pass the filters. Items whose
|
|
42
|
+
* every thread is filtered out are omitted; groups are ordered by their most
|
|
43
|
+
* recent activity.
|
|
44
|
+
*/
|
|
45
|
+
export declare function groupSubtreeFeedback({ comments, suggestedEdits, showResolved, selectedPeople, }: SubtreeFeedback & {
|
|
46
|
+
showResolved: boolean;
|
|
47
|
+
/** Author account names; empty means everyone. */
|
|
48
|
+
selectedPeople: string[];
|
|
49
|
+
}): SubtreeFeedbackItemGroup[];
|
|
50
|
+
export declare function summarizeSubtreeFeedback(groups: SubtreeFeedbackItemGroup[]): SubtreeFeedbackSummary;
|
|
51
|
+
/** The authors found in the loaded feedback, for the people filter. */
|
|
52
|
+
export declare function collectSubtreeFeedbackAuthors(feedback: SubtreeFeedback, getAuthorName: (item: Comment | SuggestedEdit) => string): {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
}[];
|
|
56
|
+
/** A one-line, image-free preview of a thread for the sidebar list. */
|
|
57
|
+
export declare function getFeedbackThreadPreview(thread: FeedbackThread): string;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { getSubtreeComments } from "../services/reviewsService";
|
|
2
|
+
import { getSubtreeSuggestedEdits } from "../services/suggestedEditsService";
|
|
3
|
+
import { filterRemovedComments } from "./commentState";
|
|
4
|
+
import { isResolvedFeedbackItem } from "./feedbackOrdering";
|
|
5
|
+
import { buildFeedbackThreads } from "./feedbackThreads";
|
|
6
|
+
import { isSuggestedEditRemoved } from "./suggestedEditState";
|
|
7
|
+
export function normalizeFeedbackItemId(id) {
|
|
8
|
+
return (id || "").replace(/[{}]/g, "").toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
export function getSubtreeFeedbackGroupKey(itemId, language) {
|
|
11
|
+
return `${normalizeFeedbackItemId(itemId)}|${(language || "").toLowerCase()}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Loads the comments and suggested edits under a root item in one language.
|
|
15
|
+
* Feedback deleted in this session is dropped, like every other surface does.
|
|
16
|
+
*/
|
|
17
|
+
export async function loadSubtreeFeedback(rootItemId, language) {
|
|
18
|
+
const [commentsResult, suggestionsResult] = await Promise.all([
|
|
19
|
+
getSubtreeComments(rootItemId, language),
|
|
20
|
+
getSubtreeSuggestedEdits(rootItemId, language),
|
|
21
|
+
]);
|
|
22
|
+
if (commentsResult.type !== "success") {
|
|
23
|
+
throw new Error(commentsResult.summary || "Failed to load comments");
|
|
24
|
+
}
|
|
25
|
+
if (suggestionsResult.type !== "success") {
|
|
26
|
+
throw new Error(suggestionsResult.summary || "Failed to load suggestions");
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
comments: filterRemovedComments(commentsResult.data || []),
|
|
30
|
+
suggestedEdits: (suggestionsResult.data || []).filter((edit) => !isSuggestedEditRemoved(edit.id)),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function isResolvedThread(thread) {
|
|
34
|
+
return thread.kind === "comment"
|
|
35
|
+
? isResolvedFeedbackItem(thread.root)
|
|
36
|
+
: isResolvedFeedbackItem(thread.suggestion);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Groups the feedback under a root by the item it was given on. Every group
|
|
40
|
+
* carries its counts over all threads (so the header stays informative while
|
|
41
|
+
* filters hide threads) and the threads that pass the filters. Items whose
|
|
42
|
+
* every thread is filtered out are omitted; groups are ordered by their most
|
|
43
|
+
* recent activity.
|
|
44
|
+
*/
|
|
45
|
+
export function groupSubtreeFeedback({ comments, suggestedEdits, showResolved, selectedPeople, }) {
|
|
46
|
+
const groups = new Map();
|
|
47
|
+
const groupFor = (itemId, language, version, name) => {
|
|
48
|
+
const key = getSubtreeFeedbackGroupKey(itemId, language);
|
|
49
|
+
let group = groups.get(key);
|
|
50
|
+
if (!group) {
|
|
51
|
+
group = {
|
|
52
|
+
itemId,
|
|
53
|
+
language,
|
|
54
|
+
version,
|
|
55
|
+
name: name || "",
|
|
56
|
+
comments: [],
|
|
57
|
+
suggestedEdits: [],
|
|
58
|
+
};
|
|
59
|
+
groups.set(key, group);
|
|
60
|
+
}
|
|
61
|
+
else if (!group.name && name) {
|
|
62
|
+
group.name = name;
|
|
63
|
+
}
|
|
64
|
+
return group;
|
|
65
|
+
};
|
|
66
|
+
comments.forEach((comment) => {
|
|
67
|
+
groupFor(comment.mainItemId, comment.language, comment.version, comment.mainItemName).comments.push(comment);
|
|
68
|
+
});
|
|
69
|
+
suggestedEdits.forEach((edit) => {
|
|
70
|
+
groupFor(edit.mainItemId, edit.mainItemLanguage, edit.mainItemVersion, edit.mainItemName).suggestedEdits.push(edit);
|
|
71
|
+
});
|
|
72
|
+
const result = [];
|
|
73
|
+
groups.forEach((group, key) => {
|
|
74
|
+
const allThreads = buildFeedbackThreads({
|
|
75
|
+
comments: group.comments,
|
|
76
|
+
suggestedEdits: group.suggestedEdits,
|
|
77
|
+
showResolved: true,
|
|
78
|
+
selectedPeople: [],
|
|
79
|
+
});
|
|
80
|
+
if (allThreads.length === 0)
|
|
81
|
+
return;
|
|
82
|
+
const threads = buildFeedbackThreads({
|
|
83
|
+
comments: group.comments,
|
|
84
|
+
suggestedEdits: group.suggestedEdits,
|
|
85
|
+
showResolved,
|
|
86
|
+
selectedPeople,
|
|
87
|
+
});
|
|
88
|
+
if (threads.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
const resolvedCount = allThreads.filter(isResolvedThread).length;
|
|
91
|
+
result.push({
|
|
92
|
+
key,
|
|
93
|
+
itemId: group.itemId,
|
|
94
|
+
language: group.language,
|
|
95
|
+
version: group.version,
|
|
96
|
+
name: group.name,
|
|
97
|
+
threads,
|
|
98
|
+
openCount: allThreads.length - resolvedCount,
|
|
99
|
+
resolvedCount,
|
|
100
|
+
lastActivity: allThreads.reduce((latest, thread) => Math.max(latest, thread.created), 0),
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
return result.sort((a, b) => b.lastActivity - a.lastActivity);
|
|
104
|
+
}
|
|
105
|
+
export function summarizeSubtreeFeedback(groups) {
|
|
106
|
+
return groups.reduce((summary, group) => ({
|
|
107
|
+
items: summary.items + 1,
|
|
108
|
+
open: summary.open + group.openCount,
|
|
109
|
+
resolved: summary.resolved + group.resolvedCount,
|
|
110
|
+
}), { items: 0, open: 0, resolved: 0 });
|
|
111
|
+
}
|
|
112
|
+
/** The authors found in the loaded feedback, for the people filter. */
|
|
113
|
+
export function collectSubtreeFeedbackAuthors(feedback, getAuthorName) {
|
|
114
|
+
const authors = new Map();
|
|
115
|
+
[...feedback.comments, ...feedback.suggestedEdits].forEach((item) => {
|
|
116
|
+
const author = item.author?.trim();
|
|
117
|
+
if (author && !authors.has(author)) {
|
|
118
|
+
authors.set(author, getAuthorName(item));
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return Array.from(authors.entries())
|
|
122
|
+
.map(([id, name]) => ({ id, name }))
|
|
123
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
124
|
+
}
|
|
125
|
+
const commentImagePattern = /!\[[^\]]*\]\([^)]*\)/g;
|
|
126
|
+
/** A one-line, image-free preview of a thread for the sidebar list. */
|
|
127
|
+
export function getFeedbackThreadPreview(thread) {
|
|
128
|
+
const text = thread.kind === "comment"
|
|
129
|
+
? thread.root.text || ""
|
|
130
|
+
: thread.suggestion.newValue || thread.comments[0]?.text || "";
|
|
131
|
+
return text
|
|
132
|
+
.replace(commentImagePattern, "")
|
|
133
|
+
.replace(/<[^>]+>/g, " ")
|
|
134
|
+
.replace(/\s+/g, " ")
|
|
135
|
+
.trim();
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=subtreeFeedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subtreeFeedback.js","sourceRoot":"","sources":["../../../src/editor/reviews/subtreeFeedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type CommentImageScope } from "./commentImages";
|
|
3
|
+
export type CommentImageAttachmentStatus = "uploading" | "done" | "error";
|
|
4
|
+
export interface CommentImageAttachment {
|
|
5
|
+
/** Local key; stable across upload and removal. */
|
|
6
|
+
key: string;
|
|
7
|
+
/** Server image id once uploaded. */
|
|
8
|
+
imageId?: string;
|
|
9
|
+
/** Object URL of the pasted file, or the served image URL for existing images. */
|
|
10
|
+
previewUrl: string;
|
|
11
|
+
fileName: string;
|
|
12
|
+
status: CommentImageAttachmentStatus;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface UseCommentImagePasteOptions {
|
|
16
|
+
scope: CommentImageScope;
|
|
17
|
+
/** Main item id (review comments) or task id (task comments) the composer targets. */
|
|
18
|
+
scopeId?: string | null;
|
|
19
|
+
/** Item language for review comments; lets reviewers without Sitecore read access upload. */
|
|
20
|
+
scopeLanguage?: string | null;
|
|
21
|
+
/** Comment text being edited; image references in it become attachments. */
|
|
22
|
+
initialText?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Attachments restored from a persisted draft. When given they replace the
|
|
25
|
+
* ones derived from `initialText`, uploads still in flight are resumed, and
|
|
26
|
+
* preview URLs are not revoked on unmount (the draft owner keeps them).
|
|
27
|
+
*/
|
|
28
|
+
initialAttachments?: CommentImageAttachment[];
|
|
29
|
+
/** Mirrors every attachment change, for draft persistence. */
|
|
30
|
+
onAttachmentsChange?: (attachments: CommentImageAttachment[]) => void;
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface CommentImagePasteState {
|
|
34
|
+
/** Attach to the composer textarea (`onPaste`). Handles Ctrl+V of image data. */
|
|
35
|
+
onPaste: (event: React.ClipboardEvent<HTMLTextAreaElement>) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Attach to the composer textarea (`onDragOver`). A textarea only accepts a
|
|
38
|
+
* drop of files (as opposed to text) when drag-over is cancelled; without
|
|
39
|
+
* this the browser opens the dropped image instead of firing `onDrop`.
|
|
40
|
+
*/
|
|
41
|
+
onDragOver: (event: React.DragEvent<HTMLTextAreaElement>) => void;
|
|
42
|
+
/** Attach to the composer textarea (`onDrop`). Handles dropped image files. */
|
|
43
|
+
onDrop: (event: React.DragEvent<HTMLTextAreaElement>) => void;
|
|
44
|
+
/** Thumbnails to show above the textarea, in paste order. */
|
|
45
|
+
attachments: CommentImageAttachment[];
|
|
46
|
+
removeAttachment: (key: string) => void;
|
|
47
|
+
/** Drops every attachment, e.g. after the comment was posted or cancelled. */
|
|
48
|
+
clearAttachments: () => void;
|
|
49
|
+
/** True while at least one attachment is still uploading. */
|
|
50
|
+
uploading: boolean;
|
|
51
|
+
/** Uploaded images that will be part of the comment. */
|
|
52
|
+
readyCount: number;
|
|
53
|
+
/**
|
|
54
|
+
* Resolves once no upload is pending for the current target, so a submit
|
|
55
|
+
* triggered mid-upload can wait for the image references.
|
|
56
|
+
*/
|
|
57
|
+
waitForUploads: () => Promise<void>;
|
|
58
|
+
/** The text to save: the typed text plus one reference line per uploaded image. */
|
|
59
|
+
buildSubmitText: (text: string) => string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Splits the text of a comment being edited into the plain text and the
|
|
63
|
+
* attachments for the images it references. Order of the images is kept;
|
|
64
|
+
* on save they are appended after the text again.
|
|
65
|
+
*/
|
|
66
|
+
export declare function splitInitialCommentText(initialText: string | undefined): {
|
|
67
|
+
text: string;
|
|
68
|
+
attachments: CommentImageAttachment[];
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Lets a comment composer accept pasted (or dropped) screenshots. Each image
|
|
72
|
+
* shows up as a thumbnail above the textarea while it uploads; the composer
|
|
73
|
+
* keeps typing text only, and `buildSubmitText` appends one markdown
|
|
74
|
+
* reference line per uploaded image when the comment is saved.
|
|
75
|
+
*
|
|
76
|
+
* Uploads are bound to the composer target: when `scope`/`scopeId` change while
|
|
77
|
+
* an upload is in flight (e.g. the task panel switches tasks), the attachments
|
|
78
|
+
* are dropped instead of ending up on the new target's comment.
|
|
79
|
+
*/
|
|
80
|
+
export declare function useCommentImagePaste({ scope, scopeId, scopeLanguage, initialText, initialAttachments, onAttachmentsChange, disabled, }: UseCommentImagePasteOptions): CommentImagePasteState;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { buildCommentImageMarkdown, getImageFilesFromDataTransfer, splitCommentImages, uploadCommentImage, } from "./commentImages";
|
|
3
|
+
/**
|
|
4
|
+
* Splits the text of a comment being edited into the plain text and the
|
|
5
|
+
* attachments for the images it references. Order of the images is kept;
|
|
6
|
+
* on save they are appended after the text again.
|
|
7
|
+
*/
|
|
8
|
+
export function splitInitialCommentText(initialText) {
|
|
9
|
+
if (!initialText)
|
|
10
|
+
return { text: "", attachments: [] };
|
|
11
|
+
const attachments = [];
|
|
12
|
+
const textParts = [];
|
|
13
|
+
for (const segment of splitCommentImages(initialText)) {
|
|
14
|
+
if (segment.type === "image") {
|
|
15
|
+
attachments.push({
|
|
16
|
+
key: `existing-${segment.imageId}`,
|
|
17
|
+
imageId: segment.imageId,
|
|
18
|
+
previewUrl: segment.src,
|
|
19
|
+
fileName: `${segment.alt}.png`,
|
|
20
|
+
status: "done",
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
textParts.push(segment.value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { text: textParts.join("\n").trim(), attachments };
|
|
28
|
+
}
|
|
29
|
+
let attachmentSequence = 0;
|
|
30
|
+
// Uploads keyed by attachment key, kept briefly after they settle, so a
|
|
31
|
+
// composer remounted with a persisted draft can pick up an upload that was
|
|
32
|
+
// still running when the previous instance unmounted.
|
|
33
|
+
const inflightUploads = new Map();
|
|
34
|
+
const INFLIGHT_RETENTION_MS = 30_000;
|
|
35
|
+
function rememberUpload(key, upload) {
|
|
36
|
+
inflightUploads.set(key, upload);
|
|
37
|
+
const forget = () => {
|
|
38
|
+
window.setTimeout(() => {
|
|
39
|
+
if (inflightUploads.get(key) === upload)
|
|
40
|
+
inflightUploads.delete(key);
|
|
41
|
+
}, INFLIGHT_RETENTION_MS);
|
|
42
|
+
};
|
|
43
|
+
upload.then(forget, forget);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Lets a comment composer accept pasted (or dropped) screenshots. Each image
|
|
47
|
+
* shows up as a thumbnail above the textarea while it uploads; the composer
|
|
48
|
+
* keeps typing text only, and `buildSubmitText` appends one markdown
|
|
49
|
+
* reference line per uploaded image when the comment is saved.
|
|
50
|
+
*
|
|
51
|
+
* Uploads are bound to the composer target: when `scope`/`scopeId` change while
|
|
52
|
+
* an upload is in flight (e.g. the task panel switches tasks), the attachments
|
|
53
|
+
* are dropped instead of ending up on the new target's comment.
|
|
54
|
+
*/
|
|
55
|
+
export function useCommentImagePaste({ scope, scopeId, scopeLanguage, initialText, initialAttachments, onAttachmentsChange, disabled = false, }) {
|
|
56
|
+
const persistent = initialAttachments !== undefined;
|
|
57
|
+
const [attachments, setAttachments] = React.useState(() => initialAttachments ?? splitInitialCommentText(initialText).attachments);
|
|
58
|
+
const attachmentsRef = React.useRef(attachments);
|
|
59
|
+
attachmentsRef.current = attachments;
|
|
60
|
+
const onAttachmentsChangeRef = React.useRef(onAttachmentsChange);
|
|
61
|
+
onAttachmentsChangeRef.current = onAttachmentsChange;
|
|
62
|
+
const persistentRef = React.useRef(persistent);
|
|
63
|
+
persistentRef.current = persistent;
|
|
64
|
+
React.useEffect(() => {
|
|
65
|
+
onAttachmentsChangeRef.current?.(attachments);
|
|
66
|
+
}, [attachments]);
|
|
67
|
+
const waitersRef = React.useRef([]);
|
|
68
|
+
const mountedRef = React.useRef(true);
|
|
69
|
+
// Every target change starts a new generation; uploads remember the generation
|
|
70
|
+
// they started in and become no-ops once it moves on.
|
|
71
|
+
const targetKey = `${scope}:${scopeId ?? ""}`;
|
|
72
|
+
const targetKeyRef = React.useRef(targetKey);
|
|
73
|
+
const generationRef = React.useRef(0);
|
|
74
|
+
const pendingCount = React.useMemo(() => attachments.filter((a) => a.status === "uploading").length, [attachments]);
|
|
75
|
+
const readyCount = React.useMemo(() => attachments.filter((a) => a.status === "done" && a.imageId).length, [attachments]);
|
|
76
|
+
const resolveWaiters = React.useCallback(() => {
|
|
77
|
+
const waiters = waitersRef.current;
|
|
78
|
+
waitersRef.current = [];
|
|
79
|
+
waiters.forEach((resolve) => resolve());
|
|
80
|
+
}, []);
|
|
81
|
+
React.useEffect(() => {
|
|
82
|
+
if (pendingCount === 0)
|
|
83
|
+
resolveWaiters();
|
|
84
|
+
}, [pendingCount, resolveWaiters]);
|
|
85
|
+
const revokePreview = (attachment) => {
|
|
86
|
+
if (attachment.previewUrl.startsWith("blob:")) {
|
|
87
|
+
URL.revokeObjectURL(attachment.previewUrl);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
React.useEffect(() => {
|
|
91
|
+
mountedRef.current = true;
|
|
92
|
+
return () => {
|
|
93
|
+
mountedRef.current = false;
|
|
94
|
+
generationRef.current += 1;
|
|
95
|
+
// A persisted draft keeps its thumbnails alive across remounts.
|
|
96
|
+
if (!persistentRef.current) {
|
|
97
|
+
attachmentsRef.current.forEach(revokePreview);
|
|
98
|
+
}
|
|
99
|
+
resolveWaiters();
|
|
100
|
+
};
|
|
101
|
+
}, [resolveWaiters]);
|
|
102
|
+
const clearAttachments = React.useCallback(() => {
|
|
103
|
+
generationRef.current += 1;
|
|
104
|
+
attachmentsRef.current.forEach(revokePreview);
|
|
105
|
+
setAttachments([]);
|
|
106
|
+
resolveWaiters();
|
|
107
|
+
}, [resolveWaiters]);
|
|
108
|
+
React.useEffect(() => {
|
|
109
|
+
if (targetKeyRef.current === targetKey)
|
|
110
|
+
return;
|
|
111
|
+
targetKeyRef.current = targetKey;
|
|
112
|
+
clearAttachments();
|
|
113
|
+
}, [clearAttachments, targetKey]);
|
|
114
|
+
const updateAttachment = React.useCallback((key, patch) => {
|
|
115
|
+
setAttachments((current) => current.map((a) => (a.key === key ? { ...a, ...patch } : a)));
|
|
116
|
+
}, []);
|
|
117
|
+
// Resume uploads that a previous composer instance started for this draft.
|
|
118
|
+
React.useEffect(() => {
|
|
119
|
+
const generation = generationRef.current;
|
|
120
|
+
const isStale = () => !mountedRef.current || generation !== generationRef.current;
|
|
121
|
+
attachmentsRef.current.forEach((attachment) => {
|
|
122
|
+
if (attachment.status !== "uploading")
|
|
123
|
+
return;
|
|
124
|
+
const pending = inflightUploads.get(attachment.key);
|
|
125
|
+
if (!pending) {
|
|
126
|
+
updateAttachment(attachment.key, {
|
|
127
|
+
status: "error",
|
|
128
|
+
error: "Image upload was interrupted",
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
pending.then((uploaded) => {
|
|
133
|
+
if (isStale())
|
|
134
|
+
return;
|
|
135
|
+
updateAttachment(attachment.key, {
|
|
136
|
+
imageId: uploaded.imageId,
|
|
137
|
+
status: "done",
|
|
138
|
+
});
|
|
139
|
+
}, (err) => {
|
|
140
|
+
if (isStale())
|
|
141
|
+
return;
|
|
142
|
+
updateAttachment(attachment.key, {
|
|
143
|
+
status: "error",
|
|
144
|
+
error: err instanceof Error && err.message
|
|
145
|
+
? err.message
|
|
146
|
+
: "Image upload failed",
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
// Runs once per mount: only attachments restored from a draft can be mid-upload.
|
|
151
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
152
|
+
}, []);
|
|
153
|
+
const uploadFiles = React.useCallback(async (files) => {
|
|
154
|
+
const generation = generationRef.current;
|
|
155
|
+
const isStale = () => !mountedRef.current || generation !== generationRef.current;
|
|
156
|
+
const created = files.map((file) => ({
|
|
157
|
+
key: `pasted-${Date.now()}-${attachmentSequence++}`,
|
|
158
|
+
previewUrl: URL.createObjectURL(file),
|
|
159
|
+
fileName: file.name,
|
|
160
|
+
status: "uploading",
|
|
161
|
+
}));
|
|
162
|
+
setAttachments((current) => [...current, ...created]);
|
|
163
|
+
for (let index = 0; index < files.length; index++) {
|
|
164
|
+
const file = files[index];
|
|
165
|
+
const key = created[index].key;
|
|
166
|
+
try {
|
|
167
|
+
const upload = uploadCommentImage(file, scope, scopeId, scopeLanguage);
|
|
168
|
+
rememberUpload(key, upload);
|
|
169
|
+
const uploaded = await upload;
|
|
170
|
+
if (isStale())
|
|
171
|
+
return;
|
|
172
|
+
updateAttachment(key, { imageId: uploaded.imageId, status: "done" });
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (isStale())
|
|
176
|
+
return;
|
|
177
|
+
updateAttachment(key, {
|
|
178
|
+
status: "error",
|
|
179
|
+
error: err instanceof Error && err.message
|
|
180
|
+
? err.message
|
|
181
|
+
: "Image upload failed",
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}, [scope, scopeId, scopeLanguage, updateAttachment]);
|
|
186
|
+
const removeAttachment = React.useCallback((key) => {
|
|
187
|
+
setAttachments((current) => {
|
|
188
|
+
const target = current.find((a) => a.key === key);
|
|
189
|
+
if (target)
|
|
190
|
+
revokePreview(target);
|
|
191
|
+
return current.filter((a) => a.key !== key);
|
|
192
|
+
});
|
|
193
|
+
}, []);
|
|
194
|
+
const onPaste = React.useCallback((event) => {
|
|
195
|
+
if (disabled)
|
|
196
|
+
return;
|
|
197
|
+
const files = getImageFilesFromDataTransfer(event.clipboardData);
|
|
198
|
+
if (files.length === 0)
|
|
199
|
+
return;
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
void uploadFiles(files);
|
|
202
|
+
}, [disabled, uploadFiles]);
|
|
203
|
+
const onDragOver = React.useCallback((event) => {
|
|
204
|
+
if (disabled)
|
|
205
|
+
return;
|
|
206
|
+
// File lists are not readable during drag-over; the types tell us enough.
|
|
207
|
+
const types = Array.from(event.dataTransfer?.types ?? []);
|
|
208
|
+
if (!types.includes("Files"))
|
|
209
|
+
return;
|
|
210
|
+
event.preventDefault();
|
|
211
|
+
event.dataTransfer.dropEffect = "copy";
|
|
212
|
+
}, [disabled]);
|
|
213
|
+
const onDrop = React.useCallback((event) => {
|
|
214
|
+
if (disabled)
|
|
215
|
+
return;
|
|
216
|
+
const files = getImageFilesFromDataTransfer(event.dataTransfer);
|
|
217
|
+
if (files.length === 0)
|
|
218
|
+
return;
|
|
219
|
+
event.preventDefault();
|
|
220
|
+
void uploadFiles(files);
|
|
221
|
+
}, [disabled, uploadFiles]);
|
|
222
|
+
const waitForUploads = React.useCallback(() => new Promise((resolve) => {
|
|
223
|
+
const pending = attachmentsRef.current.some((a) => a.status === "uploading");
|
|
224
|
+
if (!pending) {
|
|
225
|
+
resolve();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
waitersRef.current.push(resolve);
|
|
229
|
+
}), []);
|
|
230
|
+
const buildSubmitText = React.useCallback((text) => {
|
|
231
|
+
const references = attachmentsRef.current
|
|
232
|
+
.filter((a) => a.status === "done" && a.imageId)
|
|
233
|
+
.map((a) => buildCommentImageMarkdown(a.imageId));
|
|
234
|
+
const body = text.trim();
|
|
235
|
+
if (references.length === 0)
|
|
236
|
+
return body;
|
|
237
|
+
return body ? `${body}\n${references.join("\n")}` : references.join("\n");
|
|
238
|
+
}, []);
|
|
239
|
+
return {
|
|
240
|
+
onPaste,
|
|
241
|
+
onDragOver,
|
|
242
|
+
onDrop,
|
|
243
|
+
attachments,
|
|
244
|
+
removeAttachment,
|
|
245
|
+
clearAttachments,
|
|
246
|
+
uploading: pendingCount > 0,
|
|
247
|
+
readyCount,
|
|
248
|
+
waitForUploads,
|
|
249
|
+
buildSubmitText,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=useCommentImagePaste.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommentImagePaste.js","sourceRoot":"","sources":["../../../src/editor/reviews/useCommentImagePaste.ts"],"names":[],"mappings":"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"}
|