@parhelia/core 0.1.10745

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 (1012) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +34 -0
  3. package/dev.css +3 -0
  4. package/dist/agents-view/AgentCard.d.ts +12 -0
  5. package/dist/agents-view/AgentCard.js +30 -0
  6. package/dist/agents-view/AgentCard.js.map +1 -0
  7. package/dist/agents-view/AgentsView.d.ts +5 -0
  8. package/dist/agents-view/AgentsView.js +255 -0
  9. package/dist/agents-view/AgentsView.js.map +1 -0
  10. package/dist/agents-view/ProfileAgentsGroup.d.ts +17 -0
  11. package/dist/agents-view/ProfileAgentsGroup.js +13 -0
  12. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -0
  13. package/dist/client-components/api.d.ts +1 -0
  14. package/dist/client-components/api.js +4 -0
  15. package/dist/client-components/api.js.map +1 -0
  16. package/dist/client-components/index.d.ts +17 -0
  17. package/dist/client-components/index.js +18 -0
  18. package/dist/client-components/index.js.map +1 -0
  19. package/dist/components/ActionButton.d.ts +14 -0
  20. package/dist/components/ActionButton.js +6 -0
  21. package/dist/components/ActionButton.js.map +1 -0
  22. package/dist/components/Error.d.ts +9 -0
  23. package/dist/components/Error.js +24 -0
  24. package/dist/components/Error.js.map +1 -0
  25. package/dist/components/FilterInput.d.ts +22 -0
  26. package/dist/components/FilterInput.js +29 -0
  27. package/dist/components/FilterInput.js.map +1 -0
  28. package/dist/components/index.d.ts +7 -0
  29. package/dist/components/index.js +5 -0
  30. package/dist/components/index.js.map +1 -0
  31. package/dist/components/ui/CardConnector.d.ts +4 -0
  32. package/dist/components/ui/CardConnector.js +6 -0
  33. package/dist/components/ui/CardConnector.js.map +1 -0
  34. package/dist/components/ui/LanguageSelector.d.ts +8 -0
  35. package/dist/components/ui/LanguageSelector.js +47 -0
  36. package/dist/components/ui/LanguageSelector.js.map +1 -0
  37. package/dist/components/ui/PlaceholderInput.d.ts +41 -0
  38. package/dist/components/ui/PlaceholderInput.js +160 -0
  39. package/dist/components/ui/PlaceholderInput.js.map +1 -0
  40. package/dist/components/ui/PlaceholderInputTypes.d.ts +41 -0
  41. package/dist/components/ui/PlaceholderInputTypes.js +48 -0
  42. package/dist/components/ui/PlaceholderInputTypes.js.map +1 -0
  43. package/dist/components/ui/PlaceholderItemSelector.d.ts +7 -0
  44. package/dist/components/ui/PlaceholderItemSelector.js +154 -0
  45. package/dist/components/ui/PlaceholderItemSelector.js.map +1 -0
  46. package/dist/components/ui/alert.d.ts +7 -0
  47. package/dist/components/ui/alert.js +21 -0
  48. package/dist/components/ui/alert.js.map +1 -0
  49. package/dist/components/ui/badge.d.ts +9 -0
  50. package/dist/components/ui/badge.js +23 -0
  51. package/dist/components/ui/badge.js.map +1 -0
  52. package/dist/components/ui/button.d.ts +10 -0
  53. package/dist/components/ui/button.js +33 -0
  54. package/dist/components/ui/button.js.map +1 -0
  55. package/dist/components/ui/calendar.d.ts +7 -0
  56. package/dist/components/ui/calendar.js +58 -0
  57. package/dist/components/ui/calendar.js.map +1 -0
  58. package/dist/components/ui/card.d.ts +19 -0
  59. package/dist/components/ui/card.js +78 -0
  60. package/dist/components/ui/card.js.map +1 -0
  61. package/dist/components/ui/checkbox.d.ts +4 -0
  62. package/dist/components/ui/checkbox.js +10 -0
  63. package/dist/components/ui/checkbox.js.map +1 -0
  64. package/dist/components/ui/command.d.ts +18 -0
  65. package/dist/components/ui/command.js +35 -0
  66. package/dist/components/ui/command.js.map +1 -0
  67. package/dist/components/ui/context-menu.d.ts +53 -0
  68. package/dist/components/ui/context-menu.js +290 -0
  69. package/dist/components/ui/context-menu.js.map +1 -0
  70. package/dist/components/ui/copy-button.d.ts +10 -0
  71. package/dist/components/ui/copy-button.js +61 -0
  72. package/dist/components/ui/copy-button.js.map +1 -0
  73. package/dist/components/ui/dialog.d.ts +16 -0
  74. package/dist/components/ui/dialog.js +37 -0
  75. package/dist/components/ui/dialog.js.map +1 -0
  76. package/dist/components/ui/dropdown-menu.d.ts +25 -0
  77. package/dist/components/ui/dropdown-menu.js +52 -0
  78. package/dist/components/ui/dropdown-menu.js.map +1 -0
  79. package/dist/components/ui/input.d.ts +3 -0
  80. package/dist/components/ui/input.js +9 -0
  81. package/dist/components/ui/input.js.map +1 -0
  82. package/dist/components/ui/menubar.d.ts +26 -0
  83. package/dist/components/ui/menubar.js +55 -0
  84. package/dist/components/ui/menubar.js.map +1 -0
  85. package/dist/components/ui/paste-button.d.ts +14 -0
  86. package/dist/components/ui/paste-button.js +114 -0
  87. package/dist/components/ui/paste-button.js.map +1 -0
  88. package/dist/components/ui/popover.d.ts +11 -0
  89. package/dist/components/ui/popover.js +66 -0
  90. package/dist/components/ui/popover.js.map +1 -0
  91. package/dist/components/ui/progress.d.ts +7 -0
  92. package/dist/components/ui/progress.js +9 -0
  93. package/dist/components/ui/progress.js.map +1 -0
  94. package/dist/components/ui/select.d.ts +18 -0
  95. package/dist/components/ui/select.js +34 -0
  96. package/dist/components/ui/select.js.map +1 -0
  97. package/dist/components/ui/sonner.d.ts +3 -0
  98. package/dist/components/ui/sonner.js +16 -0
  99. package/dist/components/ui/sonner.js.map +1 -0
  100. package/dist/components/ui/switch.d.ts +4 -0
  101. package/dist/components/ui/switch.js +9 -0
  102. package/dist/components/ui/switch.js.map +1 -0
  103. package/dist/components/ui/tabs.d.ts +17 -0
  104. package/dist/components/ui/tabs.js +27 -0
  105. package/dist/components/ui/tabs.js.map +1 -0
  106. package/dist/components/ui/textarea.d.ts +3 -0
  107. package/dist/components/ui/textarea.js +11 -0
  108. package/dist/components/ui/textarea.js.map +1 -0
  109. package/dist/components/ui/tooltip.d.ts +9 -0
  110. package/dist/components/ui/tooltip.js +18 -0
  111. package/dist/components/ui/tooltip.js.map +1 -0
  112. package/dist/components/ui/upload-button.d.ts +15 -0
  113. package/dist/components/ui/upload-button.js +56 -0
  114. package/dist/components/ui/upload-button.js.map +1 -0
  115. package/dist/config/config.d.ts +24 -0
  116. package/dist/config/config.js +1087 -0
  117. package/dist/config/config.js.map +1 -0
  118. package/dist/config/types.d.ts +249 -0
  119. package/dist/config/types.js +2 -0
  120. package/dist/config/types.js.map +1 -0
  121. package/dist/editor/AspectRatioSelector.d.ts +13 -0
  122. package/dist/editor/AspectRatioSelector.js +71 -0
  123. package/dist/editor/AspectRatioSelector.js.map +1 -0
  124. package/dist/editor/ComponentInfo.d.ts +4 -0
  125. package/dist/editor/ComponentInfo.js +41 -0
  126. package/dist/editor/ComponentInfo.js.map +1 -0
  127. package/dist/editor/ConfirmationDialog.d.ts +19 -0
  128. package/dist/editor/ConfirmationDialog.js +31 -0
  129. package/dist/editor/ConfirmationDialog.js.map +1 -0
  130. package/dist/editor/ContentTree.d.ts +39 -0
  131. package/dist/editor/ContentTree.js +586 -0
  132. package/dist/editor/ContentTree.js.map +1 -0
  133. package/dist/editor/ContextMenu.d.ts +15 -0
  134. package/dist/editor/ContextMenu.js +239 -0
  135. package/dist/editor/ContextMenu.js.map +1 -0
  136. package/dist/editor/Editor.d.ts +12 -0
  137. package/dist/editor/Editor.js +59 -0
  138. package/dist/editor/Editor.js.map +1 -0
  139. package/dist/editor/EditorWarning.d.ts +5 -0
  140. package/dist/editor/EditorWarning.js +12 -0
  141. package/dist/editor/EditorWarning.js.map +1 -0
  142. package/dist/editor/EditorWarnings.d.ts +9 -0
  143. package/dist/editor/EditorWarnings.js +19 -0
  144. package/dist/editor/EditorWarnings.js.map +1 -0
  145. package/dist/editor/FieldActionsOverlay.d.ts +18 -0
  146. package/dist/editor/FieldActionsOverlay.js +201 -0
  147. package/dist/editor/FieldActionsOverlay.js.map +1 -0
  148. package/dist/editor/FieldEditorPopup.d.ts +10 -0
  149. package/dist/editor/FieldEditorPopup.js +23 -0
  150. package/dist/editor/FieldEditorPopup.js.map +1 -0
  151. package/dist/editor/FieldHistory.d.ts +7 -0
  152. package/dist/editor/FieldHistory.js +42 -0
  153. package/dist/editor/FieldHistory.js.map +1 -0
  154. package/dist/editor/FieldList.d.ts +19 -0
  155. package/dist/editor/FieldList.js +90 -0
  156. package/dist/editor/FieldList.js.map +1 -0
  157. package/dist/editor/FieldListField.d.ts +16 -0
  158. package/dist/editor/FieldListField.js +231 -0
  159. package/dist/editor/FieldListField.js.map +1 -0
  160. package/dist/editor/FieldListFieldWithFallbacks.d.ts +11 -0
  161. package/dist/editor/FieldListFieldWithFallbacks.js +120 -0
  162. package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -0
  163. package/dist/editor/FloatingToolbar.d.ts +7 -0
  164. package/dist/editor/FloatingToolbar.js +91 -0
  165. package/dist/editor/FloatingToolbar.js.map +1 -0
  166. package/dist/editor/ImageEditButton.d.ts +27 -0
  167. package/dist/editor/ImageEditButton.js +22 -0
  168. package/dist/editor/ImageEditButton.js.map +1 -0
  169. package/dist/editor/ImageEditor.d.ts +5 -0
  170. package/dist/editor/ImageEditor.js +76 -0
  171. package/dist/editor/ImageEditor.js.map +1 -0
  172. package/dist/editor/ItemInfo.d.ts +4 -0
  173. package/dist/editor/ItemInfo.js +36 -0
  174. package/dist/editor/ItemInfo.js.map +1 -0
  175. package/dist/editor/LinkEditorDialog.d.ts +18 -0
  176. package/dist/editor/LinkEditorDialog.js +101 -0
  177. package/dist/editor/LinkEditorDialog.js.map +1 -0
  178. package/dist/editor/MainLayout.d.ts +12 -0
  179. package/dist/editor/MainLayout.js +55 -0
  180. package/dist/editor/MainLayout.js.map +1 -0
  181. package/dist/editor/MobileLayout.d.ts +2 -0
  182. package/dist/editor/MobileLayout.js +34 -0
  183. package/dist/editor/MobileLayout.js.map +1 -0
  184. package/dist/editor/NewEditorClient.d.ts +5 -0
  185. package/dist/editor/NewEditorClient.js +7 -0
  186. package/dist/editor/NewEditorClient.js.map +1 -0
  187. package/dist/editor/PictureCropper.d.ts +6 -0
  188. package/dist/editor/PictureCropper.js +722 -0
  189. package/dist/editor/PictureCropper.js.map +1 -0
  190. package/dist/editor/PictureEditor.d.ts +9 -0
  191. package/dist/editor/PictureEditor.js +180 -0
  192. package/dist/editor/PictureEditor.js.map +1 -0
  193. package/dist/editor/PictureEditorDialog.d.ts +8 -0
  194. package/dist/editor/PictureEditorDialog.js +195 -0
  195. package/dist/editor/PictureEditorDialog.js.map +1 -0
  196. package/dist/editor/QuickItemSwitcher.d.ts +9 -0
  197. package/dist/editor/QuickItemSwitcher.js +78 -0
  198. package/dist/editor/QuickItemSwitcher.js.map +1 -0
  199. package/dist/editor/ScrollingContentTree.d.ts +10 -0
  200. package/dist/editor/ScrollingContentTree.js +54 -0
  201. package/dist/editor/ScrollingContentTree.js.map +1 -0
  202. package/dist/editor/Titlebar.d.ts +1 -0
  203. package/dist/editor/Titlebar.js +46 -0
  204. package/dist/editor/Titlebar.js.map +1 -0
  205. package/dist/editor/ai/AgentCostDisplay.d.ts +32 -0
  206. package/dist/editor/ai/AgentCostDisplay.js +93 -0
  207. package/dist/editor/ai/AgentCostDisplay.js.map +1 -0
  208. package/dist/editor/ai/AgentHistory.d.ts +11 -0
  209. package/dist/editor/ai/AgentHistory.js +12 -0
  210. package/dist/editor/ai/AgentHistory.js.map +1 -0
  211. package/dist/editor/ai/AgentProfilesOverview.d.ts +9 -0
  212. package/dist/editor/ai/AgentProfilesOverview.js +16 -0
  213. package/dist/editor/ai/AgentProfilesOverview.js.map +1 -0
  214. package/dist/editor/ai/AgentStatusBadge.d.ts +26 -0
  215. package/dist/editor/ai/AgentStatusBadge.js +126 -0
  216. package/dist/editor/ai/AgentStatusBadge.js.map +1 -0
  217. package/dist/editor/ai/AgentTerminal.d.ts +14 -0
  218. package/dist/editor/ai/AgentTerminal.js +2634 -0
  219. package/dist/editor/ai/AgentTerminal.js.map +1 -0
  220. package/dist/editor/ai/Agents.d.ts +4 -0
  221. package/dist/editor/ai/Agents.js +813 -0
  222. package/dist/editor/ai/Agents.js.map +1 -0
  223. package/dist/editor/ai/AiResponseMessage.d.ts +18 -0
  224. package/dist/editor/ai/AiResponseMessage.js +684 -0
  225. package/dist/editor/ai/AiResponseMessage.js.map +1 -0
  226. package/dist/editor/ai/ContextInfoBar.d.ts +11 -0
  227. package/dist/editor/ai/ContextInfoBar.js +355 -0
  228. package/dist/editor/ai/ContextInfoBar.js.map +1 -0
  229. package/dist/editor/ai/DancingDots.d.ts +1 -0
  230. package/dist/editor/ai/DancingDots.js +6 -0
  231. package/dist/editor/ai/DancingDots.js.map +1 -0
  232. package/dist/editor/ai/MediaImage.d.ts +6 -0
  233. package/dist/editor/ai/MediaImage.js +38 -0
  234. package/dist/editor/ai/MediaImage.js.map +1 -0
  235. package/dist/editor/ai/ToolCallDisplay.d.ts +45 -0
  236. package/dist/editor/ai/ToolCallDisplay.js +292 -0
  237. package/dist/editor/ai/ToolCallDisplay.js.map +1 -0
  238. package/dist/editor/ai/aiPageModel.d.ts +24 -0
  239. package/dist/editor/ai/aiPageModel.js +97 -0
  240. package/dist/editor/ai/aiPageModel.js.map +1 -0
  241. package/dist/editor/ai/editorAiContext.d.ts +10 -0
  242. package/dist/editor/ai/editorAiContext.js +10 -0
  243. package/dist/editor/ai/editorAiContext.js.map +1 -0
  244. package/dist/editor/ai/types.d.ts +30 -0
  245. package/dist/editor/ai/types.js +2 -0
  246. package/dist/editor/ai/types.js.map +1 -0
  247. package/dist/editor/ai/useAgentStatus.d.ts +14 -0
  248. package/dist/editor/ai/useAgentStatus.js +203 -0
  249. package/dist/editor/ai/useAgentStatus.js.map +1 -0
  250. package/dist/editor/client/AboutDialog.d.ts +2 -0
  251. package/dist/editor/client/AboutDialog.js +23 -0
  252. package/dist/editor/client/AboutDialog.js.map +1 -0
  253. package/dist/editor/client/EditorShell.d.ts +37 -0
  254. package/dist/editor/client/EditorShell.js +2388 -0
  255. package/dist/editor/client/EditorShell.js.map +1 -0
  256. package/dist/editor/client/GenericDialog.d.ts +10 -0
  257. package/dist/editor/client/GenericDialog.js +25 -0
  258. package/dist/editor/client/GenericDialog.js.map +1 -0
  259. package/dist/editor/client/editContext.d.ts +260 -0
  260. package/dist/editor/client/editContext.js +29 -0
  261. package/dist/editor/client/editContext.js.map +1 -0
  262. package/dist/editor/client/fieldModificationStore.d.ts +25 -0
  263. package/dist/editor/client/fieldModificationStore.js +184 -0
  264. package/dist/editor/client/fieldModificationStore.js.map +1 -0
  265. package/dist/editor/client/helpers.d.ts +12 -0
  266. package/dist/editor/client/helpers.js +29 -0
  267. package/dist/editor/client/helpers.js.map +1 -0
  268. package/dist/editor/client/hooks/useEditorUrlSync.d.ts +18 -0
  269. package/dist/editor/client/hooks/useEditorUrlSync.js +56 -0
  270. package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -0
  271. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +11 -0
  272. package/dist/editor/client/hooks/useEditorWebSocket.js +86 -0
  273. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -0
  274. package/dist/editor/client/hooks/useGlobalEditorKeyDown.d.ts +1 -0
  275. package/dist/editor/client/hooks/useGlobalEditorKeyDown.js +12 -0
  276. package/dist/editor/client/hooks/useGlobalEditorKeyDown.js.map +1 -0
  277. package/dist/editor/client/hooks/useMediaQuery.d.ts +1 -0
  278. package/dist/editor/client/hooks/useMediaQuery.js +19 -0
  279. package/dist/editor/client/hooks/useMediaQuery.js.map +1 -0
  280. package/dist/editor/client/hooks/useMediaSelector.d.ts +12 -0
  281. package/dist/editor/client/hooks/useMediaSelector.js +30 -0
  282. package/dist/editor/client/hooks/useMediaSelector.js.map +1 -0
  283. package/dist/editor/client/hooks/useQuota.d.ts +29 -0
  284. package/dist/editor/client/hooks/useQuota.js +53 -0
  285. package/dist/editor/client/hooks/useQuota.js.map +1 -0
  286. package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +35 -0
  287. package/dist/editor/client/hooks/useSocketMessageHandler.js +234 -0
  288. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -0
  289. package/dist/editor/client/hooks/useWorkbox.d.ts +9 -0
  290. package/dist/editor/client/hooks/useWorkbox.js +52 -0
  291. package/dist/editor/client/hooks/useWorkbox.js.map +1 -0
  292. package/dist/editor/client/itemsRepository.d.ts +38 -0
  293. package/dist/editor/client/itemsRepository.js +468 -0
  294. package/dist/editor/client/itemsRepository.js.map +1 -0
  295. package/dist/editor/client/operations.d.ts +69 -0
  296. package/dist/editor/client/operations.js +627 -0
  297. package/dist/editor/client/operations.js.map +1 -0
  298. package/dist/editor/client/pageModelBuilder.d.ts +6 -0
  299. package/dist/editor/client/pageModelBuilder.js +155 -0
  300. package/dist/editor/client/pageModelBuilder.js.map +1 -0
  301. package/dist/editor/client/ui/EditorChrome.d.ts +12 -0
  302. package/dist/editor/client/ui/EditorChrome.js +30 -0
  303. package/dist/editor/client/ui/EditorChrome.js.map +1 -0
  304. package/dist/editor/client/ui/FullscreenControls.d.ts +7 -0
  305. package/dist/editor/client/ui/FullscreenControls.js +21 -0
  306. package/dist/editor/client/ui/FullscreenControls.js.map +1 -0
  307. package/dist/editor/commands/agentCommands.d.ts +9 -0
  308. package/dist/editor/commands/agentCommands.js +30 -0
  309. package/dist/editor/commands/agentCommands.js.map +1 -0
  310. package/dist/editor/commands/commands.d.ts +19 -0
  311. package/dist/editor/commands/commands.js +2 -0
  312. package/dist/editor/commands/commands.js.map +1 -0
  313. package/dist/editor/commands/componentCommands.d.ts +12 -0
  314. package/dist/editor/commands/componentCommands.js +378 -0
  315. package/dist/editor/commands/componentCommands.js.map +1 -0
  316. package/dist/editor/commands/createVersionCommand.d.ts +4 -0
  317. package/dist/editor/commands/createVersionCommand.js +24 -0
  318. package/dist/editor/commands/createVersionCommand.js.map +1 -0
  319. package/dist/editor/commands/deleteVersionCommand.d.ts +4 -0
  320. package/dist/editor/commands/deleteVersionCommand.js +53 -0
  321. package/dist/editor/commands/deleteVersionCommand.js.map +1 -0
  322. package/dist/editor/commands/itemCommands.d.ts +29 -0
  323. package/dist/editor/commands/itemCommands.js +428 -0
  324. package/dist/editor/commands/itemCommands.js.map +1 -0
  325. package/dist/editor/commands/localizeItem/LocalizeItemDialog.d.ts +8 -0
  326. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +91 -0
  327. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js.map +1 -0
  328. package/dist/editor/commands/undo.d.ts +15 -0
  329. package/dist/editor/commands/undo.js +29 -0
  330. package/dist/editor/commands/undo.js.map +1 -0
  331. package/dist/editor/componentTreeHelper.d.ts +18 -0
  332. package/dist/editor/componentTreeHelper.js +123 -0
  333. package/dist/editor/componentTreeHelper.js.map +1 -0
  334. package/dist/editor/context-menu/CopyMoveMenu.d.ts +7 -0
  335. package/dist/editor/context-menu/CopyMoveMenu.js +58 -0
  336. package/dist/editor/context-menu/CopyMoveMenu.js.map +1 -0
  337. package/dist/editor/context-menu/InsertMenu.d.ts +9 -0
  338. package/dist/editor/context-menu/InsertMenu.js +229 -0
  339. package/dist/editor/context-menu/InsertMenu.js.map +1 -0
  340. package/dist/editor/control-center/About.d.ts +1 -0
  341. package/dist/editor/control-center/About.js +8 -0
  342. package/dist/editor/control-center/About.js.map +1 -0
  343. package/dist/editor/control-center/AllAgentsPanel.d.ts +5 -0
  344. package/dist/editor/control-center/AllAgentsPanel.js +126 -0
  345. package/dist/editor/control-center/AllAgentsPanel.js.map +1 -0
  346. package/dist/editor/control-center/ControlCenterMenu.d.ts +1 -0
  347. package/dist/editor/control-center/ControlCenterMenu.js +66 -0
  348. package/dist/editor/control-center/ControlCenterMenu.js.map +1 -0
  349. package/dist/editor/control-center/IndexOverview.d.ts +1 -0
  350. package/dist/editor/control-center/IndexOverview.js +323 -0
  351. package/dist/editor/control-center/IndexOverview.js.map +1 -0
  352. package/dist/editor/control-center/Info.d.ts +1 -0
  353. package/dist/editor/control-center/Info.js +10 -0
  354. package/dist/editor/control-center/Info.js.map +1 -0
  355. package/dist/editor/control-center/LatestFeedback.d.ts +1 -0
  356. package/dist/editor/control-center/LatestFeedback.js +136 -0
  357. package/dist/editor/control-center/LatestFeedback.js.map +1 -0
  358. package/dist/editor/control-center/QuotaInfo.d.ts +1 -0
  359. package/dist/editor/control-center/QuotaInfo.js +102 -0
  360. package/dist/editor/control-center/QuotaInfo.js.map +1 -0
  361. package/dist/editor/control-center/Setup.d.ts +1 -0
  362. package/dist/editor/control-center/Setup.js +18 -0
  363. package/dist/editor/control-center/Setup.js.map +1 -0
  364. package/dist/editor/control-center/Status.d.ts +1 -0
  365. package/dist/editor/control-center/Status.js +79 -0
  366. package/dist/editor/control-center/Status.js.map +1 -0
  367. package/dist/editor/control-center/WebSocketMessages.d.ts +1 -0
  368. package/dist/editor/control-center/WebSocketMessages.js +71 -0
  369. package/dist/editor/control-center/WebSocketMessages.js.map +1 -0
  370. package/dist/editor/control-center/parhelia-setup/Overview.d.ts +1 -0
  371. package/dist/editor/control-center/parhelia-setup/Overview.js +91 -0
  372. package/dist/editor/control-center/parhelia-setup/Overview.js.map +1 -0
  373. package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
  374. package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
  375. package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
  376. package/dist/editor/control-center/setup-steps/AiSetupStep/index.d.ts +2 -0
  377. package/dist/editor/control-center/setup-steps/AiSetupStep/index.js +22 -0
  378. package/dist/editor/control-center/setup-steps/AiSetupStep/index.js.map +1 -0
  379. package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
  380. package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
  381. package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
  382. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
  383. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
  384. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
  385. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
  386. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
  387. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
  388. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.d.ts +1 -0
  389. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js +367 -0
  390. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js.map +1 -0
  391. package/dist/editor/control-center/setup-steps/AiSetupStep/types.d.ts +1 -0
  392. package/dist/editor/control-center/setup-steps/AiSetupStep/types.js +2 -0
  393. package/dist/editor/control-center/setup-steps/AiSetupStep/types.js.map +1 -0
  394. package/dist/editor/control-center/setup-steps/AiSetupStep/utils.d.ts +4 -0
  395. package/dist/editor/control-center/setup-steps/AiSetupStep/utils.js +25 -0
  396. package/dist/editor/control-center/setup-steps/AiSetupStep/utils.js.map +1 -0
  397. package/dist/editor/control-center/setup-steps/DbSetupStep.d.ts +2 -0
  398. package/dist/editor/control-center/setup-steps/DbSetupStep.js +46 -0
  399. package/dist/editor/control-center/setup-steps/DbSetupStep.js.map +1 -0
  400. package/dist/editor/control-center/setup-steps/IndexSetupStep.d.ts +2 -0
  401. package/dist/editor/control-center/setup-steps/IndexSetupStep.js +36 -0
  402. package/dist/editor/control-center/setup-steps/IndexSetupStep.js.map +1 -0
  403. package/dist/editor/control-center/setup-steps/SettingsSetupStep.d.ts +2 -0
  404. package/dist/editor/control-center/setup-steps/SettingsSetupStep.js +107 -0
  405. package/dist/editor/control-center/setup-steps/SettingsSetupStep.js.map +1 -0
  406. package/dist/editor/editor-warnings/ItemLocked.d.ts +2 -0
  407. package/dist/editor/editor-warnings/ItemLocked.js +38 -0
  408. package/dist/editor/editor-warnings/ItemLocked.js.map +1 -0
  409. package/dist/editor/editor-warnings/NoLanguageWriteAccess.d.ts +2 -0
  410. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +14 -0
  411. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js.map +1 -0
  412. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.d.ts +2 -0
  413. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +14 -0
  414. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js.map +1 -0
  415. package/dist/editor/editor-warnings/NoWriteAccess.d.ts +2 -0
  416. package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
  417. package/dist/editor/editor-warnings/NoWriteAccess.js.map +1 -0
  418. package/dist/editor/editor-warnings/ValidationErrors.d.ts +2 -0
  419. package/dist/editor/editor-warnings/ValidationErrors.js +28 -0
  420. package/dist/editor/editor-warnings/ValidationErrors.js.map +1 -0
  421. package/dist/editor/field-types/AttachmentEditor.d.ts +9 -0
  422. package/dist/editor/field-types/AttachmentEditor.js +73 -0
  423. package/dist/editor/field-types/AttachmentEditor.js.map +1 -0
  424. package/dist/editor/field-types/CheckboxEditor.d.ts +5 -0
  425. package/dist/editor/field-types/CheckboxEditor.js +30 -0
  426. package/dist/editor/field-types/CheckboxEditor.js.map +1 -0
  427. package/dist/editor/field-types/DateFieldEditor.d.ts +5 -0
  428. package/dist/editor/field-types/DateFieldEditor.js +93 -0
  429. package/dist/editor/field-types/DateFieldEditor.js.map +1 -0
  430. package/dist/editor/field-types/DateTimeFieldEditor.d.ts +5 -0
  431. package/dist/editor/field-types/DateTimeFieldEditor.js +151 -0
  432. package/dist/editor/field-types/DateTimeFieldEditor.js.map +1 -0
  433. package/dist/editor/field-types/DropLinkEditor.d.ts +5 -0
  434. package/dist/editor/field-types/DropLinkEditor.js +42 -0
  435. package/dist/editor/field-types/DropLinkEditor.js.map +1 -0
  436. package/dist/editor/field-types/DropListEditor.d.ts +5 -0
  437. package/dist/editor/field-types/DropListEditor.js +46 -0
  438. package/dist/editor/field-types/DropListEditor.js.map +1 -0
  439. package/dist/editor/field-types/ImageFieldEditor.d.ts +5 -0
  440. package/dist/editor/field-types/ImageFieldEditor.js +34 -0
  441. package/dist/editor/field-types/ImageFieldEditor.js.map +1 -0
  442. package/dist/editor/field-types/InternalLinkFieldEditor.d.ts +5 -0
  443. package/dist/editor/field-types/InternalLinkFieldEditor.js +120 -0
  444. package/dist/editor/field-types/InternalLinkFieldEditor.js.map +1 -0
  445. package/dist/editor/field-types/LinkFieldEditor.d.ts +5 -0
  446. package/dist/editor/field-types/LinkFieldEditor.js +62 -0
  447. package/dist/editor/field-types/LinkFieldEditor.js.map +1 -0
  448. package/dist/editor/field-types/MultiLineText.d.ts +7 -0
  449. package/dist/editor/field-types/MultiLineText.js +48 -0
  450. package/dist/editor/field-types/MultiLineText.js.map +1 -0
  451. package/dist/editor/field-types/NameValueListEditor.d.ts +7 -0
  452. package/dist/editor/field-types/NameValueListEditor.js +101 -0
  453. package/dist/editor/field-types/NameValueListEditor.js.map +1 -0
  454. package/dist/editor/field-types/PictureFieldEditor.d.ts +5 -0
  455. package/dist/editor/field-types/PictureFieldEditor.js +58 -0
  456. package/dist/editor/field-types/PictureFieldEditor.js.map +1 -0
  457. package/dist/editor/field-types/RawEditor.d.ts +6 -0
  458. package/dist/editor/field-types/RawEditor.js +31 -0
  459. package/dist/editor/field-types/RawEditor.js.map +1 -0
  460. package/dist/editor/field-types/ReactQuill.d.ts +125 -0
  461. package/dist/editor/field-types/ReactQuill.js +385 -0
  462. package/dist/editor/field-types/ReactQuill.js.map +1 -0
  463. package/dist/editor/field-types/RichTextEditor.d.ts +7 -0
  464. package/dist/editor/field-types/RichTextEditor.js +21 -0
  465. package/dist/editor/field-types/RichTextEditor.js.map +1 -0
  466. package/dist/editor/field-types/RichTextEditorComponent.d.ts +8 -0
  467. package/dist/editor/field-types/RichTextEditorComponent.js +74 -0
  468. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -0
  469. package/dist/editor/field-types/SingleLineText.d.ts +7 -0
  470. package/dist/editor/field-types/SingleLineText.js +113 -0
  471. package/dist/editor/field-types/SingleLineText.js.map +1 -0
  472. package/dist/editor/field-types/TreeListEditor.d.ts +5 -0
  473. package/dist/editor/field-types/TreeListEditor.js +316 -0
  474. package/dist/editor/field-types/TreeListEditor.js.map +1 -0
  475. package/dist/editor/field-types/richtext/components/EditorDropdown.d.ts +11 -0
  476. package/dist/editor/field-types/richtext/components/EditorDropdown.js +83 -0
  477. package/dist/editor/field-types/richtext/components/EditorDropdown.js.map +1 -0
  478. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +5 -0
  479. package/dist/editor/field-types/richtext/components/ReactSlate.js +607 -0
  480. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -0
  481. package/dist/editor/field-types/richtext/components/SimpleDropdown.d.ts +18 -0
  482. package/dist/editor/field-types/richtext/components/SimpleDropdown.js +71 -0
  483. package/dist/editor/field-types/richtext/components/SimpleDropdown.js.map +1 -0
  484. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.d.ts +5 -0
  485. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js +359 -0
  486. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js.map +1 -0
  487. package/dist/editor/field-types/richtext/components/SimpleToolbar.d.ts +16 -0
  488. package/dist/editor/field-types/richtext/components/SimpleToolbar.js +181 -0
  489. package/dist/editor/field-types/richtext/components/SimpleToolbar.js.map +1 -0
  490. package/dist/editor/field-types/richtext/components/SimpleToolbarButton.d.ts +9 -0
  491. package/dist/editor/field-types/richtext/components/SimpleToolbarButton.js +14 -0
  492. package/dist/editor/field-types/richtext/components/SimpleToolbarButton.js.map +1 -0
  493. package/dist/editor/field-types/richtext/components/ToolbarButton.d.ts +3 -0
  494. package/dist/editor/field-types/richtext/components/ToolbarButton.js +6 -0
  495. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -0
  496. package/dist/editor/field-types/richtext/config/pluginFactory.d.ts +19 -0
  497. package/dist/editor/field-types/richtext/config/pluginFactory.js +17 -0
  498. package/dist/editor/field-types/richtext/config/pluginFactory.js.map +1 -0
  499. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +4 -0
  500. package/dist/editor/field-types/richtext/contextMenuFactory.js +201 -0
  501. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -0
  502. package/dist/editor/field-types/richtext/hooks/useProfileCache.d.ts +68 -0
  503. package/dist/editor/field-types/richtext/hooks/useProfileCache.js +214 -0
  504. package/dist/editor/field-types/richtext/hooks/useProfileCache.js.map +1 -0
  505. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.d.ts +25 -0
  506. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.js +64 -0
  507. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.js.map +1 -0
  508. package/dist/editor/field-types/richtext/index.d.ts +6 -0
  509. package/dist/editor/field-types/richtext/index.js +7 -0
  510. package/dist/editor/field-types/richtext/index.js.map +1 -0
  511. package/dist/editor/field-types/richtext/types.d.ts +288 -0
  512. package/dist/editor/field-types/richtext/types.js +107 -0
  513. package/dist/editor/field-types/richtext/types.js.map +1 -0
  514. package/dist/editor/field-types/richtext/utils/conversion.d.ts +7 -0
  515. package/dist/editor/field-types/richtext/utils/conversion.js +762 -0
  516. package/dist/editor/field-types/richtext/utils/conversion.js.map +1 -0
  517. package/dist/editor/field-types/richtext/utils/plugins.d.ts +170 -0
  518. package/dist/editor/field-types/richtext/utils/plugins.js +490 -0
  519. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -0
  520. package/dist/editor/field-types/richtext/utils/profileMapper.d.ts +38 -0
  521. package/dist/editor/field-types/richtext/utils/profileMapper.js +386 -0
  522. package/dist/editor/field-types/richtext/utils/profileMapper.js.map +1 -0
  523. package/dist/editor/field-types/richtext/utils/profileServiceCache.d.ts +37 -0
  524. package/dist/editor/field-types/richtext/utils/profileServiceCache.js +119 -0
  525. package/dist/editor/field-types/richtext/utils/profileServiceCache.js.map +1 -0
  526. package/dist/editor/fieldTypes.d.ts +129 -0
  527. package/dist/editor/fieldTypes.js +2 -0
  528. package/dist/editor/fieldTypes.js.map +1 -0
  529. package/dist/editor/hooks/useEditorSettings.d.ts +17 -0
  530. package/dist/editor/hooks/useEditorSettings.js +61 -0
  531. package/dist/editor/hooks/useEditorSettings.js.map +1 -0
  532. package/dist/editor/media-selector/AiImageSearch.d.ts +4 -0
  533. package/dist/editor/media-selector/AiImageSearch.js +164 -0
  534. package/dist/editor/media-selector/AiImageSearch.js.map +1 -0
  535. package/dist/editor/media-selector/AiImageSearchPrompt.d.ts +3 -0
  536. package/dist/editor/media-selector/AiImageSearchPrompt.js +57 -0
  537. package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -0
  538. package/dist/editor/media-selector/MediaFolderBrowser.d.ts +5 -0
  539. package/dist/editor/media-selector/MediaFolderBrowser.js +182 -0
  540. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -0
  541. package/dist/editor/media-selector/MediaSelector.d.ts +9 -0
  542. package/dist/editor/media-selector/MediaSelector.js +8 -0
  543. package/dist/editor/media-selector/MediaSelector.js.map +1 -0
  544. package/dist/editor/media-selector/Preview.d.ts +4 -0
  545. package/dist/editor/media-selector/Preview.js +19 -0
  546. package/dist/editor/media-selector/Preview.js.map +1 -0
  547. package/dist/editor/media-selector/Thumbnails.d.ts +8 -0
  548. package/dist/editor/media-selector/Thumbnails.js +10 -0
  549. package/dist/editor/media-selector/Thumbnails.js.map +1 -0
  550. package/dist/editor/media-selector/TreeSelector.d.ts +7 -0
  551. package/dist/editor/media-selector/TreeSelector.js +183 -0
  552. package/dist/editor/media-selector/TreeSelector.js.map +1 -0
  553. package/dist/editor/media-selector/UploadZone.d.ts +4 -0
  554. package/dist/editor/media-selector/UploadZone.js +81 -0
  555. package/dist/editor/media-selector/UploadZone.js.map +1 -0
  556. package/dist/editor/media-selector/index.d.ts +8 -0
  557. package/dist/editor/media-selector/index.js +9 -0
  558. package/dist/editor/media-selector/index.js.map +1 -0
  559. package/dist/editor/menubar/ActiveUsers.d.ts +1 -0
  560. package/dist/editor/menubar/ActiveUsers.js +120 -0
  561. package/dist/editor/menubar/ActiveUsers.js.map +1 -0
  562. package/dist/editor/menubar/ApproveAndPublish.d.ts +1 -0
  563. package/dist/editor/menubar/ApproveAndPublish.js +13 -0
  564. package/dist/editor/menubar/ApproveAndPublish.js.map +1 -0
  565. package/dist/editor/menubar/FavoritesControls.d.ts +8 -0
  566. package/dist/editor/menubar/FavoritesControls.js +124 -0
  567. package/dist/editor/menubar/FavoritesControls.js.map +1 -0
  568. package/dist/editor/menubar/GenericToolbar.d.ts +11 -0
  569. package/dist/editor/menubar/GenericToolbar.js +10 -0
  570. package/dist/editor/menubar/GenericToolbar.js.map +1 -0
  571. package/dist/editor/menubar/ItemActionsMenu.d.ts +3 -0
  572. package/dist/editor/menubar/ItemActionsMenu.js +23 -0
  573. package/dist/editor/menubar/ItemActionsMenu.js.map +1 -0
  574. package/dist/editor/menubar/ItemLanguageVersion.d.ts +1 -0
  575. package/dist/editor/menubar/ItemLanguageVersion.js +54 -0
  576. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -0
  577. package/dist/editor/menubar/ItemToolbar.d.ts +1 -0
  578. package/dist/editor/menubar/ItemToolbar.js +11 -0
  579. package/dist/editor/menubar/ItemToolbar.js.map +1 -0
  580. package/dist/editor/menubar/NavButtons.d.ts +1 -0
  581. package/dist/editor/menubar/NavButtons.js +40 -0
  582. package/dist/editor/menubar/NavButtons.js.map +1 -0
  583. package/dist/editor/menubar/PageSelector.d.ts +4 -0
  584. package/dist/editor/menubar/PageSelector.js +149 -0
  585. package/dist/editor/menubar/PageSelector.js.map +1 -0
  586. package/dist/editor/menubar/Separator.d.ts +3 -0
  587. package/dist/editor/menubar/Separator.js +6 -0
  588. package/dist/editor/menubar/Separator.js.map +1 -0
  589. package/dist/editor/menubar/SiteInfo.d.ts +1 -0
  590. package/dist/editor/menubar/SiteInfo.js +24 -0
  591. package/dist/editor/menubar/SiteInfo.js.map +1 -0
  592. package/dist/editor/menubar/ToolbarFactory.d.ts +2 -0
  593. package/dist/editor/menubar/ToolbarFactory.js +55 -0
  594. package/dist/editor/menubar/ToolbarFactory.js.map +1 -0
  595. package/dist/editor/menubar/User.d.ts +4 -0
  596. package/dist/editor/menubar/User.js +18 -0
  597. package/dist/editor/menubar/User.js.map +1 -0
  598. package/dist/editor/menubar/VersionSelector.d.ts +10 -0
  599. package/dist/editor/menubar/VersionSelector.js +53 -0
  600. package/dist/editor/menubar/VersionSelector.js.map +1 -0
  601. package/dist/editor/menubar/WorkflowButton.d.ts +1 -0
  602. package/dist/editor/menubar/WorkflowButton.js +93 -0
  603. package/dist/editor/menubar/WorkflowButton.js.map +1 -0
  604. package/dist/editor/menubar/toolbar-sections/CompareControls.d.ts +1 -0
  605. package/dist/editor/menubar/toolbar-sections/CompareControls.js +11 -0
  606. package/dist/editor/menubar/toolbar-sections/CompareControls.js.map +1 -0
  607. package/dist/editor/menubar/toolbar-sections/EditControls.d.ts +7 -0
  608. package/dist/editor/menubar/toolbar-sections/EditControls.js +15 -0
  609. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -0
  610. package/dist/editor/menubar/toolbar-sections/InsertControls.d.ts +1 -0
  611. package/dist/editor/menubar/toolbar-sections/InsertControls.js +15 -0
  612. package/dist/editor/menubar/toolbar-sections/InsertControls.js.map +1 -0
  613. package/dist/editor/menubar/toolbar-sections/ReviewCommands.d.ts +1 -0
  614. package/dist/editor/menubar/toolbar-sections/ReviewCommands.js +41 -0
  615. package/dist/editor/menubar/toolbar-sections/ReviewCommands.js.map +1 -0
  616. package/dist/editor/menubar/toolbar-sections/UtilityControls.d.ts +1 -0
  617. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +17 -0
  618. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -0
  619. package/dist/editor/menubar/toolbar-sections/ViewportControls.d.ts +1 -0
  620. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +21 -0
  621. package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -0
  622. package/dist/editor/menubar/toolbar-sections/index.d.ts +6 -0
  623. package/dist/editor/menubar/toolbar-sections/index.js +7 -0
  624. package/dist/editor/menubar/toolbar-sections/index.js.map +1 -0
  625. package/dist/editor/page-editor-chrome/CommentHighlighting.d.ts +6 -0
  626. package/dist/editor/page-editor-chrome/CommentHighlighting.js +270 -0
  627. package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -0
  628. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +4 -0
  629. package/dist/editor/page-editor-chrome/CommentHighlightings.js +15 -0
  630. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -0
  631. package/dist/editor/page-editor-chrome/FieldActionIndicator.d.ts +4 -0
  632. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +35 -0
  633. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -0
  634. package/dist/editor/page-editor-chrome/FieldActionIndicators.d.ts +1 -0
  635. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +13 -0
  636. package/dist/editor/page-editor-chrome/FieldActionIndicators.js.map +1 -0
  637. package/dist/editor/page-editor-chrome/FieldEditedIndicator.d.ts +8 -0
  638. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +26 -0
  639. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -0
  640. package/dist/editor/page-editor-chrome/FieldEditedIndicators.d.ts +6 -0
  641. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +14 -0
  642. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js.map +1 -0
  643. package/dist/editor/page-editor-chrome/FrameMenu.d.ts +7 -0
  644. package/dist/editor/page-editor-chrome/FrameMenu.js +346 -0
  645. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -0
  646. package/dist/editor/page-editor-chrome/FrameMenus.d.ts +5 -0
  647. package/dist/editor/page-editor-chrome/FrameMenus.js +22 -0
  648. package/dist/editor/page-editor-chrome/FrameMenus.js.map +1 -0
  649. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +5 -0
  650. package/dist/editor/page-editor-chrome/InlineEditor.js +704 -0
  651. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -0
  652. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +1 -0
  653. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +33 -0
  654. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -0
  655. package/dist/editor/page-editor-chrome/NoLayout.d.ts +1 -0
  656. package/dist/editor/page-editor-chrome/NoLayout.js +19 -0
  657. package/dist/editor/page-editor-chrome/NoLayout.js.map +1 -0
  658. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +6 -0
  659. package/dist/editor/page-editor-chrome/PageEditorChrome.js +64 -0
  660. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -0
  661. package/dist/editor/page-editor-chrome/PictureEditorOverlay.d.ts +1 -0
  662. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +152 -0
  663. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -0
  664. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +18 -0
  665. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +122 -0
  666. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -0
  667. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +5 -0
  668. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +289 -0
  669. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -0
  670. package/dist/editor/page-editor-chrome/SuggestionHighlighting.d.ts +6 -0
  671. package/dist/editor/page-editor-chrome/SuggestionHighlighting.js +224 -0
  672. package/dist/editor/page-editor-chrome/SuggestionHighlighting.js.map +1 -0
  673. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +4 -0
  674. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +16 -0
  675. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -0
  676. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +7 -0
  677. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +699 -0
  678. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -0
  679. package/dist/editor/page-viewer/DeviceToolbar.d.ts +6 -0
  680. package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
  681. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -0
  682. package/dist/editor/page-viewer/EditorForm.d.ts +8 -0
  683. package/dist/editor/page-viewer/EditorForm.js +257 -0
  684. package/dist/editor/page-viewer/EditorForm.js.map +1 -0
  685. package/dist/editor/page-viewer/EditorFormPopup.d.ts +11 -0
  686. package/dist/editor/page-viewer/EditorFormPopup.js +41 -0
  687. package/dist/editor/page-viewer/EditorFormPopup.js.map +1 -0
  688. package/dist/editor/page-viewer/MiniMap.d.ts +9 -0
  689. package/dist/editor/page-viewer/MiniMap.js +233 -0
  690. package/dist/editor/page-viewer/MiniMap.js.map +1 -0
  691. package/dist/editor/page-viewer/PageViewer.d.ts +10 -0
  692. package/dist/editor/page-viewer/PageViewer.js +67 -0
  693. package/dist/editor/page-viewer/PageViewer.js.map +1 -0
  694. package/dist/editor/page-viewer/PageViewerFrame.d.ts +11 -0
  695. package/dist/editor/page-viewer/PageViewerFrame.js +857 -0
  696. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -0
  697. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +3 -0
  698. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +339 -0
  699. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -0
  700. package/dist/editor/page-viewer/pageViewContext.d.ts +40 -0
  701. package/dist/editor/page-viewer/pageViewContext.js +156 -0
  702. package/dist/editor/page-viewer/pageViewContext.js.map +1 -0
  703. package/dist/editor/pageModel.d.ts +222 -0
  704. package/dist/editor/pageModel.js +2 -0
  705. package/dist/editor/pageModel.js.map +1 -0
  706. package/dist/editor/picture-shared.d.ts +16 -0
  707. package/dist/editor/picture-shared.js +25 -0
  708. package/dist/editor/picture-shared.js.map +1 -0
  709. package/dist/editor/reviews/Comment.d.ts +8 -0
  710. package/dist/editor/reviews/Comment.js +162 -0
  711. package/dist/editor/reviews/Comment.js.map +1 -0
  712. package/dist/editor/reviews/CommentDisplayPopover.d.ts +9 -0
  713. package/dist/editor/reviews/CommentDisplayPopover.js +104 -0
  714. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -0
  715. package/dist/editor/reviews/CommentEditor.d.ts +20 -0
  716. package/dist/editor/reviews/CommentEditor.js +57 -0
  717. package/dist/editor/reviews/CommentEditor.js.map +1 -0
  718. package/dist/editor/reviews/CommentPopover.d.ts +22 -0
  719. package/dist/editor/reviews/CommentPopover.js +145 -0
  720. package/dist/editor/reviews/CommentPopover.js.map +1 -0
  721. package/dist/editor/reviews/CommentView.d.ts +21 -0
  722. package/dist/editor/reviews/CommentView.js +52 -0
  723. package/dist/editor/reviews/CommentView.js.map +1 -0
  724. package/dist/editor/reviews/Comments.d.ts +3 -0
  725. package/dist/editor/reviews/Comments.js +118 -0
  726. package/dist/editor/reviews/Comments.js.map +1 -0
  727. package/dist/editor/reviews/DiffView.d.ts +17 -0
  728. package/dist/editor/reviews/DiffView.js +57 -0
  729. package/dist/editor/reviews/DiffView.js.map +1 -0
  730. package/dist/editor/reviews/PreviewInfo.d.ts +1 -0
  731. package/dist/editor/reviews/PreviewInfo.js +12 -0
  732. package/dist/editor/reviews/PreviewInfo.js.map +1 -0
  733. package/dist/editor/reviews/Reviews.d.ts +1 -0
  734. package/dist/editor/reviews/Reviews.js +186 -0
  735. package/dist/editor/reviews/Reviews.js.map +1 -0
  736. package/dist/editor/reviews/SuggestedEdit.d.ts +4 -0
  737. package/dist/editor/reviews/SuggestedEdit.js +200 -0
  738. package/dist/editor/reviews/SuggestedEdit.js.map +1 -0
  739. package/dist/editor/reviews/SuggestionDisplayPopover.d.ts +9 -0
  740. package/dist/editor/reviews/SuggestionDisplayPopover.js +204 -0
  741. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -0
  742. package/dist/editor/reviews/commentAi.d.ts +7 -0
  743. package/dist/editor/reviews/commentAi.js +100 -0
  744. package/dist/editor/reviews/commentAi.js.map +1 -0
  745. package/dist/editor/reviews/reviewCommands.d.ts +3 -0
  746. package/dist/editor/reviews/reviewCommands.js +38 -0
  747. package/dist/editor/reviews/reviewCommands.js.map +1 -0
  748. package/dist/editor/reviews/useReviews.d.ts +12 -0
  749. package/dist/editor/reviews/useReviews.js +43 -0
  750. package/dist/editor/reviews/useReviews.js.map +1 -0
  751. package/dist/editor/services/agentService.d.ts +306 -0
  752. package/dist/editor/services/agentService.js +627 -0
  753. package/dist/editor/services/agentService.js.map +1 -0
  754. package/dist/editor/services/aiService.d.ts +106 -0
  755. package/dist/editor/services/aiService.js +294 -0
  756. package/dist/editor/services/aiService.js.map +1 -0
  757. package/dist/editor/services/componentDesignerService.d.ts +46 -0
  758. package/dist/editor/services/componentDesignerService.js +72 -0
  759. package/dist/editor/services/componentDesignerService.js.map +1 -0
  760. package/dist/editor/services/contentService.d.ts +79 -0
  761. package/dist/editor/services/contentService.js +119 -0
  762. package/dist/editor/services/contentService.js.map +1 -0
  763. package/dist/editor/services/contextService.d.ts +26 -0
  764. package/dist/editor/services/contextService.js +103 -0
  765. package/dist/editor/services/contextService.js.map +1 -0
  766. package/dist/editor/services/editService.d.ts +66 -0
  767. package/dist/editor/services/editService.js +325 -0
  768. package/dist/editor/services/editService.js.map +1 -0
  769. package/dist/editor/services/favouritesService.d.ts +33 -0
  770. package/dist/editor/services/favouritesService.js +22 -0
  771. package/dist/editor/services/favouritesService.js.map +1 -0
  772. package/dist/editor/services/indexService.d.ts +13 -0
  773. package/dist/editor/services/indexService.js +45 -0
  774. package/dist/editor/services/indexService.js.map +1 -0
  775. package/dist/editor/services/reviewsService.d.ts +18 -0
  776. package/dist/editor/services/reviewsService.js +60 -0
  777. package/dist/editor/services/reviewsService.js.map +1 -0
  778. package/dist/editor/services/searchService.d.ts +17 -0
  779. package/dist/editor/services/searchService.js +25 -0
  780. package/dist/editor/services/searchService.js.map +1 -0
  781. package/dist/editor/services/serviceHelper.d.ts +10 -0
  782. package/dist/editor/services/serviceHelper.js +118 -0
  783. package/dist/editor/services/serviceHelper.js.map +1 -0
  784. package/dist/editor/services/setupService.d.ts +21 -0
  785. package/dist/editor/services/setupService.js +10 -0
  786. package/dist/editor/services/setupService.js.map +1 -0
  787. package/dist/editor/services/suggestedEditsService.d.ts +18 -0
  788. package/dist/editor/services/suggestedEditsService.js +36 -0
  789. package/dist/editor/services/suggestedEditsService.js.map +1 -0
  790. package/dist/editor/services/systemService.d.ts +4 -0
  791. package/dist/editor/services/systemService.js +11 -0
  792. package/dist/editor/services/systemService.js.map +1 -0
  793. package/dist/editor/services-server/api.d.ts +19 -0
  794. package/dist/editor/services-server/api.js +111 -0
  795. package/dist/editor/services-server/api.js.map +1 -0
  796. package/dist/editor/services-server/graphQL.d.ts +29 -0
  797. package/dist/editor/services-server/graphQL.js +53 -0
  798. package/dist/editor/services-server/graphQL.js.map +1 -0
  799. package/dist/editor/sidebar/Completions.d.ts +1 -0
  800. package/dist/editor/sidebar/Completions.js +55 -0
  801. package/dist/editor/sidebar/Completions.js.map +1 -0
  802. package/dist/editor/sidebar/ComponentPalette.d.ts +1 -0
  803. package/dist/editor/sidebar/ComponentPalette.js +86 -0
  804. package/dist/editor/sidebar/ComponentPalette.js.map +1 -0
  805. package/dist/editor/sidebar/ComponentTree.d.ts +1 -0
  806. package/dist/editor/sidebar/ComponentTree.js +691 -0
  807. package/dist/editor/sidebar/ComponentTree.js.map +1 -0
  808. package/dist/editor/sidebar/Debug.d.ts +1 -0
  809. package/dist/editor/sidebar/Debug.js +71 -0
  810. package/dist/editor/sidebar/Debug.js.map +1 -0
  811. package/dist/editor/sidebar/DictionaryEditor.d.ts +1 -0
  812. package/dist/editor/sidebar/DictionaryEditor.js +158 -0
  813. package/dist/editor/sidebar/DictionaryEditor.js.map +1 -0
  814. package/dist/editor/sidebar/Divider.d.ts +6 -0
  815. package/dist/editor/sidebar/Divider.js +6 -0
  816. package/dist/editor/sidebar/Divider.js.map +1 -0
  817. package/dist/editor/sidebar/EditHistory.d.ts +1 -0
  818. package/dist/editor/sidebar/EditHistory.js +78 -0
  819. package/dist/editor/sidebar/EditHistory.js.map +1 -0
  820. package/dist/editor/sidebar/GraphQL.d.ts +2 -0
  821. package/dist/editor/sidebar/GraphQL.js +234 -0
  822. package/dist/editor/sidebar/GraphQL.js.map +1 -0
  823. package/dist/editor/sidebar/Insert.d.ts +1 -0
  824. package/dist/editor/sidebar/Insert.js +22 -0
  825. package/dist/editor/sidebar/Insert.js.map +1 -0
  826. package/dist/editor/sidebar/LeftToolbar.d.ts +1 -0
  827. package/dist/editor/sidebar/LeftToolbar.js +16 -0
  828. package/dist/editor/sidebar/LeftToolbar.js.map +1 -0
  829. package/dist/editor/sidebar/MainContentTree.d.ts +5 -0
  830. package/dist/editor/sidebar/MainContentTree.js +70 -0
  831. package/dist/editor/sidebar/MainContentTree.js.map +1 -0
  832. package/dist/editor/sidebar/Performance.d.ts +1 -0
  833. package/dist/editor/sidebar/Performance.js +32 -0
  834. package/dist/editor/sidebar/Performance.js.map +1 -0
  835. package/dist/editor/sidebar/SEOInfo.d.ts +1 -0
  836. package/dist/editor/sidebar/SEOInfo.js +158 -0
  837. package/dist/editor/sidebar/SEOInfo.js.map +1 -0
  838. package/dist/editor/sidebar/Sessions.d.ts +1 -0
  839. package/dist/editor/sidebar/Sessions.js +29 -0
  840. package/dist/editor/sidebar/Sessions.js.map +1 -0
  841. package/dist/editor/sidebar/Sidebar.d.ts +1 -0
  842. package/dist/editor/sidebar/Sidebar.js +13 -0
  843. package/dist/editor/sidebar/Sidebar.js.map +1 -0
  844. package/dist/editor/sidebar/SidebarView.d.ts +10 -0
  845. package/dist/editor/sidebar/SidebarView.js +40 -0
  846. package/dist/editor/sidebar/SidebarView.js.map +1 -0
  847. package/dist/editor/sidebar/Validation.d.ts +1 -0
  848. package/dist/editor/sidebar/Validation.js +51 -0
  849. package/dist/editor/sidebar/Validation.js.map +1 -0
  850. package/dist/editor/sidebar/ViewSelector.d.ts +4 -0
  851. package/dist/editor/sidebar/ViewSelector.js +191 -0
  852. package/dist/editor/sidebar/ViewSelector.js.map +1 -0
  853. package/dist/editor/sidebar/Workbox.d.ts +1 -0
  854. package/dist/editor/sidebar/Workbox.js +79 -0
  855. package/dist/editor/sidebar/Workbox.js.map +1 -0
  856. package/dist/editor/ui/CenteredMessage.d.ts +3 -0
  857. package/dist/editor/ui/CenteredMessage.js +5 -0
  858. package/dist/editor/ui/CenteredMessage.js.map +1 -0
  859. package/dist/editor/ui/CopyMoveTargetSelectorDialog.d.ts +10 -0
  860. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +38 -0
  861. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -0
  862. package/dist/editor/ui/DialogButtons.d.ts +3 -0
  863. package/dist/editor/ui/DialogButtons.js +5 -0
  864. package/dist/editor/ui/DialogButtons.js.map +1 -0
  865. package/dist/editor/ui/DragPreview.d.ts +14 -0
  866. package/dist/editor/ui/DragPreview.js +33 -0
  867. package/dist/editor/ui/DragPreview.js.map +1 -0
  868. package/dist/editor/ui/Icons.d.ts +74 -0
  869. package/dist/editor/ui/Icons.js +106 -0
  870. package/dist/editor/ui/Icons.js.map +1 -0
  871. package/dist/editor/ui/ItemList.d.ts +16 -0
  872. package/dist/editor/ui/ItemList.js +19 -0
  873. package/dist/editor/ui/ItemList.js.map +1 -0
  874. package/dist/editor/ui/ItemNameDialogNew.d.ts +10 -0
  875. package/dist/editor/ui/ItemNameDialogNew.js +68 -0
  876. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -0
  877. package/dist/editor/ui/ItemSearch.d.ts +25 -0
  878. package/dist/editor/ui/ItemSearch.js +92 -0
  879. package/dist/editor/ui/ItemSearch.js.map +1 -0
  880. package/dist/editor/ui/PerfectTree.d.ts +78 -0
  881. package/dist/editor/ui/PerfectTree.js +858 -0
  882. package/dist/editor/ui/PerfectTree.js.map +1 -0
  883. package/dist/editor/ui/Section.d.ts +4 -0
  884. package/dist/editor/ui/Section.js +12 -0
  885. package/dist/editor/ui/Section.js.map +1 -0
  886. package/dist/editor/ui/SimpleIconButton.d.ts +14 -0
  887. package/dist/editor/ui/SimpleIconButton.js +15 -0
  888. package/dist/editor/ui/SimpleIconButton.js.map +1 -0
  889. package/dist/editor/ui/SimpleMenu.d.ts +6 -0
  890. package/dist/editor/ui/SimpleMenu.js +7 -0
  891. package/dist/editor/ui/SimpleMenu.js.map +1 -0
  892. package/dist/editor/ui/SimpleTable.d.ts +14 -0
  893. package/dist/editor/ui/SimpleTable.js +9 -0
  894. package/dist/editor/ui/SimpleTable.js.map +1 -0
  895. package/dist/editor/ui/SimpleTabs.d.ts +15 -0
  896. package/dist/editor/ui/SimpleTabs.js +20 -0
  897. package/dist/editor/ui/SimpleTabs.js.map +1 -0
  898. package/dist/editor/ui/SimpleToolbar.d.ts +3 -0
  899. package/dist/editor/ui/SimpleToolbar.js +5 -0
  900. package/dist/editor/ui/SimpleToolbar.js.map +1 -0
  901. package/dist/editor/ui/Spinner.d.ts +4 -0
  902. package/dist/editor/ui/Spinner.js +18 -0
  903. package/dist/editor/ui/Spinner.js.map +1 -0
  904. package/dist/editor/ui/Splitter.d.ts +22 -0
  905. package/dist/editor/ui/Splitter.js +443 -0
  906. package/dist/editor/ui/Splitter.js.map +1 -0
  907. package/dist/editor/ui/TemplateSelectorDialog.d.ts +8 -0
  908. package/dist/editor/ui/TemplateSelectorDialog.js +61 -0
  909. package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -0
  910. package/dist/editor/ui/Toolbar.d.ts +3 -0
  911. package/dist/editor/ui/Toolbar.js +5 -0
  912. package/dist/editor/ui/Toolbar.js.map +1 -0
  913. package/dist/editor/utils/id-helper.d.ts +1 -0
  914. package/dist/editor/utils/id-helper.js +5 -0
  915. package/dist/editor/utils/id-helper.js.map +1 -0
  916. package/dist/editor/utils/insertOptions.d.ts +3 -0
  917. package/dist/editor/utils/insertOptions.js +43 -0
  918. package/dist/editor/utils/insertOptions.js.map +1 -0
  919. package/dist/editor/utils/itemConverters.d.ts +3 -0
  920. package/dist/editor/utils/itemConverters.js +53 -0
  921. package/dist/editor/utils/itemConverters.js.map +1 -0
  922. package/dist/editor/utils/itemutils.d.ts +3 -0
  923. package/dist/editor/utils/itemutils.js +24 -0
  924. package/dist/editor/utils/itemutils.js.map +1 -0
  925. package/dist/editor/utils/jsonCleaner.d.ts +8 -0
  926. package/dist/editor/utils/jsonCleaner.js +76 -0
  927. package/dist/editor/utils/jsonCleaner.js.map +1 -0
  928. package/dist/editor/utils/keyboardNavigation.d.ts +34 -0
  929. package/dist/editor/utils/keyboardNavigation.js +237 -0
  930. package/dist/editor/utils/keyboardNavigation.js.map +1 -0
  931. package/dist/editor/utils/urlUtils.d.ts +9 -0
  932. package/dist/editor/utils/urlUtils.js +25 -0
  933. package/dist/editor/utils/urlUtils.js.map +1 -0
  934. package/dist/editor/utils/useMemoDebug.d.ts +1 -0
  935. package/dist/editor/utils/useMemoDebug.js +18 -0
  936. package/dist/editor/utils/useMemoDebug.js.map +1 -0
  937. package/dist/editor/utils.d.ts +65 -0
  938. package/dist/editor/utils.js +468 -0
  939. package/dist/editor/utils.js.map +1 -0
  940. package/dist/editor/views/CompareView.d.ts +1 -0
  941. package/dist/editor/views/CompareView.js +148 -0
  942. package/dist/editor/views/CompareView.js.map +1 -0
  943. package/dist/editor/views/EditView.d.ts +1 -0
  944. package/dist/editor/views/EditView.js +15 -0
  945. package/dist/editor/views/EditView.js.map +1 -0
  946. package/dist/editor/views/ItemEditor.d.ts +7 -0
  947. package/dist/editor/views/ItemEditor.js +29 -0
  948. package/dist/editor/views/ItemEditor.js.map +1 -0
  949. package/dist/editor/views/MediaFolderEditView.d.ts +4 -0
  950. package/dist/editor/views/MediaFolderEditView.js +40 -0
  951. package/dist/editor/views/MediaFolderEditView.js.map +1 -0
  952. package/dist/editor/views/ParheliaView.d.ts +5 -0
  953. package/dist/editor/views/ParheliaView.js +136 -0
  954. package/dist/editor/views/ParheliaView.js.map +1 -0
  955. package/dist/editor/views/SingleEditView.d.ts +9 -0
  956. package/dist/editor/views/SingleEditView.js +33 -0
  957. package/dist/editor/views/SingleEditView.js.map +1 -0
  958. package/dist/images/bg-shape-black.webp +0 -0
  959. package/dist/images/wizard-bg.png +0 -0
  960. package/dist/images/wizard-tour.png +0 -0
  961. package/dist/images/wizard.png +0 -0
  962. package/dist/index.d.ts +62 -0
  963. package/dist/index.js +53 -0
  964. package/dist/index.js.map +1 -0
  965. package/dist/lib/safelist.d.ts +1 -0
  966. package/dist/lib/safelist.js +5 -0
  967. package/dist/lib/safelist.js.map +1 -0
  968. package/dist/lib/utils.d.ts +2 -0
  969. package/dist/lib/utils.js +6 -0
  970. package/dist/lib/utils.js.map +1 -0
  971. package/dist/revision.d.ts +2 -0
  972. package/dist/revision.js +3 -0
  973. package/dist/revision.js.map +1 -0
  974. package/dist/splash-screen/ModernSplashScreen.d.ts +8 -0
  975. package/dist/splash-screen/ModernSplashScreen.js +92 -0
  976. package/dist/splash-screen/ModernSplashScreen.js.map +1 -0
  977. package/dist/splash-screen/NewPage.d.ts +3 -0
  978. package/dist/splash-screen/NewPage.js +145 -0
  979. package/dist/splash-screen/NewPage.js.map +1 -0
  980. package/dist/splash-screen/OpenPage.d.ts +1 -0
  981. package/dist/splash-screen/OpenPage.js +56 -0
  982. package/dist/splash-screen/OpenPage.js.map +1 -0
  983. package/dist/splash-screen/ParheliaAssistantChat.d.ts +8 -0
  984. package/dist/splash-screen/ParheliaAssistantChat.js +155 -0
  985. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -0
  986. package/dist/splash-screen/RecentAgents.d.ts +7 -0
  987. package/dist/splash-screen/RecentAgents.js +76 -0
  988. package/dist/splash-screen/RecentAgents.js.map +1 -0
  989. package/dist/splash-screen/RecentPages.d.ts +1 -0
  990. package/dist/splash-screen/RecentPages.js +47 -0
  991. package/dist/splash-screen/RecentPages.js.map +1 -0
  992. package/dist/splash-screen/SectionHeadline.d.ts +4 -0
  993. package/dist/splash-screen/SectionHeadline.js +7 -0
  994. package/dist/splash-screen/SectionHeadline.js.map +1 -0
  995. package/dist/styles.css +5914 -0
  996. package/dist/tour/Tour.d.ts +3 -0
  997. package/dist/tour/Tour.js +426 -0
  998. package/dist/tour/Tour.js.map +1 -0
  999. package/dist/tour/default-tour.d.ts +9 -0
  1000. package/dist/tour/default-tour.js +302 -0
  1001. package/dist/tour/default-tour.js.map +1 -0
  1002. package/dist/tour/preview-tour.d.ts +2 -0
  1003. package/dist/tour/preview-tour.js +93 -0
  1004. package/dist/tour/preview-tour.js.map +1 -0
  1005. package/dist/types.d.ts +396 -0
  1006. package/dist/types.js +2 -0
  1007. package/dist/types.js.map +1 -0
  1008. package/images/bg-shape-black.webp +0 -0
  1009. package/images/wizard-bg.png +0 -0
  1010. package/images/wizard-tour.png +0 -0
  1011. package/images/wizard.png +0 -0
  1012. package/package.json +93 -0
@@ -0,0 +1,2388 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React, { useState, useEffect, useRef, useCallback, useMemo, useSyncExternalStore, } from "react";
4
+ import { toast } from "sonner";
5
+ import { EditContextProvider, FieldsEditContextProvider, OperationsContextProvider, } from "./editContext";
6
+ import { fieldModificationStore } from "./fieldModificationStore";
7
+ import { useRouter, useSearchParams, usePathname } from "next/navigation";
8
+ import { findComponent, getComponentById } from "../componentTreeHelper";
9
+ import { getOperationsContext } from "./operations";
10
+ import { handleErrorResult } from "./helpers";
11
+ import { executeFieldAction as executeFieldServerAction, connectSocket, getEditHistory, releaseFieldLocks, validateItems, } from "../services/editService";
12
+ import { useEditorWebSocket } from "./hooks/useEditorWebSocket";
13
+ import { useSocketMessageHandler } from "./hooks/useSocketMessageHandler";
14
+ import "react-json-view-lite/dist/index.css";
15
+ import { MediaSelector, } from "../media-selector/MediaSelector";
16
+ import { getComponentCommands } from "../commands/componentCommands";
17
+ import { getLanguagesAndVersions, } from "../services/contentService";
18
+ import ConfirmationDialog from "../ConfirmationDialog";
19
+ import { getItemDescriptor } from "../utils";
20
+ import { EditContextMenu } from "../ContextMenu";
21
+ import { FieldEditorPopup } from "../FieldEditorPopup";
22
+ import { EditorFormPopup, } from "../page-viewer/EditorFormPopup";
23
+ import { post } from "../services/serviceHelper";
24
+ import { PageViewerFrame } from "../page-viewer/PageViewerFrame";
25
+ import { useItemsRepository } from "./itemsRepository";
26
+ import { Spinner } from "../ui/Spinner";
27
+ import { cleanId } from "../utils/id-helper";
28
+ import { useDebouncedCallback } from "use-debounce";
29
+ import { useKeyboardNavigation } from "../utils/keyboardNavigation";
30
+ import { Toaster } from "../../components/ui/sonner";
31
+ import { Tour } from "../../tour/Tour";
32
+ import { usePageViewContext } from "../page-viewer/pageViewContext";
33
+ import { QuickItemSwitcher } from "../QuickItemSwitcher";
34
+ import { getComments, getAvailableCommentTags, } from "../services/reviewsService";
35
+ import { useReviews } from "../reviews/useReviews";
36
+ import uuid from "react-uuid";
37
+ import { flushSync } from "react-dom";
38
+ import { getSuggestedEdits } from "../services/suggestedEditsService";
39
+ import { requestQuota } from "../services/aiService";
40
+ import { useQuota } from "./hooks/useQuota";
41
+ import { useEditorUrlSync } from "./hooks/useEditorUrlSync";
42
+ import { useMediaQuery } from "./hooks/useMediaQuery";
43
+ import { FullscreenControls } from "./ui/FullscreenControls";
44
+ import { EditorChrome } from "./ui/EditorChrome";
45
+ import { useWorkbox } from "./hooks/useWorkbox";
46
+ import { useMediaSelector } from "./hooks/useMediaSelector";
47
+ import { useGlobalEditorKeyDown } from "./hooks/useGlobalEditorKeyDown";
48
+ export function EditorShell({ configuration, className, item: loadItemDescriptor, sessionId, userInfo, userPreferences, editorSettings, setUserPreferences, children, }) {
49
+ const router = useRouter();
50
+ const pathname = usePathname();
51
+ const searchParams = useSearchParams();
52
+ const [selection, setSelection] = useState([]);
53
+ const [selectedForInsertion, setSelectedForInsertion] = useState("");
54
+ const [refreshCompletedFlag, setRefreshCompletedFlag] = useState(false);
55
+ const [isRefreshing, setIsRefreshing] = useState(false);
56
+ const [dragObject, setDragObject] = useState();
57
+ // media selection handled by useMediaSelector hook
58
+ const [scrollIntoView, setScrollIntoView] = useState();
59
+ const confirmationDialogRef = useRef(null);
60
+ const contextMenuRef = useRef(null);
61
+ const editContextRef = useRef(undefined);
62
+ const [currentOverlay, setCurrentOverlay] = useState();
63
+ const [contentEditorItem, setContentEditorItem] = useState();
64
+ const [focusedField, setFocusedField] = useState();
65
+ const focusedFieldRef = useRef(undefined);
66
+ const [selectedRange, setSelectedRange] = useState();
67
+ const [validating, setValidating] = useState(false);
68
+ const [inserting, setInserting] = useState();
69
+ const [showFullscreenHint, setShowFullscreenHint] = useState(false);
70
+ // const [showPublishDialog, setShowPublishDialog] = useState(false);
71
+ const [activeFieldActions, setActiveFieldActions] = useState([]);
72
+ const [renderedFields, setRenderedFields] = useState([]);
73
+ const fieldEditorPopupRef = React.useRef(null);
74
+ const editorFormPopupRef = React.useRef(null);
75
+ const [validationResult, setValidationResult] = useState();
76
+ const [editHistory, setEditHistory] = useState([]);
77
+ const [recentEdits, setRecentEdits] = useState([]);
78
+ const addRecentEdit = useCallback((edit) => {
79
+ setRecentEdits((prevEditedFields) => {
80
+ return [
81
+ ...prevEditedFields.filter((x) => x.timestamp > Date.now() - 30000 &&
82
+ (x.fieldId !== edit.fieldId ||
83
+ x.item.id !== edit.item.id ||
84
+ x.item.language !== edit.item.language ||
85
+ x.item.version !== edit.item.version)),
86
+ edit,
87
+ ];
88
+ });
89
+ }, []);
90
+ const [activeSessions, setActiveSessions] = useState(() => {
91
+ try {
92
+ const existing = globalThis.__alpacaActiveSessions;
93
+ return Array.isArray(existing) ? existing : [];
94
+ }
95
+ catch {
96
+ return [];
97
+ }
98
+ });
99
+ // Block editing until the server acknowledges our client-info for the current item
100
+ const [isClientInfoAcknowledged, setIsClientInfoAcknowledged] = useState(false);
101
+ if (typeof window !== "undefined")
102
+ sessionStorage?.setItem("sessionId", sessionId);
103
+ const [viewName, setViewName] = useState(
104
+ // default from query string
105
+ searchParams.get("view") ??
106
+ configuration.editor.views[0]?.name ??
107
+ "splash-screen");
108
+ const [previousViewName, setPreviousViewName] = useState(undefined);
109
+ const [compareMode, setCompareMode] = useState(false);
110
+ const [compareTo, setCompareTo] = useState();
111
+ const [componentDesignerComponent, setComponentDesignerComponent] = useState();
112
+ const [componentDesignerRendering, setComponentDesignerRendering] = useState();
113
+ const [insertMode, setInsertMode] = useState(false);
114
+ const [ignoreBlur, setIgnoreBlur] = useState(false);
115
+ const [currentItemDescriptor, setCurrentItemDescriptor] = useState();
116
+ const currentItemDescriptorRef = useRef(undefined);
117
+ useEffect(() => {
118
+ currentItemDescriptorRef.current = currentItemDescriptor;
119
+ }, [currentItemDescriptor]);
120
+ const currentItemRef = useRef(undefined);
121
+ useEffect(() => {
122
+ currentItemRef.current = contentEditorItem;
123
+ }, [contentEditorItem]);
124
+ const [inlineEditingFieldElement, setInlineEditingFieldElement] = useState();
125
+ const [lockedField, setLockedField] = useState();
126
+ const [itemLanguages, setItemLanguages] = useState([]);
127
+ const [itemVersions, setItemVersions] = useState([]);
128
+ const modifiedFields = useSyncExternalStore((onStoreChange) => fieldModificationStore.subscribeAll(onStoreChange), () => fieldModificationStore.getAllFields(), () => fieldModificationStore.getAllFields());
129
+ const [comments, setComments] = useState([]);
130
+ const [suggestedEdits, setSuggestedEdits] = useState([]);
131
+ const [showSuggestedEdits, setShowSuggestedEdits] = useState(false);
132
+ const [showSuggestedEditsDiff, setShowSuggestedEditsDiff] = useState(false);
133
+ const [availableCommentTags, setAvailableCommentTags] = useState([]);
134
+ const [showComments, setShowComments] = useState(() => {
135
+ const savedShowComments = typeof window !== "undefined"
136
+ ? localStorage.getItem("editor.showComments")
137
+ : null;
138
+ return savedShowComments ? JSON.parse(savedShowComments) : true;
139
+ });
140
+ useEffect(() => {
141
+ if (typeof window !== "undefined") {
142
+ localStorage.setItem("editor.showComments", JSON.stringify(showComments));
143
+ }
144
+ }, [showComments]);
145
+ const [showResolvedComments, setShowResolvedComments] = useState(() => {
146
+ const saved = typeof window !== "undefined"
147
+ ? localStorage.getItem("editor.showResolvedComments")
148
+ : null;
149
+ return saved ? JSON.parse(saved) : false;
150
+ });
151
+ useEffect(() => {
152
+ if (typeof window !== "undefined") {
153
+ localStorage.setItem("editor.showResolvedComments", JSON.stringify(showResolvedComments));
154
+ }
155
+ }, [showResolvedComments]);
156
+ const [selectedComment, setSelectedComment] = useState();
157
+ const [browseHistory, setBrowseHistory] = useState(() => {
158
+ // Convert UserBrowseHistoryEntry[] to HistoryEntry[]
159
+ if (!userInfo.browseHistory)
160
+ return [];
161
+ return userInfo.browseHistory.map((entry) => ({
162
+ name: entry.itemName,
163
+ path: entry.itemPath,
164
+ id: entry.itemId,
165
+ version: entry.itemVersion,
166
+ language: entry.itemLanguage,
167
+ hasLayout: false, // This will need to be determined from the item
168
+ templateName: "", // This will need to be determined from the item
169
+ icon: entry.icon,
170
+ }));
171
+ });
172
+ // Navigation history for browser history (view + item combinations)
173
+ const [navigationHistory, setNavigationHistory] = useState(() => {
174
+ // Initialize from browse history with current view
175
+ if (!userInfo.browseHistory)
176
+ return [];
177
+ return userInfo.browseHistory.map((entry) => ({
178
+ viewName: searchParams.get("view") ??
179
+ configuration.editor.views[0]?.name ??
180
+ "content-tree",
181
+ item: {
182
+ id: entry.itemId,
183
+ language: entry.itemLanguage,
184
+ version: entry.itemVersion,
185
+ },
186
+ timestamp: new Date(entry.visitedAt).getTime(),
187
+ displayName: searchParams.get("view") ??
188
+ configuration.editor.views[0]?.name ??
189
+ "content-tree",
190
+ itemName: entry.itemName,
191
+ itemPath: entry.itemPath,
192
+ itemIcon: entry.icon,
193
+ }));
194
+ });
195
+ const [centerPanelView, setCenterPanelView] = useState();
196
+ const [timings, setTimings] = useState({});
197
+ const [revision, setRevision] = useState();
198
+ // moved into useWorkbox
199
+ const [isTourActive, setIsTourActive] = useState(false);
200
+ const [mode, setMode] = useState("edit");
201
+ const [statusMessage, setStatusMessage] = useState("");
202
+ const [focusFieldComponentId, setFocusFieldComponentId] = useState();
203
+ const [enableCompletions, setEnableCompletions] = useState(false);
204
+ const [showComponentNavigator, setShowComponentNavigator] = useState(userPreferences.showComponentNavigator ?? false);
205
+ const [showAgentsPanel, setShowAgentsPanel] = useState(userPreferences.showAgentsPanel ?? false);
206
+ const [activeEditorTab, setActiveEditorTab] = useState(null);
207
+ const [showLayoutComponents, setShowLayoutComponents] = useState(userPreferences.showLayoutComponents ?? false);
208
+ const { quotaInfo, setQuotaInfo, isQuotaExceeded, getQuotaWarningMessage } = useQuota({
209
+ showError: ({ summary, details }) => showErrorToast({ summary, details }),
210
+ });
211
+ const [webSocketMessages, setWebSocketMessages] = useState([]);
212
+ const [favorites, setFavorites] = useState([]);
213
+ // Quick item switcher state
214
+ const [quickSwitcherVisible, setQuickSwitcherVisible] = useState(false);
215
+ const [quickSwitcherSelectedIndex, setQuickSwitcherSelectedIndex] = useState(0);
216
+ // Track initial load to know when to sync state from URL vs URL from state
217
+ const [isInitialLoad, setIsInitialLoad] = useState(true);
218
+ // Wizard state - managed centrally instead of reading URL directly
219
+ const [currentWizardId, setCurrentWizardId] = useState(null);
220
+ // Handle initial mode setup from URL (only on initial load)
221
+ useEffect(() => {
222
+ if (!isInitialLoad)
223
+ return;
224
+ const queryMode = searchParams.get("mode");
225
+ if (queryMode) {
226
+ setMode(queryMode);
227
+ }
228
+ }, [searchParams, isInitialLoad]);
229
+ useEffect(() => {
230
+ if (mode === "suggestions") {
231
+ setViewName("comments");
232
+ }
233
+ }, [mode]);
234
+ useEffect(() => {
235
+ if (focusedField &&
236
+ selection.length > 0 &&
237
+ selection[0] !== focusedField.item.id) {
238
+ setFocusedField(undefined);
239
+ }
240
+ }, [selection]);
241
+ useEffect(() => {
242
+ focusedFieldRef.current = focusedField;
243
+ }, [focusedField]);
244
+ const itemsRepository = useItemsRepository(addRecentEdit);
245
+ const pageViewContext = usePageViewContext({
246
+ pageItemDescriptor: currentItemDescriptor,
247
+ itemsRepository,
248
+ configuration,
249
+ });
250
+ // Track which items are rendered/used by the current page for targeted refresh
251
+ const pageItemsSetRef = useRef(new Set());
252
+ const makeItemKey = useCallback((d) => `${d.id}-${d.language}-${d.version}`.toLowerCase(), []);
253
+ useEffect(() => {
254
+ const newSet = new Set();
255
+ const collect = (component) => {
256
+ if (!component)
257
+ return;
258
+ if (component.datasourceItem)
259
+ newSet.add(makeItemKey(component.datasourceItem));
260
+ component.items?.forEach((i) => newSet.add(makeItemKey(i)));
261
+ component.placeholders?.forEach((ph) => ph.components?.forEach(collect));
262
+ };
263
+ if (pageViewContext?.page) {
264
+ // Include the page item itself
265
+ const pageDescriptor = pageViewContext.page.item.descriptor;
266
+ newSet.add(makeItemKey(pageDescriptor));
267
+ collect(pageViewContext.page.rootComponent);
268
+ }
269
+ pageItemsSetRef.current = newSet;
270
+ }, [pageViewContext.page?.editRevision]);
271
+ const isItemUsedInCurrentPage = useCallback((item) => pageItemsSetRef.current.has(makeItemKey(item)), [makeItemKey]);
272
+ const socketMessageListeners = useRef(new Set());
273
+ const addSocketMessageListener = useCallback((callback) => {
274
+ socketMessageListeners.current.add(callback);
275
+ return () => socketMessageListeners.current.delete(callback);
276
+ }, []);
277
+ // Listen for batch completion notifications
278
+ useEffect(() => {
279
+ const removeListener = addSocketMessageListener((message) => {
280
+ if (message.type === "batch-completed") {
281
+ const { batchId, totalJobs, completedJobs, errorJobs } = message.payload;
282
+ let toastMessage;
283
+ if (errorJobs > 0) {
284
+ toastMessage = `Translation batch completed: ${completedJobs}/${totalJobs} successful, ${errorJobs} failed`;
285
+ }
286
+ else {
287
+ toastMessage = `Translation batch completed successfully: ${completedJobs}/${totalJobs} translations finished`;
288
+ }
289
+ // Delay toast slightly to give user time to navigate if they're switching views
290
+ setTimeout(() => {
291
+ toast(toastMessage, {
292
+ duration: 5000, // Show for 5 seconds
293
+ id: `batch-${batchId}`, // Unique ID to prevent duplicates
294
+ });
295
+ // If the user is in the translation-management view for the same batch,
296
+ // trigger a refresh so the UI reflects the final state immediately.
297
+ try {
298
+ const params = new URLSearchParams(window.location.search);
299
+ const currentView = params.get("view");
300
+ const currentBatchId = params.get("batchId") || params.get("batchid");
301
+ if (currentView === "translation-management" &&
302
+ currentBatchId === batchId) {
303
+ // Ask the server for fresh data; BatchTranslationView listens to requestRefresh via editContext
304
+ requestRefresh("immediate");
305
+ }
306
+ }
307
+ catch { }
308
+ }, 1000); // 1 second delay
309
+ }
310
+ });
311
+ return () => {
312
+ try {
313
+ removeListener();
314
+ }
315
+ catch { }
316
+ };
317
+ }, [addSocketMessageListener]);
318
+ const reviews = useReviews({
319
+ currentItemDescriptor,
320
+ addSocketMessageListener: addSocketMessageListener,
321
+ });
322
+ const validate = useDebouncedCallback(async (items) => {
323
+ setValidating(true);
324
+ const result = await validateItems(items, sessionId);
325
+ if (result.type === "success")
326
+ setValidationResult(await result.data);
327
+ setValidating(false);
328
+ }, 1000);
329
+ useEffect(() => {
330
+ setSelectedForInsertion("");
331
+ }, [selection]);
332
+ // Clear any selected insertion template when insert mode is disabled
333
+ useEffect(() => {
334
+ if (!insertMode) {
335
+ setSelectedForInsertion("");
336
+ }
337
+ }, [insertMode]);
338
+ useEffect(() => {
339
+ if (focusedField?.fieldId !== selectedRange?.fieldId) {
340
+ setSelectedRange(undefined);
341
+ }
342
+ }, [focusedField]);
343
+ const currentView = configuration.editor.views.find((x) => x.name === viewName) ??
344
+ configuration.editor.views[0];
345
+ useEffect(() => {
346
+ if (currentView?.defaultCenterPanelView) {
347
+ setCenterPanelView(currentView.defaultCenterPanelView);
348
+ }
349
+ }, [currentView]);
350
+ const sendClientInfoImmediate = useCallback(async () => {
351
+ const clientInfoMessage = {
352
+ type: "client-info",
353
+ sessionId: sessionId,
354
+ url: window.location.href,
355
+ userAgent: navigator.userAgent,
356
+ item: currentItemRef.current
357
+ ? {
358
+ ...currentItemRef.current.descriptor,
359
+ name: currentItemRef.current.name,
360
+ }
361
+ : null,
362
+ };
363
+ const url = "/parhelia/client";
364
+ await post(url, clientInfoMessage);
365
+ }, [sessionId]);
366
+ const debouncedSendClientInfo = useDebouncedCallback(() => {
367
+ void sendClientInfoImmediate();
368
+ }, 100);
369
+ const sendClientInfo = useCallback(() => {
370
+ debouncedSendClientInfo();
371
+ }, [debouncedSendClientInfo]);
372
+ const startTour = useCallback(() => {
373
+ setIsTourActive(true);
374
+ }, [setIsTourActive]);
375
+ const handleSetShowComponentNavigator = useCallback((value) => {
376
+ const newValue = typeof value === "function" ? value(showComponentNavigator) : value;
377
+ setShowComponentNavigator(newValue);
378
+ setUserPreferences({ showComponentNavigator: newValue });
379
+ }, [showComponentNavigator, setShowComponentNavigator, setUserPreferences]);
380
+ const handleSetShowAgentsPanel = useCallback((value) => {
381
+ const newValue = typeof value === "function" ? value(showAgentsPanel) : value;
382
+ setShowAgentsPanel(newValue);
383
+ setUserPreferences({ showAgentsPanel: newValue });
384
+ }, [showAgentsPanel, setShowAgentsPanel, setUserPreferences]);
385
+ const handleSetShowLayoutComponents = useCallback((value) => {
386
+ const newValue = typeof value === "function" ? value(showLayoutComponents) : value;
387
+ setShowLayoutComponents(newValue);
388
+ setUserPreferences({ showLayoutComponents: newValue });
389
+ }, [showLayoutComponents, setShowLayoutComponents, setUserPreferences]);
390
+ // messageHandler is defined after loadItem/loadHistory declarations to avoid temporal dead zones
391
+ const user = useMemo(() => activeSessions.find((x) => x.sessionId === sessionId)?.user ||
392
+ userInfo.user, [activeSessions, sessionId, userInfo.user]);
393
+ // Self-heal if our session disappears (e.g., after HMR)
394
+ const missingSessionRecoveryTimerRef = useRef(null);
395
+ const missingSessionRecoveryAttemptsRef = useRef(0);
396
+ useEffect(() => {
397
+ const hasMySession = activeSessions.some((s) => s.sessionId === sessionId);
398
+ if (hasMySession) {
399
+ // Reset recovery state when we see ourselves again
400
+ if (missingSessionRecoveryTimerRef.current) {
401
+ clearTimeout(missingSessionRecoveryTimerRef.current);
402
+ missingSessionRecoveryTimerRef.current = null;
403
+ }
404
+ missingSessionRecoveryAttemptsRef.current = 0;
405
+ return;
406
+ }
407
+ // Only run one recovery timer at a time
408
+ if (missingSessionRecoveryTimerRef.current)
409
+ return;
410
+ const attempt = missingSessionRecoveryAttemptsRef.current + 1;
411
+ const delay = Math.min(250 * Math.pow(2, attempt - 1), 2000);
412
+ console.warn(`⚠️ Current session not present in active sessions. Recovery attempt ${attempt} in ${delay}ms...`);
413
+ missingSessionRecoveryTimerRef.current = setTimeout(() => {
414
+ missingSessionRecoveryTimerRef.current = null;
415
+ missingSessionRecoveryAttemptsRef.current = attempt;
416
+ if (attempt <= 3) {
417
+ sendClientInfo();
418
+ }
419
+ else {
420
+ // Force a reconnect to refresh presence after several failed nudges
421
+ try {
422
+ globalThis.editorSocket?.close(4000, "recover-presence");
423
+ }
424
+ catch { }
425
+ }
426
+ }, delay);
427
+ return () => {
428
+ if (missingSessionRecoveryTimerRef.current) {
429
+ clearTimeout(missingSessionRecoveryTimerRef.current);
430
+ missingSessionRecoveryTimerRef.current = null;
431
+ }
432
+ };
433
+ }, [activeSessions, sessionId]);
434
+ useEffect(() => {
435
+ if (typeof window === "undefined")
436
+ return;
437
+ let lastUrl = window.location.href;
438
+ const keepAliveUrl = "/parhelia/keepalive";
439
+ const interval = setInterval(() => {
440
+ fetch(keepAliveUrl + "?ts=" + Date.now()).catch((error) => console.error("Keep Alive error:", error));
441
+ }, 5 * 60 * 1000);
442
+ const handleMessage = (event) => {
443
+ if (event.data.type === "componentsSelected") {
444
+ setSelection(event.data.componentIds);
445
+ }
446
+ };
447
+ // Listen for browser navigation events (back/forward buttons)
448
+ const handlePopState = (event) => {
449
+ const newUrl = window.location.href;
450
+ if (newUrl !== lastUrl) {
451
+ lastUrl = newUrl;
452
+ // Sync URL parameters back to component state for browser navigation
453
+ const urlParams = new URLSearchParams(window.location.search);
454
+ // Handle view changes
455
+ const urlView = urlParams.get("view");
456
+ if (urlView && urlView !== viewName) {
457
+ setViewName(urlView);
458
+ }
459
+ // Handle wizard ID changes
460
+ const wizardId = urlParams.get("wizardid");
461
+ setCurrentWizardId(wizardId);
462
+ // Handle compare mode changes
463
+ const compareValue = urlParams.get("compare") === "true";
464
+ if (compareValue !== compareMode) {
465
+ setCompareMode(compareValue);
466
+ }
467
+ // Handle mode changes
468
+ const urlMode = urlParams.get("mode");
469
+ if (urlMode && urlMode !== mode) {
470
+ setMode(urlMode);
471
+ }
472
+ // Handle fullscreen changes
473
+ const isFullscreen = urlParams.get("fullscreen") === "true";
474
+ if (isFullscreen !== pageViewContext.fullscreen) {
475
+ pageViewContext.setFullscreen(isFullscreen);
476
+ }
477
+ // Handle item loading
478
+ const itemid = urlParams.get("itemid");
479
+ const language = urlParams.get("lang") ?? urlParams.get("language");
480
+ const versionParam = urlParams.get("version");
481
+ const version = versionParam ? parseInt(versionParam) : 0;
482
+ if (itemid && language) {
483
+ const itemId = cleanId(itemid);
484
+ // Only load if we have a valid itemId and it's different from current item
485
+ if (itemId &&
486
+ (currentItemDescriptorRef.current?.id !== itemId ||
487
+ currentItemDescriptorRef.current?.language !== language ||
488
+ (version &&
489
+ currentItemDescriptorRef.current?.version !== version))) {
490
+ loadItem({
491
+ id: itemId,
492
+ language: language, // TypeScript knows this is non-null due to the if check
493
+ version,
494
+ }, {
495
+ addToBrowseHistory: false, // Don't add to history since this is navigation
496
+ });
497
+ }
498
+ }
499
+ }
500
+ };
501
+ // Also track any other URL changes with a MutationObserver fallback
502
+ const checkUrlChange = () => {
503
+ const currentUrl = window.location.href;
504
+ if (currentUrl !== lastUrl) {
505
+ lastUrl = currentUrl;
506
+ }
507
+ };
508
+ const urlCheckInterval = setInterval(checkUrlChange, 100);
509
+ window.addEventListener("message", handleMessage);
510
+ window.addEventListener("popstate", handlePopState);
511
+ return () => {
512
+ window.removeEventListener("message", handleMessage);
513
+ window.removeEventListener("popstate", handlePopState);
514
+ clearInterval(interval);
515
+ clearInterval(urlCheckInterval);
516
+ };
517
+ }, []);
518
+ const isMobile = useMediaQuery("(max-width: 768px)");
519
+ const media = useMediaSelector();
520
+ useEffect(() => {
521
+ // Suppress auto-start tour when `noTour` query parameter is present
522
+ if (searchParams.get("noTour") !== null) {
523
+ return;
524
+ }
525
+ const tour = configuration.activeTour;
526
+ const key = tour === "default" ? "editor.tourShown" : "editor.tourShown." + tour;
527
+ const tourShown = localStorage.getItem(key);
528
+ if (!tourShown) {
529
+ startTour();
530
+ localStorage.setItem(key, "true");
531
+ }
532
+ }, [user]);
533
+ // WebSocket initialization is performed after messageHandler is defined
534
+ // Defer URL sync until loadItem is defined below
535
+ // Mark end of initial load phase
536
+ useEffect(() => {
537
+ if (isInitialLoad) {
538
+ // Set a small timeout to ensure all initial state setting effects have run
539
+ const timer = setTimeout(() => {
540
+ setIsInitialLoad(false);
541
+ }, 100);
542
+ return () => clearTimeout(timer);
543
+ }
544
+ }, [isInitialLoad]);
545
+ // useEffect(() => {
546
+ // if (contentEditorItem) {
547
+ // const params = new URLSearchParams(window.location.search);
548
+ // const wizardId = params.get("wizardid");
549
+ // if (wizardId && viewName !== "page-wizard") {
550
+ //
551
+ // action: "Setting page-wizard view due to wizardid parameter",
552
+ // wizardId,
553
+ // currentViewName: viewName,
554
+ // currentUrl: window.location.href,
555
+ // timestamp: new Date().toISOString(),
556
+ // });
557
+ // setViewName("page-wizard");
558
+ // }
559
+ // }
560
+ // }, [contentEditorItem, viewName, searchParams]);
561
+ useEffect(() => {
562
+ if (selection.length)
563
+ setSelectedForInsertion("");
564
+ // Does the current focused field belong to the current item?
565
+ const currentItem = selection.length > 0 ? selection[0] : pageViewContext.page?.item.id;
566
+ if (currentItem && focusedField?.item.id !== currentItem) {
567
+ setFocusedField(undefined);
568
+ }
569
+ }, [selection]);
570
+ const addToEditHistory = useCallback((currentEditOperation) => {
571
+ setEditHistory((history) => {
572
+ // Check if the operation was updated or needs to be added
573
+ const exists = history.some((item) => item.id === currentEditOperation.id);
574
+ return exists ? history : [currentEditOperation, ...history];
575
+ });
576
+ }, []);
577
+ useEffect(() => {
578
+ setRefreshCompletedFlag(!refreshCompletedFlag);
579
+ setInserting(undefined);
580
+ }, [currentItemDescriptor, pageViewContext.page?.item.id]);
581
+ useEffect(() => {
582
+ // When the item changes, reset acknowledgment and re-send client info
583
+ setIsClientInfoAcknowledged(false);
584
+ sendClientInfo();
585
+ }, [currentItemDescriptor]);
586
+ // Detect acknowledgment via presence of our session with matching item in active-sessions
587
+ useEffect(() => {
588
+ if (!currentItemDescriptor)
589
+ return;
590
+ try {
591
+ const me = activeSessions.find((s) => s.sessionId === sessionId);
592
+ const item = me?.item;
593
+ const acknowledged = !!item &&
594
+ item.id === contentEditorItem?.id &&
595
+ item.language === contentEditorItem?.language &&
596
+ item.version === contentEditorItem?.version;
597
+ if (acknowledged)
598
+ setIsClientInfoAcknowledged(true);
599
+ }
600
+ catch { }
601
+ }, [activeSessions, contentEditorItem, sessionId]);
602
+ const loadComments = useCallback(async () => {
603
+ if (!currentItemDescriptor)
604
+ return;
605
+ const result = await getComments(currentItemDescriptor.id, currentItemDescriptor.language, currentItemDescriptor.version);
606
+ if (handleErrorResult(result, ui, state))
607
+ return;
608
+ setComments((x) => {
609
+ const loadedComments = result.data;
610
+ const newComments = x.filter((c) => c.isNew &&
611
+ c.mainItemId === currentItemDescriptor.id &&
612
+ c.language === currentItemDescriptor.language &&
613
+ c.version === currentItemDescriptor.version);
614
+ const allComments = [...loadedComments, ...newComments];
615
+ allComments.sort((a, b) => a.position - b.position);
616
+ return allComments;
617
+ });
618
+ }, [currentItemDescriptor]);
619
+ // Assuming currentItemDescriptor, ui, state, handleErrorResult, and setSuggestedEdits
620
+ // are available in your component context.
621
+ const loadSuggestedEdits = useCallback(async () => {
622
+ if (!contentEditorItem)
623
+ return;
624
+ const result = await getSuggestedEdits(contentEditorItem.descriptor.id, contentEditorItem.descriptor.language, contentEditorItem.descriptor.version);
625
+ if (handleErrorResult(result, ui, state))
626
+ return;
627
+ setSuggestedEdits(result.data || []);
628
+ }, [contentEditorItem]);
629
+ const loadFavorites = useCallback(async () => {
630
+ try {
631
+ const { getAllFavorites } = await import("../services/favouritesService");
632
+ const result = await getAllFavorites();
633
+ if (result.data) {
634
+ setFavorites(result.data);
635
+ }
636
+ }
637
+ catch (error) {
638
+ console.error("Failed to load favorites:", error);
639
+ setFavorites([]);
640
+ }
641
+ }, []);
642
+ const page = pageViewContext.page;
643
+ useEffect(() => {
644
+ const isLoading = !!contentEditorItem &&
645
+ contentEditorItem.hasLayout &&
646
+ (!page || (page?.editRevision ?? "") != (revision ?? ""));
647
+ setIsRefreshing(isLoading && viewName === "page-editor");
648
+ if (!isLoading)
649
+ setInserting(undefined);
650
+ }, [page, viewName, revision]);
651
+ // moved below to ensure requestRefresh is declared first
652
+ const loadHistory = useDebouncedCallback(async (item) => {
653
+ const result = await getEditHistory(item);
654
+ if (handleErrorResult(result, ui, state))
655
+ return;
656
+ setEditHistory(result.data || []);
657
+ }, 200);
658
+ const refreshHistory = useCallback(async (item) => {
659
+ const result = await getEditHistory(item);
660
+ if (handleErrorResult(result, ui, state))
661
+ return;
662
+ setEditHistory(result.data || []);
663
+ }, []);
664
+ // defined below after loadItem/loadItemVersions/requestRefresh
665
+ const requestRefresh = useCallback((mode) => {
666
+ const refreshTimer = globalThis.editorRefreshTimer;
667
+ const doRefresh = () => {
668
+ const newRevision = uuid();
669
+ setRevision(newRevision);
670
+ globalThis.editorRefreshTimer = undefined;
671
+ };
672
+ if (mode === "immediate") {
673
+ doRefresh();
674
+ return;
675
+ }
676
+ if (mode === "waitForQuietPeriod" && refreshTimer) {
677
+ clearTimeout(refreshTimer);
678
+ }
679
+ if (!refreshTimer || mode === "waitForQuietPeriod") {
680
+ globalThis.editorRefreshTimer = setTimeout(() => {
681
+ doRefresh();
682
+ }, mode === "waitForQuietPeriod" ? 1200 : 700);
683
+ }
684
+ }, []);
685
+ useEffect(() => {
686
+ if (!currentItemDescriptor)
687
+ return;
688
+ loadComments();
689
+ loadSuggestedEdits();
690
+ }, [currentItemDescriptor]);
691
+ // Load available comment tags once per current item descriptor
692
+ useEffect(() => {
693
+ let cancelled = false;
694
+ const loadTags = async () => {
695
+ try {
696
+ if (!currentItemDescriptor) {
697
+ if (!cancelled)
698
+ setAvailableCommentTags([]);
699
+ return;
700
+ }
701
+ const tags = await getAvailableCommentTags(currentItemDescriptor);
702
+ if (!cancelled)
703
+ setAvailableCommentTags(tags || []);
704
+ }
705
+ catch {
706
+ if (!cancelled)
707
+ setAvailableCommentTags([]);
708
+ }
709
+ };
710
+ loadTags();
711
+ return () => {
712
+ cancelled = true;
713
+ };
714
+ }, [
715
+ currentItemDescriptor?.id,
716
+ currentItemDescriptor?.language,
717
+ currentItemDescriptor?.version,
718
+ ]);
719
+ // Load favorites on mount
720
+ useEffect(() => {
721
+ loadFavorites();
722
+ }, [loadFavorites]);
723
+ // Automatically focus the first rendered field when a new component is added
724
+ useEffect(() => {
725
+ async function setFocus() {
726
+ if (!focusFieldComponentId)
727
+ return;
728
+ const component = findComponent(focusFieldComponentId, page?.rootComponent?.placeholders ?? []);
729
+ if (component?.datasourceItem) {
730
+ const item = await itemsRepository.getItem(component.datasourceItem);
731
+ if (!item)
732
+ return;
733
+ const field = item.fields.find((f) => component.datasourceItem?.renderedFieldIds?.includes(f.id) &&
734
+ (f.type === "single-line text" ||
735
+ f.type === "multi-line text" ||
736
+ f.type === "rich text"));
737
+ if (field) {
738
+ setFocusedField(field.descriptor);
739
+ setFocusFieldComponentId(undefined);
740
+ }
741
+ }
742
+ }
743
+ if (mode === "edit")
744
+ setFocus();
745
+ }, [page]);
746
+ // Sync state to URL (only after initial load)
747
+ useEffect(() => {
748
+ if (isInitialLoad || !currentItemDescriptor)
749
+ return;
750
+ const current = new URLSearchParams(window.location.search);
751
+ if (current.get("itemid") !== currentItemDescriptor?.id) {
752
+ current.set("itemid", currentItemDescriptor.id);
753
+ }
754
+ if (current.get("lang") !== currentItemDescriptor?.language) {
755
+ current.set("lang", currentItemDescriptor.language);
756
+ }
757
+ if (current.get("version") !== currentItemDescriptor?.version.toString()) {
758
+ current.set("version", currentItemDescriptor.version.toString());
759
+ }
760
+ if (current.get("view") !== viewName) {
761
+ current.set("view", viewName);
762
+ }
763
+ if (!compareMode) {
764
+ current.delete("compare");
765
+ current.delete("compareLanguage");
766
+ current.delete("compareVersion");
767
+ current.delete("compareDevice");
768
+ }
769
+ else {
770
+ current.set("compare", "true");
771
+ }
772
+ current.set("mode", mode);
773
+ // Handle fullscreen parameter
774
+ if (pageViewContext.fullscreen) {
775
+ current.set("fullscreen", "true");
776
+ }
777
+ else {
778
+ current.delete("fullscreen");
779
+ }
780
+ // Handle wizard parameter
781
+ if (currentWizardId) {
782
+ current.set("wizardid", currentWizardId);
783
+ }
784
+ else {
785
+ current.delete("wizardid");
786
+ }
787
+ const newUrl = `${pathname}?${current.toString()}`;
788
+ const oldUrl = `${pathname}${window.location.search}`;
789
+ if (newUrl !== oldUrl) {
790
+ window.history.pushState(null, "", newUrl);
791
+ }
792
+ }, [
793
+ currentItemDescriptor,
794
+ viewName,
795
+ compareMode,
796
+ mode,
797
+ isInitialLoad,
798
+ pathname,
799
+ router,
800
+ pageViewContext.fullscreen,
801
+ currentWizardId,
802
+ ]);
803
+ useEffect(() => {
804
+ async function load() {
805
+ if (!currentItemDescriptor)
806
+ return;
807
+ const item = await itemsRepository.getItem(currentItemDescriptor);
808
+ setContentEditorItem(item);
809
+ if (!item)
810
+ return;
811
+ if (contentEditorItem?.descriptor.id === currentItemDescriptor.id &&
812
+ contentEditorItem?.descriptor.language ===
813
+ currentItemDescriptor.language &&
814
+ contentEditorItem?.descriptor.version !== item.version) {
815
+ showInfoToast({
816
+ summary: "New version!",
817
+ details: "New version of item loaded",
818
+ });
819
+ }
820
+ }
821
+ load();
822
+ }, [itemsRepository.revision]);
823
+ const addToBrowseHistory = useCallback((item) => {
824
+ const historyEntry = {
825
+ path: item.path || "unknown",
826
+ name: item.name || "unknown",
827
+ language: item.language,
828
+ templateName: item.templateName,
829
+ id: item.id,
830
+ hasLayout: item.hasLayout,
831
+ icon: item.icon,
832
+ version: item.version,
833
+ };
834
+ setBrowseHistory((history) => {
835
+ const newItem = item;
836
+ if (!newItem)
837
+ return history;
838
+ const newHistory = [
839
+ historyEntry,
840
+ ...history
841
+ .filter((x) => x.id !== newItem.id || x.language !== newItem.language)
842
+ .slice(0, 25),
843
+ ];
844
+ return newHistory;
845
+ });
846
+ }, [browseHistory, setBrowseHistory]);
847
+ // Add entry to navigation history (view + item combination)
848
+ const addNavigationEntry = useCallback((view, item) => {
849
+ const navEntry = {
850
+ viewName: view,
851
+ item: item
852
+ ? {
853
+ id: item.id,
854
+ language: item.language,
855
+ version: item.version,
856
+ }
857
+ : undefined,
858
+ timestamp: Date.now(),
859
+ displayName: view,
860
+ itemName: item?.name,
861
+ itemPath: item?.path,
862
+ itemIcon: item?.icon,
863
+ };
864
+ setNavigationHistory((history) => {
865
+ // Remove duplicates with same view + item identity (including version),
866
+ // and also handle entries with no item (both undefined)
867
+ const filtered = history.filter((entry) => {
868
+ const sameView = entry.viewName === view;
869
+ const bothNoItem = !entry.item && !item;
870
+ const sameItem = !!entry.item &&
871
+ !!item &&
872
+ entry.item.id === item.id &&
873
+ entry.item.language === item.language &&
874
+ entry.item.version === item.version;
875
+ return !(sameView && (bothNoItem || sameItem));
876
+ });
877
+ // Add new entry at the beginning and limit to 25 items
878
+ return [navEntry, ...filtered].slice(0, 25);
879
+ });
880
+ }, []);
881
+ const loadItem = useCallback(async (itemToLoad, options) => {
882
+ if (typeof itemToLoad === "string")
883
+ itemToLoad = {
884
+ id: itemToLoad,
885
+ language: contentEditorItem?.language || "en",
886
+ version: 0,
887
+ };
888
+ console.log("load item: " + itemToLoad.id, itemToLoad.language);
889
+ const item = await itemsRepository.getItem(itemToLoad);
890
+ if (!item) {
891
+ //TODO: Show error
892
+ console.log("item not found: ", itemToLoad.id, itemToLoad.language);
893
+ return undefined;
894
+ }
895
+ console.log("viewName: ", viewName);
896
+ if (!options?.skipViewChange &&
897
+ ((!item.hasLayout && viewName === "page-editor") ||
898
+ viewName == "splash-screen" ||
899
+ viewName == "control-center")) {
900
+ console.log("setting view name to content-tree");
901
+ setViewName("content-tree");
902
+ }
903
+ // ensure this is object has no additional properties
904
+ itemToLoad = getItemDescriptor(itemToLoad);
905
+ // Set state for the item (URL will be synced automatically by the state-to-URL effect)
906
+ setCurrentItemDescriptor(itemToLoad);
907
+ setContentEditorItem(item);
908
+ setSelection([]);
909
+ // Load history and add to browse history
910
+ loadHistory(itemToLoad);
911
+ if (options?.addToBrowseHistory ||
912
+ options?.addToBrowseHistory === undefined) {
913
+ addToBrowseHistory(item);
914
+ // Also add to navigation history with current view (unless skipped)
915
+ if (!options?.skipNavigationHistory) {
916
+ addNavigationEntry(viewName, item);
917
+ }
918
+ }
919
+ return item;
920
+ }, [
921
+ itemsRepository,
922
+ setContentEditorItem,
923
+ viewName,
924
+ loadHistory,
925
+ addToBrowseHistory,
926
+ addNavigationEntry,
927
+ ]);
928
+ useEditorUrlSync({
929
+ isInitialLoad,
930
+ setIsInitialLoad,
931
+ searchParams,
932
+ pathname,
933
+ setCurrentWizardId,
934
+ setViewName,
935
+ setCompareMode,
936
+ loadItem,
937
+ currentItemDescriptor,
938
+ loadItemDescriptor,
939
+ routerPush: (url) => router.push(url, { scroll: false }),
940
+ });
941
+ // initialized below after messageHandler
942
+ useEffect(() => {
943
+ if (pageViewContext.fullscreen &&
944
+ !searchParams.get("fullscreen") &&
945
+ !configuration.forceFullscreen)
946
+ setShowFullscreenHint(true);
947
+ }, [pageViewContext.fullscreen, configuration.forceFullscreen]);
948
+ const state = useMemo(() => ({
949
+ page,
950
+ configuration,
951
+ selection,
952
+ setSelection,
953
+ loadItem,
954
+ addToEditHistory,
955
+ setLockedField,
956
+ contentEditorItem,
957
+ sessionId,
958
+ requestRefresh,
959
+ lockedField,
960
+ itemsRepository,
961
+ user,
962
+ editHistory,
963
+ refreshHistory,
964
+ suggestedEdits,
965
+ setSuggestedEdits,
966
+ mode,
967
+ setFocusFieldComponentId,
968
+ setInsertMode,
969
+ }), [
970
+ page,
971
+ configuration,
972
+ selection,
973
+ setSelection,
974
+ loadItem,
975
+ addToEditHistory,
976
+ setLockedField,
977
+ contentEditorItem,
978
+ sessionId,
979
+ requestRefresh,
980
+ lockedField,
981
+ itemsRepository,
982
+ user,
983
+ editHistory,
984
+ refreshHistory,
985
+ suggestedEdits,
986
+ setSuggestedEdits,
987
+ mode,
988
+ setFocusFieldComponentId,
989
+ setInsertMode,
990
+ ]);
991
+ useEffect(() => {
992
+ if (currentOverlay !== "fields")
993
+ fieldEditorPopupRef.current?.close();
994
+ if (currentOverlay !== "context-menu")
995
+ contextMenuRef.current?.close({});
996
+ }, [currentOverlay]);
997
+ useEffect(() => {
998
+ loadItemVersions();
999
+ }, [currentItemDescriptor]);
1000
+ const loadItemVersions = useCallback(async () => {
1001
+ if (!currentItemDescriptorRef.current) {
1002
+ setItemVersions([]);
1003
+ setItemLanguages([]);
1004
+ return;
1005
+ }
1006
+ const result = await getLanguagesAndVersions(currentItemDescriptorRef.current);
1007
+ if (!result?.data) {
1008
+ setItemVersions([]);
1009
+ setItemLanguages([]);
1010
+ showErrorToast({
1011
+ summary: "Error",
1012
+ details: "Failed to load item versions",
1013
+ });
1014
+ return;
1015
+ }
1016
+ const v = [...result.data.versions].reverse() || [];
1017
+ setItemVersions(v);
1018
+ setItemLanguages(result.data.languages);
1019
+ }, [currentItemDescriptorRef.current, setItemVersions, setItemLanguages]);
1020
+ const showErrorToast = useCallback(({ summary, details }) => {
1021
+ toast.error(details || summary || "An error occurred");
1022
+ }, []);
1023
+ const showInfoToast = useCallback(({ summary, details }) => {
1024
+ toast.info(details || summary || "Information");
1025
+ }, []);
1026
+ const onOperationExecuted = useCallback((op) => {
1027
+ // Replace the operation in edit history with the executed operation
1028
+ setEditHistory((prev) => {
1029
+ const existingOpIndex = prev.findIndex((x) => x.id === op.id);
1030
+ if (existingOpIndex >= 0) {
1031
+ const next = [...prev];
1032
+ next[existingOpIndex] = op;
1033
+ return next;
1034
+ }
1035
+ return prev;
1036
+ });
1037
+ if (contentEditorItem?.id === op.mainItem?.id &&
1038
+ contentEditorItem?.language === op.mainItem?.language &&
1039
+ contentEditorItem?.version === op.mainItem?.version) {
1040
+ setInsertMode(false);
1041
+ }
1042
+ }, [contentEditorItem, setEditHistory, setInsertMode]);
1043
+ const ui = useMemo(() => ({
1044
+ showErrorToast,
1045
+ confirmationDialogRef,
1046
+ onOperationExecuted,
1047
+ }), [showErrorToast, confirmationDialogRef, onOperationExecuted]);
1048
+ // moved to useMediaSelector
1049
+ const { workboxItems } = useWorkbox({
1050
+ page,
1051
+ currentItemDescriptor,
1052
+ validate,
1053
+ });
1054
+ // WebSocket message handler and connection
1055
+ const messageHandler = useSocketMessageHandler({
1056
+ sessionId,
1057
+ setWebSocketMessages,
1058
+ setActiveSessions,
1059
+ sendClientInfo,
1060
+ itemsRepository,
1061
+ currentItemDescriptor,
1062
+ loadItem,
1063
+ loadItemVersions,
1064
+ setComments,
1065
+ setSuggestedEdits,
1066
+ setActiveFieldActions,
1067
+ setQuotaInfo,
1068
+ requestRefresh,
1069
+ currentItemRef,
1070
+ loadHistory,
1071
+ addRecentEdit,
1072
+ socketMessageListeners,
1073
+ isItemUsedInCurrentPage,
1074
+ });
1075
+ const { socketRef: socketInstanceRef } = useEditorWebSocket({
1076
+ sessionId,
1077
+ onMessage: messageHandler,
1078
+ onOpen: () => console.log("Connected!"),
1079
+ onError: (error) => console.error("WebSocket error:", error),
1080
+ connectSocket,
1081
+ requestQuota,
1082
+ sendClientInfo,
1083
+ });
1084
+ const switchView = (viewName, options) => {
1085
+ async function switchView() {
1086
+ if (currentView?.beforeClose && !options?.skipConfirmation) {
1087
+ const result = await currentView.beforeClose(editContext);
1088
+ if (!result)
1089
+ return;
1090
+ }
1091
+ // Track previous view name before switching
1092
+ setPreviousViewName(editContext.viewName);
1093
+ // Add to navigation history with current item (unless explicitly skipped)
1094
+ if (!options?.skipNavigationHistory) {
1095
+ addNavigationEntry(viewName, contentEditorItem);
1096
+ }
1097
+ if (typeof document.startViewTransition === "function") {
1098
+ document.startViewTransition(() => {
1099
+ flushSync(() => {
1100
+ setViewName(viewName);
1101
+ });
1102
+ });
1103
+ }
1104
+ else {
1105
+ setViewName(viewName);
1106
+ }
1107
+ }
1108
+ switchView();
1109
+ };
1110
+ // Listen for switch-view commands from agents via websocket
1111
+ useEffect(() => {
1112
+ const handleSwitchView = (message) => {
1113
+ if (message.type === "switch-view" && message.payload?.viewName) {
1114
+ try {
1115
+ switchView(message.payload.viewName);
1116
+ }
1117
+ catch (error) {
1118
+ console.error("Error switching view:", error);
1119
+ }
1120
+ }
1121
+ };
1122
+ const unsubscribe = addSocketMessageListener(handleSwitchView);
1123
+ return () => {
1124
+ unsubscribe();
1125
+ };
1126
+ }, [addSocketMessageListener, switchView]);
1127
+ const [dialog, setDialog] = useState(null);
1128
+ const openDialog = useCallback((Component, props) => {
1129
+ // Ensure any existing overlays (e.g., context menu) are closed before opening dialogs
1130
+ try {
1131
+ setCurrentOverlay(undefined);
1132
+ }
1133
+ catch { }
1134
+ return new Promise((resolve) => {
1135
+ const handleClose = (result) => {
1136
+ setDialog(null);
1137
+ resolve(result);
1138
+ };
1139
+ // Delay mounting one tick to let overlay closure propagate
1140
+ setTimeout(() => {
1141
+ setDialog(_jsx(Component, { ...props, onClose: handleClose }));
1142
+ }, 0);
1143
+ });
1144
+ }, [setDialog, setCurrentOverlay]);
1145
+ const executeCommand = useCallback(async ({ command, event, data, }) => {
1146
+ if (!editContextRef.current)
1147
+ return;
1148
+ const context = {
1149
+ editContext: editContextRef.current,
1150
+ pathname,
1151
+ router,
1152
+ searchParams,
1153
+ openDialog: openDialog,
1154
+ event,
1155
+ data,
1156
+ };
1157
+ const result = await command.execute(context);
1158
+ return result;
1159
+ }, [editContextRef, pathname, router, searchParams, openDialog]);
1160
+ const operationsContext = getOperationsContext(state, ui);
1161
+ const operations = operationsContext.ops;
1162
+ // Shared focused field setter with lock handling (used in both contexts)
1163
+ const setFocusedFieldWithLock = useCallback(async (field, requestLock) => {
1164
+ console.log("[setFocusedFieldWithLock] Called with:", {
1165
+ field: field
1166
+ ? {
1167
+ fieldId: field.fieldId,
1168
+ itemId: field.item?.id,
1169
+ language: field.item?.language,
1170
+ version: field.item?.version,
1171
+ }
1172
+ : undefined,
1173
+ requestLock,
1174
+ ignoreBlur,
1175
+ timestamp: new Date().toISOString(),
1176
+ });
1177
+ if (field) {
1178
+ setIgnoreBlur(true);
1179
+ setTimeout(() => {
1180
+ setIgnoreBlur(false);
1181
+ }, 20);
1182
+ setFocusedField({ ...field });
1183
+ if (requestLock) {
1184
+ console.log("[setFocusedFieldWithLock] Calling operations.ensureLock for field:", field.fieldId);
1185
+ const lockResult = (await operations.ensureLock(field)) || false;
1186
+ console.log("[setFocusedFieldWithLock] ensureLock result:", lockResult);
1187
+ return lockResult;
1188
+ }
1189
+ }
1190
+ else {
1191
+ console.log("[setFocusedFieldWithLock] Clearing focused field, ignoreBlur:", ignoreBlur);
1192
+ if (!ignoreBlur) {
1193
+ setFocusedField(undefined);
1194
+ console.log("[setFocusedFieldWithLock] Clearing lockedField state");
1195
+ setLockedField(undefined); // Clear client-side lock state
1196
+ releaseFieldLocks(sessionId);
1197
+ }
1198
+ }
1199
+ return true;
1200
+ }, [operations, ignoreBlur, sessionId]);
1201
+ // Quick switcher handlers
1202
+ const showQuickSwitcher = useCallback((show) => {
1203
+ console.log(`[QuickSwitcher] showQuickSwitcher called: show=${show}, historyLength=${navigationHistory.length}`);
1204
+ if (show && navigationHistory.length > 1) {
1205
+ setQuickSwitcherVisible(true);
1206
+ // Start with index 1 (second entry - previous entry) for quick switching
1207
+ setQuickSwitcherSelectedIndex(1);
1208
+ console.log("[QuickSwitcher] Switcher opened, selected index: 1");
1209
+ console.log("[QuickSwitcher] Navigation history:", navigationHistory.map((h, i) => `[${i}] ${h.displayName}`));
1210
+ }
1211
+ else {
1212
+ setQuickSwitcherVisible(false);
1213
+ console.log("[QuickSwitcher] Switcher closed");
1214
+ }
1215
+ }, [navigationHistory]);
1216
+ const cycleQuickSwitcher = useCallback((direction) => {
1217
+ console.log(`[QuickSwitcher] cycleQuickSwitcher: direction=${direction}, visible=${quickSwitcherVisible}`);
1218
+ if (!quickSwitcherVisible)
1219
+ return;
1220
+ const maxItems = Math.min(5, navigationHistory.length);
1221
+ setQuickSwitcherSelectedIndex((current) => {
1222
+ let newIndex = current;
1223
+ // Determine grid layout (responsive columns)
1224
+ // Matches the grid in QuickItemSwitcher: 2/3/4/5 columns
1225
+ const getColumnsForWidth = () => {
1226
+ const width = window.innerWidth;
1227
+ if (width >= 1280)
1228
+ return 5; // xl
1229
+ if (width >= 1024)
1230
+ return 4; // lg
1231
+ if (width >= 768)
1232
+ return 3; // md
1233
+ return 2; // default
1234
+ };
1235
+ const columns = getColumnsForWidth();
1236
+ switch (direction) {
1237
+ case "next":
1238
+ newIndex = (current + 1) % maxItems;
1239
+ break;
1240
+ case "prev":
1241
+ newIndex = (current - 1 + maxItems) % maxItems;
1242
+ break;
1243
+ case "down":
1244
+ newIndex = current + columns;
1245
+ if (newIndex >= maxItems) {
1246
+ // Wrap to first row
1247
+ newIndex = current % columns;
1248
+ }
1249
+ break;
1250
+ case "up":
1251
+ newIndex = current - columns;
1252
+ if (newIndex < 0) {
1253
+ // Wrap to last row
1254
+ const currentCol = current % columns;
1255
+ const rows = Math.ceil(maxItems / columns);
1256
+ newIndex = (rows - 1) * columns + currentCol;
1257
+ if (newIndex >= maxItems) {
1258
+ newIndex = maxItems - columns + currentCol;
1259
+ }
1260
+ }
1261
+ break;
1262
+ }
1263
+ console.log(`[QuickSwitcher] Cycling from index ${current} to ${newIndex} (${columns} columns)`);
1264
+ return newIndex;
1265
+ });
1266
+ }, [quickSwitcherVisible, browseHistory]);
1267
+ const handleQuickSwitcherSelect = useCallback((index) => {
1268
+ console.log(`[QuickSwitcher] Selecting entry at index ${index}`);
1269
+ const selectedEntry = navigationHistory[index];
1270
+ if (selectedEntry) {
1271
+ console.log(`[QuickSwitcher] Navigating to:`, selectedEntry);
1272
+ // First switch view
1273
+ if (selectedEntry.viewName !== viewName) {
1274
+ // Avoid inserting a duplicate navigation entry; we'll explicitly move the
1275
+ // selected one to the front below
1276
+ switchView(selectedEntry.viewName, {
1277
+ skipConfirmation: true,
1278
+ skipNavigationHistory: true,
1279
+ });
1280
+ }
1281
+ // Then load item if it exists and is different from current
1282
+ if (selectedEntry.item) {
1283
+ const isDifferentItem = !contentEditorItem ||
1284
+ contentEditorItem.id !== selectedEntry.item.id ||
1285
+ contentEditorItem.language !== selectedEntry.item.language ||
1286
+ contentEditorItem.version !== selectedEntry.item.version;
1287
+ if (isDifferentItem) {
1288
+ console.log(`[QuickSwitcher] Loading different item:`, selectedEntry.item);
1289
+ loadItem({
1290
+ id: selectedEntry.item.id,
1291
+ language: selectedEntry.item.language,
1292
+ version: selectedEntry.item.version,
1293
+ }, {
1294
+ addToBrowseHistory: false,
1295
+ skipViewChange: true,
1296
+ // Avoid inserting an extra nav entry; we move the selected one below
1297
+ skipNavigationHistory: true,
1298
+ });
1299
+ }
1300
+ else {
1301
+ console.log(`[QuickSwitcher] Same item, skipping reload`);
1302
+ }
1303
+ }
1304
+ // Move selected entry to first position in navigation history by identity
1305
+ setNavigationHistory((history) => {
1306
+ const filtered = history.filter((entry) => {
1307
+ const sameView = entry.viewName === selectedEntry.viewName;
1308
+ const bothNoItem = !entry.item && !selectedEntry.item;
1309
+ const sameItem = !!entry.item &&
1310
+ !!selectedEntry.item &&
1311
+ entry.item.id === selectedEntry.item.id &&
1312
+ entry.item.language === selectedEntry.item.language &&
1313
+ entry.item.version === selectedEntry.item.version;
1314
+ return !(sameView && (bothNoItem || sameItem));
1315
+ });
1316
+ return [selectedEntry, ...filtered].slice(0, 25);
1317
+ });
1318
+ }
1319
+ setQuickSwitcherVisible(false);
1320
+ }, [
1321
+ navigationHistory,
1322
+ loadItem,
1323
+ switchView,
1324
+ viewName,
1325
+ contentEditorItem,
1326
+ setNavigationHistory,
1327
+ ]);
1328
+ const { handleKeyDown } = useKeyboardNavigation({
1329
+ editContextRef,
1330
+ operations,
1331
+ pageViewContext,
1332
+ configuration,
1333
+ contentEditorItem,
1334
+ browseHistory,
1335
+ loadItem,
1336
+ showInfoToast,
1337
+ showErrorToast,
1338
+ executeCommand,
1339
+ showQuickSwitcher,
1340
+ cycleQuickSwitcher,
1341
+ });
1342
+ useGlobalEditorKeyDown(handleKeyDown);
1343
+ // Global keydown/keyup handler to manage quick switcher
1344
+ useEffect(() => {
1345
+ const handleKeyDown = (event) => {
1346
+ if (!quickSwitcherVisible)
1347
+ return;
1348
+ // Enter to select and close
1349
+ if (event.key === "Enter") {
1350
+ event.preventDefault();
1351
+ handleQuickSwitcherSelect(quickSwitcherSelectedIndex);
1352
+ }
1353
+ };
1354
+ const handleKeyUp = (event) => {
1355
+ // Close on Escape without selecting
1356
+ if (event.key === "Escape" && quickSwitcherVisible) {
1357
+ setQuickSwitcherVisible(false);
1358
+ }
1359
+ // Close and select when releasing Ctrl, Alt, or Meta (Win key)
1360
+ if ((event.key === "Control" ||
1361
+ event.key === "Alt" ||
1362
+ event.key === "Meta") &&
1363
+ quickSwitcherVisible) {
1364
+ // Small delay to ensure the key release is not part of the initial trigger
1365
+ setTimeout(() => {
1366
+ handleQuickSwitcherSelect(quickSwitcherSelectedIndex);
1367
+ }, 50);
1368
+ }
1369
+ };
1370
+ if (typeof window !== "undefined") {
1371
+ window.addEventListener("keydown", handleKeyDown);
1372
+ window.addEventListener("keyup", handleKeyUp);
1373
+ return () => {
1374
+ window.removeEventListener("keydown", handleKeyDown);
1375
+ window.removeEventListener("keyup", handleKeyUp);
1376
+ };
1377
+ }
1378
+ }, [
1379
+ quickSwitcherVisible,
1380
+ quickSwitcherSelectedIndex,
1381
+ handleQuickSwitcherSelect,
1382
+ ]);
1383
+ // Global ctrl+click handler for GUID detection and navigation
1384
+ useEffect(() => {
1385
+ const isGuid = (text) => {
1386
+ // Match GUID patterns with or without braces/curly brackets
1387
+ const guidPattern = /^[\{\(]?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}[\}\)]?$/;
1388
+ return guidPattern.test(text.trim());
1389
+ };
1390
+ const extractGuidFromText = (text) => {
1391
+ // Remove quotes, whitespace, and other JSON formatting characters
1392
+ const cleaned = text.replace(/["'\s]/g, "");
1393
+ if (isGuid(cleaned)) {
1394
+ return cleaned;
1395
+ }
1396
+ // Try to find GUID within the text using regex
1397
+ const guidPattern = /[\{\(]?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}[\}\)]?/;
1398
+ const match = text.match(guidPattern);
1399
+ return match ? match[0] : null;
1400
+ };
1401
+ const getTextFromElement = (element) => {
1402
+ if (!element)
1403
+ return null;
1404
+ // First, check if there's a text selection - user might have selected the GUID
1405
+ const selection = window.getSelection();
1406
+ if (selection && !selection.isCollapsed) {
1407
+ const selectedText = selection.toString();
1408
+ const guid = extractGuidFromText(selectedText);
1409
+ if (guid)
1410
+ return guid;
1411
+ }
1412
+ // Try to get text content from the element itself
1413
+ const textContent = element.textContent?.trim();
1414
+ if (textContent) {
1415
+ const guid = extractGuidFromText(textContent);
1416
+ if (guid)
1417
+ return guid;
1418
+ }
1419
+ // Check if we clicked on a text node's parent
1420
+ if (element.childNodes.length === 1) {
1421
+ const firstChild = element.childNodes[0];
1422
+ if (firstChild && firstChild.nodeType === Node.TEXT_NODE) {
1423
+ const text = firstChild.textContent?.trim();
1424
+ if (text) {
1425
+ const guid = extractGuidFromText(text);
1426
+ if (guid)
1427
+ return guid;
1428
+ }
1429
+ }
1430
+ }
1431
+ // Walk up the parent tree to find a parent that might contain a GUID
1432
+ // This helps with JSON viewers where the GUID is split across elements
1433
+ let currentElement = element;
1434
+ let depth = 0;
1435
+ while (currentElement && depth < 5) {
1436
+ const parentText = currentElement.textContent?.trim();
1437
+ if (parentText && parentText.length < 200) {
1438
+ // Avoid huge text blocks
1439
+ const guid = extractGuidFromText(parentText);
1440
+ if (guid)
1441
+ return guid;
1442
+ }
1443
+ currentElement = currentElement.parentElement;
1444
+ depth++;
1445
+ }
1446
+ // Try to find GUIDs in nearby text
1447
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null);
1448
+ let node;
1449
+ while ((node = walker.nextNode())) {
1450
+ const text = node.textContent?.trim();
1451
+ if (text) {
1452
+ const guid = extractGuidFromText(text);
1453
+ if (guid)
1454
+ return guid;
1455
+ }
1456
+ }
1457
+ return null;
1458
+ };
1459
+ const handleCtrlClick = async (event) => {
1460
+ // Only proceed if Ctrl (or Cmd on Mac) is pressed
1461
+ if (!event.ctrlKey && !event.metaKey)
1462
+ return;
1463
+ const target = event.target;
1464
+ const text = getTextFromElement(target);
1465
+ if (text && isGuid(text)) {
1466
+ event.preventDefault();
1467
+ event.stopPropagation();
1468
+ // Clean the GUID (remove braces/brackets)
1469
+ const cleanedGuid = cleanId(text);
1470
+ if (cleanedGuid) {
1471
+ try {
1472
+ // Try to load the item
1473
+ const item = await loadItem(cleanedGuid);
1474
+ if (item) {
1475
+ showInfoToast({
1476
+ summary: "Navigated to item",
1477
+ details: `Opened item: ${item.name}`,
1478
+ });
1479
+ }
1480
+ else {
1481
+ showErrorToast({
1482
+ summary: "Item not found",
1483
+ details: `Could not find item with ID: ${text}`,
1484
+ });
1485
+ }
1486
+ }
1487
+ catch (error) {
1488
+ console.error("Error loading item:", error);
1489
+ showErrorToast({
1490
+ summary: "Navigation error",
1491
+ details: `Failed to load item: ${text}`,
1492
+ });
1493
+ }
1494
+ }
1495
+ }
1496
+ };
1497
+ if (typeof document !== "undefined") {
1498
+ document.addEventListener("click", handleCtrlClick, true);
1499
+ return () => {
1500
+ document.removeEventListener("click", handleCtrlClick, true);
1501
+ };
1502
+ }
1503
+ }, [loadItem, showInfoToast, showErrorToast]);
1504
+ useEffect(() => {
1505
+ const handleGlobalBlur = () => {
1506
+ operations.onFieldBlur?.();
1507
+ };
1508
+ if (typeof document !== "undefined") {
1509
+ document.addEventListener("blur", handleGlobalBlur, true);
1510
+ return () => {
1511
+ document.removeEventListener("blur", handleGlobalBlur, true);
1512
+ };
1513
+ }
1514
+ }, [operations.onFieldBlur]);
1515
+ useEffect(() => {
1516
+ if (mode === "suggestions") {
1517
+ setShowSuggestedEdits(true);
1518
+ }
1519
+ else {
1520
+ setShowSuggestedEdits(false);
1521
+ }
1522
+ }, [mode]);
1523
+ const isReadOnly = !contentEditorItem ||
1524
+ !contentEditorItem.canWriteItem ||
1525
+ !contentEditorItem.canWriteLanguage ||
1526
+ !contentEditorItem.canWriteWorkflow ||
1527
+ // Block editing until server acknowledges client-info for the current item
1528
+ (currentItemDescriptor ? !isClientInfoAcknowledged : false);
1529
+ const updateUrl = useCallback((params) => {
1530
+ const url = new URL(window.location.href);
1531
+ const oldUrl = url.toString();
1532
+ Object.entries(params).forEach(([key, value]) => {
1533
+ if (value)
1534
+ url.searchParams.set(key, value);
1535
+ else
1536
+ url.searchParams.delete(key);
1537
+ });
1538
+ const newUrl = url.toString();
1539
+ router.push(newUrl, { scroll: false });
1540
+ }, [router]);
1541
+ // Calculate visible views separately to avoid circular dependency
1542
+ const visibleViews = useMemo(() => {
1543
+ const allViews = configuration.editor.views
1544
+ ?.filter((x) => {
1545
+ // For this calculation, we'll pass null for editContext since we're building it
1546
+ // The visibility check will be recalculated after editContext is available
1547
+ return !x.visible && !x.hidden;
1548
+ })
1549
+ .filter((x) => !userInfo.views ||
1550
+ userInfo.views.map((view) => view.name).includes(x.name)) ?? [];
1551
+ const pinnedViews = userInfo.preferences?.pinnedViews ||
1552
+ configuration.editor.defaultPinnedViews ||
1553
+ [];
1554
+ return allViews.filter((view) =>
1555
+ // Always show selected view
1556
+ view.name === viewName ||
1557
+ // Show pinned views
1558
+ pinnedViews.includes(view.name));
1559
+ }, [
1560
+ configuration.editor.views,
1561
+ userInfo.views,
1562
+ userInfo.preferences?.pinnedViews,
1563
+ configuration.editor.defaultPinnedViews,
1564
+ viewName,
1565
+ ]);
1566
+ // Handle initial mode setup from URL (only on initial load)
1567
+ useEffect(() => {
1568
+ if (!isInitialLoad)
1569
+ return;
1570
+ const queryMode = searchParams.get("mode");
1571
+ if (queryMode) {
1572
+ setMode(queryMode);
1573
+ }
1574
+ }, [searchParams, isInitialLoad]);
1575
+ // Add this new effect for initial fullscreen setup
1576
+ useEffect(() => {
1577
+ if (!isInitialLoad)
1578
+ return;
1579
+ const isFullscreen = searchParams.get("fullscreen") === "true";
1580
+ if (isFullscreen !== pageViewContext.fullscreen) {
1581
+ pageViewContext.setFullscreen(isFullscreen);
1582
+ }
1583
+ }, [searchParams, isInitialLoad, pageViewContext]);
1584
+ const editContext = useMemo(() => {
1585
+ // console.log('🔄 EditContext useMemo is being recalculated');
1586
+ // Simple registry for per-view context factories (e.g., GraphQL context)
1587
+ // Stored outside the EditContext object via ref to avoid re-renders
1588
+ if (!globalThis.__editorContextFactoriesRef) {
1589
+ globalThis.__editorContextFactoriesRef = {
1590
+ map: new Map(),
1591
+ };
1592
+ }
1593
+ const factoriesRef = globalThis.__editorContextFactoriesRef;
1594
+ const context = {
1595
+ operations: operationsContext.ops,
1596
+ itemsRepository,
1597
+ configuration,
1598
+ updateUrl,
1599
+ openSplashScreen: () => {
1600
+ const currentParams = new URLSearchParams(window.location.search);
1601
+ const preservedParams = new URLSearchParams();
1602
+ if (currentParams.get("fullscreen") === "true") {
1603
+ preservedParams.set("fullscreen", "true");
1604
+ }
1605
+ const queryString = preservedParams.toString();
1606
+ const newUrl = queryString ? `/parhelia?${queryString}` : "/parhelia";
1607
+ router.push(newUrl);
1608
+ },
1609
+ item: contentEditorItem || page?.item,
1610
+ itemLanguages,
1611
+ itemVersions,
1612
+ sessionId: sessionId,
1613
+ readonly: isReadOnly,
1614
+ selection,
1615
+ select: (ids) => {
1616
+ try {
1617
+ console.log("[DND][EditContext] select", ids);
1618
+ }
1619
+ catch { }
1620
+ setSelection(ids);
1621
+ },
1622
+ selectedForInsertion,
1623
+ setSelectedForInsertion,
1624
+ dragObject,
1625
+ workboxItems,
1626
+ requestRefresh,
1627
+ refreshCompletedFlag,
1628
+ openCreatePageDialog: () => {
1629
+ const current = new URLSearchParams(searchParams.toString());
1630
+ current.delete("version");
1631
+ current.delete("itemid");
1632
+ current.delete("view");
1633
+ current.set("create", "1");
1634
+ const newUrl = `${pathname}?${current.toString()}`;
1635
+ const oldUrl = `${pathname}?${searchParams.toString()}`;
1636
+ router.push(newUrl, { scroll: false });
1637
+ },
1638
+ selectMedia: media.selectMedia,
1639
+ showToast: (message) => {
1640
+ toast(message);
1641
+ },
1642
+ scrollIntoView,
1643
+ setScrollIntoView,
1644
+ focusedField,
1645
+ setFocusedField: setFocusedFieldWithLock,
1646
+ renderedFields,
1647
+ setRenderedFields,
1648
+ getComponentCommands: async (components) => {
1649
+ return await getComponentCommands(components, editContext);
1650
+ },
1651
+ dragStart: (dragObject) => {
1652
+ setDragObject(dragObject);
1653
+ },
1654
+ dragEnd: () => {
1655
+ setDragObject(undefined);
1656
+ },
1657
+ droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption) => {
1658
+ if ((!dragObject && !insertOption) || !page)
1659
+ return;
1660
+ setDragObject(undefined);
1661
+ if (spotPositionElement && spotPositionAnchor) {
1662
+ setInserting({
1663
+ positionElement: spotPositionElement,
1664
+ positionAnchor: spotPositionAnchor,
1665
+ });
1666
+ }
1667
+ const placeholderKeyComponents = placeholderKey.split("_");
1668
+ const parentId = placeholderKeyComponents.length === 1
1669
+ ? undefined
1670
+ : placeholderKeyComponents[1];
1671
+ if (parentId)
1672
+ setSelection([parentId]);
1673
+ let op;
1674
+ if (!currentItemDescriptorRef.current)
1675
+ return;
1676
+ if (insertOption) {
1677
+ operations.addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current);
1678
+ return;
1679
+ }
1680
+ if (!dragObject)
1681
+ return;
1682
+ if (dragObject && dragObject.type == "template") {
1683
+ operations.addComponent(dragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current);
1684
+ return;
1685
+ }
1686
+ console.log("dragObject", dragObject);
1687
+ if (dragObject.type == "component" ||
1688
+ (dragObject.type == "items" && dragObject.items)) {
1689
+ const parentComponent = parentId && page ? getComponentById(parentId, page) : null;
1690
+ if (dragObject.type == "items" && dragObject.items) {
1691
+ op = {
1692
+ type: "link-component",
1693
+ mainItem: page.item.descriptor,
1694
+ parent: parentId && {
1695
+ id: parentId,
1696
+ language: page.item.descriptor.language,
1697
+ version: page.item.descriptor.version,
1698
+ name: parentComponent?.name,
1699
+ },
1700
+ placeholderKey,
1701
+ placeholderIndex: index,
1702
+ date: new Date().toISOString(),
1703
+ id: uuid(),
1704
+ linkedComponentItem: dragObject.items[0],
1705
+ description: "Link component",
1706
+ };
1707
+ console.log("op", op);
1708
+ }
1709
+ else {
1710
+ const componentIds = dragObject.components?.map((c) => c.id) ?? [];
1711
+ if (componentIds.length === 0)
1712
+ return;
1713
+ op = {
1714
+ type: "move-component",
1715
+ mainItem: page.item.descriptor,
1716
+ parent: parentId && {
1717
+ id: parentId,
1718
+ language: page.item.descriptor.language,
1719
+ version: page.item.descriptor.version,
1720
+ },
1721
+ placeholderKey,
1722
+ placeholderIndex: index,
1723
+ componentIds,
1724
+ date: new Date().toISOString(),
1725
+ id: uuid(),
1726
+ description: "Move component",
1727
+ };
1728
+ }
1729
+ }
1730
+ if (op)
1731
+ operations.executeEditOperation(op);
1732
+ },
1733
+ page,
1734
+ triggerFieldAction: async (fieldDescriptor, actionButton, parameters) => {
1735
+ const field = await itemsRepository.getField(fieldDescriptor);
1736
+ if (!field)
1737
+ return;
1738
+ const op = {
1739
+ field: fieldDescriptor,
1740
+ // actionButton,
1741
+ label: actionButton.label,
1742
+ state: "running",
1743
+ };
1744
+ const fieldItem = fieldDescriptor.item;
1745
+ if ("clientAction" in actionButton) {
1746
+ await actionButton.clientAction({
1747
+ field,
1748
+ editContext,
1749
+ //dialogContext,
1750
+ });
1751
+ }
1752
+ console.log("Field action before setActiveFieldActions");
1753
+ if (actionButton.action) {
1754
+ setActiveFieldActions((prevFieldActions) => {
1755
+ const isSameField = (x) => x.field.fieldId == fieldDescriptor.fieldId &&
1756
+ x.field.item.id == fieldItem.id &&
1757
+ x.field.item.language == fieldItem.language &&
1758
+ x.field.item.version == fieldItem.version;
1759
+ const existing = prevFieldActions.find(isSameField);
1760
+ // Preserve any existing state/message (e.g., an early websocket error)
1761
+ // to avoid overwriting it with a stale "running" state
1762
+ const mergedOp = existing
1763
+ ? {
1764
+ ...op,
1765
+ state: existing.state,
1766
+ message: existing.message,
1767
+ label: existing.label ?? op.label,
1768
+ }
1769
+ : op;
1770
+ return [
1771
+ ...prevFieldActions.filter((x) => !isSameField(x)),
1772
+ mergedOp,
1773
+ ];
1774
+ });
1775
+ console.log("Field action after setActiveFieldActions");
1776
+ try {
1777
+ await executeFieldServerAction(fieldDescriptor.item, fieldDescriptor.fieldId, contentEditorItem.descriptor, actionButton.action, editContext.sessionId, selectedRange?.text || "", parameters || {}, (data) => {
1778
+ console.log("Field action progress", data);
1779
+ // Update progress message if available
1780
+ if (data?.responseText) {
1781
+ op.message = data.responseText;
1782
+ setActiveFieldActions((prevFieldActions) => [
1783
+ ...prevFieldActions,
1784
+ ]);
1785
+ }
1786
+ });
1787
+ console.log("Field action completed", op);
1788
+ itemsRepository.refreshItems([fieldDescriptor.item]);
1789
+ // Only mark as success if no websocket error has been reported
1790
+ if (op.state === "running") {
1791
+ op.state = "success";
1792
+ // Auto-dismiss successful actions after a brief delay
1793
+ setTimeout(() => {
1794
+ setActiveFieldActions((prevFieldActions) => prevFieldActions.filter((x) => !(x.field.fieldId === fieldDescriptor.fieldId &&
1795
+ x.field.item.id === fieldDescriptor.item.id &&
1796
+ x.field.item.language ===
1797
+ fieldDescriptor.item.language &&
1798
+ x.field.item.version === fieldDescriptor.item.version &&
1799
+ x.state === "success")));
1800
+ }, 500);
1801
+ }
1802
+ requestRefresh("immediate");
1803
+ }
1804
+ catch (error) {
1805
+ console.error("Field action failed", error);
1806
+ // Mark as failed and show error message
1807
+ op.state = "error";
1808
+ op.message =
1809
+ error instanceof Error ? error.message : "Field action failed";
1810
+ // Update the field action state to show error
1811
+ setActiveFieldActions((prevFieldActions) => {
1812
+ const isSameField = (x) => x.field.fieldId == fieldDescriptor.fieldId &&
1813
+ x.field.item.id == fieldItem.id &&
1814
+ x.field.item.language == fieldItem.language &&
1815
+ x.field.item.version == fieldItem.version;
1816
+ return [...prevFieldActions.filter((x) => !isSameField(x)), op];
1817
+ });
1818
+ // Auto-dismiss error after a longer delay
1819
+ setTimeout(() => {
1820
+ setActiveFieldActions((prevFieldActions) => prevFieldActions.filter((x) => !(x.field.fieldId === fieldDescriptor.fieldId &&
1821
+ x.field.item.id === fieldDescriptor.item.id &&
1822
+ x.field.item.language === fieldDescriptor.item.language &&
1823
+ x.field.item.version === fieldDescriptor.item.version)));
1824
+ }, 3000);
1825
+ }
1826
+ }
1827
+ },
1828
+ dismissFieldAction: (fieldDescriptor) => {
1829
+ setActiveFieldActions((prevFieldActions) => prevFieldActions.filter((x) => !(x.field.fieldId === fieldDescriptor.fieldId &&
1830
+ x.field.item.id === fieldDescriptor.item.id &&
1831
+ x.field.item.language === fieldDescriptor.item.language &&
1832
+ x.field.item.version === fieldDescriptor.item.version)));
1833
+ },
1834
+ activeFieldActions,
1835
+ showContextMenu: (event, items) => {
1836
+ contextMenuRef.current?.show(event, items);
1837
+ setCurrentOverlay("context-menu");
1838
+ },
1839
+ updateContextMenu: (items) => {
1840
+ contextMenuRef.current?.update(items);
1841
+ },
1842
+ showFieldEditorPopup: (fields, sections, ev) => {
1843
+ setCurrentOverlay("fields");
1844
+ fieldEditorPopupRef.current?.show(fields, sections, ev);
1845
+ },
1846
+ showEditorFormPopup: (event, activeTab) => {
1847
+ setCurrentOverlay("editor-form");
1848
+ editorFormPopupRef.current?.show(event, activeTab);
1849
+ },
1850
+ inserting,
1851
+ validating,
1852
+ validationResult,
1853
+ contentEditorItem,
1854
+ loadItem,
1855
+ editHistory,
1856
+ isRefreshing,
1857
+ activeSessions,
1858
+ unlockField: async () => {
1859
+ console.log("[EditContext.unlockField] Clearing lockedField state");
1860
+ setLockedField(undefined); // Clear client-side lock state
1861
+ await releaseFieldLocks(sessionId);
1862
+ },
1863
+ isCommandDisabled: ({ command, data, }) => {
1864
+ const props = {
1865
+ editContext,
1866
+ pathname,
1867
+ router,
1868
+ searchParams,
1869
+ data,
1870
+ openDialog,
1871
+ };
1872
+ return command.disabled(props);
1873
+ },
1874
+ executeCommand,
1875
+ viewName,
1876
+ previousViewName,
1877
+ switchView,
1878
+ compareMode,
1879
+ setCompareMode,
1880
+ view: currentView,
1881
+ visibleViews,
1882
+ pageView: pageViewContext,
1883
+ componentDesignerComponent,
1884
+ setComponentDesignerComponent,
1885
+ componentDesignerRendering,
1886
+ setComponentDesignerRendering,
1887
+ insertMode,
1888
+ setInsertMode,
1889
+ currentOverlay,
1890
+ setCurrentOverlay,
1891
+ inlineEditingFieldElement,
1892
+ setInlineEditingFieldElement,
1893
+ lockedField,
1894
+ timings,
1895
+ setTimings,
1896
+ selectedRange,
1897
+ setSelectedRange,
1898
+ confirmationDialogRef,
1899
+ confirm: (props) => {
1900
+ confirmationDialogRef.current?.confirm(props);
1901
+ },
1902
+ showMessageDialog: (props) => {
1903
+ confirmationDialogRef.current?.confirm({
1904
+ header: props.header,
1905
+ message: props.message,
1906
+ accept: () => { },
1907
+ acceptLabel: "Ok",
1908
+ });
1909
+ },
1910
+ browseHistory,
1911
+ setCenterPanelView,
1912
+ handleKeyDown,
1913
+ startTour,
1914
+ addSocketMessageListener,
1915
+ currentItemDescriptor,
1916
+ compareTo,
1917
+ setCompareTo,
1918
+ revision,
1919
+ selectedComment,
1920
+ setSelectedComment,
1921
+ comments,
1922
+ availableCommentTags,
1923
+ loadComments,
1924
+ setComments,
1925
+ showComments,
1926
+ setShowComments,
1927
+ showResolvedComments,
1928
+ setShowResolvedComments,
1929
+ addComment: async () => {
1930
+ const descriptor = contentEditorItem?.descriptor;
1931
+ if (!descriptor)
1932
+ return;
1933
+ const itemId = focusedFieldRef.current?.item.id ||
1934
+ (selection.length > 0 ? selection[0] : undefined) ||
1935
+ descriptor.id;
1936
+ if (!itemId)
1937
+ return;
1938
+ const language = descriptor.language;
1939
+ const version = descriptor.version;
1940
+ const getFieldName = async () => {
1941
+ if (!focusedFieldRef.current)
1942
+ return "";
1943
+ const field = await itemsRepository.getField(focusedFieldRef.current);
1944
+ return field?.name;
1945
+ };
1946
+ const getItemName = async () => {
1947
+ const item = await itemsRepository.getItem({
1948
+ id: itemId,
1949
+ language,
1950
+ version,
1951
+ });
1952
+ return item?.name;
1953
+ };
1954
+ const newComment = {
1955
+ id: uuid(),
1956
+ isNew: true,
1957
+ itemId,
1958
+ itemName: await getItemName(),
1959
+ fieldId: focusedFieldRef.current?.fieldId,
1960
+ fieldName: await getFieldName(),
1961
+ mainItemId: descriptor.id,
1962
+ language,
1963
+ version,
1964
+ position: 0,
1965
+ rangeStart: selectedRange?.startOffset || 0,
1966
+ rangeEnd: selectedRange?.endOffset || 0,
1967
+ author: user?.name,
1968
+ authorDisplayName: user?.fullName,
1969
+ date: new Date().toISOString(),
1970
+ };
1971
+ setComments([newComment, ...comments]);
1972
+ setSelectedComment(newComment);
1973
+ setShowComments(true);
1974
+ },
1975
+ mode,
1976
+ setMode,
1977
+ user,
1978
+ reviews,
1979
+ statusMessage,
1980
+ setStatusMessage,
1981
+ suggestedEdits,
1982
+ showSuggestedEdits,
1983
+ setShowSuggestedEdits,
1984
+ showSuggestedEditsDiff,
1985
+ setShowSuggestedEditsDiff,
1986
+ enableCompletions,
1987
+ setEnableCompletions,
1988
+ showComponentNavigator,
1989
+ setShowComponentNavigator: handleSetShowComponentNavigator,
1990
+ showAgentsPanel,
1991
+ setShowAgentsPanel: handleSetShowAgentsPanel,
1992
+ activeEditorTab,
1993
+ setActiveEditorTab,
1994
+ showLayoutComponents,
1995
+ setShowLayoutComponents: handleSetShowLayoutComponents,
1996
+ quotaInfo,
1997
+ isQuotaExceeded: isQuotaExceeded(),
1998
+ getQuotaWarningMessage,
1999
+ isMobile,
2000
+ openDialog,
2001
+ webSocketMessages,
2002
+ clearWebSocketMessages: () => setWebSocketMessages([]),
2003
+ userInfo: userInfo,
2004
+ editorSettings,
2005
+ userPreferences,
2006
+ setUserPreferences,
2007
+ currentWizardId,
2008
+ setCurrentWizardId,
2009
+ favorites,
2010
+ loadFavorites,
2011
+ isQuickSwitcherVisible: quickSwitcherVisible,
2012
+ // Context factory registry methods
2013
+ registerContextFactory: (name, factory) => {
2014
+ try {
2015
+ factoriesRef.map.set(name, factory);
2016
+ }
2017
+ catch { }
2018
+ },
2019
+ unregisterContextFactory: (name) => {
2020
+ try {
2021
+ factoriesRef.map.delete(name);
2022
+ }
2023
+ catch { }
2024
+ },
2025
+ getContextFactory: (name) => {
2026
+ try {
2027
+ return factoriesRef.map.get(name);
2028
+ }
2029
+ catch {
2030
+ return undefined;
2031
+ }
2032
+ },
2033
+ };
2034
+ return context;
2035
+ }, [
2036
+ operations,
2037
+ itemsRepository,
2038
+ configuration,
2039
+ contentEditorItem,
2040
+ page?.item,
2041
+ itemLanguages,
2042
+ itemVersions,
2043
+ sessionId,
2044
+ isReadOnly,
2045
+ selection,
2046
+ selectedForInsertion,
2047
+ dragObject,
2048
+ requestRefresh,
2049
+ refreshCompletedFlag,
2050
+ searchParams,
2051
+ pathname,
2052
+ router,
2053
+ scrollIntoView,
2054
+ focusedField,
2055
+ renderedFields,
2056
+ inserting,
2057
+ page,
2058
+ activeFieldActions,
2059
+ editHistory,
2060
+ isRefreshing,
2061
+ activeSessions,
2062
+ currentView,
2063
+ componentDesignerComponent,
2064
+ componentDesignerRendering,
2065
+ insertMode,
2066
+ currentOverlay,
2067
+ inlineEditingFieldElement,
2068
+ lockedField,
2069
+ selectedRange,
2070
+ pageViewContext,
2071
+ browseHistory,
2072
+ workboxItems,
2073
+ validating,
2074
+ setCenterPanelView,
2075
+ handleKeyDown,
2076
+ setTimings,
2077
+ timings,
2078
+ startTour,
2079
+ viewName,
2080
+ compareMode,
2081
+ setCompareMode,
2082
+ addSocketMessageListener,
2083
+ currentItemDescriptor,
2084
+ compareTo,
2085
+ setCompareTo,
2086
+ revision,
2087
+ comments,
2088
+ setComments,
2089
+ availableCommentTags,
2090
+ selectedComment,
2091
+ setSelectedComment,
2092
+ loadComments,
2093
+ mode,
2094
+ setMode,
2095
+ user,
2096
+ reviews,
2097
+ statusMessage,
2098
+ setStatusMessage,
2099
+ suggestedEdits,
2100
+ setSuggestedEdits,
2101
+ showSuggestedEdits,
2102
+ setShowSuggestedEdits,
2103
+ showSuggestedEditsDiff,
2104
+ setShowSuggestedEditsDiff,
2105
+ showComments,
2106
+ showResolvedComments,
2107
+ setShowResolvedComments,
2108
+ showComponentNavigator,
2109
+ handleSetShowComponentNavigator,
2110
+ showAgentsPanel,
2111
+ handleSetShowAgentsPanel,
2112
+ activeEditorTab,
2113
+ setActiveEditorTab,
2114
+ showLayoutComponents,
2115
+ handleSetShowLayoutComponents,
2116
+ quotaInfo,
2117
+ isQuotaExceeded,
2118
+ getQuotaWarningMessage,
2119
+ isMobile,
2120
+ openDialog,
2121
+ webSocketMessages,
2122
+ currentWizardId,
2123
+ setCurrentWizardId,
2124
+ favorites,
2125
+ loadFavorites,
2126
+ userInfo,
2127
+ editorSettings,
2128
+ visibleViews,
2129
+ ]);
2130
+ // CRITICAL: Assign editContext to ref so keyboard handlers can access it
2131
+ useEffect(() => {
2132
+ editContextRef.current = editContext;
2133
+ }, [editContext]);
2134
+ const fieldsEditContext = useMemo(() => {
2135
+ return {
2136
+ modifiedFields,
2137
+ recentEdits,
2138
+ clearModifiedFields: () => {
2139
+ fieldModificationStore.clear();
2140
+ },
2141
+ clearRecentEdits: () => {
2142
+ setRecentEdits([]);
2143
+ },
2144
+ addRecentEdit,
2145
+ focusedField,
2146
+ setFocusedField: setFocusedFieldWithLock,
2147
+ unlockField: async () => {
2148
+ console.log("[FieldsEditContext.unlockField] Clearing lockedField state");
2149
+ setLockedField(undefined); // Clear client-side lock state
2150
+ await releaseFieldLocks(sessionId);
2151
+ },
2152
+ inlineEditingFieldElement,
2153
+ setInlineEditingFieldElement,
2154
+ };
2155
+ }, [
2156
+ modifiedFields,
2157
+ recentEdits,
2158
+ addRecentEdit,
2159
+ focusedField,
2160
+ setFocusedFieldWithLock,
2161
+ sessionId,
2162
+ inlineEditingFieldElement,
2163
+ setInlineEditingFieldElement,
2164
+ ]);
2165
+ // Debug: Track editContext changes
2166
+ // const prevDependencies = useRef<any[]>([]);
2167
+ // useEffect(() => {
2168
+ // // Create current dependencies array to match the useMemo dependency array
2169
+ // const currentDependencies = [
2170
+ // operations,
2171
+ // itemsRepository,
2172
+ // configuration,
2173
+ // contentEditorItem,
2174
+ // page?.item,
2175
+ // itemLanguages,
2176
+ // itemVersions,
2177
+ // sessionId,
2178
+ // isReadOnly,
2179
+ // selection,
2180
+ // selectedForInsertion,
2181
+ // dragObject,
2182
+ // requestRefresh,
2183
+ // refreshCompletedFlag,
2184
+ // searchParams,
2185
+ // pathname,
2186
+ // router,
2187
+ // selectMedia,
2188
+ // scrollIntoView,
2189
+ // focusedField,
2190
+ // renderedFields,
2191
+ // inserting,
2192
+ // page,
2193
+ // activeFieldActions,
2194
+ // editHistory,
2195
+ // isRefreshing,
2196
+ // activeSessions,
2197
+ // currentView,
2198
+ // componentDesignerComponent,
2199
+ // componentDesignerRendering,
2200
+ // insertMode,
2201
+ // currentOverlay,
2202
+ // inlineEditingFieldElement,
2203
+ // lockedField,
2204
+ // selectedRange,
2205
+ // pageViewContext,
2206
+ // browseHistory,
2207
+ // workboxItems,
2208
+ // validating,
2209
+ // setCenterPanelView,
2210
+ // handleKeyDown,
2211
+ // setTimings,
2212
+ // timings,
2213
+ // startTour,
2214
+ // viewName,
2215
+ // compareMode,
2216
+ // setCompareMode,
2217
+ // addSocketMessageListener,
2218
+ // currentItemDescriptor,
2219
+ // compareTo,
2220
+ // setCompareTo,
2221
+ // revision,
2222
+ // comments,
2223
+ // setComments,
2224
+ // selectedComment,
2225
+ // setSelectedComment,
2226
+ // loadComments,
2227
+ // mode,
2228
+ // setMode,
2229
+ // user,
2230
+ // reviews,
2231
+ // statusMessage,
2232
+ // setStatusMessage,
2233
+ // suggestedEdits,
2234
+ // setSuggestedEdits,
2235
+ // showSuggestedEdits,
2236
+ // setShowSuggestedEdits,
2237
+ // showSuggestedEditsDiff,
2238
+ // setShowSuggestedEditsDiff,
2239
+ // showRightSidebar,
2240
+ // handleSetShowRightSidebar,
2241
+ // activeEditorTab,
2242
+ // setActiveEditorTab,
2243
+ // showLayoutComponents,
2244
+ // handleSetShowLayoutComponents,
2245
+ // quotaInfo,
2246
+ // isQuotaExceeded,
2247
+ // getQuotaWarningMessage,
2248
+ // isMobile,
2249
+ // openDialog,
2250
+ // pageWizard,
2251
+ // webSocketMessages,
2252
+ // currentWizardId,
2253
+ // setCurrentWizardId,
2254
+ // favorites,
2255
+ // loadFavorites,
2256
+ // ];
2257
+ // const dependencyNames = [
2258
+ // 'operations',
2259
+ // 'itemsRepository',
2260
+ // 'configuration',
2261
+ // 'contentEditorItem',
2262
+ // 'page?.item',
2263
+ // 'itemLanguages',
2264
+ // 'itemVersions',
2265
+ // 'sessionId',
2266
+ // 'isReadOnly',
2267
+ // 'selection',
2268
+ // 'selectedForInsertion',
2269
+ // 'dragObject',
2270
+ // 'requestRefresh',
2271
+ // 'refreshCompletedFlag',
2272
+ // 'searchParams',
2273
+ // 'pathname',
2274
+ // 'router',
2275
+ // 'selectMedia',
2276
+ // 'scrollIntoView',
2277
+ // 'focusedField',
2278
+ // 'renderedFields',
2279
+ // 'inserting',
2280
+ // 'page',
2281
+ // 'activeFieldActions',
2282
+ // 'editHistory',
2283
+ // 'isRefreshing',
2284
+ // 'activeSessions',
2285
+ // 'currentView',
2286
+ // 'componentDesignerComponent',
2287
+ // 'componentDesignerRendering',
2288
+ // 'insertMode',
2289
+ // 'currentOverlay',
2290
+ // 'inlineEditingFieldElement',
2291
+ // 'lockedField',
2292
+ // 'selectedRange',
2293
+ // 'pageViewContext',
2294
+ // 'browseHistory',
2295
+ // 'workboxItems',
2296
+ // 'validating',
2297
+ // 'setCenterPanelView',
2298
+ // 'handleKeyDown',
2299
+ // 'setTimings',
2300
+ // 'timings',
2301
+ // 'startTour',
2302
+ // 'viewName',
2303
+ // 'compareMode',
2304
+ // 'setCompareMode',
2305
+ // 'addSocketMessageListener',
2306
+ // 'currentItemDescriptor',
2307
+ // 'compareTo',
2308
+ // 'setCompareTo',
2309
+ // 'revision',
2310
+ // 'comments',
2311
+ // 'setComments',
2312
+ // 'selectedComment',
2313
+ // 'setSelectedComment',
2314
+ // 'loadComments',
2315
+ // 'mode',
2316
+ // 'setMode',
2317
+ // 'user',
2318
+ // 'reviews',
2319
+ // 'statusMessage',
2320
+ // 'setStatusMessage',
2321
+ // 'suggestedEdits',
2322
+ // 'setSuggestedEdits',
2323
+ // 'showSuggestedEdits',
2324
+ // 'setShowSuggestedEdits',
2325
+ // 'showSuggestedEditsDiff',
2326
+ // 'setShowSuggestedEditsDiff',
2327
+ // 'showRightSidebar',
2328
+ // 'handleSetShowRightSidebar',
2329
+ // 'activeEditorTab',
2330
+ // 'setActiveEditorTab',
2331
+ // 'showLayoutComponents',
2332
+ // 'handleSetShowLayoutComponents',
2333
+ // 'quotaInfo',
2334
+ // 'isQuotaExceeded',
2335
+ // 'getQuotaWarningMessage',
2336
+ // 'isMobile',
2337
+ // 'openDialog',
2338
+ // 'pageWizard',
2339
+ // 'webSocketMessages',
2340
+ // 'currentWizardId',
2341
+ // 'setCurrentWizardId',
2342
+ // 'favorites',
2343
+ // 'loadFavorites',
2344
+ // ];
2345
+ // // Check which dependencies have changed
2346
+ // const changedDependencies: string[] = [];
2347
+ // currentDependencies.forEach((dep, index) => {
2348
+ // if (prevDependencies.current[index] !== dep) {
2349
+ // const depName = dependencyNames[index];
2350
+ // if (depName) {
2351
+ // changedDependencies.push(depName);
2352
+ // }
2353
+ // }
2354
+ // });
2355
+ // if (changedDependencies.length > 0) {
2356
+ // console.group('🔍 EditContext Changed');
2357
+ // console.log('Changed dependencies:', changedDependencies);
2358
+ // console.log('Total dependencies tracked:', currentDependencies.length);
2359
+ // // Log details about the changed dependencies
2360
+ // changedDependencies.forEach(depName => {
2361
+ // const index = dependencyNames.indexOf(depName);
2362
+ // const oldValue = prevDependencies.current[index];
2363
+ // const newValue = currentDependencies[index];
2364
+ // console.log(`📝 ${depName}:`, {
2365
+ // from: oldValue,
2366
+ // to: newValue,
2367
+ // changed: oldValue !== newValue
2368
+ // });
2369
+ // });
2370
+ // console.groupEnd();
2371
+ // }
2372
+ // // Store current dependencies for next comparison
2373
+ // prevDependencies.current = currentDependencies;
2374
+ // editContextRef.current = editContext;
2375
+ // }, [editContext]);
2376
+ useEffect(() => {
2377
+ fieldsEditContext.clearModifiedFields();
2378
+ }, [currentItemDescriptor]);
2379
+ if (!currentView)
2380
+ return null;
2381
+ const editorUi = pageViewContext.fullscreen ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "fixed inset-0 flex", children: [_jsx(PageViewerFrame, { compareView: compareMode, pageViewContext: pageViewContext }), _jsx(FullscreenControls, { device: pageViewContext.device, setDevice: (d) => pageViewContext.setDevice(d), canExit: !configuration.forceFullscreen, onExit: () => pageViewContext.setFullscreen(false), firstMobileDeviceName: configuration.devices[0]?.name })] }), _jsx(EditorFormPopup, { ref: editorFormPopupRef, pageViewContext: pageViewContext }), showFullscreenHint && !configuration.forceFullscreen && (_jsx("div", { className: "fixed inset-0", onMouseMoveCapture: () => {
2382
+ setTimeout(() => {
2383
+ setShowFullscreenHint(false);
2384
+ }, 600);
2385
+ }, "data-testid": "fullscreen-hint-overlay", children: _jsx("div", { className: "fixed top-3 left-1/2 -translate-x-1/2 transform rounded-sm bg-gray-200 p-12", children: "Press Ctrl + F11 to exit fullscreen mode" }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(EditorChrome, { className: className, currentView: currentView, centerPanelView: centerPanelView, editContext: editContext, showComponentNavigator: showComponentNavigator, handleSetShowComponentNavigator: handleSetShowComponentNavigator, showAgentsPanel: showAgentsPanel, handleSetShowAgentsPanel: handleSetShowAgentsPanel, viewName: viewName }), isTourActive && _jsx(Tour, { tourStopCallback: () => setIsTourActive(false) })] }));
2386
+ return (_jsx("div", { className: `editor h-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsxs(EditContextProvider, { value: editContext, children: [editContext.isRefreshing && (_jsx("div", { className: "pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center text-gray-600 opacity-50 select-none", children: _jsx(Spinner, {}) })), children || editorUi, dialog, _jsx(Toaster, { position: "top-center" }), " ", _jsx(ConfirmationDialog, { ref: confirmationDialogRef }), _jsx(QuickItemSwitcher, { visible: quickSwitcherVisible, entries: navigationHistory.slice(0, 5), selectedIndex: quickSwitcherSelectedIndex, onSelect: handleQuickSwitcherSelect, onClose: () => setQuickSwitcherVisible(false) }), _jsx(EditContextMenu, { ref: contextMenuRef }), media.mediaSelectorVisible && (_jsx(MediaSelector, { language: editContext.currentItemDescriptor.language, visible: media.mediaSelectorVisible, onHide: () => media.setMediaSelectorVisible(false), onMediaSelected: media.onMediaSelect, selectedIdPath: media.selectedMediaIdPath, mode: media.mediaSelectorMode })), _jsx(FieldEditorPopup, { ref: fieldEditorPopupRef }), _jsx(EditorFormPopup, { ref: editorFormPopupRef, pageViewContext: pageViewContext })] }) }) }) }));
2387
+ }
2388
+ //# sourceMappingURL=EditorShell.js.map