@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.
Files changed (307) hide show
  1. package/dist/components/ui/card.d.ts +1 -3
  2. package/dist/components/ui/card.js +2 -2
  3. package/dist/components/ui/card.js.map +1 -1
  4. package/dist/components/ui/context-menu.js +2 -2
  5. package/dist/config/config.js +7 -8
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/config/types.d.ts +7 -0
  8. package/dist/config/types.js.map +1 -1
  9. package/dist/editor/FieldActionsOverlay.d.ts +1 -0
  10. package/dist/editor/FieldActionsOverlay.js +45 -1
  11. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  12. package/dist/editor/FieldListField.d.ts +1 -1
  13. package/dist/editor/FieldListField.js +18 -20
  14. package/dist/editor/FieldListField.js.map +1 -1
  15. package/dist/editor/ImageEditor.d.ts +1 -6
  16. package/dist/editor/ImageEditor.js +3 -19
  17. package/dist/editor/ImageEditor.js.map +1 -1
  18. package/dist/editor/PictureEditor.d.ts +1 -2
  19. package/dist/editor/PictureEditor.js +14 -5
  20. package/dist/editor/PictureEditor.js.map +1 -1
  21. package/dist/editor/ai/Agents.js +2 -2
  22. package/dist/editor/ai/Agents.js.map +1 -1
  23. package/dist/editor/ai/GuidanceOverlay.js +11 -1
  24. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  25. package/dist/editor/ai/InlineAiDialog.js +11 -22
  26. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  27. package/dist/editor/ai/InlineAiTrigger.js +57 -17
  28. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  29. package/dist/editor/ai/dialogs/capturePageDom.js +36 -66
  30. package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
  31. package/dist/editor/ai/dialogs/capturePageScreenshot.js +162 -281
  32. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  33. package/dist/editor/ai/terminal/agentSessionState.d.ts +0 -3
  34. package/dist/editor/ai/terminal/agentSessionState.js +1 -3
  35. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  36. package/dist/editor/ai/terminal/agentStartRequest.d.ts +1 -2
  37. package/dist/editor/ai/terminal/agentStartRequest.js +1 -2
  38. package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
  39. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
  40. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  41. package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +0 -7
  42. package/dist/editor/ai/terminal/components/AgentDocumentList.js +13 -55
  43. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  44. package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +1 -3
  45. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +14 -22
  46. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  47. package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
  48. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  49. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
  50. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  51. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
  52. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  53. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +1 -2
  54. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +11 -8
  55. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  56. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +4 -1
  57. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +14 -31
  58. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  59. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
  60. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
  61. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +1 -2
  62. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +4 -2
  63. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  64. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  65. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
  66. package/dist/editor/ai/terminal/components/AgentTerminalView.js +2 -13
  67. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  68. package/dist/editor/ai/terminal/components/AiResponseMessage.js +14 -16
  69. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  70. package/dist/editor/ai/terminal/components/ContextInfoBar.js +2 -22
  71. package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
  72. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +26 -37
  73. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
  74. package/dist/editor/ai/terminal/components/UserMessage.d.ts +1 -2
  75. package/dist/editor/ai/terminal/components/UserMessage.js +8 -144
  76. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  77. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
  78. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
  79. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +0 -1
  80. package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +1 -3
  81. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +3 -9
  82. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  83. package/dist/editor/ai/terminal/useAgentTerminalController.js +0 -7
  84. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  85. package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
  86. package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
  87. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +1 -3
  88. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
  89. package/dist/editor/ai/useInlineAiPosition.d.ts +1 -1
  90. package/dist/editor/ai/useInlineAiPosition.js +52 -22
  91. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  92. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +62 -30
  93. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  94. package/dist/editor/client/EditorShell.d.ts +1 -5
  95. package/dist/editor/client/EditorShell.js +136 -285
  96. package/dist/editor/client/EditorShell.js.map +1 -1
  97. package/dist/editor/client/editContext.d.ts +5 -33
  98. package/dist/editor/client/editContext.js.map +1 -1
  99. package/dist/editor/client/hooks/useSocketMessageHandler.js +17 -14
  100. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  101. package/dist/editor/client/itemsRepository.d.ts +0 -2
  102. package/dist/editor/client/itemsRepository.js +8 -15
  103. package/dist/editor/client/itemsRepository.js.map +1 -1
  104. package/dist/editor/client/operations.d.ts +1 -1
  105. package/dist/editor/client/operations.js +17 -41
  106. package/dist/editor/client/operations.js.map +1 -1
  107. package/dist/editor/client/pageModelBuilder.js +7 -24
  108. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  109. package/dist/editor/commands/handlers/uiActionHandlers.js +5 -1
  110. package/dist/editor/commands/handlers/uiActionHandlers.js.map +1 -1
  111. package/dist/editor/editor-warnings/FinalWorkflowStateReadOnly.js +5 -0
  112. package/dist/editor/editor-warnings/FinalWorkflowStateReadOnly.js.map +1 -1
  113. package/dist/editor/editor-warnings/ItemLocked.js +6 -3
  114. package/dist/editor/editor-warnings/ItemLocked.js.map +1 -1
  115. package/dist/editor/field-types/MultiLineText.js +3 -10
  116. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  117. package/dist/editor/field-types/RawEditor.js +1 -8
  118. package/dist/editor/field-types/RawEditor.js.map +1 -1
  119. package/dist/editor/field-types/RichTextEditorComponent.js +45 -156
  120. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  121. package/dist/editor/field-types/SingleLineText.js +3 -10
  122. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  123. package/dist/editor/field-types/richtext/components/ReactSlate.js +2 -8
  124. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  125. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -1
  126. package/dist/editor/field-types/richtext/contextMenuFactory.js +303 -100
  127. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  128. package/dist/editor/field-types/richtext/types.d.ts +0 -2
  129. package/dist/editor/field-types/richtext/types.js.map +1 -1
  130. package/dist/editor/media-selector/MediaFolderBrowser.d.ts +2 -1
  131. package/dist/editor/media-selector/MediaFolderBrowser.js +19 -9
  132. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  133. package/dist/editor/media-selector/TreeSelector.js +30 -24
  134. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  135. package/dist/editor/media-selector/UploadZone.d.ts +2 -1
  136. package/dist/editor/media-selector/UploadZone.js +21 -9
  137. package/dist/editor/media-selector/UploadZone.js.map +1 -1
  138. package/dist/editor/menubar/PageSelector.js +2 -8
  139. package/dist/editor/menubar/PageSelector.js.map +1 -1
  140. package/dist/editor/menubar/VersionPreviewCard.js +249 -4
  141. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  142. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  143. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  144. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -0
  145. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +462 -63
  146. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  147. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
  148. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +2 -5
  149. package/dist/editor/page-editor-chrome/CommentHighlightings.js +215 -340
  150. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  151. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +1 -5
  152. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +4 -11
  153. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  154. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +13 -21
  155. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  156. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +29 -23
  157. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  158. package/dist/editor/page-editor-chrome/FrameMenu.js +19 -110
  159. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  160. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +7 -0
  161. package/dist/editor/page-editor-chrome/InlineEditor.js +1719 -0
  162. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -0
  163. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +2 -3
  164. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +45 -148
  165. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  166. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +0 -2
  167. package/dist/editor/page-editor-chrome/PageEditorChrome.js +21 -25
  168. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  169. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +128 -163
  170. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  171. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  172. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +3 -6
  173. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  174. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +2 -1
  175. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +146 -83
  176. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  177. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +2 -5
  178. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +63 -144
  179. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  180. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +2 -1
  181. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +30 -101
  182. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  183. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +1 -10
  184. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +122 -105
  185. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  186. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +4 -11
  187. package/dist/editor/page-editor-chrome/overlay/geometry.js +36 -139
  188. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  189. package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +2 -0
  190. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +21 -0
  191. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +1 -0
  192. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +7 -0
  193. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +758 -0
  194. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -0
  195. package/dist/editor/page-viewer/EditorForm.js +1 -17
  196. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  197. package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
  198. package/dist/editor/page-viewer/MiniMap.js +364 -176
  199. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  200. package/dist/editor/page-viewer/PageViewer.js +13 -40
  201. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  202. package/dist/editor/page-viewer/PageViewerFrame.d.ts +5 -0
  203. package/dist/editor/page-viewer/PageViewerFrame.js +1509 -1527
  204. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  205. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +3 -0
  206. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +796 -0
  207. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -0
  208. package/dist/editor/page-viewer/pageViewContext.d.ts +0 -32
  209. package/dist/editor/page-viewer/pageViewContext.js +6 -37
  210. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  211. package/dist/editor/reviews/Comment.d.ts +1 -2
  212. package/dist/editor/reviews/Comment.js +4 -9
  213. package/dist/editor/reviews/Comment.js.map +1 -1
  214. package/dist/editor/reviews/CommentEditor.js +1 -1
  215. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  216. package/dist/editor/reviews/CommentPopover.js +9 -68
  217. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  218. package/dist/editor/reviews/CommentView.js +4 -24
  219. package/dist/editor/reviews/CommentView.js.map +1 -1
  220. package/dist/editor/reviews/Comments.d.ts +2 -0
  221. package/dist/editor/reviews/Comments.js +30 -29
  222. package/dist/editor/reviews/Comments.js.map +1 -1
  223. package/dist/editor/reviews/FeedbackCard.d.ts +2 -4
  224. package/dist/editor/reviews/FeedbackCard.js +5 -5
  225. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  226. package/dist/editor/reviews/SuggestedEdit.js +6 -4
  227. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  228. package/dist/editor/reviews/SuggestionDisplayPopover.js +2 -3
  229. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  230. package/dist/editor/reviews/commentAi.js +27 -96
  231. package/dist/editor/reviews/commentAi.js.map +1 -1
  232. package/dist/editor/reviews/feedbackSelection.js +4 -32
  233. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  234. package/dist/editor/services/agentService.d.ts +0 -15
  235. package/dist/editor/services/agentService.js +1 -11
  236. package/dist/editor/services/agentService.js.map +1 -1
  237. package/dist/editor/services/contentService.d.ts +1 -0
  238. package/dist/editor/services/contentService.js.map +1 -1
  239. package/dist/editor/services/reviewsService.d.ts +2 -2
  240. package/dist/editor/services/reviewsService.js.map +1 -1
  241. package/dist/editor/settings/SettingsView.js +2 -2
  242. package/dist/editor/settings/SettingsView.js.map +1 -1
  243. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  244. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  245. package/dist/editor/settings/panels/ProvidersPanel.js +3 -2
  246. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  247. package/dist/editor/sidebar/MorePanelsButton.js +1 -1
  248. package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
  249. package/dist/editor/sidebar/Workbox.js +1 -1
  250. package/dist/editor/sidebar/Workbox.js.map +1 -1
  251. package/dist/editor/ui/IconSelectorDialog.js +1 -1
  252. package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
  253. package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
  254. package/dist/editor/ui/SimpleIconButton.js +1 -1
  255. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  256. package/dist/editor/utils.d.ts +17 -1
  257. package/dist/editor/utils.js +143 -0
  258. package/dist/editor/utils.js.map +1 -1
  259. package/dist/editor/version-diff/versionDiffTargets.d.ts +8 -3
  260. package/dist/editor/version-diff/versionDiffTargets.js +94 -37
  261. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  262. package/dist/editor/views/MediaFolderEditView.js +1 -1
  263. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  264. package/dist/revision.d.ts +2 -2
  265. package/dist/revision.js +2 -2
  266. package/dist/splash-screen/DialogWrappers.js +2 -2
  267. package/dist/splash-screen/DialogWrappers.js.map +1 -1
  268. package/dist/splash-screen/ModernSplashScreen.js +3 -11
  269. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  270. package/dist/splash-screen/NewPage.js +5 -7
  271. package/dist/splash-screen/NewPage.js.map +1 -1
  272. package/dist/splash-screen/OpenPage.js +3 -5
  273. package/dist/splash-screen/OpenPage.js.map +1 -1
  274. package/dist/splash-screen/RecentPages.js +3 -3
  275. package/dist/splash-screen/RecentPages.js.map +1 -1
  276. package/package.json +1 -2
  277. package/styles.css +0 -49
  278. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
  279. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
  280. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
  281. package/dist/editor/bridge/BridgeClient.d.ts +0 -80
  282. package/dist/editor/bridge/BridgeClient.js +0 -417
  283. package/dist/editor/bridge/BridgeClient.js.map +0 -1
  284. package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +0 -13
  285. package/dist/editor/field-types/useFormFieldCaretPresence.js +0 -92
  286. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +0 -1
  287. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +0 -6
  288. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +0 -123
  289. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +0 -1
  290. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +0 -26
  291. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +0 -222
  292. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +0 -1
  293. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +0 -20
  294. package/dist/editor/page-viewer/bridgeFieldPatch.js +0 -33
  295. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +0 -1
  296. package/dist/editor/reviews/commentTransientSelection.d.ts +0 -23
  297. package/dist/editor/reviews/commentTransientSelection.js +0 -7
  298. package/dist/editor/reviews/commentTransientSelection.js.map +0 -1
  299. package/dist/editor/reviews/feedbackOrdering.d.ts +0 -5
  300. package/dist/editor/reviews/feedbackOrdering.js +0 -27
  301. package/dist/editor/reviews/feedbackOrdering.js.map +0 -1
  302. package/dist/editor/reviews/suggestedEditState.d.ts +0 -12
  303. package/dist/editor/reviews/suggestedEditState.js +0 -90
  304. package/dist/editor/reviews/suggestedEditState.js.map +0 -1
  305. package/dist/editor/reviews/suggestionDisplayValue.d.ts +0 -43
  306. package/dist/editor/reviews/suggestionDisplayValue.js +0 -93
  307. 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(() => searchParams.get("tour") === "active", [searchParams]);
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, setModeState] = useState("edit");
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
- setMode(urlMode ?? "edit");
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", workspaceShowsModeControls ? mode : "edit");
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
- }, [sessionId]);
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, selectionOverride) => {
3599
- const rangeToReplace = selectionOverride ?? selectedRange ?? lastTextSelectionRangeRef.current;
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 (rangeToReplace?.text && rangeToReplace.replaceText) {
3603
- rangeToReplace.replaceText(newText);
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 (!rangeToReplace?.text && rangeToReplace?.replaceText) {
3611
- rangeToReplace.replaceText(newText);
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 } = fieldToReplace;
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(fieldToReplace))
3638
- ?.value || "";
3516
+ : (await itemsRepository.getField(focusedField))?.value ||
3517
+ "";
3639
3518
  let newValue;
3640
- if (rangeToReplace?.text) {
3519
+ if (selectedRange?.text) {
3641
3520
  // Replace selected text
3642
- const { text: originalSelectedText } = rangeToReplace;
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 = rangeToReplace?.startOffset ?? currentValue.length;
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: fieldToReplace,
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, spotPosition) => {
4292
- const droppedDragObject = dragObject;
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
- operationPromise = operations.addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current);
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
- else if (droppedDragObject?.type == "template") {
4324
- operationPromise = operations.addComponent(droppedDragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current);
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
- else if (droppedDragObject?.type == "component" ||
4327
- (droppedDragObject?.type == "items" && droppedDragObject.items)) {
4238
+ if (dragObject.type == "component" ||
4239
+ (dragObject.type == "items" && dragObject.items)) {
4328
4240
  const parentComponent = parentId && page ? getComponentById(parentId, page) : null;
4329
- if (droppedDragObject.type == "items" && droppedDragObject.items) {
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: droppedDragObject.items[0],
4255
+ linkedComponentItem: dragObject.items[0],
4344
4256
  title: "Link component",
4345
4257
  };
4346
4258
  }
4347
4259
  else {
4348
- const componentIds = droppedDragObject.components?.map((c) => c.id) ?? [];
4349
- if (componentIds.length > 0) {
4350
- op = {
4351
- type: "move-component",
4352
- mainItem: page.item.descriptor,
4353
- parent: parentId && {
4354
- id: parentId,
4355
- language: page.item.descriptor.language,
4356
- version: page.item.descriptor.version,
4357
- },
4358
- placeholderKey,
4359
- placeholderIndex: index,
4360
- componentIds,
4361
- date: new Date().toISOString(),
4362
- id: uuid(),
4363
- title: "Move component",
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
- operationPromise = operations.executeEditOperation(op);
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 (options) => {
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 selectedRangeCandidate = isUsableTextSelectionRange(selectedRange)
4675
- ? selectedRange
4676
- : lastTextSelectionRangeRef.current;
4677
- const selectedRangeSnapshot = !hintedFieldSnapshot ||
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 = commentFieldSnapshot?.item.language || descriptor.language;
4704
- const version = typeof commentFieldSnapshot?.item.version === "number"
4705
- ? commentFieldSnapshot.item.version
4706
- : descriptor.version;
4575
+ const language = descriptor.language;
4576
+ const version = descriptor.version;
4707
4577
  const getFieldName = async () => {
4708
- if (!commentFieldSnapshot)
4578
+ if (!focusedFieldSnapshot)
4709
4579
  return "";
4710
- const field = await itemsRepository.getField(commentFieldSnapshot);
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: commentFieldSnapshot?.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: isUsableTextSelectionRange(selectedRangeSnapshot)
4733
- ? selectedRangeSnapshot.startOffset
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
- created: new Date().toISOString(),
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
- const showRefreshSpinner = editContext.isRefreshing && !activePageViewContext.iframeSupportsRefresh;
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) => {