@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,432 +0,0 @@
1
- import { useState, useEffect, useRef, useCallback } from "react";
2
- import { useEditContext } from "../client/editContext";
3
- import { AiResponseMessage } from "./AiResponseMessage";
4
- import { createEditorAiContext } from "./editorAiContext";
5
-
6
- import { ToolCall, Message as AiTerminalMessage } from "./AiTerminal";
7
- import { executePrompt } from "../services/aiService";
8
- import { EditOperation } from "../../types";
9
- import { useDebouncedCallback } from "use-debounce";
10
- // Simple debounce function
11
- function debounce<F extends (...args: any[]) => any>(
12
- func: F,
13
- waitFor: number,
14
- ): (...args: Parameters<F>) => void {
15
- let timeoutId: ReturnType<typeof setTimeout> | null = null;
16
-
17
- return (...args: Parameters<F>): void => {
18
- if (timeoutId !== null) {
19
- clearTimeout(timeoutId);
20
- }
21
- timeoutId = setTimeout(() => func(...args), waitFor);
22
- };
23
- }
24
-
25
- // This matches the Message type in aiService.ts which is used by executePrompt
26
- type Message = {
27
- content: string;
28
- name: string;
29
- role: string;
30
- };
31
-
32
- type Response = {
33
- responseText: string;
34
- editOperations: EditOperation[];
35
- numInputTokens: number;
36
- numOutputTokens: number;
37
- numCachedTokens: number;
38
- messages: AiTerminalMessage[];
39
- toolCalls?: ToolCall[];
40
- state: string;
41
- };
42
-
43
- const GHOST_WRITER_CONTEXT_FIELD_ID =
44
- "5B14129E-E14F-4C17-A7D2-0FCB27601A18".toLowerCase();
45
-
46
- export function GhostWriter() {
47
- const editContext = useEditContext();
48
- const [context, setContext] = useState("");
49
- const [messages, setMessages] = useState<AiTerminalMessage[]>([]);
50
- const [thinking, setThinking] = useState<Response | null>(null);
51
- const [isMonitoring, setIsMonitoring] = useState(false);
52
- const [isThinking, setIsThinking] = useState(false);
53
- const lastOpIndexRef = useRef(0);
54
- const isMountedRef = useRef(false); // To prevent running on initial mount
55
- const [newMessages, setNewMessages] = useState<AiTerminalMessage[]>([]);
56
- const newMessagesRef = useRef<AiTerminalMessage[]>([]);
57
-
58
- useEffect(() => {
59
- newMessagesRef.current = newMessages;
60
- }, [newMessages]);
61
-
62
- // Memoized debounced function
63
- const debouncedCheckIfAiCanHelp = useDebouncedCallback(() => {
64
- // Check if component is still mounted and conditions are met
65
- if (isMountedRef.current && isMonitoring && !isThinking && editContext) {
66
- console.log("Debounced check triggered");
67
- checkIfAiCanHelp();
68
- }
69
- }, 3000); // Wait 3 seconds
70
-
71
- // Effect to monitor edit history length for changes
72
- useEffect(() => {
73
- if (!editContext || !isMonitoring) {
74
- isMountedRef.current = false; // Reset mount status if disabled/no context
75
- return;
76
- }
77
-
78
- // Set mounted status only after initial render and when enabled
79
- isMountedRef.current = true;
80
-
81
- // Trigger debounce when edit history changes *after* initial mount
82
- // Only trigger if the last edit was NOT made by the AI
83
- if (isMountedRef.current && editContext?.editHistory) {
84
- const history = editContext.editHistory;
85
- if (history.length > 0) {
86
- const lastOp = history[0];
87
- // Ensure lastOp exists and check the user.ai flag
88
- if (lastOp && !lastOp.user?.ai) {
89
- console.log(
90
- "User edit detected, calling debounce for Ghost Writer check",
91
- );
92
- debouncedCheckIfAiCanHelp();
93
- } else {
94
- console.log("AI edit detected, skipping Ghost Writer check");
95
- }
96
- }
97
- }
98
-
99
- // Cleanup function to set mounted status to false
100
- return () => {
101
- isMountedRef.current = false;
102
- };
103
- }, [editContext?.editHistory, isMonitoring, debouncedCheckIfAiCanHelp]); // Watch history length and monitoring status
104
-
105
- // Load initial context from Sitecore field
106
- useEffect(() => {
107
- if (
108
- !editContext ||
109
- !editContext.currentItemDescriptor ||
110
- !editContext.itemsRepository
111
- ) {
112
- return;
113
- }
114
- const { currentItemDescriptor, itemsRepository } = editContext;
115
-
116
- const loadContext = async () => {
117
- try {
118
- // Get the full item first
119
- const item = await itemsRepository.getItem(currentItemDescriptor);
120
- if (!item?.fields) {
121
- console.warn(
122
- "Could not load item or fields for Ghost Writer context",
123
- );
124
- return;
125
- }
126
-
127
- // Find the specific field
128
- const contextField = item.fields.find(
129
- (f) => f.id === GHOST_WRITER_CONTEXT_FIELD_ID,
130
- );
131
- const initialContext = contextField?.value; // Or contextField?.rawValue
132
-
133
- if (initialContext && typeof initialContext === "string") {
134
- setContext(initialContext);
135
- } else {
136
- // Set to empty if field doesn't exist or is not a string
137
- setContext("");
138
- }
139
- } catch (error) {
140
- console.error("Error loading Ghost Writer context:", error);
141
- setContext(""); // Reset context on error
142
- }
143
- };
144
-
145
- loadContext();
146
- // Depend on the item descriptor and the repository instance
147
- }, [editContext?.currentItemDescriptor, editContext?.itemsRepository]);
148
-
149
- // Debounced function to save context to Sitecore
150
- const debouncedSaveContext = useDebouncedCallback((newContext: string) => {
151
- if (
152
- !editContext ||
153
- !editContext.currentItemDescriptor ||
154
- !editContext.operations
155
- ) {
156
- return;
157
- }
158
- const { currentItemDescriptor, operations } = editContext;
159
-
160
- console.log("Debounced save triggered for context:", newContext);
161
- try {
162
- operations.editField({
163
- field: {
164
- item: currentItemDescriptor,
165
- fieldId: GHOST_WRITER_CONTEXT_FIELD_ID,
166
- },
167
- value: newContext,
168
- });
169
- } catch (error) {
170
- console.error("Error saving Ghost Writer context:", error);
171
- }
172
- }, 1000);
173
-
174
- // Handle context change and trigger debounced save
175
- const handleContextChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
176
- const newContext = e.target.value;
177
- setContext(newContext);
178
- debouncedSaveContext(newContext);
179
- };
180
-
181
- // Function to check if AI can help
182
- const checkIfAiCanHelp = async () => {
183
- if (!editContext) return;
184
-
185
- console.log("Starting AI check");
186
- setIsThinking(true);
187
-
188
- // Create a new user message for the current context
189
- const userMessage: AiTerminalMessage = {
190
- id: Date.now(),
191
- content: context,
192
- role: "user",
193
- name: "user",
194
- tool_calls: [],
195
- };
196
-
197
- // Add user message to our history display
198
- const updatedMessages = [...messages, userMessage];
199
- setMessages(updatedMessages);
200
-
201
- setThinking({
202
- responseText: "Your Ghost Writer is thinking...",
203
- editOperations: [],
204
- numInputTokens: 0,
205
- numOutputTokens: 0,
206
- numCachedTokens: 0,
207
- messages: updatedMessages,
208
- state: "thinking",
209
- });
210
-
211
- lastOpIndexRef.current = 0;
212
- setNewMessages([]);
213
-
214
- try {
215
- // Only send the current context as a message to executePrompt
216
- const response = await executePrompt(
217
- [
218
- {
219
- content: context,
220
- role: "user",
221
- name: "user",
222
- },
223
- ],
224
- editContext,
225
- createEditorAiContext,
226
- {
227
- addAllContent: true,
228
- profile: "ghostwriter",
229
- },
230
- undefined,
231
- "gpt-4.1-mini",
232
- handleAiResponse,
233
- );
234
-
235
- if (response) {
236
- handleAiResponse(response);
237
- }
238
- } catch (error) {
239
- console.error("Error executing Ghost Writer AI prompt:", error);
240
- if (isMountedRef.current) {
241
- // Check if still mounted before setting state
242
- setThinking({
243
- responseText: "Error occurred while thinking.",
244
- editOperations: [],
245
- numInputTokens: 0,
246
- numOutputTokens: 0,
247
- numCachedTokens: 0,
248
- messages: updatedMessages,
249
- state: "error",
250
- toolCalls: [],
251
- });
252
- }
253
- } finally {
254
- if (isMountedRef.current) {
255
- setIsThinking(false);
256
- console.log("AI check finished");
257
- }
258
- }
259
- };
260
-
261
- // Handle AI response as it streams in
262
- const handleAiResponse = (response: Response) => {
263
- if (!isMountedRef.current) return; // Don't update state if unmounted
264
-
265
- // Merge new messages from the response with newMessagesRef.current based on message ID
266
- const currentNewMessages = [...newMessagesRef.current];
267
-
268
- if (response.messages && response.messages.length > 0) {
269
- response.messages.forEach((newMsg) => {
270
- // Check if message with this ID already exists in newMessages
271
- const existingMsgIndex = currentNewMessages.findIndex(
272
- (m) => m.id === newMsg.id,
273
- );
274
-
275
- if (existingMsgIndex >= 0) {
276
- // Update existing message
277
- currentNewMessages[existingMsgIndex] = newMsg;
278
- } else {
279
- // Add new message
280
- currentNewMessages.push(newMsg);
281
- }
282
- });
283
- }
284
-
285
- // Update newMessages state and ref
286
- setNewMessages(currentNewMessages);
287
- setMessages([...messages, ...currentNewMessages]);
288
-
289
- // Merge the new response messages with our existing messages
290
- const updatedMessages = [...messages];
291
- if (response.messages && response.messages.length > 0) {
292
- response.messages.forEach((msg) => {
293
- updatedMessages.push(msg);
294
- });
295
- }
296
- console.log("Updated messages:", updatedMessages);
297
- setMessages(updatedMessages);
298
-
299
- // Update the response with our combined messages
300
- const updatedResponse = {
301
- ...response,
302
- messages: updatedMessages,
303
- };
304
-
305
- setThinking(updatedResponse); // Update the displayed thinking state
306
-
307
- // Apply new operations incrementally
308
- if (
309
- editContext &&
310
- response.editOperations &&
311
- response.editOperations.length > lastOpIndexRef.current
312
- ) {
313
- const newOps = response.editOperations.slice(lastOpIndexRef.current);
314
- // applyAiOperations(newOps);
315
- lastOpIndexRef.current = response.editOperations.length;
316
- }
317
- };
318
-
319
- // // Apply operations suggested by the AI
320
- // const applyAiOperations = (operations: EditOperation[]) => {
321
- // if (!editContext || !isMountedRef.current) return;
322
-
323
- // const isEditTextFieldOp = (op: EditOperation): op is EditFieldOperation => {
324
- // if (op.type !== "edit-field") return false;
325
- // const editFieldOp = op as EditFieldOperation;
326
- // return (
327
- // !!editFieldOp.fieldType && editFieldOp.fieldType.indexOf("text") !== -1
328
- // );
329
- // };
330
-
331
- // operations.forEach((op: EditOperation) => {
332
- // console.log("Applying AI operation:", op.type, op);
333
- // if (isEditTextFieldOp(op)) {
334
- // if (op.itemId && op.mainItem) {
335
- // // Check mainItem exists
336
- // const fieldDescriptor = {
337
- // item: {
338
- // ...op.mainItem,
339
- // id: op.itemId,
340
- // },
341
- // fieldId: op.fieldId,
342
- // };
343
- // try {
344
- // editContext.itemsRepository.updateFieldValue(
345
- // fieldDescriptor,
346
- // op.user ?? { name: "GhostWriter", ai: true },
347
- // false,
348
- // op.value,
349
- // );
350
- // } catch (error) {
351
- // console.error(
352
- // "Error applying updateFieldValue:",
353
- // error,
354
- // fieldDescriptor,
355
- // op.value,
356
- // );
357
- // }
358
- // } else {
359
- // console.warn(
360
- // "Skipping edit-field op due to missing itemId or mainItem:",
361
- // op,
362
- // );
363
- // }
364
- // } else if (op.type === "add-component") {
365
- // // Add component logic might need more details from the operation
366
- // // Example: editContext.operations.addComponent(...)
367
- // console.warn(
368
- // "Add-component operation application not fully implemented.",
369
- // );
370
- // }
371
- // });
372
-
373
- // // Debounce refresh request if needed
374
- // editContext.requestRefresh("immediate");
375
- // };
376
-
377
- return (
378
- <div className="ghost-writer flex h-full flex-col gap-4 p-4">
379
- <div className="flex items-center justify-between">
380
- <h2 className="text-lg font-semibold">Ghost Writer</h2>
381
- <label className="flex cursor-pointer items-center">
382
- <input
383
- type="checkbox"
384
- checked={isMonitoring}
385
- onChange={() => setIsMonitoring(!isMonitoring)}
386
- className="mr-2"
387
- />
388
- <span>Enable Ghost Writer</span>
389
- </label>
390
- </div>
391
-
392
- <div className="background-context">
393
- <label className="mb-2 block font-medium">Background Context</label>
394
- <textarea
395
- value={context}
396
- onChange={handleContextChange}
397
- placeholder="Provide some background context about this page to help the AI understand its purpose..."
398
- className="h-32 w-full resize-none rounded border p-2"
399
- disabled={isThinking}
400
- />
401
- </div>
402
-
403
- <div className="ai-thinking flex-1 overflow-auto text-sm">
404
- <label className="mb-2 block font-medium">AI Thinking</label>
405
- <div className="max-h-[400px] min-h-[200px] overflow-y-auto rounded border bg-gray-50 p-3">
406
- {messages.length > 0 ? (
407
- <AiResponseMessage
408
- messages={messages}
409
- editOperations={thinking?.editOperations || []}
410
- finished={
411
- !thinking ||
412
- thinking.state === "finished" ||
413
- thinking.state === "error"
414
- }
415
- />
416
- ) : (
417
- <div className="text-gray-500 italic">
418
- {isMonitoring
419
- ? "Ghost Writer is active and monitoring for changes..."
420
- : "Enable Ghost Writer to get AI assistance while you edit"}
421
- </div>
422
- )}
423
- {thinking && thinking.state === "thinking" && (
424
- <div className="mt-2 text-blue-500">
425
- Your Ghost Writer is thinking...
426
- </div>
427
- )}
428
- </div>
429
- </div>
430
- </div>
431
- );
432
- }
@@ -1,108 +0,0 @@
1
- import { EditContextType } from "../client/editContext";
2
- import {
3
- Component,
4
- FullItem,
5
- ItemDescriptor,
6
- Page,
7
- Placeholder,
8
- } from "../pageModel";
9
-
10
- export type AiPageModel = {
11
- components: AiComponent[];
12
- message?: string;
13
- };
14
-
15
- export type AiComponent = {
16
- id: string;
17
- name: string;
18
- type: string;
19
- fields: AiField[];
20
- placeholder?: string;
21
- children?: AiComponent[];
22
- };
23
-
24
- export type AiField = {
25
- name: string;
26
- value: string;
27
- type: string;
28
- };
29
-
30
- const collectDatasourceItemDescriptors = (
31
- component: Component,
32
- allDatasourceItemDescriptors: ItemDescriptor[],
33
- ): void => {
34
- if (component.datasourceItem) {
35
- allDatasourceItemDescriptors.push(component.datasourceItem);
36
- }
37
-
38
- component.placeholders.forEach((placeholder) => {
39
- if (placeholder.components) {
40
- placeholder.components.forEach((c) => {
41
- collectDatasourceItemDescriptors(c, allDatasourceItemDescriptors);
42
- });
43
- }
44
- });
45
- };
46
-
47
- const mapComponent = (allDatasourceItems: FullItem[], component: Component) => {
48
- const item = allDatasourceItems.find((item) => item.id === component.id);
49
- console.log("Map component: ", component, allDatasourceItems);
50
-
51
- const fields: AiField[] =
52
- item?.fields
53
- .filter((x) =>
54
- component.datasourceItem?.renderedFieldIds.find((y) => y === x.id),
55
- )
56
- .map((field) => ({
57
- name: field.name || "unknown",
58
- value: field.rawValue as string,
59
- type: field.type,
60
- })) ?? [];
61
-
62
- return {
63
- id: component.id,
64
- name: component.name || "unknown",
65
- type: component.type,
66
- fields: fields,
67
- children: mapPlaceholders(component, allDatasourceItems),
68
- };
69
- };
70
-
71
- const mapPlaceholders = (
72
- component: Component,
73
- allDatasourceItems: FullItem[],
74
- ) => {
75
- let components: AiComponent[] = [];
76
- component.placeholders.forEach((p) => {
77
- const placeholderComponents = mapPlaceholder(p, allDatasourceItems);
78
- components = [...components, ...placeholderComponents];
79
- });
80
- return components;
81
- };
82
-
83
- const mapPlaceholder = (
84
- placeholder: Placeholder,
85
- allDatasourceItems: FullItem[],
86
- ) => {
87
- return placeholder.components.map((c) => mapComponent(allDatasourceItems, c));
88
- };
89
-
90
- export const convertToAiPageModel = async (
91
- page: Page,
92
- editContext: EditContextType,
93
- ): Promise<AiPageModel> => {
94
- const allDatasourceItemDescriptors: ItemDescriptor[] = [];
95
-
96
- collectDatasourceItemDescriptors(
97
- page.rootComponent,
98
- allDatasourceItemDescriptors,
99
- );
100
-
101
- const allDatasourceItems = await editContext.itemsRepository.getItems(
102
- allDatasourceItemDescriptors,
103
- );
104
-
105
- return {
106
- components: mapPlaceholders(page.rootComponent, allDatasourceItems),
107
- };
108
- };
@@ -1,18 +0,0 @@
1
- import { EditContextType } from "../client/editContext";
2
-
3
- export function createEditorAiContext({
4
- editContext,
5
- }: {
6
- editContext: EditContextType;
7
- }) {
8
- const aiPromptUrl = editContext.configuration.services.aiService.promptUrl;
9
-
10
- return {
11
- endpoint: aiPromptUrl,
12
- promptData: {
13
- itemid: editContext.currentItemDescriptor?.id,
14
- language: editContext.currentItemDescriptor?.language,
15
- version: editContext.currentItemDescriptor?.version,
16
- },
17
- };
18
- }
@@ -1,44 +0,0 @@
1
- import { Dialog } from "primereact/dialog";
2
- import { DialogProps } from "./editContext";
3
- import { useImperativeHandle, useState, forwardRef, useEffect } from "react";
4
- import { buildDate, version } from "../../revision";
5
-
6
- export const AboutDialog = forwardRef<DialogProps<void>, DialogProps<void>>(
7
- (props, ref) => {
8
- const [visible, setVisible] = useState(false);
9
-
10
- useImperativeHandle(ref, () => ({
11
- onClose: (result: any) => {
12
- setVisible(false);
13
- props.onClose(result);
14
- },
15
- }));
16
-
17
- useEffect(() => {
18
- setVisible(true);
19
- }, []);
20
-
21
- return (
22
- <Dialog
23
- visible={visible}
24
- onHide={() => {
25
- setVisible(false);
26
- props.onClose(null);
27
- }}
28
- header="About AI Workbench"
29
- style={{ width: "400px" }}
30
- >
31
- <div className="flex flex-col gap-4 p-2">
32
- <div>
33
- Build: <span className="font-bold"> {version}</span> from{" "}
34
- <span className="font-bold">{buildDate}</span>
35
- </div>
36
- <div className="mt-4 text-sm text-gray-600">
37
- &copy; {new Date().getFullYear()} canvas Reply GmbH. All rights
38
- reserved.
39
- </div>
40
- </div>
41
- </Dialog>
42
- );
43
- },
44
- );