@alpaca-editor/core 1.0.3938 → 1.0.3941

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 (357) hide show
  1. package/dist/components/ActionButton.d.ts +1 -0
  2. package/dist/components/ActionButton.js +2 -2
  3. package/dist/components/ActionButton.js.map +1 -1
  4. package/dist/editor/ContentTree.js +12 -8
  5. package/dist/editor/ContentTree.js.map +1 -1
  6. package/dist/editor/ContextMenu.d.ts +1 -1
  7. package/dist/editor/ContextMenu.js +17 -3
  8. package/dist/editor/ContextMenu.js.map +1 -1
  9. package/dist/editor/FieldActionsOverlay.d.ts +18 -0
  10. package/dist/editor/FieldActionsOverlay.js +139 -0
  11. package/dist/editor/FieldActionsOverlay.js.map +1 -0
  12. package/dist/editor/FieldHistory.d.ts +2 -1
  13. package/dist/editor/FieldHistory.js +11 -8
  14. package/dist/editor/FieldHistory.js.map +1 -1
  15. package/dist/editor/FieldListField.js +14 -17
  16. package/dist/editor/FieldListField.js.map +1 -1
  17. package/dist/editor/PictureCropper.js +65 -23
  18. package/dist/editor/PictureCropper.js.map +1 -1
  19. package/dist/editor/PictureEditor.js +43 -3
  20. package/dist/editor/PictureEditor.js.map +1 -1
  21. package/dist/editor/Titlebar.js +19 -10
  22. package/dist/editor/Titlebar.js.map +1 -1
  23. package/dist/editor/ai/AiTerminal.js +27 -41
  24. package/dist/editor/ai/AiTerminal.js.map +1 -1
  25. package/dist/editor/ai/GhostWriter.js +21 -2
  26. package/dist/editor/ai/GhostWriter.js.map +1 -1
  27. package/dist/editor/client/EditorClient.js +48 -18
  28. package/dist/editor/client/EditorClient.js.map +1 -1
  29. package/dist/editor/client/editContext.d.ts +1 -1
  30. package/dist/editor/client/editContext.js.map +1 -1
  31. package/dist/editor/client/itemsRepository.js +126 -90
  32. package/dist/editor/client/itemsRepository.js.map +1 -1
  33. package/dist/editor/commands/componentCommands.js +7 -3
  34. package/dist/editor/commands/componentCommands.js.map +1 -1
  35. package/dist/editor/media-selector/MediaFolderBrowser.d.ts +5 -0
  36. package/dist/editor/media-selector/MediaFolderBrowser.js +77 -0
  37. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -0
  38. package/dist/editor/media-selector/MediaSelector.js +1 -1
  39. package/dist/editor/media-selector/MediaSelector.js.map +1 -1
  40. package/dist/editor/media-selector/Thumbnails.js +2 -2
  41. package/dist/editor/media-selector/index.d.ts +8 -0
  42. package/dist/editor/media-selector/index.js +9 -0
  43. package/dist/editor/media-selector/index.js.map +1 -0
  44. package/dist/editor/menubar/BrowseHistory.js +3 -4
  45. package/dist/editor/menubar/BrowseHistory.js.map +1 -1
  46. package/dist/editor/menubar/PageSelector.js +62 -10
  47. package/dist/editor/menubar/PageSelector.js.map +1 -1
  48. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +1 -1
  49. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  50. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +37 -11
  51. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  52. package/dist/editor/page-viewer/PageViewerFrame.js +98 -2
  53. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  54. package/dist/editor/pageModel.d.ts +14 -0
  55. package/dist/editor/reviews/Comment.js +3 -2
  56. package/dist/editor/reviews/Comment.js.map +1 -1
  57. package/dist/editor/services/aiService.js +0 -1
  58. package/dist/editor/services/aiService.js.map +1 -1
  59. package/dist/editor/services/editService.d.ts +1 -1
  60. package/dist/editor/services/editService.js +2 -1
  61. package/dist/editor/services/editService.js.map +1 -1
  62. package/dist/editor/sidebar/ComponentTree.js +3 -4
  63. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  64. package/dist/editor/ui/Icons.js +1 -1
  65. package/dist/editor/ui/Icons.js.map +1 -1
  66. package/dist/editor/ui/ItemList.d.ts +16 -0
  67. package/dist/editor/ui/ItemList.js +19 -0
  68. package/dist/editor/ui/ItemList.js.map +1 -0
  69. package/dist/editor/ui/ItemSearch.js +2 -12
  70. package/dist/editor/ui/ItemSearch.js.map +1 -1
  71. package/dist/editor/ui/SimpleTabs.d.ts +1 -0
  72. package/dist/editor/ui/SimpleTabs.js +3 -3
  73. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  74. package/dist/editor/ui/Splitter.js +61 -6
  75. package/dist/editor/ui/Splitter.js.map +1 -1
  76. package/dist/editor/views/MediaFolderEditView.d.ts +4 -0
  77. package/dist/editor/views/MediaFolderEditView.js +40 -0
  78. package/dist/editor/views/MediaFolderEditView.js.map +1 -0
  79. package/dist/editor/views/SingleEditView.js +9 -1
  80. package/dist/editor/views/SingleEditView.js.map +1 -1
  81. package/dist/revision.d.ts +2 -2
  82. package/dist/revision.js +2 -2
  83. package/dist/styles.css +64 -13
  84. package/package.json +8 -2
  85. package/.prettierrc +0 -3
  86. package/build.css +0 -3
  87. package/components.json +0 -21
  88. package/eslint.config.mjs +0 -4
  89. package/images/bg-shape-black.webp +0 -0
  90. package/images/wizard-bg.png +0 -0
  91. package/images/wizard-tour.png +0 -0
  92. package/images/wizard.png +0 -0
  93. package/src/client-components/api.ts +0 -6
  94. package/src/client-components/index.ts +0 -19
  95. package/src/components/ActionButton.tsx +0 -41
  96. package/src/components/Error.tsx +0 -57
  97. package/src/components/ui/CardConnector.tsx +0 -56
  98. package/src/components/ui/button.tsx +0 -62
  99. package/src/components/ui/card.tsx +0 -372
  100. package/src/components/ui/context-menu.tsx +0 -250
  101. package/src/config/config.tsx +0 -917
  102. package/src/config/types.ts +0 -286
  103. package/src/editor/ComponentInfo.tsx +0 -90
  104. package/src/editor/ConfirmationDialog.tsx +0 -103
  105. package/src/editor/ContentTree.tsx +0 -727
  106. package/src/editor/ContextMenu.tsx +0 -212
  107. package/src/editor/Editor.tsx +0 -90
  108. package/src/editor/EditorWarning.tsx +0 -34
  109. package/src/editor/EditorWarnings.tsx +0 -33
  110. package/src/editor/FieldEditorPopup.tsx +0 -65
  111. package/src/editor/FieldHistory.tsx +0 -74
  112. package/src/editor/FieldList.tsx +0 -190
  113. package/src/editor/FieldListField.tsx +0 -391
  114. package/src/editor/FieldListFieldWithFallbacks.tsx +0 -217
  115. package/src/editor/FloatingToolbar.tsx +0 -163
  116. package/src/editor/ImageEditor.tsx +0 -128
  117. package/src/editor/ItemInfo.tsx +0 -90
  118. package/src/editor/LinkEditorDialog.tsx +0 -196
  119. package/src/editor/MainLayout.tsx +0 -95
  120. package/src/editor/MobileLayout.tsx +0 -68
  121. package/src/editor/NewEditorClient.tsx +0 -11
  122. package/src/editor/PictureCropper.tsx +0 -503
  123. package/src/editor/PictureEditor.tsx +0 -212
  124. package/src/editor/PictureEditorDialog.tsx +0 -381
  125. package/src/editor/PublishDialog.ignore +0 -74
  126. package/src/editor/ScrollingContentTree.tsx +0 -67
  127. package/src/editor/Terminal.tsx +0 -227
  128. package/src/editor/Titlebar.tsx +0 -93
  129. package/src/editor/ai/AiPopup.tsx +0 -59
  130. package/src/editor/ai/AiResponseMessage.tsx +0 -106
  131. package/src/editor/ai/AiTerminal.tsx +0 -514
  132. package/src/editor/ai/AiToolCall.tsx +0 -61
  133. package/src/editor/ai/EditorAiTerminal.tsx +0 -20
  134. package/src/editor/ai/GhostWriter.tsx +0 -432
  135. package/src/editor/ai/aiPageModel.ts +0 -108
  136. package/src/editor/ai/editorAiContext.ts +0 -18
  137. package/src/editor/client/AboutDialog.tsx +0 -44
  138. package/src/editor/client/EditorClient.tsx +0 -2197
  139. package/src/editor/client/GenericDialog.tsx +0 -50
  140. package/src/editor/client/editContext.ts +0 -412
  141. package/src/editor/client/helpers.ts +0 -44
  142. package/src/editor/client/itemsRepository.ts +0 -538
  143. package/src/editor/client/operations.ts +0 -768
  144. package/src/editor/client/pageModelBuilder.ts +0 -219
  145. package/src/editor/commands/commands.ts +0 -22
  146. package/src/editor/commands/componentCommands.tsx +0 -424
  147. package/src/editor/commands/createVersionCommand.ts +0 -33
  148. package/src/editor/commands/deleteVersionCommand.ts +0 -71
  149. package/src/editor/commands/itemCommands.tsx +0 -351
  150. package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +0 -201
  151. package/src/editor/commands/localizeItem/LocalizeItemUtils.ts +0 -27
  152. package/src/editor/commands/undo.ts +0 -39
  153. package/src/editor/component-designer/ComponentDesigner.tsx +0 -70
  154. package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx +0 -11
  155. package/src/editor/component-designer/ComponentDesignerMenu.tsx +0 -91
  156. package/src/editor/component-designer/ComponentEditor.tsx +0 -97
  157. package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +0 -31
  158. package/src/editor/component-designer/ComponentRenderingEditor.tsx +0 -104
  159. package/src/editor/component-designer/ComponentsDropdown.tsx +0 -39
  160. package/src/editor/component-designer/PlaceholdersEditor.tsx +0 -179
  161. package/src/editor/component-designer/RenderingsDropdown.tsx +0 -36
  162. package/src/editor/component-designer/TemplateEditor.tsx +0 -236
  163. package/src/editor/component-designer/aiContext.ts +0 -23
  164. package/src/editor/componentTreeHelper.tsx +0 -116
  165. package/src/editor/context-menu/CopyMoveMenu.tsx +0 -103
  166. package/src/editor/context-menu/InsertMenu.tsx +0 -347
  167. package/src/editor/control-center/About.tsx +0 -342
  168. package/src/editor/control-center/ControlCenterMenu.tsx +0 -76
  169. package/src/editor/control-center/IndexOverview.tsx +0 -50
  170. package/src/editor/control-center/IndexSettings.tsx +0 -266
  171. package/src/editor/control-center/Info.tsx +0 -104
  172. package/src/editor/control-center/QuotaInfo.tsx +0 -301
  173. package/src/editor/control-center/Status.tsx +0 -113
  174. package/src/editor/control-center/WebSocketMessages.tsx +0 -155
  175. package/src/editor/editor-warnings/ItemLocked.tsx +0 -63
  176. package/src/editor/editor-warnings/NoLanguageWriteAccess.tsx +0 -22
  177. package/src/editor/editor-warnings/NoWorkflowWriteAccess.tsx +0 -23
  178. package/src/editor/editor-warnings/NoWriteAccess.tsx +0 -16
  179. package/src/editor/editor-warnings/ValidationErrors.tsx +0 -54
  180. package/src/editor/field-types/AttachmentEditor.tsx +0 -9
  181. package/src/editor/field-types/CheckboxEditor.tsx +0 -47
  182. package/src/editor/field-types/DropLinkEditor.tsx +0 -80
  183. package/src/editor/field-types/DropListEditor.tsx +0 -84
  184. package/src/editor/field-types/ImageFieldEditor.tsx +0 -65
  185. package/src/editor/field-types/InternalLinkFieldEditor.tsx +0 -117
  186. package/src/editor/field-types/LinkFieldEditor.tsx +0 -85
  187. package/src/editor/field-types/MultiLineText.tsx +0 -82
  188. package/src/editor/field-types/PictureFieldEditor.tsx +0 -121
  189. package/src/editor/field-types/RawEditor.tsx +0 -53
  190. package/src/editor/field-types/ReactQuill.tsx +0 -580
  191. package/src/editor/field-types/RichTextEditor.tsx +0 -22
  192. package/src/editor/field-types/RichTextEditorComponent.tsx +0 -127
  193. package/src/editor/field-types/SingleLineText.tsx +0 -174
  194. package/src/editor/field-types/TreeListEditor.tsx +0 -261
  195. package/src/editor/fieldTypes.ts +0 -140
  196. package/src/editor/media-selector/AiImageSearch.tsx +0 -185
  197. package/src/editor/media-selector/AiImageSearchPrompt.tsx +0 -94
  198. package/src/editor/media-selector/MediaSelector.tsx +0 -42
  199. package/src/editor/media-selector/Preview.tsx +0 -14
  200. package/src/editor/media-selector/Thumbnails.tsx +0 -48
  201. package/src/editor/media-selector/TreeSelector.tsx +0 -292
  202. package/src/editor/media-selector/UploadZone.tsx +0 -137
  203. package/src/editor/menubar/ActionsMenu.tsx +0 -94
  204. package/src/editor/menubar/ActiveUsers.tsx +0 -17
  205. package/src/editor/menubar/ApproveAndPublish.tsx +0 -18
  206. package/src/editor/menubar/BrowseHistory.tsx +0 -37
  207. package/src/editor/menubar/ItemLanguageVersion.tsx +0 -76
  208. package/src/editor/menubar/LanguageSelector.tsx +0 -226
  209. package/src/editor/menubar/Menu.tsx +0 -83
  210. package/src/editor/menubar/NavButtons.tsx +0 -74
  211. package/src/editor/menubar/PageSelector.tsx +0 -141
  212. package/src/editor/menubar/PageViewerControls.tsx +0 -120
  213. package/src/editor/menubar/PreviewSecondaryControls.tsx +0 -18
  214. package/src/editor/menubar/SecondaryControls.tsx +0 -45
  215. package/src/editor/menubar/Separator.tsx +0 -12
  216. package/src/editor/menubar/SiteInfo.tsx +0 -53
  217. package/src/editor/menubar/User.tsx +0 -27
  218. package/src/editor/menubar/VersionSelector.tsx +0 -142
  219. package/src/editor/page-editor-chrome/CommentHighlighting.tsx +0 -307
  220. package/src/editor/page-editor-chrome/CommentHighlightings.tsx +0 -35
  221. package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +0 -59
  222. package/src/editor/page-editor-chrome/FieldActionIndicators.tsx +0 -23
  223. package/src/editor/page-editor-chrome/FieldEditedIndicator.tsx +0 -64
  224. package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +0 -35
  225. package/src/editor/page-editor-chrome/FrameMenu.tsx +0 -338
  226. package/src/editor/page-editor-chrome/FrameMenus.tsx +0 -48
  227. package/src/editor/page-editor-chrome/InlineEditor.tsx +0 -765
  228. package/src/editor/page-editor-chrome/LockedFieldIndicator.tsx +0 -61
  229. package/src/editor/page-editor-chrome/NoLayout.tsx +0 -36
  230. package/src/editor/page-editor-chrome/PageEditorChrome.tsx +0 -122
  231. package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +0 -161
  232. package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +0 -169
  233. package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +0 -315
  234. package/src/editor/page-editor-chrome/SuggestionHighlighting.tsx +0 -300
  235. package/src/editor/page-editor-chrome/SuggestionHighlightings.tsx +0 -40
  236. package/src/editor/page-editor-chrome/useInlineAICompletion.tsx +0 -791
  237. package/src/editor/page-viewer/DeviceToolbar.tsx +0 -70
  238. package/src/editor/page-viewer/EditorForm.tsx +0 -258
  239. package/src/editor/page-viewer/MiniMap.tsx +0 -362
  240. package/src/editor/page-viewer/PageViewer.tsx +0 -169
  241. package/src/editor/page-viewer/PageViewerFrame.tsx +0 -879
  242. package/src/editor/page-viewer/pageModelSkeletonBuilder.ts +0 -412
  243. package/src/editor/page-viewer/pageViewContext.ts +0 -186
  244. package/src/editor/pageModel.ts +0 -208
  245. package/src/editor/picture-shared.tsx +0 -53
  246. package/src/editor/reviews/Comment.tsx +0 -308
  247. package/src/editor/reviews/Comments.tsx +0 -125
  248. package/src/editor/reviews/DiffView.tsx +0 -109
  249. package/src/editor/reviews/PreviewInfo.tsx +0 -35
  250. package/src/editor/reviews/Reviews.tsx +0 -280
  251. package/src/editor/reviews/SuggestedEdit.tsx +0 -316
  252. package/src/editor/reviews/reviewCommands.tsx +0 -47
  253. package/src/editor/reviews/useReviews.tsx +0 -70
  254. package/src/editor/services/aiService.ts +0 -174
  255. package/src/editor/services/componentDesignerService.ts +0 -151
  256. package/src/editor/services/contentService.ts +0 -180
  257. package/src/editor/services/editService.ts +0 -486
  258. package/src/editor/services/indexService.ts +0 -24
  259. package/src/editor/services/reviewsService.ts +0 -53
  260. package/src/editor/services/serviceHelper.ts +0 -95
  261. package/src/editor/services/suggestedEditsService.ts +0 -39
  262. package/src/editor/services/systemService.ts +0 -5
  263. package/src/editor/services/translationService.ts +0 -21
  264. package/src/editor/services-server/api.ts +0 -150
  265. package/src/editor/services-server/graphQL.ts +0 -106
  266. package/src/editor/sidebar/ComponentPalette.tsx +0 -161
  267. package/src/editor/sidebar/ComponentTree.tsx +0 -548
  268. package/src/editor/sidebar/ComponentTree2.tsxx +0 -490
  269. package/src/editor/sidebar/Debug.tsx +0 -111
  270. package/src/editor/sidebar/DictionaryEditor.tsx +0 -261
  271. package/src/editor/sidebar/EditHistory.tsx +0 -134
  272. package/src/editor/sidebar/GraphQL.tsx +0 -164
  273. package/src/editor/sidebar/Insert.tsx +0 -35
  274. package/src/editor/sidebar/MainContentTree.tsx +0 -102
  275. package/src/editor/sidebar/Performance.tsx +0 -53
  276. package/src/editor/sidebar/Sessions.tsx +0 -35
  277. package/src/editor/sidebar/Sidebar.tsx +0 -20
  278. package/src/editor/sidebar/SidebarView.tsx +0 -152
  279. package/src/editor/sidebar/Translations.tsx +0 -295
  280. package/src/editor/sidebar/Validation.tsx +0 -102
  281. package/src/editor/sidebar/ViewSelector.tsx +0 -60
  282. package/src/editor/sidebar/Workbox.tsx +0 -209
  283. package/src/editor/ui/CenteredMessage.tsx +0 -7
  284. package/src/editor/ui/CopyMoveTargetSelectorDialog.tsx +0 -81
  285. package/src/editor/ui/CopyToClipboardButton.tsx +0 -24
  286. package/src/editor/ui/DialogButtons.tsx +0 -11
  287. package/src/editor/ui/Icons.tsx +0 -708
  288. package/src/editor/ui/ItemNameDialogNew.tsx +0 -118
  289. package/src/editor/ui/ItemSearch.tsx +0 -190
  290. package/src/editor/ui/PerfectTree.tsx +0 -571
  291. package/src/editor/ui/Section.tsx +0 -35
  292. package/src/editor/ui/SimpleIconButton.tsx +0 -54
  293. package/src/editor/ui/SimpleMenu.tsx +0 -40
  294. package/src/editor/ui/SimpleTable.tsx +0 -60
  295. package/src/editor/ui/SimpleTabs.tsx +0 -55
  296. package/src/editor/ui/SimpleToolbar.tsx +0 -7
  297. package/src/editor/ui/Spinner.tsx +0 -9
  298. package/src/editor/ui/Splitter.tsx +0 -314
  299. package/src/editor/ui/StackedPanels.tsx +0 -134
  300. package/src/editor/ui/Toolbar.tsx +0 -7
  301. package/src/editor/utils/id-helper.ts +0 -3
  302. package/src/editor/utils/insertOptions.ts +0 -69
  303. package/src/editor/utils/itemutils.ts +0 -29
  304. package/src/editor/utils/useMemoDebug.ts +0 -28
  305. package/src/editor/utils.ts +0 -486
  306. package/src/editor/views/CompareView.tsx +0 -245
  307. package/src/editor/views/EditView.tsx +0 -27
  308. package/src/editor/views/ItemEditor.tsx +0 -58
  309. package/src/editor/views/SingleEditView.tsx +0 -46
  310. package/src/fonts/Geist-Black.woff2 +0 -0
  311. package/src/fonts/Geist-Bold.woff2 +0 -0
  312. package/src/fonts/Geist-ExtraBold.woff2 +0 -0
  313. package/src/fonts/Geist-ExtraLight.woff2 +0 -0
  314. package/src/fonts/Geist-Light.woff2 +0 -0
  315. package/src/fonts/Geist-Medium.woff2 +0 -0
  316. package/src/fonts/Geist-Regular.woff2 +0 -0
  317. package/src/fonts/Geist-SemiBold.woff2 +0 -0
  318. package/src/fonts/Geist-Thin.woff2 +0 -0
  319. package/src/fonts/Geist[wght].woff2 +0 -0
  320. package/src/fonts/index.ts +0 -10
  321. package/src/index.ts +0 -23
  322. package/src/lib/safelist.tsx +0 -16
  323. package/src/lib/utils.ts +0 -6
  324. package/src/page-wizard/PageWizard.tsx +0 -139
  325. package/src/page-wizard/WizardBox.tsx +0 -4
  326. package/src/page-wizard/WizardBoxConnector.tsx +0 -56
  327. package/src/page-wizard/WizardSteps.tsx +0 -458
  328. package/src/page-wizard/service.ts +0 -35
  329. package/src/page-wizard/startPageWizardCommand.ts +0 -26
  330. package/src/page-wizard/steps/BuildPageStep.tsx +0 -259
  331. package/src/page-wizard/steps/CollectStep.tsx +0 -296
  332. package/src/page-wizard/steps/ComponentTypesSelector.tsx +0 -454
  333. package/src/page-wizard/steps/Components.tsx +0 -193
  334. package/src/page-wizard/steps/ContentStep.tsx +0 -890
  335. package/src/page-wizard/steps/EditButton.tsx +0 -34
  336. package/src/page-wizard/steps/FieldEditor.tsx +0 -102
  337. package/src/page-wizard/steps/Generate.tsx +0 -60
  338. package/src/page-wizard/steps/ImagesStep.tsx +0 -382
  339. package/src/page-wizard/steps/LayoutStep.tsx +0 -227
  340. package/src/page-wizard/steps/MetaDataStep.tsx +0 -173
  341. package/src/page-wizard/steps/SelectStep.tsx +0 -281
  342. package/src/page-wizard/steps/schema.ts +0 -180
  343. package/src/page-wizard/steps/usePageCreator.ts +0 -325
  344. package/src/page-wizard/usePageWizard.ts +0 -79
  345. package/src/revision.ts +0 -2
  346. package/src/splash-screen/NewPage.tsx +0 -294
  347. package/src/splash-screen/OpenPage.tsx +0 -113
  348. package/src/splash-screen/RecentPages.tsx +0 -123
  349. package/src/splash-screen/SectionHeadline.tsx +0 -21
  350. package/src/splash-screen/SplashScreen.tsx +0 -195
  351. package/src/tour/Tour.tsx +0 -566
  352. package/src/tour/default-tour.tsx +0 -301
  353. package/src/tour/preview-tour.tsx +0 -128
  354. package/src/types.ts +0 -335
  355. package/styles.css +0 -765
  356. package/tsconfig.build.json +0 -31
  357. package/tsconfig.json +0 -14
@@ -1,727 +0,0 @@
1
- "use client";
2
-
3
- import { useEditContext, useEditContextRef } from "./client/editContext";
4
-
5
- import { useCallback, useEffect, useRef, useState, useMemo, memo } from "react";
6
-
7
- import { ItemTreeNodeData, getChildren } from "./services/contentService";
8
- import { ContextMenu } from "primereact/contextmenu";
9
- import { MenuItem } from "primereact/menuitem";
10
-
11
- import { getAbsoluteIconUrl } from "./utils";
12
- import { FullItem, ItemDescriptor } from "./pageModel";
13
- import { ItemCommand } from "./commands/itemCommands";
14
- import { Spinner } from "./ui/Spinner";
15
-
16
- import { PerfectTree, TreeNode } from "./ui/PerfectTree";
17
- import { loadInsertOptions } from "./services/editService";
18
-
19
- // Create a memoized version of PerfectTree
20
- const MemoizedPerfectTree = memo(PerfectTree);
21
-
22
- type CustomTreeNode = TreeNode & {
23
- isDraggable?: boolean;
24
- iconUrl?: string;
25
- url?: string;
26
- loading?: boolean;
27
- parent?: CustomTreeNode;
28
- selectable?: boolean;
29
- className?: string;
30
- };
31
-
32
- export default function ContentTree({
33
- isDraggable,
34
- dragStart,
35
- dragEnd,
36
- expandIdPath,
37
- selectionMode,
38
- selectedItemIds,
39
- rootItemId,
40
- rootItemIds,
41
- onSelectionChange,
42
- filter,
43
- templateIds,
44
- className,
45
- includeEmbeddedItems,
46
- onDoubleClick,
47
- selectPagesOnly,
48
- renderNode,
49
- onItemInserted,
50
- language,
51
- includeItemPath,
52
- }: {
53
- isDraggable?: (item: ItemTreeNodeData) => boolean;
54
- dragStart?: (item: ItemTreeNodeData) => void;
55
- dragEnd?: () => void;
56
- expandIdPath?: string;
57
- selectionMode?: "single" | "multiple" | "none";
58
- rootItemId?: string;
59
- rootItemIds?: string[];
60
- selectedItemIds?: string[];
61
- onSelectionChange?: (itemIds: ItemTreeNodeData[]) => void;
62
-
63
- filter?: (items: ItemTreeNodeData[]) => ItemTreeNodeData[];
64
- templateIds?: string[];
65
- className?: string;
66
- includeEmbeddedItems?: boolean;
67
- onDoubleClick?: (item: ItemTreeNodeData) => void;
68
- selectPagesOnly?: boolean;
69
- onItemInserted?: (item: ItemDescriptor) => void;
70
- renderNode?: (
71
- node: CustomTreeNode,
72
- defaultRenderer: (node: CustomTreeNode) => React.ReactNode,
73
- ) => React.ReactNode;
74
- language: string;
75
- includeItemPath?: boolean;
76
- }) {
77
- const [treeNodes, setTreeNodes] = useState<TreeNode[]>([]);
78
-
79
- const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
80
- const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
81
- const treeContainerRef = useRef<HTMLDivElement>(null);
82
- const editContext = useEditContext();
83
-
84
- const nodeDictionary = useRef<{ [key: string]: CustomTreeNode }>({});
85
- const cm = useRef<ContextMenu>(null);
86
- const [menu, setMenu] = useState<MenuItem[]>([]);
87
-
88
- const editContextRef = useEditContextRef();
89
- const lastSelectedItemId = useRef<string | undefined>(undefined);
90
- const [isInitialized, setIsInitialized] = useState(false);
91
-
92
- const loadNodeChildren = useCallback(
93
- async (node: CustomTreeNode): Promise<CustomTreeNode[]> => {
94
- if (!editContext) return [];
95
-
96
- let children = await getChildren(
97
- node.key as string,
98
- editContext.sessionId,
99
- templateIds,
100
- includeEmbeddedItems ?? false,
101
- language,
102
- includeItemPath ? "path,idPath" : undefined,
103
- );
104
-
105
- if (filter) children = filter(children);
106
-
107
- return children.map((x) => ({
108
- key: x.id,
109
- label: x.name,
110
- iconUrl: getAbsoluteIconUrl(x.icon),
111
- isDraggable: isDraggable && isDraggable(x),
112
- selectable: !selectPagesOnly || x.hasLayout,
113
- data: x,
114
- hasChildren: x.hasChildren,
115
- parent: node,
116
- }));
117
- },
118
- [
119
- editContext,
120
- filter,
121
- includeEmbeddedItems,
122
- isDraggable,
123
- language,
124
- selectPagesOnly,
125
- templateIds,
126
- includeItemPath,
127
- ],
128
- );
129
-
130
- const updateCorrespondingNode = useCallback(
131
- (x: FullItem, parent: CustomTreeNode) => {
132
- const node = nodeDictionary.current[x.id];
133
- if (!node) return;
134
- node.label = x.name;
135
- node.iconUrl = getAbsoluteIconUrl(x.icon);
136
- node.isDraggable =
137
- isDraggable &&
138
- isDraggable({
139
- ...x,
140
- isComponent: !x.hasLayout,
141
- thumbUrl: "",
142
- previewUrl: "",
143
- });
144
- node.selectable = !selectPagesOnly || x.hasLayout;
145
- node.data = x;
146
- node.hasChildren = x.hasChildren;
147
- node.parent = parent;
148
- },
149
- [isDraggable, selectPagesOnly],
150
- );
151
-
152
- const loadNode = useCallback(
153
- async (descriptor: ItemDescriptor) => {
154
- const item = await editContext?.itemsRepository.getItem(descriptor);
155
- if (!item) return;
156
- return {
157
- key: item.id,
158
- label: item.name,
159
- iconUrl: getAbsoluteIconUrl(item.icon),
160
- isDraggable:
161
- isDraggable &&
162
- isDraggable({
163
- ...item,
164
- isComponent: !item.hasLayout,
165
- thumbUrl: "",
166
- previewUrl: "",
167
- }),
168
- selectable: !selectPagesOnly || item.hasLayout,
169
- data: item,
170
- hasChildren: item.hasChildren,
171
- };
172
- },
173
- [editContext, isDraggable, selectPagesOnly],
174
- );
175
-
176
- const loadRootNodes = useCallback(
177
- async (force: boolean = false) => {
178
- if (!force && treeNodes.length > 0) return treeNodes;
179
-
180
- if (rootItemId)
181
- return await loadNodeChildren({ key: rootItemId, label: "" });
182
-
183
- return await Promise.all(
184
- rootItemIds
185
- ?.map((rootItemId) =>
186
- loadNode({
187
- id: rootItemId,
188
- language,
189
- version: 0,
190
- }),
191
- )
192
- .filter((x) => x) || [],
193
- );
194
- },
195
- [loadNode, loadNodeChildren, rootItemId, rootItemIds, language, treeNodes],
196
- );
197
-
198
- const doPreloadNodes = useCallback(
199
- async (expandedKeys: string[], treeNodes: TreeNode[]) => {
200
- for (let i = 0; i < treeNodes.length; i++) {
201
- const node = treeNodes[i];
202
- if (!node) continue;
203
- let children = node.children;
204
- if (expandedKeys.includes(node.key as string) && !children) {
205
- children = node.data.hasChildren ? await loadNodeChildren(node) : [];
206
-
207
- node.children = children;
208
- node.hasChildren = children.length > 0;
209
- }
210
- if (
211
- expandedKeys.includes(node.key!) &&
212
- children &&
213
- children.length > 0
214
- ) {
215
- await doPreloadNodes(expandedKeys, children);
216
- }
217
- }
218
- },
219
- [loadNodeChildren],
220
- );
221
-
222
- const preLoadNodes = useCallback(
223
- async (expandedKeys: string[], force: boolean) => {
224
- const rootNodes = await loadRootNodes(force);
225
- await doPreloadNodes(expandedKeys, rootNodes as TreeNode[]);
226
-
227
- setTreeNodes([...(rootNodes.filter((x) => x) as TreeNode[])]);
228
- },
229
- [doPreloadNodes, loadRootNodes],
230
- );
231
-
232
- const refreshNode = useCallback(
233
- async (node: TreeNode) => {
234
- const tempNode = { ...node };
235
-
236
- tempNode.children = undefined;
237
-
238
- await doPreloadNodes(expandedKeys || [], [tempNode as CustomTreeNode]);
239
-
240
- const item = await editContext?.itemsRepository.getItem(
241
- node.data as ItemDescriptor,
242
- );
243
-
244
- if (item) {
245
- // Update node properties directly without changing parent relationship
246
- const customNode = node as CustomTreeNode;
247
- customNode.label = item.name;
248
- customNode.iconUrl = getAbsoluteIconUrl(item.icon);
249
- customNode.isDraggable =
250
- isDraggable &&
251
- isDraggable({
252
- ...item,
253
- isComponent: !item.hasLayout,
254
- thumbUrl: "",
255
- previewUrl: "",
256
- });
257
- customNode.selectable = !selectPagesOnly || item.hasLayout;
258
- customNode.data = item;
259
- customNode.hasChildren = item.hasChildren;
260
- // Preserve existing parent relationship - don't update it
261
- }
262
-
263
- node.children = tempNode.children;
264
- },
265
- [
266
- editContext?.itemsRepository,
267
- expandedKeys,
268
- doPreloadNodes,
269
- isDraggable,
270
- selectPagesOnly,
271
- ],
272
- );
273
-
274
- // Handle root items or language changes
275
- useEffect(() => {
276
- setIsInitialized(true);
277
- const load = async () => {
278
- await preLoadNodes(expandedKeys || [], true);
279
- };
280
-
281
- load();
282
- }, [language, rootItemId, rootItemIds]);
283
-
284
- // Handle expanded keys changes without forcing reload
285
- useEffect(() => {
286
- if (isInitialized) {
287
- preLoadNodes(expandedKeys || [], false);
288
- }
289
- }, [expandedKeys]);
290
-
291
- useEffect(() => {
292
- if (!editContext?.itemsRepository) return;
293
- const unsubscribe = editContext.itemsRepository.subscribeItemsChanged(
294
- async (items) => {
295
- const nodes = items
296
- .map((x) =>
297
- x.action === "delete" && x.parentId
298
- ? nodeDictionary.current[x.parentId]
299
- : nodeDictionary.current[x.item.id],
300
- )
301
- .filter((x) => x);
302
-
303
- if (nodes.length === 0) return;
304
-
305
- await Promise.all(
306
- nodes.map(async (x) => {
307
- if (x) await refreshNode(x);
308
- }),
309
- );
310
-
311
- setTreeNodes((prev) => [...prev]);
312
- },
313
- );
314
- return () => {
315
- unsubscribe();
316
- };
317
- }, [editContext?.itemsRepository, refreshNode]);
318
-
319
- function getExpandedKeys() {
320
- const newExpandedKeys: string[] = [];
321
-
322
- if (rootItemId)
323
- newExpandedKeys.push(rootItemId.toLowerCase().replace(/[{}]/g, ""));
324
-
325
- if (!expandIdPath) return newExpandedKeys;
326
-
327
- const idPathArray = expandIdPath.toLowerCase().split("/");
328
- idPathArray.forEach((x) => {
329
- if (x !== "") newExpandedKeys.push(x.substring(1, x.length - 1));
330
- });
331
- return newExpandedKeys;
332
- }
333
-
334
- useEffect(() => {
335
- const newExpandedKeys = getExpandedKeys();
336
-
337
- const hasNewKeys = newExpandedKeys.some(
338
- (key) => !expandedKeys.includes(key),
339
- );
340
-
341
- if (hasNewKeys) {
342
- setExpandedKeys([...new Set([...expandedKeys, ...newExpandedKeys])]);
343
- }
344
- }, [expandIdPath, expandedKeys, rootItemId]);
345
-
346
- useEffect(() => {
347
- const newNodeDictionary: { [key: string]: CustomTreeNode } = {};
348
- createMap(treeNodes, newNodeDictionary);
349
- nodeDictionary.current = newNodeDictionary;
350
- }, [treeNodes]);
351
-
352
- function createMap(
353
- treeNodes: CustomTreeNode[],
354
- nodeDictionary: { [key: string]: CustomTreeNode },
355
- ) {
356
- treeNodes.forEach((n) => {
357
- if (n.key) nodeDictionary[n.key] = n;
358
- if (n.children) createMap(n.children, nodeDictionary);
359
- });
360
- }
361
-
362
- const nodeTemplate = useCallback((node: CustomTreeNode) => {
363
- let label = <span>{node.label}</span>;
364
-
365
- if (node.url) {
366
- label = (
367
- <a
368
- onDragStart={(e) => e.preventDefault()}
369
- href={node.url}
370
- className="text-primary font-semibold hover:underline"
371
- >
372
- {node.label}
373
- </a>
374
- );
375
- }
376
-
377
- const getNodeCursor = (node: CustomTreeNode) => {
378
- if (node.isDraggable) return "cursor-grab";
379
- return "";
380
- };
381
-
382
- return (
383
- <span
384
- // onDragStart={(event: React.DragEvent<HTMLDivElement>) => {
385
- // handleDragStart(node, event);
386
- // }}
387
- // onDragEnd={handleDragEnd}
388
- // draggable={node.isDraggable}
389
- className={`flex items-center gap-2 text-xs ${getNodeCursor(node)} ${
390
- node.className
391
- }`}
392
- >
393
- <img
394
- src={node.iconUrl}
395
- style={{ height: "16px" }}
396
- width="16"
397
- height="16"
398
- onDragStart={(e) => e.preventDefault()}
399
- ></img>
400
- {label}
401
- </span>
402
- );
403
- }, []);
404
-
405
- function handleDragStart(data: {
406
- node: CustomTreeNode;
407
- event: React.DragEvent;
408
- isMultiSelect: boolean;
409
- }): void {
410
- const items = data.isMultiSelect
411
- ? selectedItemIds
412
- ?.map((x) => nodeDictionary.current[x]?.data)
413
- .filter(Boolean)
414
- : [data.node.data];
415
-
416
- setTimeout(() => {
417
- editContextRef.current?.dragStart({
418
- type: "items",
419
- typeId: data.node.data.templateId,
420
- items: items,
421
- });
422
- }, 10);
423
- //dragStart?.(data.node.data);
424
- data.event.stopPropagation();
425
- }
426
-
427
- async function handleDrop(
428
- parent: CustomTreeNode,
429
- index: number,
430
- event: React.DragEvent,
431
- ): Promise<void> {
432
- const object = editContextRef.current?.dragObject;
433
- if (!object) return;
434
-
435
- if (object.type === "items" && object.items) {
436
- // Check insert options for validation
437
- try {
438
- const insertOptions = await loadInsertOptions({
439
- id: parent.data.id,
440
- language: parent.data.language || language,
441
- version: parent.data.version || 0,
442
- });
443
-
444
- // Check if any of the dragged items have compatible insert options
445
- const hasValidInsertOptions = object.items.some((item) =>
446
- insertOptions.some(
447
- (option) =>
448
- option.id === (item as ItemTreeNodeData).templateId ||
449
- option.id === object.typeId,
450
- ),
451
- );
452
-
453
- if (!hasValidInsertOptions) {
454
- const confirmed = await new Promise<boolean>((resolve) => {
455
- editContext?.confirm({
456
- message: (
457
- <div>
458
- The selected items may not be compatible with this location.
459
- No matching insert options were found. Do you want to proceed
460
- anyway?
461
- </div>
462
- ),
463
- header: "Insert Options Warning",
464
- icon: "pi pi-exclamation-triangle",
465
- acceptLabel: "Proceed Anyway",
466
- rejectLabel: "Cancel",
467
- accept: () => resolve(true),
468
- reject: () => resolve(false),
469
- });
470
- });
471
-
472
- if (!confirmed) {
473
- return;
474
- }
475
- }
476
-
477
- // Proceed with the original drop logic
478
- if (event.ctrlKey) {
479
- editContext?.executeCommand({
480
- command: editContext.configuration.commands.copyItems,
481
- data: {
482
- items: object.items as FullItem[],
483
- targetItem: parent.data,
484
- index,
485
- },
486
- });
487
- } else {
488
- editContext?.executeCommand({
489
- command: editContext.configuration.commands.moveItems,
490
- data: {
491
- items: object.items as FullItem[],
492
- targetItem: parent.data,
493
- index,
494
- },
495
- });
496
- }
497
- } catch (error) {
498
- console.error("Error validating insert options:", error);
499
- editContext?.showToast({
500
- severity: "error",
501
- summary: "Validation Error",
502
- detail: "Unable to validate insert options. Please try again.",
503
- life: 5000,
504
- });
505
- return;
506
- }
507
- }
508
- event.stopPropagation();
509
- }
510
-
511
- function handleDragEnd(): void {
512
- editContextRef.current?.dragEnd();
513
- if (dragEnd) dragEnd();
514
- }
515
-
516
- useEffect(() => {
517
- setSelectedKeys(selectedItemIds || []);
518
- }, [selectedItemIds]);
519
-
520
- const itemCommands =
521
- editContext?.configuration.commands.allItemCommands || [];
522
-
523
- const onContextMenu = useCallback(
524
- async (node: CustomTreeNode, originalEvent: React.MouseEvent) => {
525
- const key = node.key;
526
- let itemIds = selectedItemIds;
527
-
528
- if (!itemIds || !itemIds.includes(key as string)) {
529
- if (onSelectionChange && selectionMode === "single") {
530
- onSelectionChange([node.data as ItemTreeNodeData]);
531
- }
532
- itemIds = [key as string];
533
- }
534
-
535
- const items = await editContext?.itemsRepository.getItems(
536
- itemIds.map((x) => ({
537
- id: x,
538
- language: editContext.contentEditorItem?.language || "en",
539
- version: 0,
540
- })),
541
- );
542
-
543
- if (!items || items.length === 0) return;
544
-
545
- const menuItems =
546
- await editContext?.configuration.editor.contentTree.contextMenu.factory(
547
- {
548
- items: items,
549
- editContext: editContext,
550
- commandCallback: (command: ItemCommand, result: any) => {
551
- cm.current?.hide(originalEvent);
552
- if (command.id === "insertItem") {
553
- const item = result as ItemDescriptor;
554
- if (item) {
555
- setExpandedKeys((keys) => [...keys, item.id]);
556
- onItemInserted?.(item);
557
- }
558
- }
559
- },
560
- },
561
- );
562
-
563
- if (menuItems) setMenu(menuItems);
564
-
565
- cm.current?.show(originalEvent);
566
- },
567
- [
568
- itemCommands,
569
- editContext,
570
- selectedItemIds,
571
- onSelectionChange,
572
- selectionMode,
573
- onItemInserted,
574
- ],
575
- );
576
-
577
- // Memoize the toggle expand handler
578
- const handleToggleExpand = useCallback((nodeKey: string) => {
579
- setExpandedKeys((value) => {
580
- if (value.includes(nodeKey)) return value.filter((x) => x !== nodeKey);
581
- else return [...value, nodeKey];
582
- });
583
- }, []);
584
-
585
- // Memoize the node selection handler
586
- const handleNodeSelect = useCallback(
587
- (nodeKey: string, ev: any) => {
588
- let newSelection = [...selectedKeys];
589
-
590
- if (
591
- selectionMode === "multiple" &&
592
- ev.shiftKey &&
593
- lastSelectedItemId.current
594
- ) {
595
- // Get the nodes
596
- const lastNode = nodeDictionary.current[lastSelectedItemId.current];
597
- const currentNode = nodeDictionary.current[nodeKey];
598
-
599
- // Check if both nodes exist and have the same parent
600
- if (
601
- lastNode &&
602
- currentNode &&
603
- lastNode.parent?.key === currentNode.parent?.key
604
- ) {
605
- const parentNode = lastNode.parent;
606
-
607
- // Get all children of the parent
608
- const siblings = parentNode?.children || [];
609
-
610
- // Find indices of selected nodes
611
- const siblingKeys = siblings.map((node) => node.key as string);
612
- const lastNodeIndex = siblingKeys.indexOf(lastSelectedItemId.current);
613
- const currentNodeIndex = siblingKeys.indexOf(nodeKey);
614
-
615
- // Determine start and end indices
616
- const startIdx = Math.min(lastNodeIndex, currentNodeIndex);
617
- const endIdx = Math.max(lastNodeIndex, currentNodeIndex);
618
-
619
- // Get all nodes between (inclusive)
620
- const nodesToSelect = siblingKeys.slice(startIdx, endIdx + 1);
621
-
622
- // Combine with existing selection
623
- newSelection = [...new Set([...newSelection, ...nodesToSelect])];
624
- } else {
625
- // If not on same level, just select the current node
626
- newSelection = [nodeKey];
627
- }
628
- } else if (selectionMode === "multiple" && ev.ctrlKey) {
629
- newSelection = selectedKeys.includes(nodeKey)
630
- ? selectedKeys.filter((x) => x !== nodeKey)
631
- : [...selectedKeys, nodeKey];
632
- } else {
633
- lastSelectedItemId.current = nodeKey;
634
- newSelection = [nodeKey];
635
- }
636
-
637
- setSelectedKeys(newSelection);
638
- if (onSelectionChange) {
639
- const selectedNodes = newSelection
640
- .filter((key) => nodeDictionary.current[key])
641
- .map((key) => nodeDictionary.current[key]);
642
- onSelectionChange(selectedNodes.map((x) => x?.data));
643
- }
644
- },
645
- [onSelectionChange, selectionMode, selectedKeys],
646
- );
647
-
648
- // Memoize the renderNode function
649
- const memoizedRenderNode = useMemo(() => {
650
- if (renderNode) {
651
- return (node: CustomTreeNode) => renderNode(node, (n) => nodeTemplate(n));
652
- }
653
- return nodeTemplate;
654
- }, [renderNode, nodeTemplate]);
655
-
656
- // Memoize the double click handler
657
- const handleDoubleClick = useCallback(
658
- (node: CustomTreeNode) => {
659
- onDoubleClick?.(node.data);
660
- },
661
- [onDoubleClick],
662
- );
663
-
664
- // Memoize treeNodes to prevent unnecessary re-renders
665
- const memoizedTreeNodes = useMemo(() => treeNodes, [treeNodes]);
666
-
667
- const loadChildren = useCallback(
668
- async (node: CustomTreeNode, forceReload = false) => {
669
- if (!node.children || forceReload) {
670
- const nodes = await loadNodeChildren(node);
671
- node.children = nodes;
672
- setTreeNodes((prev) => [...prev]);
673
- }
674
- },
675
- [loadNodeChildren],
676
- );
677
-
678
- const loadOnExpand = useCallback(
679
- async (node: CustomTreeNode) => {
680
- node.children = null;
681
- setTreeNodes([...treeNodes]);
682
- await loadChildren(node);
683
- },
684
- [loadChildren, treeNodes],
685
- );
686
-
687
- const handleDragOverZone = useCallback(
688
- (node: CustomTreeNode | null, index: number, event: React.DragEvent) => {
689
- event.dataTransfer.dropEffect = event.ctrlKey ? "copy" : "move";
690
- return true;
691
- },
692
- [],
693
- );
694
- if (!memoizedTreeNodes.length)
695
- return (
696
- <div className="flex h-full items-center justify-center gap-2 bg-gray-50 text-xs text-gray-500">
697
- <Spinner size="2xl" /> Loading...
698
- </div>
699
- );
700
-
701
- return (
702
- <>
703
- <ContextMenu model={menu} ref={cm} className="text-sm" />
704
- <div className={className} ref={treeContainerRef}>
705
- <MemoizedPerfectTree
706
- nodes={memoizedTreeNodes}
707
- expandedKeys={expandedKeys}
708
- onToggleExpand={handleToggleExpand}
709
- renderNode={memoizedRenderNode}
710
- onLazyLoad={loadOnExpand}
711
- onDoubleClick={handleDoubleClick}
712
- onSelect={handleNodeSelect}
713
- selectedKeys={selectedKeys}
714
- onContextMenu={onContextMenu}
715
- enableDragAndDrop={true}
716
- onStartDrag={handleDragStart}
717
- onDragOverZone={handleDragOverZone}
718
- onDragEnd={handleDragEnd}
719
- isDragging={editContext?.dragObject !== undefined}
720
- onDrop={(parent, index, event) => {
721
- handleDrop(parent as CustomTreeNode, index, event);
722
- }}
723
- />
724
- </div>
725
- </>
726
- );
727
- }