@parhelia/core 0.1.12882 → 0.1.12884

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 (414) hide show
  1. package/dist/agents-view/AgentsSidebar.js +1 -1
  2. package/dist/agents-view/AgentsSidebar.js.map +1 -1
  3. package/dist/agents-view/AgentsTitlebar.d.ts +1 -1
  4. package/dist/agents-view/AgentsTitlebar.js +3 -6
  5. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  6. package/dist/agents-view/AgentsView.d.ts +2 -2
  7. package/dist/agents-view/AgentsView.js +2 -2
  8. package/dist/agents-view/AgentsView.js.map +1 -1
  9. package/dist/agents-view/AgentsWorkspaceView.js +1 -12
  10. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  11. package/dist/agents-view/CreateAgentView.d.ts +1 -1
  12. package/dist/agents-view/CreateAgentView.js +1 -1
  13. package/dist/agents-view/DateAgentsGroup.js +12 -1
  14. package/dist/agents-view/DateAgentsGroup.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.js +16 -4
  16. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
  17. package/dist/components/ui/card.d.ts +3 -1
  18. package/dist/components/ui/card.js +2 -2
  19. package/dist/components/ui/card.js.map +1 -1
  20. package/dist/components/ui/checkbox.js +1 -1
  21. package/dist/components/ui/checkbox.js.map +1 -1
  22. package/dist/components/ui/context-menu.d.ts +2 -1
  23. package/dist/components/ui/context-menu.js +6 -3
  24. package/dist/components/ui/context-menu.js.map +1 -1
  25. package/dist/components/ui/input.js +2 -2
  26. package/dist/components/ui/input.js.map +1 -1
  27. package/dist/components/ui/select.js +1 -1
  28. package/dist/components/ui/select.js.map +1 -1
  29. package/dist/components/ui/textarea.js +2 -2
  30. package/dist/components/ui/textarea.js.map +1 -1
  31. package/dist/config/config.js +107 -12
  32. package/dist/config/config.js.map +1 -1
  33. package/dist/editor/ContextMenu.d.ts +1 -0
  34. package/dist/editor/ContextMenu.js +4 -4
  35. package/dist/editor/ContextMenu.js.map +1 -1
  36. package/dist/editor/FieldActionsOverlay.d.ts +0 -1
  37. package/dist/editor/FieldActionsOverlay.js +1 -45
  38. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  39. package/dist/editor/FieldHistory.d.ts +2 -1
  40. package/dist/editor/FieldHistory.js +13 -12
  41. package/dist/editor/FieldHistory.js.map +1 -1
  42. package/dist/editor/FieldListField.d.ts +1 -1
  43. package/dist/editor/FieldListField.js +24 -36
  44. package/dist/editor/FieldListField.js.map +1 -1
  45. package/dist/editor/ImageEditor.d.ts +6 -1
  46. package/dist/editor/ImageEditor.js +19 -3
  47. package/dist/editor/ImageEditor.js.map +1 -1
  48. package/dist/editor/LinkEditorDialog.d.ts +9 -2
  49. package/dist/editor/LinkEditorDialog.js +174 -70
  50. package/dist/editor/LinkEditorDialog.js.map +1 -1
  51. package/dist/editor/MainLayout.js +49 -6
  52. package/dist/editor/MainLayout.js.map +1 -1
  53. package/dist/editor/MobileLayout.js +33 -1
  54. package/dist/editor/MobileLayout.js.map +1 -1
  55. package/dist/editor/PictureCropper.js +45 -28
  56. package/dist/editor/PictureCropper.js.map +1 -1
  57. package/dist/editor/PictureEditor.d.ts +2 -1
  58. package/dist/editor/PictureEditor.js +5 -14
  59. package/dist/editor/PictureEditor.js.map +1 -1
  60. package/dist/editor/ai/AgentProfileSelector.js +7 -7
  61. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  62. package/dist/editor/ai/Agents.js +20 -6
  63. package/dist/editor/ai/Agents.js.map +1 -1
  64. package/dist/editor/ai/GuidanceOverlay.js +1 -11
  65. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  66. package/dist/editor/ai/InlineAiDialog.d.ts +1 -0
  67. package/dist/editor/ai/InlineAiDialog.js +254 -202
  68. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  69. package/dist/editor/ai/InlineAiTextEditTooltip.d.ts +8 -0
  70. package/dist/editor/ai/InlineAiTextEditTooltip.js +10 -0
  71. package/dist/editor/ai/InlineAiTextEditTooltip.js.map +1 -0
  72. package/dist/editor/ai/InlineAiTrigger.js +158 -31
  73. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  74. package/dist/editor/ai/dialogs/capturePageDom.js +66 -36
  75. package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
  76. package/dist/editor/ai/dialogs/capturePageScreenshot.js +281 -162
  77. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  78. package/dist/editor/ai/inlineAiTextEditLabels.d.ts +2 -0
  79. package/dist/editor/ai/inlineAiTextEditLabels.js +8 -0
  80. package/dist/editor/ai/inlineAiTextEditLabels.js.map +1 -0
  81. package/dist/editor/ai/prepareInlineAiTextSelection.d.ts +5 -0
  82. package/dist/editor/ai/prepareInlineAiTextSelection.js +86 -0
  83. package/dist/editor/ai/prepareInlineAiTextSelection.js.map +1 -0
  84. package/dist/editor/ai/terminal/agentSessionState.d.ts +3 -0
  85. package/dist/editor/ai/terminal/agentSessionState.js +3 -1
  86. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  87. package/dist/editor/ai/terminal/agentStartRequest.d.ts +2 -1
  88. package/dist/editor/ai/terminal/agentStartRequest.js +2 -1
  89. package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
  90. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
  91. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  92. package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +7 -0
  93. package/dist/editor/ai/terminal/components/AgentDocumentList.js +55 -13
  94. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  95. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +5 -0
  96. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +12 -0
  97. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +1 -0
  98. package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +3 -1
  99. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +22 -14
  100. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  101. package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
  102. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  103. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
  104. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  105. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
  106. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  107. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +2 -1
  108. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +8 -11
  109. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  110. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +1 -4
  111. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +31 -14
  112. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  113. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
  114. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
  115. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +2 -1
  116. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +2 -4
  117. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  118. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  119. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
  120. package/dist/editor/ai/terminal/components/AgentTerminalView.js +13 -2
  121. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  122. package/dist/editor/ai/terminal/components/AiResponseMessage.js +11 -9
  123. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  124. package/dist/editor/ai/terminal/components/ContextInfoBar.js +22 -2
  125. package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
  126. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +37 -26
  127. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
  128. package/dist/editor/ai/terminal/components/ToolCallDisplay.js +3 -1
  129. package/dist/editor/ai/terminal/components/ToolCallDisplay.js.map +1 -1
  130. package/dist/editor/ai/terminal/components/UserMessage.d.ts +2 -1
  131. package/dist/editor/ai/terminal/components/UserMessage.js +144 -8
  132. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  133. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
  134. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
  135. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +1 -0
  136. package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +3 -1
  137. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +9 -3
  138. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  139. package/dist/editor/ai/terminal/useAgentTerminalController.js +7 -0
  140. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  141. package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
  142. package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
  143. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +3 -1
  144. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
  145. package/dist/editor/ai/useActiveAgentConversation.d.ts +3 -0
  146. package/dist/editor/ai/useActiveAgentConversation.js +32 -0
  147. package/dist/editor/ai/useActiveAgentConversation.js.map +1 -0
  148. package/dist/editor/ai/useInlineAiPosition.d.ts +10 -2
  149. package/dist/editor/ai/useInlineAiPosition.js +32 -71
  150. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  151. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +30 -62
  152. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  153. package/dist/editor/bridge/BridgeClient.d.ts +80 -0
  154. package/dist/editor/bridge/BridgeClient.js +417 -0
  155. package/dist/editor/bridge/BridgeClient.js.map +1 -0
  156. package/dist/editor/client/EditorShell.d.ts +5 -1
  157. package/dist/editor/client/EditorShell.js +295 -127
  158. package/dist/editor/client/EditorShell.js.map +1 -1
  159. package/dist/editor/client/editContext.d.ts +58 -5
  160. package/dist/editor/client/editContext.js.map +1 -1
  161. package/dist/editor/client/fieldModificationStore.d.ts +1 -0
  162. package/dist/editor/client/fieldModificationStore.js +7 -2
  163. package/dist/editor/client/fieldModificationStore.js.map +1 -1
  164. package/dist/editor/client/hooks/useSocketMessageHandler.js +14 -17
  165. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  166. package/dist/editor/client/itemsRepository.d.ts +2 -0
  167. package/dist/editor/client/itemsRepository.js +18 -9
  168. package/dist/editor/client/itemsRepository.js.map +1 -1
  169. package/dist/editor/client/operations.d.ts +1 -1
  170. package/dist/editor/client/operations.js +67 -21
  171. package/dist/editor/client/operations.js.map +1 -1
  172. package/dist/editor/client/pageModelBuilder.js +24 -7
  173. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  174. package/dist/editor/client/ui/EditorChrome.js +1 -1
  175. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  176. package/dist/editor/commands/componentCommands.d.ts +3 -1
  177. package/dist/editor/commands/componentCommands.js +8 -3
  178. package/dist/editor/commands/componentCommands.js.map +1 -1
  179. package/dist/editor/field-types/DateFieldEditor.js +1 -1
  180. package/dist/editor/field-types/DateFieldEditor.js.map +1 -1
  181. package/dist/editor/field-types/DateTimeFieldEditor.js +1 -1
  182. package/dist/editor/field-types/DateTimeFieldEditor.js.map +1 -1
  183. package/dist/editor/field-types/DropLinkEditor.js +1 -1
  184. package/dist/editor/field-types/DropLinkEditor.js.map +1 -1
  185. package/dist/editor/field-types/DropListEditor.js +1 -1
  186. package/dist/editor/field-types/DropListEditor.js.map +1 -1
  187. package/dist/editor/field-types/ImageFieldEditor.js +1 -1
  188. package/dist/editor/field-types/ImageFieldEditor.js.map +1 -1
  189. package/dist/editor/field-types/InternalLinkFieldEditor.js +1 -1
  190. package/dist/editor/field-types/InternalLinkFieldEditor.js.map +1 -1
  191. package/dist/editor/field-types/LinkFieldEditor.js +15 -3
  192. package/dist/editor/field-types/LinkFieldEditor.js.map +1 -1
  193. package/dist/editor/field-types/MultiLineText.js +11 -4
  194. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  195. package/dist/editor/field-types/NameValueListEditor.js +1 -1
  196. package/dist/editor/field-types/NameValueListEditor.js.map +1 -1
  197. package/dist/editor/field-types/PictureFieldEditor.js +2 -2
  198. package/dist/editor/field-types/PictureFieldEditor.js.map +1 -1
  199. package/dist/editor/field-types/RawEditor.js +9 -2
  200. package/dist/editor/field-types/RawEditor.js.map +1 -1
  201. package/dist/editor/field-types/RichTextEditorComponent.js +170 -77
  202. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  203. package/dist/editor/field-types/SingleLineText.js +10 -3
  204. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  205. package/dist/editor/field-types/TreeListEditor.js +1 -1
  206. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  207. package/dist/editor/field-types/richtext/bridgeRichTextProfile.d.ts +21 -0
  208. package/dist/editor/field-types/richtext/bridgeRichTextProfile.js +96 -0
  209. package/dist/editor/field-types/richtext/bridgeRichTextProfile.js.map +1 -0
  210. package/dist/editor/field-types/richtext/components/ReactSlate.css +44 -6
  211. package/dist/editor/field-types/richtext/components/ReactSlate.js +191 -36
  212. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  213. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.css +5 -2
  214. package/dist/editor/field-types/richtext/components/SimpleToolbar.js +5 -4
  215. package/dist/editor/field-types/richtext/components/SimpleToolbar.js.map +1 -1
  216. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -15
  217. package/dist/editor/field-types/richtext/contextMenuFactory.js +4 -435
  218. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  219. package/dist/editor/field-types/richtext/richTextToolbarIcons.d.ts +7 -0
  220. package/dist/editor/field-types/richtext/richTextToolbarIcons.js +49 -0
  221. package/dist/editor/field-types/richtext/richTextToolbarIcons.js.map +1 -0
  222. package/dist/editor/field-types/richtext/types.d.ts +2 -0
  223. package/dist/editor/field-types/richtext/types.js.map +1 -1
  224. package/dist/editor/field-types/richtext/utils/conversion.js +23 -2
  225. package/dist/editor/field-types/richtext/utils/conversion.js.map +1 -1
  226. package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +13 -0
  227. package/dist/editor/field-types/useFormFieldCaretPresence.js +92 -0
  228. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +1 -0
  229. package/dist/editor/fieldTypes.d.ts +2 -0
  230. package/dist/editor/media-selector/TreeSelector.js +15 -15
  231. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  232. package/dist/editor/menubar/PageSelector.js +8 -2
  233. package/dist/editor/menubar/PageSelector.js.map +1 -1
  234. package/dist/editor/menubar/VersionPreviewCard.js +4 -249
  235. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  236. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  237. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  238. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +338 -187
  239. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  240. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +3 -1
  241. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  242. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
  243. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +8 -0
  244. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +407 -0
  245. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -0
  246. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +5 -2
  247. package/dist/editor/page-editor-chrome/CommentHighlightings.js +340 -215
  248. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  249. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +5 -1
  250. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +11 -4
  251. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  252. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +21 -13
  253. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  254. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +23 -29
  255. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  256. package/dist/editor/page-editor-chrome/FrameMenu.js +110 -19
  257. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  258. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +3 -2
  259. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +148 -45
  260. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  261. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +2 -0
  262. package/dist/editor/page-editor-chrome/PageEditorChrome.js +25 -21
  263. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  264. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +163 -128
  265. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  266. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  267. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +6 -3
  268. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  269. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +1 -2
  270. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +83 -146
  271. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  272. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +5 -2
  273. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +144 -63
  274. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  275. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +1 -2
  276. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +101 -30
  277. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  278. package/dist/editor/page-editor-chrome/bridgeInlineFormatToolbarLayout.d.ts +24 -0
  279. package/dist/editor/page-editor-chrome/bridgeInlineFormatToolbarLayout.js +89 -0
  280. package/dist/editor/page-editor-chrome/bridgeInlineFormatToolbarLayout.js.map +1 -0
  281. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +10 -1
  282. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +105 -122
  283. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  284. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +11 -4
  285. package/dist/editor/page-editor-chrome/overlay/geometry.js +139 -36
  286. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  287. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +26 -0
  288. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +228 -0
  289. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -0
  290. package/dist/editor/page-viewer/EditorForm.js +17 -1
  291. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  292. package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
  293. package/dist/editor/page-viewer/MiniMap.js +176 -364
  294. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  295. package/dist/editor/page-viewer/PageViewer.js +63 -17
  296. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  297. package/dist/editor/page-viewer/PageViewerFrame.d.ts +0 -5
  298. package/dist/editor/page-viewer/PageViewerFrame.js +1685 -1512
  299. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  300. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +20 -0
  301. package/dist/editor/page-viewer/bridgeFieldPatch.js +33 -0
  302. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -0
  303. package/dist/editor/page-viewer/pageViewContext.d.ts +32 -0
  304. package/dist/editor/page-viewer/pageViewContext.js +37 -6
  305. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  306. package/dist/editor/reviews/Comment.d.ts +2 -1
  307. package/dist/editor/reviews/Comment.js +10 -5
  308. package/dist/editor/reviews/Comment.js.map +1 -1
  309. package/dist/editor/reviews/CommentDisplayPopover.js +2 -1
  310. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  311. package/dist/editor/reviews/CommentEditor.d.ts +1 -0
  312. package/dist/editor/reviews/CommentEditor.js +3 -2
  313. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  314. package/dist/editor/reviews/CommentPopover.js +69 -10
  315. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  316. package/dist/editor/reviews/CommentView.js +24 -4
  317. package/dist/editor/reviews/CommentView.js.map +1 -1
  318. package/dist/editor/reviews/Comments.d.ts +0 -2
  319. package/dist/editor/reviews/Comments.js +31 -31
  320. package/dist/editor/reviews/Comments.js.map +1 -1
  321. package/dist/editor/reviews/FeedbackCard.d.ts +4 -2
  322. package/dist/editor/reviews/FeedbackCard.js +8 -10
  323. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  324. package/dist/editor/reviews/SuggestedEdit.js +4 -6
  325. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  326. package/dist/editor/reviews/SuggestionCommentThread.js +3 -3
  327. package/dist/editor/reviews/SuggestionCommentThread.js.map +1 -1
  328. package/dist/editor/reviews/SuggestionDisplayPopover.js +3 -2
  329. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  330. package/dist/editor/reviews/commentAi.js +96 -27
  331. package/dist/editor/reviews/commentAi.js.map +1 -1
  332. package/dist/editor/reviews/commentTransientSelection.d.ts +23 -0
  333. package/dist/editor/reviews/commentTransientSelection.js +7 -0
  334. package/dist/editor/reviews/commentTransientSelection.js.map +1 -0
  335. package/dist/editor/reviews/feedbackOrdering.d.ts +5 -0
  336. package/dist/editor/reviews/feedbackOrdering.js +27 -0
  337. package/dist/editor/reviews/feedbackOrdering.js.map +1 -0
  338. package/dist/editor/reviews/feedbackSelection.js +32 -4
  339. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  340. package/dist/editor/reviews/suggestedEditState.d.ts +12 -0
  341. package/dist/editor/reviews/suggestedEditState.js +90 -0
  342. package/dist/editor/reviews/suggestedEditState.js.map +1 -0
  343. package/dist/editor/reviews/suggestionDisplayValue.d.ts +43 -0
  344. package/dist/editor/reviews/suggestionDisplayValue.js +93 -0
  345. package/dist/editor/reviews/suggestionDisplayValue.js.map +1 -0
  346. package/dist/editor/services/agentService.d.ts +15 -0
  347. package/dist/editor/services/agentService.js +11 -1
  348. package/dist/editor/services/agentService.js.map +1 -1
  349. package/dist/editor/services/reviewsService.d.ts +2 -2
  350. package/dist/editor/services/reviewsService.js.map +1 -1
  351. package/dist/editor/settings/SettingsView.js +2 -2
  352. package/dist/editor/settings/SettingsView.js.map +1 -1
  353. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  354. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  355. package/dist/editor/settings/panels/ProvidersPanel.js +2 -3
  356. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  357. package/dist/editor/sidebar/MorePanelsButton.js +1 -1
  358. package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
  359. package/dist/editor/sidebar/Validation.js +4 -1
  360. package/dist/editor/sidebar/Validation.js.map +1 -1
  361. package/dist/editor/sidebar/Workbox.js +1 -1
  362. package/dist/editor/sidebar/Workbox.js.map +1 -1
  363. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +1 -1
  364. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js.map +1 -1
  365. package/dist/editor/ui/IconSelectorDialog.js +1 -1
  366. package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
  367. package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
  368. package/dist/editor/ui/SimpleIconButton.js +7 -1
  369. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  370. package/dist/editor/ui/Splitter.d.ts +1 -0
  371. package/dist/editor/ui/Splitter.js +12 -2
  372. package/dist/editor/ui/Splitter.js.map +1 -1
  373. package/dist/editor/ui/animationSettle.d.ts +32 -0
  374. package/dist/editor/ui/animationSettle.js +85 -0
  375. package/dist/editor/ui/animationSettle.js.map +1 -0
  376. package/dist/editor/utils/expandSelectionAtCaret.d.ts +15 -0
  377. package/dist/editor/utils/expandSelectionAtCaret.js +183 -0
  378. package/dist/editor/utils/expandSelectionAtCaret.js.map +1 -0
  379. package/dist/editor/utils.d.ts +1 -17
  380. package/dist/editor/utils.js +0 -143
  381. package/dist/editor/utils.js.map +1 -1
  382. package/dist/editor/version-diff/versionDiffTargets.d.ts +3 -8
  383. package/dist/editor/version-diff/versionDiffTargets.js +37 -94
  384. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  385. package/dist/revision.d.ts +2 -2
  386. package/dist/revision.js +2 -2
  387. package/dist/splash-screen/ModernSplashScreen.js +11 -3
  388. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  389. package/dist/splash-screen/NewPage.js +7 -5
  390. package/dist/splash-screen/NewPage.js.map +1 -1
  391. package/dist/splash-screen/OpenPage.js +5 -3
  392. package/dist/splash-screen/OpenPage.js.map +1 -1
  393. package/dist/splash-screen/RecentPages.js +3 -3
  394. package/dist/splash-screen/RecentPages.js.map +1 -1
  395. package/dist/task-board/components/TaskDetailPanel.js +2 -1
  396. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  397. package/dist/task-board/views/DependencyGraphView.d.ts +42 -1
  398. package/dist/task-board/views/DependencyGraphView.js +94 -0
  399. package/dist/task-board/views/DependencyGraphView.js.map +1 -1
  400. package/dist/types.d.ts +1 -0
  401. package/package.json +2 -1
  402. package/styles.css +96 -0
  403. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +0 -7
  404. package/dist/editor/page-editor-chrome/InlineEditor.js +0 -1719
  405. package/dist/editor/page-editor-chrome/InlineEditor.js.map +0 -1
  406. package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +0 -2
  407. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +0 -21
  408. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +0 -1
  409. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +0 -7
  410. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +0 -758
  411. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +0 -1
  412. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +0 -3
  413. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +0 -796
  414. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +0 -1
@@ -34,6 +34,7 @@ import { post } from "../services/serviceHelper";
34
34
  import { PageViewerFrame } from "../page-viewer/PageViewerFrame";
35
35
  import { useItemsRepository } from "./itemsRepository";
36
36
  import { Spinner } from "../ui/Spinner";
37
+ import { createSettleRegistry } from "../ui/animationSettle";
37
38
  import { cleanId } from "../utils/id-helper";
38
39
  import { useDebouncedCallback } from "use-debounce";
39
40
  import { useKeyboardNavigation } from "../utils/keyboardNavigation";
@@ -46,6 +47,7 @@ import { QuickItemSwitcher } from "../QuickItemSwitcher";
46
47
  import { useEditorSlotContext, } from "../views/editorSlotContext";
47
48
  import { getComments, getAvailableCommentTags, } from "../services/reviewsService";
48
49
  import { useReviews } from "../reviews/useReviews";
50
+ import { COMMENT_TRANSIENT_ELEMENT_KEY, COMMENT_TRANSIENT_SELECTION_RECT, } from "../reviews/commentTransientSelection";
49
51
  import uuid from "react-uuid";
50
52
  import { flushSync } from "react-dom";
51
53
  import { getSuggestedEdits } from "../services/suggestedEditsService";
@@ -67,6 +69,24 @@ import { FeatureGate, LicenseFeatures, LicenseProvider, LicenseOverlay, } from "
67
69
  // nothing open" (param present with this value) so reload can honor the user's intent.
68
70
  const SIDEBAR_NONE_SENTINEL = "none";
69
71
  const sidebarUrlValue = (ids) => ids.length ? ids.join(",") : SIDEBAR_NONE_SENTINEL;
72
+ // moved to hooks/useQuota
73
+ function isUsableTextSelectionRange(range) {
74
+ return !!(range &&
75
+ range.text?.trim() &&
76
+ typeof range.startOffset === "number" &&
77
+ typeof range.endOffset === "number" &&
78
+ range.startOffset !== range.endOffset &&
79
+ range.fieldId &&
80
+ range.itemId);
81
+ }
82
+ function selectionRangeMatchesField(range, field) {
83
+ if (!range || !field)
84
+ return false;
85
+ return (cleanId(range.fieldId) === cleanId(field.fieldId) &&
86
+ cleanId(range.itemId) === cleanId(field.item.id) &&
87
+ (!range.language || range.language === field.item.language) &&
88
+ (typeof range.version !== "number" || range.version === field.item.version));
89
+ }
70
90
  function reconcileSlotSettingsState(previous, slots, defaults) {
71
91
  const next = {};
72
92
  let changed = false;
@@ -134,8 +154,10 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
134
154
  const [focusedField, setFocusedField] = useState();
135
155
  const focusedFieldRef = useRef(undefined);
136
156
  const [selectedRange, setSelectedRange] = useState();
157
+ const lastTextSelectionRangeRef = useRef(undefined);
137
158
  const [validating, setValidating] = useState(false);
138
159
  const [inserting, setInserting] = useState();
160
+ const insertingSequenceRef = useRef(0);
139
161
  const [showFullscreenHint, setShowFullscreenHint] = useState(false);
140
162
  // Fullscreen is a shell-level UI mode. Keep it in EditorShell state so the shell can rerender
141
163
  // immediately when toggled, while still syncing the active slot's PageViewContext.fullscreen.
@@ -465,7 +487,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
465
487
  // The very first URL sync after initial load should replaceState (not pushState)
466
488
  // so the initial bare URL isn't left as a dead-end history entry.
467
489
  const isFirstUrlSyncRef = useRef(true);
468
- const [inlineEditingFieldElement, setInlineEditingFieldElement] = useState();
469
490
  const [lockedField, setLockedField] = useState();
470
491
  const [itemLanguages, setItemLanguages] = useState([]);
471
492
  const [itemVersions, setItemVersions] = useState([]);
@@ -556,9 +577,67 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
556
577
  const [isTourActive, setIsTourActive] = useState(tourRestoredFromUrl);
557
578
  // Track if tour was restored from URL to skip prepareAction on initial render
558
579
  const tourRestoredRef = useRef(tourRestoredFromUrl);
559
- const [mode, setMode] = useState("edit");
580
+ const [mode, setModeState] = useState("edit");
581
+ const modeRef = useRef("edit");
582
+ modeRef.current = mode;
583
+ const modeChangeParticipantsRef = useRef(new Set());
584
+ const loadSuggestedEditsRef = useRef(async () => { });
585
+ const [modeTransitionRevision, setModeTransitionRevision] = useState(0);
560
586
  const [previewDate, setPreviewDate] = useState();
561
587
  const [layoutMode, setLayoutMode] = useState("final");
588
+ const registerModeChangeParticipant = useCallback((participant) => {
589
+ modeChangeParticipantsRef.current.add(participant);
590
+ return () => {
591
+ modeChangeParticipantsRef.current.delete(participant);
592
+ };
593
+ }, []);
594
+ const changeMode = useCallback(async (nextMode, options) => {
595
+ const previousMode = modeRef.current;
596
+ if (nextMode === previousMode)
597
+ return;
598
+ const participants = Array.from(modeChangeParticipantsRef.current);
599
+ for (const participant of participants) {
600
+ await participant.beforeModeChange?.(nextMode, previousMode, options);
601
+ }
602
+ for (const participant of participants) {
603
+ participant.clearInlineDedupe?.(nextMode, previousMode, options);
604
+ }
605
+ flushSync(() => {
606
+ modeRef.current = nextMode;
607
+ setModeState(nextMode);
608
+ setModeTransitionRevision((revision) => revision + 1);
609
+ if (nextMode !== "preview") {
610
+ setPreviewDate(undefined);
611
+ }
612
+ if (nextMode === "suggestions") {
613
+ setShowSuggestedEdits(true);
614
+ setWorkspaceId("editor");
615
+ setOpenSidebars((prev) => {
616
+ if (prev.includes("feedback"))
617
+ return prev;
618
+ const next = [...prev, "feedback"];
619
+ openSidebarsRef.current = next;
620
+ return next;
621
+ });
622
+ }
623
+ else {
624
+ setShowSuggestedEdits(false);
625
+ }
626
+ });
627
+ if (nextMode === "suggestions") {
628
+ void loadSuggestedEditsRef.current();
629
+ }
630
+ }, []);
631
+ const setMode = useCallback((nextMode) => {
632
+ const resolvedMode = typeof nextMode === "function" ? nextMode(modeRef.current) : nextMode;
633
+ void changeMode(resolvedMode);
634
+ }, [changeMode]);
635
+ const workspaceShowsModeControls = !!configuration.editor.workspaces?.find((workspace) => workspace.id === workspaceId)?.toolbarFactory;
636
+ useEffect(() => {
637
+ if (workspaceShowsModeControls || mode !== "suggestions")
638
+ return;
639
+ void changeMode("edit", { reason: "mode-controls-hidden" });
640
+ }, [changeMode, mode, workspaceId, workspaceShowsModeControls]);
562
641
  useEffect(() => {
563
642
  if (mode !== "preview") {
564
643
  setPreviewDate(undefined);
@@ -577,6 +656,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
577
656
  return userPreferences.showAgentsPanel ?? false;
578
657
  });
579
658
  const [editorFormHiddenDefault, setEditorFormHiddenDefault] = useState(userPreferences.editorFormHidden ?? false);
659
+ // Stable registry that lets layout owners (Splitter panels) report when a
660
+ // reveal surface finished animating, and lets callers await that signal.
661
+ const settleRegistry = useMemo(() => createSettleRegistry(), []);
580
662
  useEffect(() => {
581
663
  setSlotSettingsById((prev) => reconcileSlotSettingsState(prev, editorSlots, {
582
664
  showComponentNavigator: showComponentNavigatorDefault,
@@ -664,19 +746,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
664
746
  setSelectedHelpSectionId(helpParam === "contents" || helpParam === "true" ? null : helpParam);
665
747
  }
666
748
  }, [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]);
680
749
  useEffect(() => {
681
750
  if (focusedField &&
682
751
  selection.length > 0 &&
@@ -686,7 +755,19 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
686
755
  }, [selection]);
687
756
  useEffect(() => {
688
757
  focusedFieldRef.current = focusedField;
758
+ const lastTextSelection = lastTextSelectionRangeRef.current;
759
+ if (focusedField &&
760
+ lastTextSelection &&
761
+ (focusedField.fieldId !== lastTextSelection.fieldId ||
762
+ focusedField.item.id !== lastTextSelection.itemId)) {
763
+ lastTextSelectionRangeRef.current = undefined;
764
+ }
689
765
  }, [focusedField]);
766
+ useEffect(() => {
767
+ if (isUsableTextSelectionRange(selectedRange)) {
768
+ lastTextSelectionRangeRef.current = selectedRange;
769
+ }
770
+ }, [selectedRange]);
690
771
  // Track the current page item descriptor for itemsRepository
691
772
  const [currentPageItem, setCurrentPageItem] = useState();
692
773
  // Create itemsRepository with current page item (will be updated when page loads)
@@ -1220,7 +1301,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1220
1301
  const toggleHelpTerminal = useCallback((options) => {
1221
1302
  const isCurrentlyOpen = showHelpTerminal;
1222
1303
  const requestedTab = options?.activeTab;
1223
- if (isCurrentlyOpen && (!requestedTab || requestedTab === helpTerminalActiveTab)) {
1304
+ if (isCurrentlyOpen &&
1305
+ (!requestedTab || requestedTab === helpTerminalActiveTab)) {
1224
1306
  // Close when toggling the currently active help view.
1225
1307
  handleSetShowHelpTerminal(false);
1226
1308
  }
@@ -1423,9 +1505,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1423
1505
  }
1424
1506
  // Handle mode changes — always set to avoid stale-closure mismatch
1425
1507
  const urlMode = urlParams.get("mode");
1426
- if (urlMode) {
1427
- setMode(urlMode);
1428
- }
1508
+ setMode(urlMode ?? "edit");
1429
1509
  // Handle fullscreen changes (shell-level state)
1430
1510
  const isFullscreen = urlParams.get("fullscreen") === "true";
1431
1511
  if (configuration.forceFullscreen) {
@@ -1705,6 +1785,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1705
1785
  const edits = result.data || [];
1706
1786
  setSuggestedEdits(edits);
1707
1787
  }, [item, searchParams]);
1788
+ useEffect(() => {
1789
+ loadSuggestedEditsRef.current = loadSuggestedEdits;
1790
+ }, [loadSuggestedEdits]);
1708
1791
  const loadFavorites = useCallback(async () => {
1709
1792
  try {
1710
1793
  const result = await getAllFavorites();
@@ -1717,6 +1800,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
1717
1800
  setFavorites([]);
1718
1801
  }
1719
1802
  }, []);
1803
+ const refreshFavorites = useCallback(async (opts) => {
1804
+ await loadFavorites();
1805
+ }, [loadFavorites]);
1720
1806
  const page = activePageViewContext.page;
1721
1807
  const currentHistoryScope = useMemo(() => {
1722
1808
  const currentItem = item?.descriptor;
@@ -2113,6 +2199,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
2113
2199
  globalThis.editorRefreshTimer = undefined;
2114
2200
  };
2115
2201
  if (mode === "immediate") {
2202
+ if (refreshTimer) {
2203
+ clearTimeout(refreshTimer);
2204
+ }
2116
2205
  doRefresh();
2117
2206
  return;
2118
2207
  }
@@ -2306,7 +2395,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
2306
2395
  else {
2307
2396
  current.set("compare", "true");
2308
2397
  }
2309
- current.set("mode", mode);
2398
+ current.set("mode", workspaceShowsModeControls ? mode : "edit");
2310
2399
  // Handle fullscreen parameter
2311
2400
  if (fullscreen) {
2312
2401
  current.set("fullscreen", "true");
@@ -2762,6 +2851,11 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
2762
2851
  if (currentOverlay !== "context-menu")
2763
2852
  contextMenuRef.current?.close({});
2764
2853
  }, [currentOverlay]);
2854
+ const handleContextMenuOpenChange = useCallback((open) => {
2855
+ if (open)
2856
+ return;
2857
+ setCurrentOverlay((overlay) => overlay === "context-menu" ? undefined : overlay);
2858
+ }, []);
2765
2859
  useEffect(() => {
2766
2860
  loadItemVersions();
2767
2861
  }, [currentItemDescriptor]);
@@ -3011,9 +3105,35 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3011
3105
  };
3012
3106
  }, [promptSessionReconnect]);
3013
3107
  const sendSocketMessage = useCallback((message) => {
3108
+ if (message.type === "caret-position" &&
3109
+ message.payload?.source === "form-field") {
3110
+ const payload = message.payload;
3111
+ setRemoteCarets((current) => {
3112
+ if (payload.offset == null) {
3113
+ if (!current[sessionId])
3114
+ return current;
3115
+ const next = { ...current };
3116
+ delete next[sessionId];
3117
+ return next;
3118
+ }
3119
+ if (!payload.fieldId || !payload.item) {
3120
+ return current;
3121
+ }
3122
+ return {
3123
+ ...current,
3124
+ [sessionId]: {
3125
+ sessionId,
3126
+ fieldId: payload.fieldId,
3127
+ item: payload.item,
3128
+ offset: payload.offset,
3129
+ value: payload.value,
3130
+ },
3131
+ };
3132
+ });
3133
+ }
3014
3134
  // Routes over whichever transport is active (WebSocket preferred, SSE fallback).
3015
3135
  getEditorRealtime().send(message);
3016
- }, []);
3136
+ }, [sessionId]);
3017
3137
  // URL update helper - defined early so it can be used by workspace/sidebar functions
3018
3138
  const updateUrl = useCallback((params) => {
3019
3139
  // Use the actual browser pathname (including any basePath like /parhelia)
@@ -3491,34 +3611,51 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3491
3611
  operationsContext.context.markOperationComplete;
3492
3612
  }, [operationsContext.context.markOperationComplete]);
3493
3613
  // Replace selected text with new content (for inline AI editing)
3494
- const replaceSelectedText = useCallback(async (newText) => {
3495
- if (!focusedField)
3496
- return;
3614
+ const replaceSelectedText = useCallback(async (newText, selectionOverride) => {
3615
+ const rangeToReplace = selectionOverride ?? selectedRange ?? lastTextSelectionRangeRef.current;
3497
3616
  try {
3498
3617
  // If we have selected text and a replaceText callback, use it
3499
- if (selectedRange?.text && selectedRange.replaceText) {
3500
- selectedRange.replaceText(newText);
3618
+ if (rangeToReplace?.text && rangeToReplace.replaceText) {
3619
+ rangeToReplace.replaceText(newText);
3501
3620
  setSelectedRange(undefined);
3621
+ lastTextSelectionRangeRef.current = undefined;
3502
3622
  return;
3503
3623
  }
3504
3624
  // If no selection but we have a replaceText callback, try to use it for insertion
3505
3625
  // (some editors might support insertion via the same callback)
3506
- if (!selectedRange?.text && selectedRange?.replaceText) {
3507
- selectedRange.replaceText(newText);
3626
+ if (!rangeToReplace?.text && rangeToReplace?.replaceText) {
3627
+ rangeToReplace.replaceText(newText);
3508
3628
  setSelectedRange(undefined);
3629
+ lastTextSelectionRangeRef.current = undefined;
3509
3630
  return;
3510
3631
  }
3632
+ const fieldToReplace = focusedField ??
3633
+ (rangeToReplace?.fieldId &&
3634
+ rangeToReplace.itemId &&
3635
+ rangeToReplace.language &&
3636
+ typeof rangeToReplace.version === "number"
3637
+ ? {
3638
+ fieldId: rangeToReplace.fieldId,
3639
+ item: {
3640
+ id: rangeToReplace.itemId,
3641
+ language: rangeToReplace.language,
3642
+ version: rangeToReplace.version,
3643
+ },
3644
+ }
3645
+ : undefined);
3646
+ if (!fieldToReplace)
3647
+ return;
3511
3648
  // Fallback: indexOf-based replacement/insertion for plain text fields
3512
- const { fieldId, item } = focusedField;
3649
+ const { fieldId, item } = fieldToReplace;
3513
3650
  const modifiedField = getActiveSlotContext()?.fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
3514
3651
  const currentValue = modifiedField
3515
3652
  ? modifiedField.value || ""
3516
- : (await itemsRepository.getField(focusedField))?.value ||
3517
- "";
3653
+ : (await itemsRepository.getField(fieldToReplace))
3654
+ ?.value || "";
3518
3655
  let newValue;
3519
- if (selectedRange?.text) {
3656
+ if (rangeToReplace?.text) {
3520
3657
  // Replace selected text
3521
- const { text: originalSelectedText } = selectedRange;
3658
+ const { text: originalSelectedText } = rangeToReplace;
3522
3659
  const actualPosition = currentValue.indexOf(originalSelectedText);
3523
3660
  if (actualPosition === -1) {
3524
3661
  console.error("Failed to find selected text in field value");
@@ -3531,7 +3668,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3531
3668
  }
3532
3669
  else {
3533
3670
  // Insert at cursor position (use startOffset if available, otherwise append)
3534
- const insertPosition = selectedRange?.startOffset ?? currentValue.length;
3671
+ const insertPosition = rangeToReplace?.startOffset ?? currentValue.length;
3535
3672
  newValue =
3536
3673
  currentValue.slice(0, insertPosition) +
3537
3674
  newText +
@@ -3539,12 +3676,13 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
3539
3676
  }
3540
3677
  // Update the field
3541
3678
  await operations.editField({
3542
- field: focusedField,
3679
+ field: fieldToReplace,
3543
3680
  value: newValue,
3544
3681
  refresh: "immediate",
3545
3682
  });
3546
3683
  // Clear the selection after replacement/insertion
3547
3684
  setSelectedRange(undefined);
3685
+ lastTextSelectionRangeRef.current = undefined;
3548
3686
  }
3549
3687
  catch (error) {
3550
3688
  console.error("Failed to replace/insert text:", error);
@@ -4021,18 +4159,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4021
4159
  };
4022
4160
  }
4023
4161
  }, [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]);
4036
4162
  const isReadOnly = !item ||
4037
4163
  !item.canWriteItem ||
4038
4164
  !item.canWriteLanguage ||
@@ -4051,15 +4177,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4051
4177
  // Otherwise, only show workspaces that are in the settings
4052
4178
  return workspaceIdsFromSettings.includes(w.id) && !w.visible;
4053
4179
  });
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]);
4063
4180
  // Add this new effect for initial fullscreen setup
4064
4181
  useEffect(() => {
4065
4182
  if (!isInitialLoad)
@@ -4187,16 +4304,11 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4187
4304
  dragEnd: () => {
4188
4305
  setDragObject(undefined);
4189
4306
  },
4190
- droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption) => {
4191
- if ((!dragObject && !insertOption) || !page)
4307
+ droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption, spotPosition) => {
4308
+ const droppedDragObject = dragObject;
4309
+ if ((!droppedDragObject && !insertOption) || !page)
4192
4310
  return;
4193
4311
  setDragObject(undefined);
4194
- if (spotPositionElement && spotPositionAnchor) {
4195
- setInserting({
4196
- positionElement: spotPositionElement,
4197
- positionAnchor: spotPositionAnchor,
4198
- });
4199
- }
4200
4312
  const placeholderKeyComponents = placeholderKey.split("_");
4201
4313
  const parentId = placeholderKeyComponents.length === 1
4202
4314
  ? undefined
@@ -4206,39 +4318,31 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4206
4318
  let op;
4207
4319
  if (!currentItemDescriptorRef.current)
4208
4320
  return;
4321
+ let insertionSequence;
4322
+ if ((spotPosition || spotPositionElement) && spotPositionAnchor) {
4323
+ insertionSequence = ++insertingSequenceRef.current;
4324
+ setInserting({
4325
+ position: spotPosition,
4326
+ positionElement: spotPositionElement,
4327
+ positionAnchor: spotPositionAnchor,
4328
+ });
4329
+ }
4330
+ let operationPromise;
4209
4331
  if (insertOption) {
4210
4332
  // Clear any selected component type for insertion once the component
4211
4333
  // has been dropped into a placeholder. This ensures that insert mode
4212
4334
  // can exit cleanly and the editor header updates from "Add Component"
4213
4335
  // to the actual component name after the operation completes.
4214
4336
  setSelectedForInsertion("");
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;
4337
+ operationPromise = operations.addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current);
4224
4338
  }
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;
4339
+ else if (droppedDragObject?.type == "template") {
4340
+ operationPromise = operations.addComponent(droppedDragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current);
4237
4341
  }
4238
- if (dragObject.type == "component" ||
4239
- (dragObject.type == "items" && dragObject.items)) {
4342
+ else if (droppedDragObject?.type == "component" ||
4343
+ (droppedDragObject?.type == "items" && droppedDragObject.items)) {
4240
4344
  const parentComponent = parentId && page ? getComponentById(parentId, page) : null;
4241
- if (dragObject.type == "items" && dragObject.items) {
4345
+ if (droppedDragObject.type == "items" && droppedDragObject.items) {
4242
4346
  op = {
4243
4347
  type: "link-component",
4244
4348
  mainItem: page.item.descriptor,
@@ -4252,33 +4356,52 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4252
4356
  placeholderIndex: index,
4253
4357
  date: new Date().toISOString(),
4254
4358
  id: uuid(),
4255
- linkedComponentItem: dragObject.items[0],
4359
+ linkedComponentItem: droppedDragObject.items[0],
4256
4360
  title: "Link component",
4257
4361
  };
4258
4362
  }
4259
4363
  else {
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
- };
4364
+ const componentIds = droppedDragObject.components?.map((c) => c.id) ?? [];
4365
+ if (componentIds.length > 0) {
4366
+ op = {
4367
+ type: "move-component",
4368
+ mainItem: page.item.descriptor,
4369
+ parent: parentId && {
4370
+ id: parentId,
4371
+ language: page.item.descriptor.language,
4372
+ version: page.item.descriptor.version,
4373
+ },
4374
+ placeholderKey,
4375
+ placeholderIndex: index,
4376
+ componentIds,
4377
+ date: new Date().toISOString(),
4378
+ id: uuid(),
4379
+ title: "Move component",
4380
+ };
4381
+ }
4278
4382
  }
4279
4383
  }
4280
4384
  if (op)
4281
- operations.executeEditOperation(op);
4385
+ operationPromise = operations.executeEditOperation(op);
4386
+ if (!operationPromise) {
4387
+ if (insertionSequence !== undefined &&
4388
+ insertingSequenceRef.current === insertionSequence) {
4389
+ setInserting(undefined);
4390
+ }
4391
+ return;
4392
+ }
4393
+ try {
4394
+ await operationPromise;
4395
+ }
4396
+ catch (err) {
4397
+ console.error("Failed to drop component in placeholder", err);
4398
+ }
4399
+ finally {
4400
+ if (insertionSequence !== undefined &&
4401
+ insertingSequenceRef.current === insertionSequence) {
4402
+ setInserting(undefined);
4403
+ }
4404
+ }
4282
4405
  },
4283
4406
  page,
4284
4407
  triggerFieldAction: async (fieldDescriptor, actionButton, parameters, event) => {
@@ -4557,27 +4680,50 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4557
4680
  setShowComments,
4558
4681
  showResolvedComments,
4559
4682
  setShowResolvedComments,
4560
- addComment: async () => {
4683
+ addComment: async (options) => {
4561
4684
  const descriptor = item?.descriptor;
4562
4685
  if (!descriptor)
4563
4686
  return;
4564
4687
  // Snapshot selection context up-front so switching views doesn't change what we comment on.
4688
+ const hintedFieldSnapshot = options?.field;
4565
4689
  const focusedFieldSnapshot = focusedFieldRef.current;
4566
- const selectionSnapshot = [...selection];
4567
- const selectedRangeSnapshot = selectedRange;
4568
- const itemId = focusedFieldSnapshot?.item.id ||
4569
- (selectionSnapshot.length > 0 ? selectionSnapshot[0] : undefined) ||
4690
+ const selectedRangeCandidate = isUsableTextSelectionRange(selectedRange)
4691
+ ? selectedRange
4692
+ : lastTextSelectionRangeRef.current;
4693
+ const selectedRangeSnapshot = !hintedFieldSnapshot ||
4694
+ selectionRangeMatchesField(selectedRangeCandidate, hintedFieldSnapshot)
4695
+ ? selectedRangeCandidate
4696
+ : undefined;
4697
+ const selectedRangeFieldSnapshot = isUsableTextSelectionRange(selectedRangeSnapshot)
4698
+ ? {
4699
+ fieldId: selectedRangeSnapshot.fieldId,
4700
+ item: {
4701
+ id: selectedRangeSnapshot.itemId,
4702
+ language: selectedRangeSnapshot.language || descriptor.language,
4703
+ version: typeof selectedRangeSnapshot.version === "number"
4704
+ ? selectedRangeSnapshot.version
4705
+ : descriptor.version,
4706
+ },
4707
+ }
4708
+ : undefined;
4709
+ const commentFieldSnapshot = selectedRangeFieldSnapshot ??
4710
+ hintedFieldSnapshot ??
4711
+ focusedFieldSnapshot;
4712
+ const itemId = commentFieldSnapshot?.item.id ||
4713
+ (selection.length > 0 ? selection[0] : undefined) ||
4570
4714
  descriptor.id;
4571
4715
  if (!itemId)
4572
4716
  return;
4573
4717
  // Ensure the feedback sidebar is open when adding a comment (e.g. command palette / toolbar button).
4574
4718
  openSidebar("feedback");
4575
- const language = descriptor.language;
4576
- const version = descriptor.version;
4719
+ const language = commentFieldSnapshot?.item.language || descriptor.language;
4720
+ const version = typeof commentFieldSnapshot?.item.version === "number"
4721
+ ? commentFieldSnapshot.item.version
4722
+ : descriptor.version;
4577
4723
  const getFieldName = async () => {
4578
- if (!focusedFieldSnapshot)
4724
+ if (!commentFieldSnapshot)
4579
4725
  return "";
4580
- const field = await itemsRepository.getField(focusedFieldSnapshot);
4726
+ const field = await itemsRepository.getField(commentFieldSnapshot);
4581
4727
  return field?.name;
4582
4728
  };
4583
4729
  const getItemName = async () => {
@@ -4593,24 +4739,40 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4593
4739
  isNew: true,
4594
4740
  itemId,
4595
4741
  itemName: await getItemName(),
4596
- fieldId: focusedFieldSnapshot?.fieldId,
4742
+ fieldId: commentFieldSnapshot?.fieldId,
4597
4743
  fieldName: await getFieldName(),
4598
4744
  mainItemId: descriptor.id,
4599
4745
  language,
4600
4746
  version,
4601
4747
  position: 0,
4602
- rangeStart: selectedRangeSnapshot?.startOffset || 0,
4603
- rangeEnd: selectedRangeSnapshot?.endOffset || 0,
4748
+ rangeStart: isUsableTextSelectionRange(selectedRangeSnapshot)
4749
+ ? selectedRangeSnapshot.startOffset
4750
+ : 0,
4751
+ rangeEnd: isUsableTextSelectionRange(selectedRangeSnapshot)
4752
+ ? selectedRangeSnapshot.endOffset
4753
+ : 0,
4604
4754
  author: user?.name,
4605
4755
  authorDisplayName: user?.fullName,
4606
- date: new Date().toISOString(),
4756
+ created: new Date().toISOString(),
4607
4757
  };
4758
+ if (selectedRangeSnapshot?.clientRect) {
4759
+ newComment[COMMENT_TRANSIENT_SELECTION_RECT] =
4760
+ selectedRangeSnapshot.clientRect;
4761
+ }
4762
+ if (selectedRangeSnapshot?.elementKey) {
4763
+ newComment[COMMENT_TRANSIENT_ELEMENT_KEY] =
4764
+ selectedRangeSnapshot.elementKey;
4765
+ }
4608
4766
  setComments([newComment, ...comments]);
4609
4767
  setSelectedComment(newComment);
4610
4768
  setShowComments(true);
4769
+ lastTextSelectionRangeRef.current = undefined;
4611
4770
  },
4612
4771
  mode,
4772
+ changeMode,
4613
4773
  setMode,
4774
+ registerModeChangeParticipant,
4775
+ modeTransitionRevision,
4614
4776
  previewDate,
4615
4777
  setPreviewDate,
4616
4778
  layoutMode,
@@ -4635,6 +4797,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4635
4797
  setComponentNavigatorOpenForSlot,
4636
4798
  showAgentsPanel,
4637
4799
  setShowAgentsPanel: handleSetShowAgentsPanel,
4800
+ waitForSurfaceSettled: settleRegistry.waitForSurfaceSettled,
4801
+ notifySurfaceSettled: settleRegistry.notifySettled,
4638
4802
  isEditorFormHiddenForSlot,
4639
4803
  setEditorFormHiddenForSlot,
4640
4804
  editorFormHintSeen,
@@ -4678,6 +4842,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4678
4842
  setCurrentWizardId,
4679
4843
  favorites,
4680
4844
  loadFavorites,
4845
+ refreshFavorites,
4681
4846
  isQuickSwitcherVisible: quickSwitcherVisible,
4682
4847
  // Context factory registry methods
4683
4848
  registerContextFactory: (name, factory) => {
@@ -4786,6 +4951,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4786
4951
  isRefreshing,
4787
4952
  favorites,
4788
4953
  loadFavorites,
4954
+ refreshFavorites,
4789
4955
  currentWizardId,
4790
4956
  quickSwitcherVisible,
4791
4957
  quickSwitcherSelectedIndex,
@@ -4796,6 +4962,10 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4796
4962
  factoriesRef,
4797
4963
  user,
4798
4964
  statusMessage,
4965
+ changeMode,
4966
+ setMode,
4967
+ registerModeChangeParticipant,
4968
+ modeTransitionRevision,
4799
4969
  previewDate,
4800
4970
  layoutMode,
4801
4971
  enableCompletions,
@@ -4811,6 +4981,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4811
4981
  handleSetShowComponentNavigator,
4812
4982
  showAgentsPanel,
4813
4983
  handleSetShowAgentsPanel,
4984
+ settleRegistry,
4814
4985
  activeSlotId,
4815
4986
  editorSlots,
4816
4987
  slotContexts,
@@ -4861,8 +5032,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4861
5032
  setLockedField(undefined); // Clear client-side lock state
4862
5033
  await releaseFieldLocks(sessionId);
4863
5034
  },
4864
- inlineEditingFieldElement,
4865
- setInlineEditingFieldElement,
4866
5035
  };
4867
5036
  // Debug: Track editContext changes
4868
5037
  // const prevDependencies = useRef<any[]>([]);
@@ -4901,7 +5070,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4901
5070
  // componentDesignerRendering,
4902
5071
  // insertMode,
4903
5072
  // currentOverlay,
4904
- // inlineEditingFieldElement,
4905
5073
  // lockedField,
4906
5074
  // selectedRange,
4907
5075
  // pageViewContext,
@@ -4989,7 +5157,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
4989
5157
  // 'componentDesignerRendering',
4990
5158
  // 'insertMode',
4991
5159
  // 'currentOverlay',
4992
- // 'inlineEditingFieldElement',
4993
5160
  // 'lockedField',
4994
5161
  // 'selectedRange',
4995
5162
  // 'pageViewContext',
@@ -5117,13 +5284,14 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
5117
5284
  : window.location.pathname;
5118
5285
  window.history.replaceState(getCurrentHistoryState(), "", newUrl);
5119
5286
  }, configuration: configuration, restoredFromUrl: tourRestoredRef.current })), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(GuidanceOverlay, {}) }), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(AgentDialogHandler, {}) })] }));
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" ||
5287
+ const showRefreshSpinner = editContext.isRefreshing && !activePageViewContext.iframeSupportsRefresh;
5288
+ 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" ||
5121
5289
  currentWorkspace.id === "taskboard" ||
5122
5290
  currentWorkspace.id === "translation-management") &&
5123
5291
  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) => {
5124
5292
  if (!open) {
5125
5293
  setConcurrentUserLimitError(null);
5126
5294
  }
5127
- }, sessionId: sessionId, currentUsers: concurrentUserLimitError?.currentUsers ?? 0, maxUsers: concurrentUserLimitError?.maxUsers ?? 0, message: concurrentUserLimitError?.message ?? "", onRetry: handleRetryConnection, isAdministrator: userInfo.user.isAdministrator === true }), _jsx(QuickItemSwitcher, { visible: quickSwitcherVisible, entries: quickSwitcherEntries.slice(0, 5), selectedIndex: quickSwitcherSelectedIndex, onSelect: handleQuickSwitcherSelect, onClose: () => setQuickSwitcherVisible(false) }), _jsx(EditContextMenu, { ref: contextMenuRef }), _jsx(EditorFormHintPopover, {}), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(InlineAiTrigger, {}) }), media.mediaSelectorVisible && (_jsx(MediaSelector, { language: editContext.currentItemDescriptor.language, visible: media.mediaSelectorVisible, onHide: media.handleHide, onMediaSelected: media.onMediaSelect, selectedIdPath: media.selectedMediaIdPath, mode: media.mediaSelectorMode, initialSearchTerm: media.initialSearchTerm })), _jsx(FieldEditorPopup, { ref: fieldEditorPopupRef }), _jsx(LicenseOverlay, {}), _jsx(SessionExpiredOverlay, {})] }) }) }) }) }) }));
5295
+ }, sessionId: sessionId, currentUsers: concurrentUserLimitError?.currentUsers ?? 0, maxUsers: concurrentUserLimitError?.maxUsers ?? 0, message: concurrentUserLimitError?.message ?? "", onRetry: handleRetryConnection, isAdministrator: userInfo.user.isAdministrator === true }), _jsx(QuickItemSwitcher, { visible: quickSwitcherVisible, entries: quickSwitcherEntries.slice(0, 5), selectedIndex: quickSwitcherSelectedIndex, onSelect: handleQuickSwitcherSelect, onClose: () => setQuickSwitcherVisible(false) }), _jsx(EditContextMenu, { ref: contextMenuRef, onOpenChange: handleContextMenuOpenChange }), _jsx(EditorFormHintPopover, {}), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(InlineAiTrigger, {}) }), media.mediaSelectorVisible && (_jsx(MediaSelector, { language: editContext.currentItemDescriptor.language, visible: media.mediaSelectorVisible, onHide: media.handleHide, onMediaSelected: media.onMediaSelect, selectedIdPath: media.selectedMediaIdPath, mode: media.mediaSelectorMode, initialSearchTerm: media.initialSearchTerm })), _jsx(FieldEditorPopup, { ref: fieldEditorPopupRef }), _jsx(LicenseOverlay, {}), _jsx(SessionExpiredOverlay, {})] }) }) }) }) }) }));
5128
5296
  }
5129
5297
  //# sourceMappingURL=EditorShell.js.map