@parhelia/core 0.1.12881 → 0.1.12882
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 +1 -3
- 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 +7 -8
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.js.map +1 -1
- package/dist/editor/FieldActionsOverlay.d.ts +1 -0
- package/dist/editor/FieldActionsOverlay.js +45 -1
- package/dist/editor/FieldActionsOverlay.js.map +1 -1
- package/dist/editor/FieldListField.d.ts +1 -1
- package/dist/editor/FieldListField.js +18 -20
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/ImageEditor.d.ts +1 -6
- package/dist/editor/ImageEditor.js +3 -19
- package/dist/editor/ImageEditor.js.map +1 -1
- package/dist/editor/PictureEditor.d.ts +1 -2
- package/dist/editor/PictureEditor.js +14 -5
- 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 +11 -1
- package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
- package/dist/editor/ai/InlineAiDialog.js +11 -22
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +57 -17
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/dialogs/capturePageDom.js +36 -66
- package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
- package/dist/editor/ai/dialogs/capturePageScreenshot.js +162 -281
- package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
- package/dist/editor/ai/terminal/agentSessionState.d.ts +0 -3
- package/dist/editor/ai/terminal/agentSessionState.js +1 -3
- package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
- package/dist/editor/ai/terminal/agentStartRequest.d.ts +1 -2
- package/dist/editor/ai/terminal/agentStartRequest.js +1 -2
- 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 +0 -7
- package/dist/editor/ai/terminal/components/AgentDocumentList.js +13 -55
- package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +1 -3
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +14 -22
- 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 +1 -2
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +11 -8
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +4 -1
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +14 -31
- 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 +1 -2
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +4 -2
- 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 +2 -13
- package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
- package/dist/editor/ai/terminal/components/AiResponseMessage.js +14 -16
- package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/terminal/components/ContextInfoBar.js +2 -22
- package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +26 -37
- package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
- package/dist/editor/ai/terminal/components/UserMessage.d.ts +1 -2
- package/dist/editor/ai/terminal/components/UserMessage.js +8 -144
- 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 +0 -1
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +1 -3
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +3 -9
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalController.js +0 -7
- 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 +1 -3
- 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 +52 -22
- package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
- package/dist/editor/ai-image-editor/AiImageResultOverlay.js +62 -30
- package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
- package/dist/editor/client/EditorShell.d.ts +1 -5
- package/dist/editor/client/EditorShell.js +136 -285
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +5 -33
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +17 -14
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.d.ts +0 -2
- package/dist/editor/client/itemsRepository.js +8 -15
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +1 -1
- package/dist/editor/client/operations.js +17 -41
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +7 -24
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/commands/handlers/uiActionHandlers.js +5 -1
- package/dist/editor/commands/handlers/uiActionHandlers.js.map +1 -1
- package/dist/editor/editor-warnings/FinalWorkflowStateReadOnly.js +5 -0
- package/dist/editor/editor-warnings/FinalWorkflowStateReadOnly.js.map +1 -1
- package/dist/editor/editor-warnings/ItemLocked.js +6 -3
- package/dist/editor/editor-warnings/ItemLocked.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +3 -10
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/RawEditor.js +1 -8
- package/dist/editor/field-types/RawEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +45 -156
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +3 -10
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.js +2 -8
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.js +303 -100
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +0 -2
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.d.ts +2 -1
- package/dist/editor/media-selector/MediaFolderBrowser.js +19 -9
- package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
- package/dist/editor/media-selector/TreeSelector.js +30 -24
- package/dist/editor/media-selector/TreeSelector.js.map +1 -1
- package/dist/editor/media-selector/UploadZone.d.ts +2 -1
- package/dist/editor/media-selector/UploadZone.js +21 -9
- package/dist/editor/media-selector/UploadZone.js.map +1 -1
- package/dist/editor/menubar/PageSelector.js +2 -8
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/VersionPreviewCard.js +249 -4
- 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 +10 -0
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +462 -63
- 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/CommentHighlightings.d.ts +2 -5
- package/dist/editor/page-editor-chrome/CommentHighlightings.js +215 -340
- package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +1 -5
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +4 -11
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js +13 -21
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +29 -23
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +19 -110
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineEditor.d.ts +7 -0
- package/dist/editor/page-editor-chrome/InlineEditor.js +1719 -0
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -0
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +2 -3
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +45 -148
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +0 -2
- package/dist/editor/page-editor-chrome/PageEditorChrome.js +21 -25
- package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +128 -163
- 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 +3 -6
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +2 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +146 -83
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +2 -5
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +63 -144
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +2 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +30 -101
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +1 -10
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +122 -105
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +4 -11
- package/dist/editor/page-editor-chrome/overlay/geometry.js +36 -139
- package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +2 -0
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +21 -0
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +1 -0
- package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +7 -0
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +758 -0
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -0
- package/dist/editor/page-viewer/EditorForm.js +1 -17
- 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 +364 -176
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.js +13 -40
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +5 -0
- package/dist/editor/page-viewer/PageViewerFrame.js +1509 -1527
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +3 -0
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +796 -0
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -0
- package/dist/editor/page-viewer/pageViewContext.d.ts +0 -32
- package/dist/editor/page-viewer/pageViewContext.js +6 -37
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/reviews/Comment.d.ts +1 -2
- package/dist/editor/reviews/Comment.js +4 -9
- 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 +9 -68
- package/dist/editor/reviews/CommentPopover.js.map +1 -1
- package/dist/editor/reviews/CommentView.js +4 -24
- package/dist/editor/reviews/CommentView.js.map +1 -1
- package/dist/editor/reviews/Comments.d.ts +2 -0
- package/dist/editor/reviews/Comments.js +30 -29
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/FeedbackCard.d.ts +2 -4
- package/dist/editor/reviews/FeedbackCard.js +5 -5
- package/dist/editor/reviews/FeedbackCard.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +6 -4
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionDisplayPopover.js +2 -3
- package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/commentAi.js +27 -96
- package/dist/editor/reviews/commentAi.js.map +1 -1
- package/dist/editor/reviews/feedbackSelection.js +4 -32
- package/dist/editor/reviews/feedbackSelection.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +0 -15
- package/dist/editor/services/agentService.js +1 -11
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/contentService.d.ts +1 -0
- package/dist/editor/services/contentService.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 +3 -2
- 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 +17 -1
- package/dist/editor/utils.js +143 -0
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/version-diff/versionDiffTargets.d.ts +8 -3
- package/dist/editor/version-diff/versionDiffTargets.js +94 -37
- package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
- package/dist/editor/views/MediaFolderEditView.js +1 -1
- package/dist/editor/views/MediaFolderEditView.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 +3 -11
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +5 -7
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/OpenPage.js +3 -5
- 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 +1 -2
- package/styles.css +0 -49
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
- package/dist/editor/bridge/BridgeClient.d.ts +0 -80
- package/dist/editor/bridge/BridgeClient.js +0 -417
- package/dist/editor/bridge/BridgeClient.js.map +0 -1
- package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +0 -13
- package/dist/editor/field-types/useFormFieldCaretPresence.js +0 -92
- package/dist/editor/field-types/useFormFieldCaretPresence.js.map +0 -1
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +0 -6
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +0 -123
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +0 -1
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +0 -26
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +0 -222
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +0 -1
- package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +0 -20
- package/dist/editor/page-viewer/bridgeFieldPatch.js +0 -33
- package/dist/editor/page-viewer/bridgeFieldPatch.js.map +0 -1
- package/dist/editor/reviews/commentTransientSelection.d.ts +0 -23
- package/dist/editor/reviews/commentTransientSelection.js +0 -7
- package/dist/editor/reviews/commentTransientSelection.js.map +0 -1
- package/dist/editor/reviews/feedbackOrdering.d.ts +0 -5
- package/dist/editor/reviews/feedbackOrdering.js +0 -27
- package/dist/editor/reviews/feedbackOrdering.js.map +0 -1
- package/dist/editor/reviews/suggestedEditState.d.ts +0 -12
- package/dist/editor/reviews/suggestedEditState.js +0 -90
- package/dist/editor/reviews/suggestedEditState.js.map +0 -1
- package/dist/editor/reviews/suggestionDisplayValue.d.ts +0 -43
- package/dist/editor/reviews/suggestionDisplayValue.js +0 -93
- package/dist/editor/reviews/suggestionDisplayValue.js.map +0 -1
|
@@ -46,7 +46,6 @@ import { QuickItemSwitcher } from "../QuickItemSwitcher";
|
|
|
46
46
|
import { useEditorSlotContext, } from "../views/editorSlotContext";
|
|
47
47
|
import { getComments, getAvailableCommentTags, } from "../services/reviewsService";
|
|
48
48
|
import { useReviews } from "../reviews/useReviews";
|
|
49
|
-
import { COMMENT_TRANSIENT_ELEMENT_KEY, COMMENT_TRANSIENT_SELECTION_RECT, } from "../reviews/commentTransientSelection";
|
|
50
49
|
import uuid from "react-uuid";
|
|
51
50
|
import { flushSync } from "react-dom";
|
|
52
51
|
import { getSuggestedEdits } from "../services/suggestedEditsService";
|
|
@@ -68,24 +67,6 @@ import { FeatureGate, LicenseFeatures, LicenseProvider, LicenseOverlay, } from "
|
|
|
68
67
|
// nothing open" (param present with this value) so reload can honor the user's intent.
|
|
69
68
|
const SIDEBAR_NONE_SENTINEL = "none";
|
|
70
69
|
const sidebarUrlValue = (ids) => ids.length ? ids.join(",") : SIDEBAR_NONE_SENTINEL;
|
|
71
|
-
// moved to hooks/useQuota
|
|
72
|
-
function isUsableTextSelectionRange(range) {
|
|
73
|
-
return !!(range &&
|
|
74
|
-
range.text?.trim() &&
|
|
75
|
-
typeof range.startOffset === "number" &&
|
|
76
|
-
typeof range.endOffset === "number" &&
|
|
77
|
-
range.startOffset !== range.endOffset &&
|
|
78
|
-
range.fieldId &&
|
|
79
|
-
range.itemId);
|
|
80
|
-
}
|
|
81
|
-
function selectionRangeMatchesField(range, field) {
|
|
82
|
-
if (!range || !field)
|
|
83
|
-
return false;
|
|
84
|
-
return (cleanId(range.fieldId) === cleanId(field.fieldId) &&
|
|
85
|
-
cleanId(range.itemId) === cleanId(field.item.id) &&
|
|
86
|
-
(!range.language || range.language === field.item.language) &&
|
|
87
|
-
(typeof range.version !== "number" || range.version === field.item.version));
|
|
88
|
-
}
|
|
89
70
|
function reconcileSlotSettingsState(previous, slots, defaults) {
|
|
90
71
|
const next = {};
|
|
91
72
|
let changed = false;
|
|
@@ -153,10 +134,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
153
134
|
const [focusedField, setFocusedField] = useState();
|
|
154
135
|
const focusedFieldRef = useRef(undefined);
|
|
155
136
|
const [selectedRange, setSelectedRange] = useState();
|
|
156
|
-
const lastTextSelectionRangeRef = useRef(undefined);
|
|
157
137
|
const [validating, setValidating] = useState(false);
|
|
158
138
|
const [inserting, setInserting] = useState();
|
|
159
|
-
const insertingSequenceRef = useRef(0);
|
|
160
139
|
const [showFullscreenHint, setShowFullscreenHint] = useState(false);
|
|
161
140
|
// Fullscreen is a shell-level UI mode. Keep it in EditorShell state so the shell can rerender
|
|
162
141
|
// immediately when toggled, while still syncing the active slot's PageViewContext.fullscreen.
|
|
@@ -486,6 +465,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
486
465
|
// The very first URL sync after initial load should replaceState (not pushState)
|
|
487
466
|
// so the initial bare URL isn't left as a dead-end history entry.
|
|
488
467
|
const isFirstUrlSyncRef = useRef(true);
|
|
468
|
+
const [inlineEditingFieldElement, setInlineEditingFieldElement] = useState();
|
|
489
469
|
const [lockedField, setLockedField] = useState();
|
|
490
470
|
const [itemLanguages, setItemLanguages] = useState([]);
|
|
491
471
|
const [itemVersions, setItemVersions] = useState([]);
|
|
@@ -571,71 +551,14 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
571
551
|
// moved into useWorkbox
|
|
572
552
|
// Initialize tour state from URL parameter to survive navigation/remounts
|
|
573
553
|
// Memoize to avoid triggering Router state updates during render
|
|
574
|
-
const tourRestoredFromUrl = useMemo(() =>
|
|
554
|
+
const tourRestoredFromUrl = useMemo(() => Boolean(configuration.activeTour) &&
|
|
555
|
+
searchParams.get("tour") === "active", [configuration.activeTour, searchParams]);
|
|
575
556
|
const [isTourActive, setIsTourActive] = useState(tourRestoredFromUrl);
|
|
576
557
|
// Track if tour was restored from URL to skip prepareAction on initial render
|
|
577
558
|
const tourRestoredRef = useRef(tourRestoredFromUrl);
|
|
578
|
-
const [mode,
|
|
579
|
-
const modeRef = useRef("edit");
|
|
580
|
-
modeRef.current = mode;
|
|
581
|
-
const modeChangeParticipantsRef = useRef(new Set());
|
|
582
|
-
const loadSuggestedEditsRef = useRef(async () => { });
|
|
583
|
-
const [modeTransitionRevision, setModeTransitionRevision] = useState(0);
|
|
559
|
+
const [mode, setMode] = useState("edit");
|
|
584
560
|
const [previewDate, setPreviewDate] = useState();
|
|
585
561
|
const [layoutMode, setLayoutMode] = useState("final");
|
|
586
|
-
const registerModeChangeParticipant = useCallback((participant) => {
|
|
587
|
-
modeChangeParticipantsRef.current.add(participant);
|
|
588
|
-
return () => {
|
|
589
|
-
modeChangeParticipantsRef.current.delete(participant);
|
|
590
|
-
};
|
|
591
|
-
}, []);
|
|
592
|
-
const changeMode = useCallback(async (nextMode, options) => {
|
|
593
|
-
const previousMode = modeRef.current;
|
|
594
|
-
if (nextMode === previousMode)
|
|
595
|
-
return;
|
|
596
|
-
const participants = Array.from(modeChangeParticipantsRef.current);
|
|
597
|
-
for (const participant of participants) {
|
|
598
|
-
await participant.beforeModeChange?.(nextMode, previousMode, options);
|
|
599
|
-
}
|
|
600
|
-
for (const participant of participants) {
|
|
601
|
-
participant.clearInlineDedupe?.(nextMode, previousMode, options);
|
|
602
|
-
}
|
|
603
|
-
flushSync(() => {
|
|
604
|
-
modeRef.current = nextMode;
|
|
605
|
-
setModeState(nextMode);
|
|
606
|
-
setModeTransitionRevision((revision) => revision + 1);
|
|
607
|
-
if (nextMode !== "preview") {
|
|
608
|
-
setPreviewDate(undefined);
|
|
609
|
-
}
|
|
610
|
-
if (nextMode === "suggestions") {
|
|
611
|
-
setShowSuggestedEdits(true);
|
|
612
|
-
setWorkspaceId("editor");
|
|
613
|
-
setOpenSidebars((prev) => {
|
|
614
|
-
if (prev.includes("feedback"))
|
|
615
|
-
return prev;
|
|
616
|
-
const next = [...prev, "feedback"];
|
|
617
|
-
openSidebarsRef.current = next;
|
|
618
|
-
return next;
|
|
619
|
-
});
|
|
620
|
-
}
|
|
621
|
-
else {
|
|
622
|
-
setShowSuggestedEdits(false);
|
|
623
|
-
}
|
|
624
|
-
});
|
|
625
|
-
if (nextMode === "suggestions") {
|
|
626
|
-
void loadSuggestedEditsRef.current();
|
|
627
|
-
}
|
|
628
|
-
}, []);
|
|
629
|
-
const setMode = useCallback((nextMode) => {
|
|
630
|
-
const resolvedMode = typeof nextMode === "function" ? nextMode(modeRef.current) : nextMode;
|
|
631
|
-
void changeMode(resolvedMode);
|
|
632
|
-
}, [changeMode]);
|
|
633
|
-
const workspaceShowsModeControls = !!configuration.editor.workspaces?.find((workspace) => workspace.id === workspaceId)?.toolbarFactory;
|
|
634
|
-
useEffect(() => {
|
|
635
|
-
if (workspaceShowsModeControls || mode !== "suggestions")
|
|
636
|
-
return;
|
|
637
|
-
void changeMode("edit", { reason: "mode-controls-hidden" });
|
|
638
|
-
}, [changeMode, mode, workspaceId, workspaceShowsModeControls]);
|
|
639
562
|
useEffect(() => {
|
|
640
563
|
if (mode !== "preview") {
|
|
641
564
|
setPreviewDate(undefined);
|
|
@@ -741,6 +664,19 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
741
664
|
setSelectedHelpSectionId(helpParam === "contents" || helpParam === "true" ? null : helpParam);
|
|
742
665
|
}
|
|
743
666
|
}, [searchParams, isInitialLoad]);
|
|
667
|
+
useEffect(() => {
|
|
668
|
+
if (mode === "suggestions") {
|
|
669
|
+
// Ensure we're in the editor workspace and open the feedback sidebar
|
|
670
|
+
setWorkspaceId("editor");
|
|
671
|
+
// Open the feedback sidebar if not already open
|
|
672
|
+
setOpenSidebars((prev) => {
|
|
673
|
+
if (!prev.includes("comments")) {
|
|
674
|
+
return [...prev, "comments"];
|
|
675
|
+
}
|
|
676
|
+
return prev;
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
}, [mode]);
|
|
744
680
|
useEffect(() => {
|
|
745
681
|
if (focusedField &&
|
|
746
682
|
selection.length > 0 &&
|
|
@@ -750,19 +686,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
750
686
|
}, [selection]);
|
|
751
687
|
useEffect(() => {
|
|
752
688
|
focusedFieldRef.current = focusedField;
|
|
753
|
-
const lastTextSelection = lastTextSelectionRangeRef.current;
|
|
754
|
-
if (focusedField &&
|
|
755
|
-
lastTextSelection &&
|
|
756
|
-
(focusedField.fieldId !== lastTextSelection.fieldId ||
|
|
757
|
-
focusedField.item.id !== lastTextSelection.itemId)) {
|
|
758
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
759
|
-
}
|
|
760
689
|
}, [focusedField]);
|
|
761
|
-
useEffect(() => {
|
|
762
|
-
if (isUsableTextSelectionRange(selectedRange)) {
|
|
763
|
-
lastTextSelectionRangeRef.current = selectedRange;
|
|
764
|
-
}
|
|
765
|
-
}, [selectedRange]);
|
|
766
690
|
// Track the current page item descriptor for itemsRepository
|
|
767
691
|
const [currentPageItem, setCurrentPageItem] = useState();
|
|
768
692
|
// Create itemsRepository with current page item (will be updated when page loads)
|
|
@@ -1121,6 +1045,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1121
1045
|
});
|
|
1122
1046
|
}, [isInitialLoad, searchParams]);
|
|
1123
1047
|
const startTour = useCallback(() => {
|
|
1048
|
+
if (!configuration.activeTour) {
|
|
1049
|
+
return;
|
|
1050
|
+
}
|
|
1124
1051
|
setIsTourActive(true);
|
|
1125
1052
|
// Persist tour state to URL so it survives navigation/remounts
|
|
1126
1053
|
// Use history.replaceState instead of router.replace to avoid triggering React navigation
|
|
@@ -1128,7 +1055,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1128
1055
|
params.set("tour", "active");
|
|
1129
1056
|
const newUrl = `${window.location.pathname}?${params.toString()}`;
|
|
1130
1057
|
window.history.replaceState(getCurrentHistoryState(), "", newUrl);
|
|
1131
|
-
}, [setIsTourActive]);
|
|
1058
|
+
}, [configuration.activeTour, setIsTourActive]);
|
|
1132
1059
|
const isMobile = useMediaQuery("(max-width: 767px)");
|
|
1133
1060
|
// On mobile, clear all locked sidebars and keep only the last-opened panel.
|
|
1134
1061
|
// Handles viewport resize: desktop -> mobile unlocks everything and trims to one panel.
|
|
@@ -1293,8 +1220,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1293
1220
|
const toggleHelpTerminal = useCallback((options) => {
|
|
1294
1221
|
const isCurrentlyOpen = showHelpTerminal;
|
|
1295
1222
|
const requestedTab = options?.activeTab;
|
|
1296
|
-
if (isCurrentlyOpen &&
|
|
1297
|
-
(!requestedTab || requestedTab === helpTerminalActiveTab)) {
|
|
1223
|
+
if (isCurrentlyOpen && (!requestedTab || requestedTab === helpTerminalActiveTab)) {
|
|
1298
1224
|
// Close when toggling the currently active help view.
|
|
1299
1225
|
handleSetShowHelpTerminal(false);
|
|
1300
1226
|
}
|
|
@@ -1497,7 +1423,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1497
1423
|
}
|
|
1498
1424
|
// Handle mode changes — always set to avoid stale-closure mismatch
|
|
1499
1425
|
const urlMode = urlParams.get("mode");
|
|
1500
|
-
|
|
1426
|
+
if (urlMode) {
|
|
1427
|
+
setMode(urlMode);
|
|
1428
|
+
}
|
|
1501
1429
|
// Handle fullscreen changes (shell-level state)
|
|
1502
1430
|
const isFullscreen = urlParams.get("fullscreen") === "true";
|
|
1503
1431
|
if (configuration.forceFullscreen) {
|
|
@@ -1575,6 +1503,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1575
1503
|
return;
|
|
1576
1504
|
}
|
|
1577
1505
|
const tour = configuration.activeTour;
|
|
1506
|
+
if (!tour) {
|
|
1507
|
+
return;
|
|
1508
|
+
}
|
|
1578
1509
|
const key = tour === "default" ? "editor.tourShown" : "editor.tourShown." + tour;
|
|
1579
1510
|
const tourShown = localStorageService.getString(key);
|
|
1580
1511
|
if (!tourShown) {
|
|
@@ -1774,9 +1705,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1774
1705
|
const edits = result.data || [];
|
|
1775
1706
|
setSuggestedEdits(edits);
|
|
1776
1707
|
}, [item, searchParams]);
|
|
1777
|
-
useEffect(() => {
|
|
1778
|
-
loadSuggestedEditsRef.current = loadSuggestedEdits;
|
|
1779
|
-
}, [loadSuggestedEdits]);
|
|
1780
1708
|
const loadFavorites = useCallback(async () => {
|
|
1781
1709
|
try {
|
|
1782
1710
|
const result = await getAllFavorites();
|
|
@@ -1789,9 +1717,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1789
1717
|
setFavorites([]);
|
|
1790
1718
|
}
|
|
1791
1719
|
}, []);
|
|
1792
|
-
const refreshFavorites = useCallback(async (opts) => {
|
|
1793
|
-
await loadFavorites();
|
|
1794
|
-
}, [loadFavorites]);
|
|
1795
1720
|
const page = activePageViewContext.page;
|
|
1796
1721
|
const currentHistoryScope = useMemo(() => {
|
|
1797
1722
|
const currentItem = item?.descriptor;
|
|
@@ -2188,9 +2113,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2188
2113
|
globalThis.editorRefreshTimer = undefined;
|
|
2189
2114
|
};
|
|
2190
2115
|
if (mode === "immediate") {
|
|
2191
|
-
if (refreshTimer) {
|
|
2192
|
-
clearTimeout(refreshTimer);
|
|
2193
|
-
}
|
|
2194
2116
|
doRefresh();
|
|
2195
2117
|
return;
|
|
2196
2118
|
}
|
|
@@ -2384,7 +2306,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2384
2306
|
else {
|
|
2385
2307
|
current.set("compare", "true");
|
|
2386
2308
|
}
|
|
2387
|
-
current.set("mode",
|
|
2309
|
+
current.set("mode", mode);
|
|
2388
2310
|
// Handle fullscreen parameter
|
|
2389
2311
|
if (fullscreen) {
|
|
2390
2312
|
current.set("fullscreen", "true");
|
|
@@ -3089,35 +3011,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3089
3011
|
};
|
|
3090
3012
|
}, [promptSessionReconnect]);
|
|
3091
3013
|
const sendSocketMessage = useCallback((message) => {
|
|
3092
|
-
if (message.type === "caret-position" &&
|
|
3093
|
-
message.payload?.source === "form-field") {
|
|
3094
|
-
const payload = message.payload;
|
|
3095
|
-
setRemoteCarets((current) => {
|
|
3096
|
-
if (payload.offset == null) {
|
|
3097
|
-
if (!current[sessionId])
|
|
3098
|
-
return current;
|
|
3099
|
-
const next = { ...current };
|
|
3100
|
-
delete next[sessionId];
|
|
3101
|
-
return next;
|
|
3102
|
-
}
|
|
3103
|
-
if (!payload.fieldId || !payload.item) {
|
|
3104
|
-
return current;
|
|
3105
|
-
}
|
|
3106
|
-
return {
|
|
3107
|
-
...current,
|
|
3108
|
-
[sessionId]: {
|
|
3109
|
-
sessionId,
|
|
3110
|
-
fieldId: payload.fieldId,
|
|
3111
|
-
item: payload.item,
|
|
3112
|
-
offset: payload.offset,
|
|
3113
|
-
value: payload.value,
|
|
3114
|
-
},
|
|
3115
|
-
};
|
|
3116
|
-
});
|
|
3117
|
-
}
|
|
3118
3014
|
// Routes over whichever transport is active (WebSocket preferred, SSE fallback).
|
|
3119
3015
|
getEditorRealtime().send(message);
|
|
3120
|
-
}, [
|
|
3016
|
+
}, []);
|
|
3121
3017
|
// URL update helper - defined early so it can be used by workspace/sidebar functions
|
|
3122
3018
|
const updateUrl = useCallback((params) => {
|
|
3123
3019
|
// Use the actual browser pathname (including any basePath like /parhelia)
|
|
@@ -3595,51 +3491,34 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3595
3491
|
operationsContext.context.markOperationComplete;
|
|
3596
3492
|
}, [operationsContext.context.markOperationComplete]);
|
|
3597
3493
|
// Replace selected text with new content (for inline AI editing)
|
|
3598
|
-
const replaceSelectedText = useCallback(async (newText
|
|
3599
|
-
|
|
3494
|
+
const replaceSelectedText = useCallback(async (newText) => {
|
|
3495
|
+
if (!focusedField)
|
|
3496
|
+
return;
|
|
3600
3497
|
try {
|
|
3601
3498
|
// If we have selected text and a replaceText callback, use it
|
|
3602
|
-
if (
|
|
3603
|
-
|
|
3499
|
+
if (selectedRange?.text && selectedRange.replaceText) {
|
|
3500
|
+
selectedRange.replaceText(newText);
|
|
3604
3501
|
setSelectedRange(undefined);
|
|
3605
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
3606
3502
|
return;
|
|
3607
3503
|
}
|
|
3608
3504
|
// If no selection but we have a replaceText callback, try to use it for insertion
|
|
3609
3505
|
// (some editors might support insertion via the same callback)
|
|
3610
|
-
if (!
|
|
3611
|
-
|
|
3506
|
+
if (!selectedRange?.text && selectedRange?.replaceText) {
|
|
3507
|
+
selectedRange.replaceText(newText);
|
|
3612
3508
|
setSelectedRange(undefined);
|
|
3613
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
3614
3509
|
return;
|
|
3615
3510
|
}
|
|
3616
|
-
const fieldToReplace = focusedField ??
|
|
3617
|
-
(rangeToReplace?.fieldId &&
|
|
3618
|
-
rangeToReplace.itemId &&
|
|
3619
|
-
rangeToReplace.language &&
|
|
3620
|
-
typeof rangeToReplace.version === "number"
|
|
3621
|
-
? {
|
|
3622
|
-
fieldId: rangeToReplace.fieldId,
|
|
3623
|
-
item: {
|
|
3624
|
-
id: rangeToReplace.itemId,
|
|
3625
|
-
language: rangeToReplace.language,
|
|
3626
|
-
version: rangeToReplace.version,
|
|
3627
|
-
},
|
|
3628
|
-
}
|
|
3629
|
-
: undefined);
|
|
3630
|
-
if (!fieldToReplace)
|
|
3631
|
-
return;
|
|
3632
3511
|
// Fallback: indexOf-based replacement/insertion for plain text fields
|
|
3633
|
-
const { fieldId, item } =
|
|
3512
|
+
const { fieldId, item } = focusedField;
|
|
3634
3513
|
const modifiedField = getActiveSlotContext()?.fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
|
|
3635
3514
|
const currentValue = modifiedField
|
|
3636
3515
|
? modifiedField.value || ""
|
|
3637
|
-
: (await itemsRepository.getField(
|
|
3638
|
-
|
|
3516
|
+
: (await itemsRepository.getField(focusedField))?.value ||
|
|
3517
|
+
"";
|
|
3639
3518
|
let newValue;
|
|
3640
|
-
if (
|
|
3519
|
+
if (selectedRange?.text) {
|
|
3641
3520
|
// Replace selected text
|
|
3642
|
-
const { text: originalSelectedText } =
|
|
3521
|
+
const { text: originalSelectedText } = selectedRange;
|
|
3643
3522
|
const actualPosition = currentValue.indexOf(originalSelectedText);
|
|
3644
3523
|
if (actualPosition === -1) {
|
|
3645
3524
|
console.error("Failed to find selected text in field value");
|
|
@@ -3652,7 +3531,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3652
3531
|
}
|
|
3653
3532
|
else {
|
|
3654
3533
|
// Insert at cursor position (use startOffset if available, otherwise append)
|
|
3655
|
-
const insertPosition =
|
|
3534
|
+
const insertPosition = selectedRange?.startOffset ?? currentValue.length;
|
|
3656
3535
|
newValue =
|
|
3657
3536
|
currentValue.slice(0, insertPosition) +
|
|
3658
3537
|
newText +
|
|
@@ -3660,13 +3539,12 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3660
3539
|
}
|
|
3661
3540
|
// Update the field
|
|
3662
3541
|
await operations.editField({
|
|
3663
|
-
field:
|
|
3542
|
+
field: focusedField,
|
|
3664
3543
|
value: newValue,
|
|
3665
3544
|
refresh: "immediate",
|
|
3666
3545
|
});
|
|
3667
3546
|
// Clear the selection after replacement/insertion
|
|
3668
3547
|
setSelectedRange(undefined);
|
|
3669
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
3670
3548
|
}
|
|
3671
3549
|
catch (error) {
|
|
3672
3550
|
console.error("Failed to replace/insert text:", error);
|
|
@@ -4143,6 +4021,18 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4143
4021
|
};
|
|
4144
4022
|
}
|
|
4145
4023
|
}, [operations.onFieldBlur]);
|
|
4024
|
+
useEffect(() => {
|
|
4025
|
+
if (mode === "suggestions") {
|
|
4026
|
+
setShowSuggestedEdits(true);
|
|
4027
|
+
// Refresh from the server to recover from any missed
|
|
4028
|
+
// `suggested-edit-updated` WebSocket events (e.g. created by an
|
|
4029
|
+
// agent tool while another tab was focused).
|
|
4030
|
+
loadSuggestedEdits();
|
|
4031
|
+
}
|
|
4032
|
+
else {
|
|
4033
|
+
setShowSuggestedEdits(false);
|
|
4034
|
+
}
|
|
4035
|
+
}, [mode, loadSuggestedEdits]);
|
|
4146
4036
|
const isReadOnly = !item ||
|
|
4147
4037
|
!item.canWriteItem ||
|
|
4148
4038
|
!item.canWriteLanguage ||
|
|
@@ -4161,6 +4051,15 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4161
4051
|
// Otherwise, only show workspaces that are in the settings
|
|
4162
4052
|
return workspaceIdsFromSettings.includes(w.id) && !w.visible;
|
|
4163
4053
|
});
|
|
4054
|
+
// Handle initial mode setup from URL (only on initial load)
|
|
4055
|
+
useEffect(() => {
|
|
4056
|
+
if (!isInitialLoad)
|
|
4057
|
+
return;
|
|
4058
|
+
const queryMode = searchParams.get("mode");
|
|
4059
|
+
if (queryMode) {
|
|
4060
|
+
setMode(queryMode);
|
|
4061
|
+
}
|
|
4062
|
+
}, [searchParams, isInitialLoad]);
|
|
4164
4063
|
// Add this new effect for initial fullscreen setup
|
|
4165
4064
|
useEffect(() => {
|
|
4166
4065
|
if (!isInitialLoad)
|
|
@@ -4288,11 +4187,16 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4288
4187
|
dragEnd: () => {
|
|
4289
4188
|
setDragObject(undefined);
|
|
4290
4189
|
},
|
|
4291
|
-
droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption
|
|
4292
|
-
|
|
4293
|
-
if ((!droppedDragObject && !insertOption) || !page)
|
|
4190
|
+
droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption) => {
|
|
4191
|
+
if ((!dragObject && !insertOption) || !page)
|
|
4294
4192
|
return;
|
|
4295
4193
|
setDragObject(undefined);
|
|
4194
|
+
if (spotPositionElement && spotPositionAnchor) {
|
|
4195
|
+
setInserting({
|
|
4196
|
+
positionElement: spotPositionElement,
|
|
4197
|
+
positionAnchor: spotPositionAnchor,
|
|
4198
|
+
});
|
|
4199
|
+
}
|
|
4296
4200
|
const placeholderKeyComponents = placeholderKey.split("_");
|
|
4297
4201
|
const parentId = placeholderKeyComponents.length === 1
|
|
4298
4202
|
? undefined
|
|
@@ -4302,31 +4206,39 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4302
4206
|
let op;
|
|
4303
4207
|
if (!currentItemDescriptorRef.current)
|
|
4304
4208
|
return;
|
|
4305
|
-
let insertionSequence;
|
|
4306
|
-
if ((spotPosition || spotPositionElement) && spotPositionAnchor) {
|
|
4307
|
-
insertionSequence = ++insertingSequenceRef.current;
|
|
4308
|
-
setInserting({
|
|
4309
|
-
position: spotPosition,
|
|
4310
|
-
positionElement: spotPositionElement,
|
|
4311
|
-
positionAnchor: spotPositionAnchor,
|
|
4312
|
-
});
|
|
4313
|
-
}
|
|
4314
|
-
let operationPromise;
|
|
4315
4209
|
if (insertOption) {
|
|
4316
4210
|
// Clear any selected component type for insertion once the component
|
|
4317
4211
|
// has been dropped into a placeholder. This ensures that insert mode
|
|
4318
4212
|
// can exit cleanly and the editor header updates from "Add Component"
|
|
4319
4213
|
// to the actual component name after the operation completes.
|
|
4320
4214
|
setSelectedForInsertion("");
|
|
4321
|
-
|
|
4215
|
+
operations
|
|
4216
|
+
.addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current)
|
|
4217
|
+
.then((result) => {
|
|
4218
|
+
setInserting(undefined);
|
|
4219
|
+
})
|
|
4220
|
+
.catch((err) => {
|
|
4221
|
+
setInserting(undefined);
|
|
4222
|
+
});
|
|
4223
|
+
return;
|
|
4322
4224
|
}
|
|
4323
|
-
|
|
4324
|
-
|
|
4225
|
+
if (!dragObject)
|
|
4226
|
+
return;
|
|
4227
|
+
if (dragObject && dragObject.type == "template") {
|
|
4228
|
+
operations
|
|
4229
|
+
.addComponent(dragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current)
|
|
4230
|
+
.then((result) => {
|
|
4231
|
+
setInserting(undefined);
|
|
4232
|
+
})
|
|
4233
|
+
.catch((err) => {
|
|
4234
|
+
setInserting(undefined);
|
|
4235
|
+
});
|
|
4236
|
+
return;
|
|
4325
4237
|
}
|
|
4326
|
-
|
|
4327
|
-
(
|
|
4238
|
+
if (dragObject.type == "component" ||
|
|
4239
|
+
(dragObject.type == "items" && dragObject.items)) {
|
|
4328
4240
|
const parentComponent = parentId && page ? getComponentById(parentId, page) : null;
|
|
4329
|
-
if (
|
|
4241
|
+
if (dragObject.type == "items" && dragObject.items) {
|
|
4330
4242
|
op = {
|
|
4331
4243
|
type: "link-component",
|
|
4332
4244
|
mainItem: page.item.descriptor,
|
|
@@ -4340,52 +4252,33 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4340
4252
|
placeholderIndex: index,
|
|
4341
4253
|
date: new Date().toISOString(),
|
|
4342
4254
|
id: uuid(),
|
|
4343
|
-
linkedComponentItem:
|
|
4255
|
+
linkedComponentItem: dragObject.items[0],
|
|
4344
4256
|
title: "Link component",
|
|
4345
4257
|
};
|
|
4346
4258
|
}
|
|
4347
4259
|
else {
|
|
4348
|
-
const componentIds =
|
|
4349
|
-
if (componentIds.length
|
|
4350
|
-
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
}
|
|
4260
|
+
const componentIds = dragObject.components?.map((c) => c.id) ?? [];
|
|
4261
|
+
if (componentIds.length === 0)
|
|
4262
|
+
return;
|
|
4263
|
+
op = {
|
|
4264
|
+
type: "move-component",
|
|
4265
|
+
mainItem: page.item.descriptor,
|
|
4266
|
+
parent: parentId && {
|
|
4267
|
+
id: parentId,
|
|
4268
|
+
language: page.item.descriptor.language,
|
|
4269
|
+
version: page.item.descriptor.version,
|
|
4270
|
+
},
|
|
4271
|
+
placeholderKey,
|
|
4272
|
+
placeholderIndex: index,
|
|
4273
|
+
componentIds,
|
|
4274
|
+
date: new Date().toISOString(),
|
|
4275
|
+
id: uuid(),
|
|
4276
|
+
title: "Move component",
|
|
4277
|
+
};
|
|
4366
4278
|
}
|
|
4367
4279
|
}
|
|
4368
4280
|
if (op)
|
|
4369
|
-
|
|
4370
|
-
if (!operationPromise) {
|
|
4371
|
-
if (insertionSequence !== undefined &&
|
|
4372
|
-
insertingSequenceRef.current === insertionSequence) {
|
|
4373
|
-
setInserting(undefined);
|
|
4374
|
-
}
|
|
4375
|
-
return;
|
|
4376
|
-
}
|
|
4377
|
-
try {
|
|
4378
|
-
await operationPromise;
|
|
4379
|
-
}
|
|
4380
|
-
catch (err) {
|
|
4381
|
-
console.error("Failed to drop component in placeholder", err);
|
|
4382
|
-
}
|
|
4383
|
-
finally {
|
|
4384
|
-
if (insertionSequence !== undefined &&
|
|
4385
|
-
insertingSequenceRef.current === insertionSequence) {
|
|
4386
|
-
setInserting(undefined);
|
|
4387
|
-
}
|
|
4388
|
-
}
|
|
4281
|
+
operations.executeEditOperation(op);
|
|
4389
4282
|
},
|
|
4390
4283
|
page,
|
|
4391
4284
|
triggerFieldAction: async (fieldDescriptor, actionButton, parameters, event) => {
|
|
@@ -4664,50 +4557,27 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4664
4557
|
setShowComments,
|
|
4665
4558
|
showResolvedComments,
|
|
4666
4559
|
setShowResolvedComments,
|
|
4667
|
-
addComment: async (
|
|
4560
|
+
addComment: async () => {
|
|
4668
4561
|
const descriptor = item?.descriptor;
|
|
4669
4562
|
if (!descriptor)
|
|
4670
4563
|
return;
|
|
4671
4564
|
// Snapshot selection context up-front so switching views doesn't change what we comment on.
|
|
4672
|
-
const hintedFieldSnapshot = options?.field;
|
|
4673
4565
|
const focusedFieldSnapshot = focusedFieldRef.current;
|
|
4674
|
-
const
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4678
|
-
selectionRangeMatchesField(selectedRangeCandidate, hintedFieldSnapshot)
|
|
4679
|
-
? selectedRangeCandidate
|
|
4680
|
-
: undefined;
|
|
4681
|
-
const selectedRangeFieldSnapshot = isUsableTextSelectionRange(selectedRangeSnapshot)
|
|
4682
|
-
? {
|
|
4683
|
-
fieldId: selectedRangeSnapshot.fieldId,
|
|
4684
|
-
item: {
|
|
4685
|
-
id: selectedRangeSnapshot.itemId,
|
|
4686
|
-
language: selectedRangeSnapshot.language || descriptor.language,
|
|
4687
|
-
version: typeof selectedRangeSnapshot.version === "number"
|
|
4688
|
-
? selectedRangeSnapshot.version
|
|
4689
|
-
: descriptor.version,
|
|
4690
|
-
},
|
|
4691
|
-
}
|
|
4692
|
-
: undefined;
|
|
4693
|
-
const commentFieldSnapshot = selectedRangeFieldSnapshot ??
|
|
4694
|
-
hintedFieldSnapshot ??
|
|
4695
|
-
focusedFieldSnapshot;
|
|
4696
|
-
const itemId = commentFieldSnapshot?.item.id ||
|
|
4697
|
-
(selection.length > 0 ? selection[0] : undefined) ||
|
|
4566
|
+
const selectionSnapshot = [...selection];
|
|
4567
|
+
const selectedRangeSnapshot = selectedRange;
|
|
4568
|
+
const itemId = focusedFieldSnapshot?.item.id ||
|
|
4569
|
+
(selectionSnapshot.length > 0 ? selectionSnapshot[0] : undefined) ||
|
|
4698
4570
|
descriptor.id;
|
|
4699
4571
|
if (!itemId)
|
|
4700
4572
|
return;
|
|
4701
4573
|
// Ensure the feedback sidebar is open when adding a comment (e.g. command palette / toolbar button).
|
|
4702
4574
|
openSidebar("feedback");
|
|
4703
|
-
const language =
|
|
4704
|
-
const version =
|
|
4705
|
-
? commentFieldSnapshot.item.version
|
|
4706
|
-
: descriptor.version;
|
|
4575
|
+
const language = descriptor.language;
|
|
4576
|
+
const version = descriptor.version;
|
|
4707
4577
|
const getFieldName = async () => {
|
|
4708
|
-
if (!
|
|
4578
|
+
if (!focusedFieldSnapshot)
|
|
4709
4579
|
return "";
|
|
4710
|
-
const field = await itemsRepository.getField(
|
|
4580
|
+
const field = await itemsRepository.getField(focusedFieldSnapshot);
|
|
4711
4581
|
return field?.name;
|
|
4712
4582
|
};
|
|
4713
4583
|
const getItemName = async () => {
|
|
@@ -4723,40 +4593,24 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4723
4593
|
isNew: true,
|
|
4724
4594
|
itemId,
|
|
4725
4595
|
itemName: await getItemName(),
|
|
4726
|
-
fieldId:
|
|
4596
|
+
fieldId: focusedFieldSnapshot?.fieldId,
|
|
4727
4597
|
fieldName: await getFieldName(),
|
|
4728
4598
|
mainItemId: descriptor.id,
|
|
4729
4599
|
language,
|
|
4730
4600
|
version,
|
|
4731
4601
|
position: 0,
|
|
4732
|
-
rangeStart:
|
|
4733
|
-
|
|
4734
|
-
: 0,
|
|
4735
|
-
rangeEnd: isUsableTextSelectionRange(selectedRangeSnapshot)
|
|
4736
|
-
? selectedRangeSnapshot.endOffset
|
|
4737
|
-
: 0,
|
|
4602
|
+
rangeStart: selectedRangeSnapshot?.startOffset || 0,
|
|
4603
|
+
rangeEnd: selectedRangeSnapshot?.endOffset || 0,
|
|
4738
4604
|
author: user?.name,
|
|
4739
4605
|
authorDisplayName: user?.fullName,
|
|
4740
|
-
|
|
4606
|
+
date: new Date().toISOString(),
|
|
4741
4607
|
};
|
|
4742
|
-
if (selectedRangeSnapshot?.clientRect) {
|
|
4743
|
-
newComment[COMMENT_TRANSIENT_SELECTION_RECT] =
|
|
4744
|
-
selectedRangeSnapshot.clientRect;
|
|
4745
|
-
}
|
|
4746
|
-
if (selectedRangeSnapshot?.elementKey) {
|
|
4747
|
-
newComment[COMMENT_TRANSIENT_ELEMENT_KEY] =
|
|
4748
|
-
selectedRangeSnapshot.elementKey;
|
|
4749
|
-
}
|
|
4750
4608
|
setComments([newComment, ...comments]);
|
|
4751
4609
|
setSelectedComment(newComment);
|
|
4752
4610
|
setShowComments(true);
|
|
4753
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
4754
4611
|
},
|
|
4755
4612
|
mode,
|
|
4756
|
-
changeMode,
|
|
4757
4613
|
setMode,
|
|
4758
|
-
registerModeChangeParticipant,
|
|
4759
|
-
modeTransitionRevision,
|
|
4760
4614
|
previewDate,
|
|
4761
4615
|
setPreviewDate,
|
|
4762
4616
|
layoutMode,
|
|
@@ -4824,7 +4678,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4824
4678
|
setCurrentWizardId,
|
|
4825
4679
|
favorites,
|
|
4826
4680
|
loadFavorites,
|
|
4827
|
-
refreshFavorites,
|
|
4828
4681
|
isQuickSwitcherVisible: quickSwitcherVisible,
|
|
4829
4682
|
// Context factory registry methods
|
|
4830
4683
|
registerContextFactory: (name, factory) => {
|
|
@@ -4933,7 +4786,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4933
4786
|
isRefreshing,
|
|
4934
4787
|
favorites,
|
|
4935
4788
|
loadFavorites,
|
|
4936
|
-
refreshFavorites,
|
|
4937
4789
|
currentWizardId,
|
|
4938
4790
|
quickSwitcherVisible,
|
|
4939
4791
|
quickSwitcherSelectedIndex,
|
|
@@ -4944,10 +4796,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4944
4796
|
factoriesRef,
|
|
4945
4797
|
user,
|
|
4946
4798
|
statusMessage,
|
|
4947
|
-
changeMode,
|
|
4948
|
-
setMode,
|
|
4949
|
-
registerModeChangeParticipant,
|
|
4950
|
-
modeTransitionRevision,
|
|
4951
4799
|
previewDate,
|
|
4952
4800
|
layoutMode,
|
|
4953
4801
|
enableCompletions,
|
|
@@ -5013,6 +4861,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5013
4861
|
setLockedField(undefined); // Clear client-side lock state
|
|
5014
4862
|
await releaseFieldLocks(sessionId);
|
|
5015
4863
|
},
|
|
4864
|
+
inlineEditingFieldElement,
|
|
4865
|
+
setInlineEditingFieldElement,
|
|
5016
4866
|
};
|
|
5017
4867
|
// Debug: Track editContext changes
|
|
5018
4868
|
// const prevDependencies = useRef<any[]>([]);
|
|
@@ -5051,6 +4901,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5051
4901
|
// componentDesignerRendering,
|
|
5052
4902
|
// insertMode,
|
|
5053
4903
|
// currentOverlay,
|
|
4904
|
+
// inlineEditingFieldElement,
|
|
5054
4905
|
// lockedField,
|
|
5055
4906
|
// selectedRange,
|
|
5056
4907
|
// pageViewContext,
|
|
@@ -5138,6 +4989,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5138
4989
|
// 'componentDesignerRendering',
|
|
5139
4990
|
// 'insertMode',
|
|
5140
4991
|
// 'currentOverlay',
|
|
4992
|
+
// 'inlineEditingFieldElement',
|
|
5141
4993
|
// 'lockedField',
|
|
5142
4994
|
// 'selectedRange',
|
|
5143
4995
|
// 'pageViewContext',
|
|
@@ -5253,7 +5105,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5253
5105
|
setTimeout(() => {
|
|
5254
5106
|
setShowFullscreenHint(false);
|
|
5255
5107
|
}, 600);
|
|
5256
|
-
}, "data-testid": "fullscreen-hint-overlay", children: _jsxs("div", { className: "bg-neutral-grey-100/60 fixed top-6 left-1/2 -translate-x-1/2 transform rounded-full px-6 py-2.5 text-sm font-medium text-white shadow-2xl backdrop-blur-md transition-all duration-500", children: ["Press", " ", _jsx("kbd", { className: "badge-pad-sm mx-1 rounded bg-white/20 text-xs font-semibold", children: "Ctrl + F11" }), " ", "to exit fullscreen"] }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(EditorChrome, { className: className, currentWorkspace: currentWorkspace, centerPanelView: centerPanelView, editContext: editContext, showAgentsPanel: showAgentsPanel, handleSetShowAgentsPanel: handleSetShowAgentsPanel, workspaceId: workspaceId }), isTourActive && (_jsx(Tour, { tourStopCallback: () => {
|
|
5108
|
+
}, "data-testid": "fullscreen-hint-overlay", children: _jsxs("div", { className: "bg-neutral-grey-100/60 fixed top-6 left-1/2 -translate-x-1/2 transform rounded-full px-6 py-2.5 text-sm font-medium text-white shadow-2xl backdrop-blur-md transition-all duration-500", children: ["Press", " ", _jsx("kbd", { className: "badge-pad-sm mx-1 rounded bg-white/20 text-xs font-semibold", children: "Ctrl + F11" }), " ", "to exit fullscreen"] }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(EditorChrome, { className: className, currentWorkspace: currentWorkspace, centerPanelView: centerPanelView, editContext: editContext, showAgentsPanel: showAgentsPanel, handleSetShowAgentsPanel: handleSetShowAgentsPanel, workspaceId: workspaceId }), isTourActive && configuration.activeTour && (_jsx(Tour, { tourStopCallback: () => {
|
|
5257
5109
|
setIsTourActive(false);
|
|
5258
5110
|
// Remove tour state from URL
|
|
5259
5111
|
// Use history.replaceState instead of router.replace to avoid triggering React navigation
|
|
@@ -5265,8 +5117,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5265
5117
|
: window.location.pathname;
|
|
5266
5118
|
window.history.replaceState(getCurrentHistoryState(), "", newUrl);
|
|
5267
5119
|
}, configuration: configuration, restoredFromUrl: tourRestoredRef.current })), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(GuidanceOverlay, {}) }), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(AgentDialogHandler, {}) })] }));
|
|
5268
|
-
|
|
5269
|
-
return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && _jsx(EditorLoadingOverlay, {}), showRefreshSpinner && (_jsx("div", { className: "text-neutral-grey-50 pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
|
|
5120
|
+
return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && _jsx(EditorLoadingOverlay, {}), editContext.isRefreshing && (_jsx("div", { className: "text-neutral-grey-50 pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
|
|
5270
5121
|
currentWorkspace.id === "taskboard" ||
|
|
5271
5122
|
currentWorkspace.id === "translation-management") &&
|
|
5272
5123
|
showAgentsWorkspaceEditor && (_jsx(AgentsSlotContextBridgeHost, { slots: editorSlots })), startupChecks.state !== "loading" && (children || editorUi), startupChecks.state !== "loading" && dialog, _jsx(Toaster, { position: "top-center" }), " ", _jsx(ConfirmationDialog, { ref: confirmationDialogRef }), _jsx(ConcurrentUserLimitDialog, { open: concurrentUserLimitError !== null, onOpenChange: (open) => {
|