@alpaca-editor/core 1.0.3762-mono

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 (460) hide show
  1. package/.prettierrc +3 -0
  2. package/dist/client-components/api.js +6 -0
  3. package/dist/client-components/index.js +36 -0
  4. package/dist/components/ActionButton.js +9 -0
  5. package/dist/components/Error.js +28 -0
  6. package/dist/config/config.js +654 -0
  7. package/dist/config/types.js +2 -0
  8. package/dist/editor/ComponentInfo.js +31 -0
  9. package/dist/editor/ConfirmationDialog.js +32 -0
  10. package/dist/editor/ContentTree.js +406 -0
  11. package/dist/editor/ContextMenu.js +117 -0
  12. package/dist/editor/Editor.js +55 -0
  13. package/dist/editor/EditorWarning.js +13 -0
  14. package/dist/editor/EditorWarnings.js +24 -0
  15. package/dist/editor/FieldEditorPopup.js +24 -0
  16. package/dist/editor/FieldHistory.js +40 -0
  17. package/dist/editor/FieldList.js +63 -0
  18. package/dist/editor/FieldListField.js +164 -0
  19. package/dist/editor/FieldListFieldWithFallbacks.js +114 -0
  20. package/dist/editor/FloatingToolbar.js +92 -0
  21. package/dist/editor/ImageEditor.js +55 -0
  22. package/dist/editor/InsertMenu.js +164 -0
  23. package/dist/editor/ItemInfo.js +30 -0
  24. package/dist/editor/LinkEditorDialog.js +89 -0
  25. package/dist/editor/MainLayout.js +46 -0
  26. package/dist/editor/NewEditorClient.js +9 -0
  27. package/dist/editor/PictureCropper.js +332 -0
  28. package/dist/editor/PictureEditor.js +104 -0
  29. package/dist/editor/PictureEditorDialog.js +194 -0
  30. package/dist/editor/ScrollingContentTree.js +30 -0
  31. package/dist/editor/Terminal.js +109 -0
  32. package/dist/editor/Titlebar.js +11 -0
  33. package/dist/editor/ai/AiPopup.js +25 -0
  34. package/dist/editor/ai/AiResponseMessage.js +24 -0
  35. package/dist/editor/ai/AiTerminal.js +241 -0
  36. package/dist/editor/ai/AiToolCall.js +18 -0
  37. package/dist/editor/ai/EditorAiTerminal.js +9 -0
  38. package/dist/editor/ai/editorAiContext.js +14 -0
  39. package/dist/editor/client/DialogContext.js +29 -0
  40. package/dist/editor/client/EditorClient.js +1336 -0
  41. package/dist/editor/client/GenericDialog.js +27 -0
  42. package/dist/editor/client/editContext.js +59 -0
  43. package/dist/editor/client/helpers.js +31 -0
  44. package/dist/editor/client/itemsRepository.js +255 -0
  45. package/dist/editor/client/operations.js +398 -0
  46. package/dist/editor/client/pageModelBuilder.js +129 -0
  47. package/dist/editor/commands/commands.js +2 -0
  48. package/dist/editor/commands/componentCommands.js +277 -0
  49. package/dist/editor/commands/createVersionCommand.js +26 -0
  50. package/dist/editor/commands/deleteVersionCommand.js +55 -0
  51. package/dist/editor/commands/itemCommands.js +134 -0
  52. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +94 -0
  53. package/dist/editor/commands/undo.js +32 -0
  54. package/dist/editor/component-designer/ComponentDesigner.js +58 -0
  55. package/dist/editor/component-designer/ComponentDesignerAiTerminal.js +9 -0
  56. package/dist/editor/component-designer/ComponentDesignerMenu.js +67 -0
  57. package/dist/editor/component-designer/ComponentEditor.js +59 -0
  58. package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +16 -0
  59. package/dist/editor/component-designer/ComponentRenderingEditor.js +71 -0
  60. package/dist/editor/component-designer/ComponentsDropdown.js +22 -0
  61. package/dist/editor/component-designer/PlaceholdersEditor.js +70 -0
  62. package/dist/editor/component-designer/RenderingsDropdown.js +25 -0
  63. package/dist/editor/component-designer/TemplateEditor.js +144 -0
  64. package/dist/editor/component-designer/aiContext.js +18 -0
  65. package/dist/editor/componentTreeHelper.js +97 -0
  66. package/dist/editor/control-center/ControlCenterMenu.js +59 -0
  67. package/dist/editor/control-center/IndexOverview.js +27 -0
  68. package/dist/editor/control-center/IndexSettings.js +106 -0
  69. package/dist/editor/control-center/Status.js +7 -0
  70. package/dist/editor/editor-warnings/ItemLocked.js +40 -0
  71. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +16 -0
  72. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +16 -0
  73. package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
  74. package/dist/editor/editor-warnings/ValidationErrors.js +27 -0
  75. package/dist/editor/field-types/AttachmentEditor.js +7 -0
  76. package/dist/editor/field-types/CheckboxEditor.js +32 -0
  77. package/dist/editor/field-types/DropLinkEditor.js +51 -0
  78. package/dist/editor/field-types/DropListEditor.js +58 -0
  79. package/dist/editor/field-types/ImageFieldEditor.js +36 -0
  80. package/dist/editor/field-types/InternalLinkFieldEditor.js +64 -0
  81. package/dist/editor/field-types/LinkFieldEditor.js +58 -0
  82. package/dist/editor/field-types/MultiLineText.js +35 -0
  83. package/dist/editor/field-types/PictureFieldEditor.js +59 -0
  84. package/dist/editor/field-types/RawEditor.js +33 -0
  85. package/dist/editor/field-types/ReactQuill.js +366 -0
  86. package/dist/editor/field-types/RichTextEditor.js +46 -0
  87. package/dist/editor/field-types/RichTextEditorComponent.js +72 -0
  88. package/dist/editor/field-types/SingleLineText.js +92 -0
  89. package/dist/editor/field-types/TreeListEditor.js +137 -0
  90. package/dist/editor/fieldTypes.js +2 -0
  91. package/dist/editor/media-selector/AiImageSearch.js +110 -0
  92. package/dist/editor/media-selector/AiImageSearchPrompt.js +58 -0
  93. package/dist/editor/media-selector/MediaSelector.js +11 -0
  94. package/dist/editor/media-selector/Preview.js +9 -0
  95. package/dist/editor/media-selector/Thumbnails.js +11 -0
  96. package/dist/editor/media-selector/TreeSelector.js +171 -0
  97. package/dist/editor/media-selector/UploadZone.js +80 -0
  98. package/dist/editor/menubar/ActionsMenu.js +33 -0
  99. package/dist/editor/menubar/ActiveUsers.js +13 -0
  100. package/dist/editor/menubar/ApproveAndPublish.js +13 -0
  101. package/dist/editor/menubar/BrowseHistory.js +14 -0
  102. package/dist/editor/menubar/ItemLanguageVersion.js +36 -0
  103. package/dist/editor/menubar/LanguageSelector.js +33 -0
  104. package/dist/editor/menubar/Menu.js +65 -0
  105. package/dist/editor/menubar/NavButtons.js +43 -0
  106. package/dist/editor/menubar/PageSelector.js +50 -0
  107. package/dist/editor/menubar/PageViewerControls.js +37 -0
  108. package/dist/editor/menubar/Separator.js +8 -0
  109. package/dist/editor/menubar/SiteInfo.js +26 -0
  110. package/dist/editor/menubar/User.js +18 -0
  111. package/dist/editor/menubar/VersionSelector.js +49 -0
  112. package/dist/editor/page-editor-chrome/CommentHighlighting.js +214 -0
  113. package/dist/editor/page-editor-chrome/CommentHighlightings.js +17 -0
  114. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +27 -0
  115. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +15 -0
  116. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +27 -0
  117. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +15 -0
  118. package/dist/editor/page-editor-chrome/FrameMenu.js +178 -0
  119. package/dist/editor/page-editor-chrome/FrameMenus.js +24 -0
  120. package/dist/editor/page-editor-chrome/InlineEditor.js +101 -0
  121. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +35 -0
  122. package/dist/editor/page-editor-chrome/NoLayout.js +21 -0
  123. package/dist/editor/page-editor-chrome/PageEditorChrome.js +65 -0
  124. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +109 -0
  125. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +82 -0
  126. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +147 -0
  127. package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
  128. package/dist/editor/page-viewer/EditorForm.js +130 -0
  129. package/dist/editor/page-viewer/MiniMap.js +257 -0
  130. package/dist/editor/page-viewer/PageViewer.js +64 -0
  131. package/dist/editor/page-viewer/PageViewerFrame.js +696 -0
  132. package/dist/editor/page-viewer/pageViewContext.js +117 -0
  133. package/dist/editor/pageModel.js +2 -0
  134. package/dist/editor/picture-shared.js +28 -0
  135. package/dist/editor/reviews/Comment.js +112 -0
  136. package/dist/editor/reviews/Comments.js +24 -0
  137. package/dist/editor/reviews/PreviewInfo.js +13 -0
  138. package/dist/editor/reviews/Reviews.js +165 -0
  139. package/dist/editor/reviews/reviewCommands.js +44 -0
  140. package/dist/editor/reviews/useReviews.js +48 -0
  141. package/dist/editor/services/aiService.js +99 -0
  142. package/dist/editor/services/componentDesignerService.js +79 -0
  143. package/dist/editor/services/contentService.js +104 -0
  144. package/dist/editor/services/editService.js +322 -0
  145. package/dist/editor/services/indexService.js +25 -0
  146. package/dist/editor/services/reviewsService.js +43 -0
  147. package/dist/editor/services/serviceHelper.js +67 -0
  148. package/dist/editor/services/systemService.js +7 -0
  149. package/dist/editor/services/translationService.js +15 -0
  150. package/dist/editor/services-server/api.js +119 -0
  151. package/dist/editor/services-server/graphQL.js +56 -0
  152. package/dist/editor/sidebar/ComponentPalette.js +55 -0
  153. package/dist/editor/sidebar/ComponentTree.js +362 -0
  154. package/dist/editor/sidebar/Debug.js +60 -0
  155. package/dist/editor/sidebar/DictionaryEditor.js +160 -0
  156. package/dist/editor/sidebar/EditHistory.js +74 -0
  157. package/dist/editor/sidebar/GraphQL.js +115 -0
  158. package/dist/editor/sidebar/Insert.js +24 -0
  159. package/dist/editor/sidebar/MainContentTree.js +52 -0
  160. package/dist/editor/sidebar/Performance.js +34 -0
  161. package/dist/editor/sidebar/Sessions.js +31 -0
  162. package/dist/editor/sidebar/Sidebar.js +15 -0
  163. package/dist/editor/sidebar/SidebarView.js +76 -0
  164. package/dist/editor/sidebar/Translations.js +160 -0
  165. package/dist/editor/sidebar/Validation.js +52 -0
  166. package/dist/editor/sidebar/ViewSelector.js +15 -0
  167. package/dist/editor/sidebar/Workbox.js +80 -0
  168. package/dist/editor/ui/CenteredMessage.js +7 -0
  169. package/dist/editor/ui/CopyToClipboardButton.js +17 -0
  170. package/dist/editor/ui/DialogButtons.js +7 -0
  171. package/dist/editor/ui/Icons.js +75 -0
  172. package/dist/editor/ui/ItemNameDialog.js +45 -0
  173. package/dist/editor/ui/ItemNameDialogNew.js +61 -0
  174. package/dist/editor/ui/ItemSearch.js +93 -0
  175. package/dist/editor/ui/PerfectTree.js +223 -0
  176. package/dist/editor/ui/Section.js +12 -0
  177. package/dist/editor/ui/SimpleIconButton.js +11 -0
  178. package/dist/editor/ui/SimpleMenu.js +9 -0
  179. package/dist/editor/ui/SimpleTable.js +11 -0
  180. package/dist/editor/ui/SimpleTabs.js +21 -0
  181. package/dist/editor/ui/SimpleToolbar.js +7 -0
  182. package/dist/editor/ui/Spinner.js +7 -0
  183. package/dist/editor/ui/Splitter.js +187 -0
  184. package/dist/editor/ui/StackedPanels.js +69 -0
  185. package/dist/editor/ui/Toolbar.js +7 -0
  186. package/dist/editor/utils/id-helper.js +7 -0
  187. package/dist/editor/utils/insertOptions.js +45 -0
  188. package/dist/editor/utils/itemutils.js +25 -0
  189. package/dist/editor/utils/useMemoDebug.js +20 -0
  190. package/dist/editor/utils.js +328 -0
  191. package/dist/editor/views/CompareView.js +147 -0
  192. package/dist/editor/views/EditView.js +17 -0
  193. package/dist/editor/views/ItemEditor.js +24 -0
  194. package/dist/editor/views/SingleEditView.js +25 -0
  195. package/dist/index.js +22 -0
  196. package/dist/page-wizard/PageWizard.js +62 -0
  197. package/dist/page-wizard/SelectWizard.js +43 -0
  198. package/dist/page-wizard/WizardSteps.js +71 -0
  199. package/dist/page-wizard/service.js +26 -0
  200. package/dist/page-wizard/startPageWizardCommand.js +23 -0
  201. package/dist/page-wizard/steps/BuildPageStep.js +138 -0
  202. package/dist/page-wizard/steps/CollectStep.js +124 -0
  203. package/dist/page-wizard/steps/ComponentTypesSelector.js +211 -0
  204. package/dist/page-wizard/steps/Components.js +94 -0
  205. package/dist/page-wizard/steps/CreatePage.js +142 -0
  206. package/dist/page-wizard/steps/CreatePageAndLayoutStep.js +230 -0
  207. package/dist/page-wizard/steps/EditButton.js +7 -0
  208. package/dist/page-wizard/steps/FieldEditor.js +30 -0
  209. package/dist/page-wizard/steps/Generate.js +11 -0
  210. package/dist/page-wizard/steps/ImagesStep.js +159 -0
  211. package/dist/page-wizard/steps/LayoutStep.js +120 -0
  212. package/dist/page-wizard/steps/SelectStep.js +150 -0
  213. package/dist/page-wizard/steps/schema.js +140 -0
  214. package/dist/page-wizard/steps/usePageCreator.js +194 -0
  215. package/dist/splash-screen/NewPage.js +131 -0
  216. package/dist/splash-screen/SectionHeadline.js +9 -0
  217. package/dist/splash-screen/SplashScreen.js +81 -0
  218. package/dist/tour/Tour.js +321 -0
  219. package/dist/tour/default-tour.js +231 -0
  220. package/dist/tour/preview-tour.js +93 -0
  221. package/dist/tsconfig.build.tsbuildinfo +1 -0
  222. package/dist/types.js +2 -0
  223. package/eslint.config.mjs +4 -0
  224. package/images/bg-shape-black.webp +0 -0
  225. package/package.json +52 -0
  226. package/src/client-components/api.ts +6 -0
  227. package/src/client-components/index.ts +19 -0
  228. package/src/components/ActionButton.tsx +43 -0
  229. package/src/components/Error.tsx +57 -0
  230. package/src/config/config.tsx +737 -0
  231. package/src/config/types.ts +263 -0
  232. package/src/editor/ComponentInfo.tsx +77 -0
  233. package/src/editor/ConfirmationDialog.tsx +103 -0
  234. package/src/editor/ContentTree.tsx +654 -0
  235. package/src/editor/ContextMenu.tsx +155 -0
  236. package/src/editor/Editor.tsx +91 -0
  237. package/src/editor/EditorWarning.tsx +34 -0
  238. package/src/editor/EditorWarnings.tsx +33 -0
  239. package/src/editor/FieldEditorPopup.tsx +65 -0
  240. package/src/editor/FieldHistory.tsx +74 -0
  241. package/src/editor/FieldList.tsx +190 -0
  242. package/src/editor/FieldListField.tsx +387 -0
  243. package/src/editor/FieldListFieldWithFallbacks.tsx +211 -0
  244. package/src/editor/FloatingToolbar.tsx +163 -0
  245. package/src/editor/ImageEditor.tsx +129 -0
  246. package/src/editor/InsertMenu.tsx +332 -0
  247. package/src/editor/ItemInfo.tsx +90 -0
  248. package/src/editor/LinkEditorDialog.tsx +192 -0
  249. package/src/editor/MainLayout.tsx +94 -0
  250. package/src/editor/NewEditorClient.tsx +11 -0
  251. package/src/editor/PictureCropper.tsx +505 -0
  252. package/src/editor/PictureEditor.tsx +206 -0
  253. package/src/editor/PictureEditorDialog.tsx +381 -0
  254. package/src/editor/PublishDialog.ignore +74 -0
  255. package/src/editor/ScrollingContentTree.tsx +47 -0
  256. package/src/editor/Terminal.tsx +215 -0
  257. package/src/editor/Titlebar.tsx +23 -0
  258. package/src/editor/ai/AiPopup.tsx +59 -0
  259. package/src/editor/ai/AiResponseMessage.tsx +82 -0
  260. package/src/editor/ai/AiTerminal.tsx +450 -0
  261. package/src/editor/ai/AiToolCall.tsx +46 -0
  262. package/src/editor/ai/EditorAiTerminal.tsx +20 -0
  263. package/src/editor/ai/editorAiContext.ts +18 -0
  264. package/src/editor/client/DialogContext.tsx +49 -0
  265. package/src/editor/client/EditorClient.tsx +1831 -0
  266. package/src/editor/client/GenericDialog.tsx +50 -0
  267. package/src/editor/client/editContext.ts +330 -0
  268. package/src/editor/client/helpers.ts +44 -0
  269. package/src/editor/client/itemsRepository.ts +391 -0
  270. package/src/editor/client/operations.ts +610 -0
  271. package/src/editor/client/pageModelBuilder.ts +182 -0
  272. package/src/editor/commands/commands.ts +23 -0
  273. package/src/editor/commands/componentCommands.tsx +408 -0
  274. package/src/editor/commands/createVersionCommand.ts +33 -0
  275. package/src/editor/commands/deleteVersionCommand.ts +71 -0
  276. package/src/editor/commands/itemCommands.tsx +186 -0
  277. package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +201 -0
  278. package/src/editor/commands/undo.ts +39 -0
  279. package/src/editor/component-designer/ComponentDesigner.tsx +70 -0
  280. package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx +11 -0
  281. package/src/editor/component-designer/ComponentDesignerMenu.tsx +91 -0
  282. package/src/editor/component-designer/ComponentEditor.tsx +97 -0
  283. package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +31 -0
  284. package/src/editor/component-designer/ComponentRenderingEditor.tsx +104 -0
  285. package/src/editor/component-designer/ComponentsDropdown.tsx +39 -0
  286. package/src/editor/component-designer/PlaceholdersEditor.tsx +183 -0
  287. package/src/editor/component-designer/RenderingsDropdown.tsx +36 -0
  288. package/src/editor/component-designer/TemplateEditor.tsx +236 -0
  289. package/src/editor/component-designer/aiContext.ts +23 -0
  290. package/src/editor/componentTreeHelper.tsx +114 -0
  291. package/src/editor/control-center/ControlCenterMenu.tsx +71 -0
  292. package/src/editor/control-center/IndexOverview.tsx +50 -0
  293. package/src/editor/control-center/IndexSettings.tsx +266 -0
  294. package/src/editor/control-center/Status.tsx +7 -0
  295. package/src/editor/editor-warnings/ItemLocked.tsx +63 -0
  296. package/src/editor/editor-warnings/NoLanguageWriteAccess.tsx +22 -0
  297. package/src/editor/editor-warnings/NoWorkflowWriteAccess.tsx +23 -0
  298. package/src/editor/editor-warnings/NoWriteAccess.tsx +15 -0
  299. package/src/editor/editor-warnings/ValidationErrors.tsx +54 -0
  300. package/src/editor/field-types/AttachmentEditor.tsx +9 -0
  301. package/src/editor/field-types/CheckboxEditor.tsx +47 -0
  302. package/src/editor/field-types/DropLinkEditor.tsx +75 -0
  303. package/src/editor/field-types/DropListEditor.tsx +84 -0
  304. package/src/editor/field-types/ImageFieldEditor.tsx +65 -0
  305. package/src/editor/field-types/InternalLinkFieldEditor.tsx +112 -0
  306. package/src/editor/field-types/LinkFieldEditor.tsx +85 -0
  307. package/src/editor/field-types/MultiLineText.tsx +63 -0
  308. package/src/editor/field-types/PictureFieldEditor.tsx +121 -0
  309. package/src/editor/field-types/RawEditor.tsx +53 -0
  310. package/src/editor/field-types/ReactQuill.tsx +580 -0
  311. package/src/editor/field-types/RichTextEditor.tsx +22 -0
  312. package/src/editor/field-types/RichTextEditorComponent.tsx +108 -0
  313. package/src/editor/field-types/SingleLineText.tsx +150 -0
  314. package/src/editor/field-types/TreeListEditor.tsx +261 -0
  315. package/src/editor/fieldTypes.ts +140 -0
  316. package/src/editor/media-selector/AiImageSearch.tsx +186 -0
  317. package/src/editor/media-selector/AiImageSearchPrompt.tsx +95 -0
  318. package/src/editor/media-selector/MediaSelector.tsx +42 -0
  319. package/src/editor/media-selector/Preview.tsx +14 -0
  320. package/src/editor/media-selector/Thumbnails.tsx +48 -0
  321. package/src/editor/media-selector/TreeSelector.tsx +292 -0
  322. package/src/editor/media-selector/UploadZone.tsx +137 -0
  323. package/src/editor/menubar/ActionsMenu.tsx +47 -0
  324. package/src/editor/menubar/ActiveUsers.tsx +17 -0
  325. package/src/editor/menubar/ApproveAndPublish.tsx +18 -0
  326. package/src/editor/menubar/BrowseHistory.tsx +37 -0
  327. package/src/editor/menubar/ItemLanguageVersion.tsx +52 -0
  328. package/src/editor/menubar/LanguageSelector.tsx +152 -0
  329. package/src/editor/menubar/Menu.tsx +83 -0
  330. package/src/editor/menubar/NavButtons.tsx +74 -0
  331. package/src/editor/menubar/PageSelector.tsx +139 -0
  332. package/src/editor/menubar/PageViewerControls.tsx +99 -0
  333. package/src/editor/menubar/Separator.tsx +12 -0
  334. package/src/editor/menubar/SiteInfo.tsx +53 -0
  335. package/src/editor/menubar/User.tsx +27 -0
  336. package/src/editor/menubar/VersionSelector.tsx +143 -0
  337. package/src/editor/page-editor-chrome/CommentHighlighting.tsx +287 -0
  338. package/src/editor/page-editor-chrome/CommentHighlightings.tsx +35 -0
  339. package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +44 -0
  340. package/src/editor/page-editor-chrome/FieldActionIndicators.tsx +23 -0
  341. package/src/editor/page-editor-chrome/FieldEditedIndicator.tsx +64 -0
  342. package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +35 -0
  343. package/src/editor/page-editor-chrome/FrameMenu.tsx +263 -0
  344. package/src/editor/page-editor-chrome/FrameMenus.tsx +48 -0
  345. package/src/editor/page-editor-chrome/InlineEditor.tsx +147 -0
  346. package/src/editor/page-editor-chrome/LockedFieldIndicator.tsx +61 -0
  347. package/src/editor/page-editor-chrome/NoLayout.tsx +36 -0
  348. package/src/editor/page-editor-chrome/PageEditorChrome.tsx +119 -0
  349. package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +154 -0
  350. package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +171 -0
  351. package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +233 -0
  352. package/src/editor/page-viewer/DeviceToolbar.tsx +70 -0
  353. package/src/editor/page-viewer/EditorForm.tsx +247 -0
  354. package/src/editor/page-viewer/MiniMap.tsx +351 -0
  355. package/src/editor/page-viewer/PageViewer.tsx +127 -0
  356. package/src/editor/page-viewer/PageViewerFrame.tsx +1030 -0
  357. package/src/editor/page-viewer/pageViewContext.ts +186 -0
  358. package/src/editor/pageModel.ts +191 -0
  359. package/src/editor/picture-shared.tsx +53 -0
  360. package/src/editor/reviews/Comment.tsx +265 -0
  361. package/src/editor/reviews/Comments.tsx +50 -0
  362. package/src/editor/reviews/PreviewInfo.tsx +35 -0
  363. package/src/editor/reviews/Reviews.tsx +280 -0
  364. package/src/editor/reviews/reviewCommands.tsx +47 -0
  365. package/src/editor/reviews/useReviews.tsx +70 -0
  366. package/src/editor/services/aiService.ts +155 -0
  367. package/src/editor/services/componentDesignerService.ts +151 -0
  368. package/src/editor/services/contentService.ts +159 -0
  369. package/src/editor/services/editService.ts +462 -0
  370. package/src/editor/services/indexService.ts +24 -0
  371. package/src/editor/services/reviewsService.ts +45 -0
  372. package/src/editor/services/serviceHelper.ts +95 -0
  373. package/src/editor/services/systemService.ts +5 -0
  374. package/src/editor/services/translationService.ts +21 -0
  375. package/src/editor/services-server/api.ts +150 -0
  376. package/src/editor/services-server/graphQL.ts +106 -0
  377. package/src/editor/sidebar/ComponentPalette.tsx +146 -0
  378. package/src/editor/sidebar/ComponentTree.tsx +512 -0
  379. package/src/editor/sidebar/ComponentTree2.tsxx +490 -0
  380. package/src/editor/sidebar/Debug.tsx +105 -0
  381. package/src/editor/sidebar/DictionaryEditor.tsx +261 -0
  382. package/src/editor/sidebar/EditHistory.tsx +134 -0
  383. package/src/editor/sidebar/GraphQL.tsx +164 -0
  384. package/src/editor/sidebar/Insert.tsx +35 -0
  385. package/src/editor/sidebar/MainContentTree.tsx +95 -0
  386. package/src/editor/sidebar/Performance.tsx +53 -0
  387. package/src/editor/sidebar/Sessions.tsx +35 -0
  388. package/src/editor/sidebar/Sidebar.tsx +20 -0
  389. package/src/editor/sidebar/SidebarView.tsx +150 -0
  390. package/src/editor/sidebar/Translations.tsx +276 -0
  391. package/src/editor/sidebar/Validation.tsx +102 -0
  392. package/src/editor/sidebar/ViewSelector.tsx +49 -0
  393. package/src/editor/sidebar/Workbox.tsx +209 -0
  394. package/src/editor/ui/CenteredMessage.tsx +7 -0
  395. package/src/editor/ui/CopyToClipboardButton.tsx +23 -0
  396. package/src/editor/ui/DialogButtons.tsx +11 -0
  397. package/src/editor/ui/Icons.tsx +585 -0
  398. package/src/editor/ui/ItemNameDialog.tsx +94 -0
  399. package/src/editor/ui/ItemNameDialogNew.tsx +118 -0
  400. package/src/editor/ui/ItemSearch.tsx +173 -0
  401. package/src/editor/ui/PerfectTree.tsx +550 -0
  402. package/src/editor/ui/Section.tsx +35 -0
  403. package/src/editor/ui/SimpleIconButton.tsx +43 -0
  404. package/src/editor/ui/SimpleMenu.tsx +48 -0
  405. package/src/editor/ui/SimpleTable.tsx +63 -0
  406. package/src/editor/ui/SimpleTabs.tsx +55 -0
  407. package/src/editor/ui/SimpleToolbar.tsx +7 -0
  408. package/src/editor/ui/Spinner.tsx +7 -0
  409. package/src/editor/ui/Splitter.tsx +247 -0
  410. package/src/editor/ui/StackedPanels.tsx +134 -0
  411. package/src/editor/ui/Toolbar.tsx +7 -0
  412. package/src/editor/utils/id-helper.ts +3 -0
  413. package/src/editor/utils/insertOptions.ts +69 -0
  414. package/src/editor/utils/itemutils.ts +29 -0
  415. package/src/editor/utils/useMemoDebug.ts +28 -0
  416. package/src/editor/utils.ts +435 -0
  417. package/src/editor/views/CompareView.tsx +256 -0
  418. package/src/editor/views/EditView.tsx +27 -0
  419. package/src/editor/views/ItemEditor.tsx +58 -0
  420. package/src/editor/views/SingleEditView.tsx +44 -0
  421. package/src/fonts/Geist-Black.woff2 +0 -0
  422. package/src/fonts/Geist-Bold.woff2 +0 -0
  423. package/src/fonts/Geist-ExtraBold.woff2 +0 -0
  424. package/src/fonts/Geist-ExtraLight.woff2 +0 -0
  425. package/src/fonts/Geist-Light.woff2 +0 -0
  426. package/src/fonts/Geist-Medium.woff2 +0 -0
  427. package/src/fonts/Geist-Regular.woff2 +0 -0
  428. package/src/fonts/Geist-SemiBold.woff2 +0 -0
  429. package/src/fonts/Geist-Thin.woff2 +0 -0
  430. package/src/fonts/Geist[wght].woff2 +0 -0
  431. package/src/index.ts +7 -0
  432. package/src/page-wizard/PageWizard.tsx +163 -0
  433. package/src/page-wizard/SelectWizard.tsx +109 -0
  434. package/src/page-wizard/WizardSteps.tsx +207 -0
  435. package/src/page-wizard/service.ts +35 -0
  436. package/src/page-wizard/startPageWizardCommand.ts +27 -0
  437. package/src/page-wizard/steps/BuildPageStep.tsx +266 -0
  438. package/src/page-wizard/steps/CollectStep.tsx +233 -0
  439. package/src/page-wizard/steps/ComponentTypesSelector.tsx +443 -0
  440. package/src/page-wizard/steps/Components.tsx +193 -0
  441. package/src/page-wizard/steps/CreatePage.tsx +285 -0
  442. package/src/page-wizard/steps/CreatePageAndLayoutStep.tsx +384 -0
  443. package/src/page-wizard/steps/EditButton.tsx +34 -0
  444. package/src/page-wizard/steps/FieldEditor.tsx +102 -0
  445. package/src/page-wizard/steps/Generate.tsx +32 -0
  446. package/src/page-wizard/steps/ImagesStep.tsx +318 -0
  447. package/src/page-wizard/steps/LayoutStep.tsx +228 -0
  448. package/src/page-wizard/steps/SelectStep.tsx +256 -0
  449. package/src/page-wizard/steps/schema.ts +180 -0
  450. package/src/page-wizard/steps/usePageCreator.ts +279 -0
  451. package/src/splash-screen/NewPage.tsx +232 -0
  452. package/src/splash-screen/SectionHeadline.tsx +21 -0
  453. package/src/splash-screen/SplashScreen.tsx +156 -0
  454. package/src/tour/Tour.tsx +558 -0
  455. package/src/tour/default-tour.tsx +300 -0
  456. package/src/tour/preview-tour.tsx +127 -0
  457. package/src/types.ts +302 -0
  458. package/styles.css +476 -0
  459. package/tsconfig.build.json +21 -0
  460. package/tsconfig.json +11 -0
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreatePageAndLayoutStep = CreatePageAndLayoutStep;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Splitter_1 = require("../../editor/ui/Splitter");
6
+ const CreatePage_1 = require("./CreatePage");
7
+ const react_1 = require("react");
8
+ const PageViewer_1 = require("../../editor/page-viewer/PageViewer");
9
+ const editContext_1 = require("../../editor/client/editContext");
10
+ const utils_1 = require("primereact/utils");
11
+ const ComponentTypesSelector_1 = require("./ComponentTypesSelector");
12
+ const ActionButton_1 = require("../../components/ActionButton");
13
+ const schema_1 = require("./schema");
14
+ const service_1 = require("../service");
15
+ const aiService_1 = require("../../editor/services/aiService");
16
+ const usePageCreator_1 = require("./usePageCreator");
17
+ const use_debounce_1 = require("use-debounce");
18
+ function CreatePageAndLayoutStep({ wizard, step, parentItem, pageModel, setPageModel, data, setData, internalState, setInternalState, setStepCompleted, }) {
19
+ const [pageLoaded, setPageLoaded] = (0, react_1.useState)(false);
20
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
21
+ const editContext = (0, editContext_1.useEditContext)();
22
+ const [abortController, setAbortController] = (0, react_1.useState)();
23
+ const [message, setMessage] = (0, react_1.useState)();
24
+ const [isCreatingComponents, setIsCreatingComponents] = (0, react_1.useState)(false);
25
+ const pageItem = internalState.pageItem;
26
+ const pageCreator = (0, usePageCreator_1.usePageCreator)(pageItem, wizard, setPageModel);
27
+ if (!parentItem)
28
+ return "No parent item";
29
+ (0, react_1.useEffect)(() => {
30
+ if (!internalState.layoutInstructions) {
31
+ setInternalState({
32
+ ...internalState,
33
+ layoutInstructions: step.instructions,
34
+ });
35
+ }
36
+ }, []);
37
+ const createComponents = async () => {
38
+ if (!pageLoaded)
39
+ return;
40
+ if (pageModel?.components && !isCreatingComponents) {
41
+ try {
42
+ setIsCreatingComponents(true);
43
+ await pageCreator.createComponentsRecursively(pageModel.components, "root");
44
+ setInternalState((prev) => ({
45
+ ...prev,
46
+ componentsCreated: true,
47
+ }));
48
+ }
49
+ finally {
50
+ setIsCreatingComponents(false);
51
+ }
52
+ }
53
+ };
54
+ (0, react_1.useEffect)(() => {
55
+ if (internalState.componentsCreated &&
56
+ !isCreatingComponents &&
57
+ !isLoading) {
58
+ editContext?.requestRefresh("immediate");
59
+ }
60
+ }, [isCreatingComponents, isLoading]);
61
+ const createComponentsThrottled = (0, use_debounce_1.useThrottledCallback)(createComponents, 300);
62
+ (0, react_1.useEffect)(() => {
63
+ createComponentsThrottled();
64
+ }, [pageModel]);
65
+ (0, react_1.useEffect)(() => {
66
+ if (editContext &&
67
+ editContext.page &&
68
+ editContext.page.item &&
69
+ pageItem &&
70
+ pageItem.id === editContext.page.item.descriptor.id)
71
+ setPageLoaded(true);
72
+ }, [editContext?.page, pageItem]);
73
+ if (!pageItem) {
74
+ return ((0, jsx_runtime_1.jsx)(CreatePage_1.CreatePage, { wizard: wizard, parentItem: parentItem, setPageItem: (pageItem) => setInternalState((prev) => ({ ...prev, pageItem })), pageItem: pageItem, pageModel: pageModel, setPageModel: setPageModel, step: step, data: data }));
75
+ }
76
+ const createLayout = async () => {
77
+ try {
78
+ if (!editContext)
79
+ return;
80
+ setIsLoading(true);
81
+ setStepCompleted(false);
82
+ if (internalState.componentsCreated) {
83
+ await (0, service_1.wipeComponents)(pageItem.descriptor);
84
+ setPageModel((prev) => ({
85
+ ...prev,
86
+ components: [],
87
+ }));
88
+ editContext?.requestRefresh("immediate");
89
+ }
90
+ // Parse schema if it's a string
91
+ const schema = typeof wizard.schema === "string"
92
+ ? JSON.parse(wizard.schema)
93
+ : wizard.schema;
94
+ // Filter the schema based on selected component types and placeholders
95
+ const filteredSchema = (0, schema_1.convertPageSchemaToWizardComponents)(schema, data.selectedComponentTypes);
96
+ const localAbortController = new AbortController();
97
+ setAbortController(localAbortController);
98
+ const result = await (0, aiService_1.executePrompt)([
99
+ {
100
+ content: `${internalState.layoutInstructions?.trim()} Reply with a json object of type PageModel = { components: Component[]; message: string; };
101
+ Component = { name: string, type: string; fields: Field[]; placeholder?: string; children?: Component[]; };
102
+ Field = { name: string; value: string; type: string; };
103
+ Generate a descriptive name for each component including the topic.
104
+ Only use component types that are in the page schema.
105
+
106
+ Component types: ${JSON.stringify(filteredSchema)} Root level component types ${filteredSchema
107
+ .filter((c) => c.allowedOnRoot)
108
+ .map((c) => c.type)
109
+ .join(", ")}
110
+ Tell the user your reasoning in the message field.
111
+ Fill image ids into picture / image fields.
112
+ The language of the page is ${pageItem.descriptor.language}.
113
+ Input data: ${JSON.stringify(data)}`,
114
+ name: "system",
115
+ role: "system",
116
+ },
117
+ ], editContext, service_1.createWizardAiContext, [""], true, { signal: localAbortController.signal }, step.aiModel || "o3-mini-low", (response) => {
118
+ try {
119
+ const newLayout = JSON.parse(response.content);
120
+ if (newLayout) {
121
+ setPageModel((prev) => mergeLayout(prev, newLayout));
122
+ }
123
+ setMessage(newLayout.message);
124
+ }
125
+ catch (parseError) { }
126
+ });
127
+ const pageModel = JSON.parse(result.content);
128
+ setPageModel((prev) => mergeLayout(prev, pageModel));
129
+ setMessage(pageModel.message);
130
+ setStepCompleted(true);
131
+ }
132
+ catch (error) {
133
+ console.error(error);
134
+ }
135
+ finally {
136
+ setIsLoading(false);
137
+ }
138
+ };
139
+ // Custom instructions panel
140
+ const customInstructionsPanel = () => {
141
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-sm font-semibold", children: "Instructions" }), (0, jsx_runtime_1.jsx)("div", { className: "mb-3 text-xs text-gray-500", children: "Provide guidance for the AI when generating your layout" }), (0, jsx_runtime_1.jsx)("textarea", { value: internalState.layoutInstructions, onChange: (e) => setInternalState({
142
+ ...internalState,
143
+ layoutInstructions: e.target.value,
144
+ }), placeholder: "Example: Make it modern and minimalist. Focus on images. Include a hero section at the top.", className: "w-full px-3 py-2 border border-gray-300 rounded text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 h-48" })] }));
145
+ };
146
+ const panels = [
147
+ {
148
+ name: "settings",
149
+ content: ((0, jsx_runtime_1.jsxs)("div", { className: "pr-6", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-sm font-medium", children: "Page item" }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs text-gray-500", children: pageItem.path }), (0, jsx_runtime_1.jsx)(ComponentTypesSelector_1.ComponentTypeSelector, { selectedComponentTypes: data.selectedComponentTypes, setSelectedComponentTypes: (selectedTypes) => {
150
+ setData({
151
+ ...data,
152
+ selectedComponentTypes: selectedTypes,
153
+ });
154
+ }, schema: wizard.schema, data: data, setData: setData, step: step }), customInstructionsPanel(), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2", children: [(0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { onClick: createLayout, disabled: isLoading ||
155
+ !data.selectedComponentTypes ||
156
+ data.selectedComponentTypes.length === 0, isLoading: isLoading, loadingText: "Working", className: "flex-1", children: internalState.componentsCreated
157
+ ? "Delete and Regenerate Layout"
158
+ : "Generate Layout" }), isLoading && ((0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { isLoading: false, onClick: () => abortController?.abort("User aborted"), children: "Abort" }))] }), message && (0, jsx_runtime_1.jsx)("div", { className: "mt-2 text-xs", children: message })] })),
159
+ defaultSize: 400,
160
+ },
161
+ {
162
+ name: "layout",
163
+ content: ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.classNames)("px-6", pageLoaded ? "h-full" : "h-0"), children: (0, jsx_runtime_1.jsx)(PageViewer_1.PageViewer, { name: "single", mode: editContext?.previewMode ? "view" : "edit", showFormEditor: false, followEditsDefault: true, pageViewContext: editContext.pageView }) })),
164
+ defaultSize: "auto",
165
+ },
166
+ ];
167
+ return (0, jsx_runtime_1.jsx)(Splitter_1.Splitter, { panels: panels });
168
+ }
169
+ /**
170
+ * Merges a new layout with the previous layout
171
+ * - Keeps all previous components
172
+ * - Adds new components
173
+ * - Updates existing fields with new values
174
+ * - Adds new fields
175
+ */
176
+ const mergeLayout = (prev, newLayout) => {
177
+ if (!prev)
178
+ return newLayout;
179
+ // Merge top-level properties
180
+ const result = {
181
+ name: newLayout.name || prev.name,
182
+ message: newLayout.message,
183
+ metaDescription: prev.metaDescription,
184
+ metaKeywords: prev.metaKeywords,
185
+ components: [...(prev.components || [])],
186
+ };
187
+ // Function to merge components recursively
188
+ const mergeComponents = (existingComponents, newComponents) => {
189
+ if (!newComponents?.length)
190
+ return existingComponents;
191
+ const result = [...existingComponents];
192
+ for (const newComp of newComponents) {
193
+ // Try to find a matching component by type and name
194
+ const existingIndex = result.findIndex((comp) => comp.type === newComp.type && comp.name === newComp.name);
195
+ if (existingIndex >= 0) {
196
+ // Update existing component
197
+ const existing = result[existingIndex];
198
+ // Merge fields - update existing fields and add new ones
199
+ const mergedFields = [...(existing.fields || [])];
200
+ for (const newField of newComp.fields || []) {
201
+ const fieldIndex = mergedFields.findIndex((f) => f.name === newField.name);
202
+ if (fieldIndex >= 0) {
203
+ mergedFields[fieldIndex].value = newField.value; // Update existing field
204
+ mergedFields[fieldIndex].type = newField.type;
205
+ }
206
+ else {
207
+ mergedFields.push(newField); // Add new field
208
+ }
209
+ }
210
+ // Recursive merge of children components
211
+ const mergedChildren = mergeComponents(existing.children || [], newComp.children || []);
212
+ // Create updated component
213
+ result[existingIndex] = {
214
+ ...existing,
215
+ fields: mergedFields,
216
+ children: mergedChildren,
217
+ placeholder: newComp.placeholder || existing.placeholder,
218
+ };
219
+ }
220
+ else {
221
+ // Add new component
222
+ result.push(newComp);
223
+ }
224
+ }
225
+ return result;
226
+ };
227
+ // Merge components recursively
228
+ result.components = mergeComponents(result.components, newLayout.components || []);
229
+ return result;
230
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditButton = EditButton;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function EditButton({ field, onEdit, className = "" }) {
6
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onEdit, className: `inline-flex items-center justify-center p-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${className}`, "aria-label": `Edit ${field.name || "field"}`, title: `Edit ${field.name || "field"}`, children: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" }) }) }));
7
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldEditor = FieldEditor;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const editor_1 = require("primereact/editor");
7
+ function FieldEditor({ field, onFieldEdited, }) {
8
+ const [fieldValue, setFieldValue] = (0, react_1.useState)("");
9
+ const [isEditing, setIsEditing] = (0, react_1.useState)(false);
10
+ (0, react_1.useEffect)(() => {
11
+ if (isEditing) {
12
+ const value = field.value;
13
+ setFieldValue(typeof value === "string" ? value : "");
14
+ }
15
+ }, [isEditing]);
16
+ if (!isEditing) {
17
+ return ((0, jsx_runtime_1.jsxs)("div", { onClick: () => setIsEditing(true), className: "cursor-pointer mb-2", children: [(0, jsx_runtime_1.jsxs)("div", { className: "font-bold text-gray-900", children: [field.name, ":"] }), (0, jsx_runtime_1.jsx)("div", { className: "text-gray-700 [&_ul]:list-disc [&_ul]:pl-5 [&_li]:my-1 [&_p]:my-1", dangerouslySetInnerHTML: { __html: field.value } })] }));
18
+ }
19
+ const isRichText = field.type === "Rich Text";
20
+ const handleSave = () => {
21
+ console.log(`Saving changes to field ${field.name}:`, fieldValue);
22
+ field.value = fieldValue;
23
+ setIsEditing(false);
24
+ onFieldEdited();
25
+ };
26
+ const handleCancel = () => {
27
+ setIsEditing(false);
28
+ };
29
+ return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-1000", children: (0, jsx_runtime_1.jsxs)("div", { className: "bg-white rounded-lg shadow-xl p-6 w-full max-w-lg", children: [(0, jsx_runtime_1.jsxs)("h3", { className: "text-lg font-medium text-gray-900 mb-4", children: ["Edit ", field.name || "Field"] }), isRichText ? ((0, jsx_runtime_1.jsx)("div", { className: "mb-4", children: (0, jsx_runtime_1.jsx)(editor_1.Editor, { className: "w-full h-64 p-2 border border-gray-300 rounded-md", value: fieldValue, onTextChange: (e) => setFieldValue(e.htmlValue || "") }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "mb-4", children: (0, jsx_runtime_1.jsx)("textarea", { className: "w-full p-2 border border-gray-300 rounded-md", value: fieldValue, onChange: (e) => setFieldValue(e.target.value) }) })), (0, jsx_runtime_1.jsxs)("div", { className: "flex justify-end space-x-3", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleCancel, className: "inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500", children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleSave, className: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500", children: "Save" })] })] }) }));
30
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const utils_1 = require("primereact/utils");
5
+ const Icons_1 = require("../../editor/ui/Icons");
6
+ const Icons_2 = require("../../editor/ui/Icons");
7
+ function Generate({ title }) {
8
+ console.log("Generate", title);
9
+ return ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.classNames)("flex flex-col justify-center items-center h-full transition-all duration-300 animate-fadeIn text-canvas-pink"), children: (0, jsx_runtime_1.jsxs)("div", { className: "mb-20", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex justify-center ml-20 animate-sparkle w-auto min-h-10 delay-700", children: (0, jsx_runtime_1.jsx)(Icons_2.SparkleIconSmall, {}) }), (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center ml-5 animate-sparkle w-auto min-h-20", children: (0, jsx_runtime_1.jsx)(Icons_1.SparkleIconBig, {}) }), (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center mr-20 animate-sparkle w-auto min-h-10 delay-500", children: (0, jsx_runtime_1.jsx)(Icons_2.SparkleIconSmall, {}) })] }) }));
10
+ }
11
+ exports.default = Generate;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImagesStep = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const ScrollingContentTree_1 = require("../../editor/ScrollingContentTree");
7
+ const Splitter_1 = require("../../editor/ui/Splitter");
8
+ const editContext_1 = require("../../editor/client/editContext");
9
+ const aiService_1 = require("../../editor/services/aiService");
10
+ const service_1 = require("../service");
11
+ const ActionButton_1 = require("../../components/ActionButton");
12
+ const utils_1 = require("primereact/utils");
13
+ const button_1 = require("primereact/button");
14
+ const dialog_1 = require("primereact/dialog");
15
+ const ImagesStep = (props) => {
16
+ const mediaRootId = "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1";
17
+ const [selectedFolderId, setSelectedFolderId] = (0, react_1.useState)(mediaRootId);
18
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
19
+ const [error, setError] = (0, react_1.useState)(null);
20
+ const editContext = (0, editContext_1.useEditContext)();
21
+ const propName = props.step.propertyName || "images";
22
+ const [showFolderDialog, setShowFolderDialog] = (0, react_1.useState)(false);
23
+ const [selectedFolder, setSelectedFolder] = (0, react_1.useState)();
24
+ (0, react_1.useEffect)(() => {
25
+ if (props.data[propName]?.length > 0) {
26
+ props.setStepCompleted(true);
27
+ }
28
+ }, [props.data]);
29
+ const findMatchingImages = async () => {
30
+ setIsLoading(true);
31
+ setError(null);
32
+ props.setData((prevData) => ({
33
+ ...prevData,
34
+ [propName]: [],
35
+ }));
36
+ try {
37
+ // First, ask AI for keywords based on the content
38
+ const aiPromptResult = await (0, aiService_1.executePrompt)([
39
+ {
40
+ content: `You are an AI assistant for building a web page. You will later have to create images for the page.
41
+ Please anaylze the provided data and suggest a number of images and specific keywords per image. The keywords will be used to find matching images in the image library.
42
+ Response JSON format: { images: Image[] } type Image = { title: string, keywords: string[] }
43
+ Input data: ${JSON.stringify(props.data)}
44
+ Instructions: ${props.step.instructions}`,
45
+ name: "system",
46
+ role: "system",
47
+ },
48
+ ], editContext, service_1.createWizardAiContext, [""], true, undefined, "o3-mini-low");
49
+ const images = JSON.parse(aiPromptResult.content).images;
50
+ // Create an array of promises for all search operations
51
+ const searchPromises = images.map(async (image) => {
52
+ const searchResult = await (0, aiService_1.executeSearch)({
53
+ query: image.keywords.join(" "),
54
+ rootItemIds: selectedFolderId ? [selectedFolderId] : undefined,
55
+ editContext: editContext,
56
+ maxResults: 6,
57
+ index: "media",
58
+ skipValidation: true,
59
+ });
60
+ if (searchResult.type === "success") {
61
+ const thumbnails = searchResult.data.map((thumbnail) => ({
62
+ name: thumbnail.name,
63
+ id: thumbnail.id,
64
+ thumbUrl: thumbnail.thumbUrl,
65
+ description: thumbnail.description,
66
+ }));
67
+ props.setInternalState((state) => ({
68
+ ...state,
69
+ thumbnails: [
70
+ ...(state.thumbnails || []),
71
+ ...thumbnails.filter((newThumb) => !(state.thumbnails || []).some((existingThumb) => existingThumb.id === newThumb.id)),
72
+ ],
73
+ }));
74
+ props.setData((prevData) => ({
75
+ ...prevData,
76
+ [propName]: [
77
+ ...(prevData[propName] || []),
78
+ {
79
+ ...image,
80
+ options: thumbnails,
81
+ },
82
+ ],
83
+ }));
84
+ }
85
+ else {
86
+ setError(`Error searching for images: ${searchResult.response.statusText}`);
87
+ }
88
+ });
89
+ // Wait for all search operations to complete
90
+ await Promise.all(searchPromises);
91
+ }
92
+ catch (err) {
93
+ setError(`Error finding matching images: ${err instanceof Error ? err.message : String(err)}`);
94
+ console.error("Error in findMatchingImages:", err);
95
+ }
96
+ finally {
97
+ setIsLoading(false);
98
+ }
99
+ };
100
+ (0, react_1.useEffect)(() => {
101
+ const loadFolder = async () => {
102
+ if (selectedFolderId) {
103
+ const item = await editContext?.itemsRepository.getItem({
104
+ id: selectedFolderId,
105
+ language: "en",
106
+ version: 1,
107
+ });
108
+ console.log("ITEM", item);
109
+ setSelectedFolder(item);
110
+ }
111
+ };
112
+ loadFolder();
113
+ }, [selectedFolderId]);
114
+ console.log("FOLDER", selectedFolder, selectedFolderId);
115
+ const panels = [
116
+ {
117
+ name: "Settings",
118
+ defaultSize: 400,
119
+ content: ((0, jsx_runtime_1.jsxs)("div", { className: "flex h-full flex-col gap-2 pr-6 pb-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative mb-2 rounded-md border border-gray-400 bg-white p-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-2 text-sm font-bold text-gray-800", children: "Image library folder" }), selectedFolder && ((0, jsx_runtime_1.jsx)("div", { className: "mb-2 text-sm text-gray-500", children: selectedFolder.path })), (0, jsx_runtime_1.jsx)(button_1.Button, { label: "Change Folder", onClick: () => {
120
+ setShowFolderDialog(true);
121
+ } }), (0, jsx_runtime_1.jsx)(dialog_1.Dialog, { header: "Select Folder", visible: showFolderDialog, onHide: () => {
122
+ setShowFolderDialog(false);
123
+ }, style: { width: "50vw", height: "50vh" }, children: (0, jsx_runtime_1.jsx)("div", { className: "relative flex h-full flex-col", children: (0, jsx_runtime_1.jsx)(ScrollingContentTree_1.ScrollingContentTree, { rootItemId: mediaRootId, onSelectionChange: (selection) => {
124
+ const selectedNode = selection[0];
125
+ if (selectedNode)
126
+ setSelectedFolderId(selectedNode.id);
127
+ else
128
+ setSelectedFolderId(mediaRootId);
129
+ setShowFolderDialog(false);
130
+ } }) }) })] }), (0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { onClick: findMatchingImages, isLoading: isLoading, disabled: isLoading, loadingText: "Searching...", children: "Find Matching Images" })] })),
131
+ },
132
+ {
133
+ name: "Images",
134
+ defaultSize: "auto",
135
+ content: ((0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 overflow-auto", children: (0, jsx_runtime_1.jsx)("div", { className: "flex flex-col gap-4 p-4 pt-0", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-4", children: [error && (0, jsx_runtime_1.jsx)("div", { className: "text-red-500", children: error }), props.data[propName]?.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-col gap-4", children: props.data[propName]?.map((image, index) => ((0, jsx_runtime_1.jsxs)("span", { className: (0, utils_1.classNames)("rounded border border-gray-400 bg-white p-4 text-sm", index % 2 === 0
136
+ ? "animate-fadeRight"
137
+ : "animate-fadeLeft"), children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-3 text-lg", children: image.title }), (0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap gap-5", children: image.options?.map((option, thumbnailIndex) => ((0, jsx_runtime_1.jsxs)("div", { className: "relative flex h-28 w-28 cursor-pointer items-center justify-center border border-gray-400", onClick: () => {
138
+ props.setData((prevData) => ({
139
+ ...prevData,
140
+ [propName]: prevData[propName].map((img, imgIndex) => ({
141
+ ...img,
142
+ options: imgIndex !== index
143
+ ? img.options
144
+ : img.options?.map((option, optionIndex) => optionIndex === thumbnailIndex
145
+ ? {
146
+ ...option,
147
+ selected: !option.selected,
148
+ }
149
+ : option),
150
+ })),
151
+ }));
152
+ }, children: [(0, jsx_runtime_1.jsx)("img", { src: option.thumbUrl, alt: option.name }, thumbnailIndex), (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.classNames)("peer ring-offset-background focus-visible:ring-ring pointer-events-none absolute right-1 bottom-1 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", option.selected
153
+ ? "text-canvas-pink border-canvas-pink bg-white"
154
+ : ""), children: option.selected && ((0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: (0, jsx_runtime_1.jsx)("path", { d: "M20 6 9 17l-5-5" }) })) })] }, thumbnailIndex))) })] }, index))) }))] }) }) })),
155
+ },
156
+ ];
157
+ return (0, jsx_runtime_1.jsx)(Splitter_1.Splitter, { panels: panels });
158
+ };
159
+ exports.ImagesStep = ImagesStep;
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LayoutStep = LayoutStep;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const editContext_1 = require("../../editor/client/editContext");
7
+ const aiService_1 = require("../../editor/services/aiService");
8
+ const service_1 = require("../service");
9
+ const Components_1 = require("./Components");
10
+ const Splitter_1 = require("../../editor/ui/Splitter");
11
+ const schema_1 = require("./schema");
12
+ const ActionButton_1 = require("../../components/ActionButton");
13
+ const ComponentTypesSelector_1 = require("./ComponentTypesSelector");
14
+ function LayoutStep({ wizard, step, data, setData, setStepCompleted, internalState, setInternalState, }) {
15
+ const editContext = (0, editContext_1.useEditContext)();
16
+ const abortController = new AbortController();
17
+ const localAbortController = abortController || new AbortController();
18
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
19
+ const [message, setMessage] = (0, react_1.useState)();
20
+ const [selectedComponentTypes, setSelectedComponentTypes] = (0, react_1.useState)([]);
21
+ const [customInstructions, setCustomInstructions] = (0, react_1.useState)();
22
+ if (!editContext) {
23
+ return null;
24
+ }
25
+ (0, react_1.useEffect)(() => {
26
+ if (data.pageModel?.components?.length) {
27
+ setStepCompleted(!isLoading);
28
+ }
29
+ }, [data.pageModel, isLoading]);
30
+ (0, react_1.useEffect)(() => {
31
+ setCustomInstructions(step.instructions);
32
+ }, []);
33
+ const createLayout = async () => {
34
+ try {
35
+ setIsLoading(true);
36
+ // Parse schema if it's a string
37
+ const schema = typeof wizard.schema === "string"
38
+ ? JSON.parse(wizard.schema)
39
+ : wizard.schema;
40
+ // Filter the schema based on selected component types and placeholders
41
+ const filteredSchema = (0, schema_1.convertPageSchemaToWizardComponents)(schema, selectedComponentTypes);
42
+ const result = await (0, aiService_1.executePrompt)([
43
+ {
44
+ content: `${customInstructions?.trim()} Reply with a json object of type PageModel = { name: string; metaDescription: string; components: Component[]; message: string; };
45
+ Component = { name: string, type: string; fields: Field[]; placeholder?: string; children?: Component[]; };
46
+ Field = { name: string; value: string; type: string; };
47
+ Generate a descriptive name for each component including the topic.
48
+ Only use component types that are in the page schema. Also suggest a page name following default sitecore item naming conventions (no underscores, no white space, no umlaute, no special characters, hyphens are allowed) and the page meta description.
49
+ Component types: ${JSON.stringify(filteredSchema)} Root level component types ${filteredSchema
50
+ .filter((c) => c.allowedOnRoot)
51
+ .map((c) => c.type)
52
+ .join(", ")}
53
+ Tell the user your reasoning in the message field.
54
+ Fill image ids into picture / image fields.
55
+ Input data: ${JSON.stringify(data)}`,
56
+ name: "system",
57
+ role: "system",
58
+ },
59
+ ], editContext, service_1.createWizardAiContext, [""], true, { signal: localAbortController.signal }, "o3-mini-low", (response) => {
60
+ try {
61
+ const newLayout = JSON.parse(response.content);
62
+ if (newLayout) {
63
+ setData((prev) => ({
64
+ ...prev,
65
+ pageModel: newLayout,
66
+ }));
67
+ }
68
+ setMessage(newLayout.message);
69
+ }
70
+ catch (parseError) { }
71
+ });
72
+ const pageModel = JSON.parse(result.content);
73
+ setData({
74
+ ...data,
75
+ pageModel: JSON.parse(result.content),
76
+ customInstructions,
77
+ });
78
+ setMessage(pageModel.message);
79
+ }
80
+ catch (error) {
81
+ console.error(error);
82
+ }
83
+ finally {
84
+ setIsLoading(false);
85
+ }
86
+ };
87
+ // Toggle placeholder selection
88
+ // Regenerate layout with current selected component types and placeholders
89
+ const regenerateLayout = () => {
90
+ createLayout();
91
+ };
92
+ (0, react_1.useEffect)(() => {
93
+ if (!selectedComponentTypes.length)
94
+ return;
95
+ // Only set custom instructions if they're not already set or if step.instructions has changed
96
+ if (customInstructions !== step.instructions) {
97
+ setCustomInstructions(step.instructions);
98
+ }
99
+ }, [step.instructions, selectedComponentTypes]);
100
+ // Custom instructions panel
101
+ const customInstructionsPanel = () => {
102
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-sm font-bold", children: "Instructions" }), (0, jsx_runtime_1.jsx)("div", { className: "mb-3 text-xs text-gray-500", children: "Provide guidance for the AI when generating your layout" }), (0, jsx_runtime_1.jsx)("textarea", { value: customInstructions, onChange: (e) => setCustomInstructions(e.target.value), placeholder: "Example: Make it modern and minimalist. Focus on images. Include a hero section at the top.", className: "w-full px-3 py-2 border border-gray-300 rounded text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 h-48", disabled: isLoading })] }));
103
+ };
104
+ const settingsPanel = {
105
+ name: "Settings",
106
+ collapsible: false,
107
+ defaultSize: 450,
108
+ content: ((0, jsx_runtime_1.jsxs)("div", { className: "absolute inset-0 overflow-auto flex flex-col h-full pr-4", children: [customInstructionsPanel(), (0, jsx_runtime_1.jsx)(ComponentTypesSelector_1.ComponentTypeSelector, { selectedComponentTypes: selectedComponentTypes, setSelectedComponentTypes: setSelectedComponentTypes, schema: wizard.schema, data: data, setData: setData, step: step }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2", children: [(0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { onClick: regenerateLayout, disabled: isLoading || selectedComponentTypes.length === 0, isLoading: isLoading, loadingText: "Working", className: "flex-1", children: data.pageModel ? "Regenerate Layout" : "Generate Layout" }), isLoading && ((0, jsx_runtime_1.jsxs)("button", { onClick: () => {
109
+ localAbortController.abort();
110
+ setIsLoading(false);
111
+ }, className: "bg-red-500 text-white px-2 py-1 rounded text-xs hover:bg-red-600 flex items-center gap-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "pi pi-times" }), "Abort"] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs text-gray-500 p-2", children: message })] })),
112
+ };
113
+ const layoutPanel = {
114
+ name: "Layout",
115
+ defaultSize: "auto",
116
+ collapsible: false,
117
+ content: ((0, jsx_runtime_1.jsx)("div", { className: "absolute inset-2 flex flex-col justify-center items-center text-gray-600", children: (0, jsx_runtime_1.jsx)(Components_1.Components, { pageModel: data.pageModel, onComponentRemoved: () => setData({ ...data }), onFieldEdited: () => setData({ ...data }), thumbnails: internalState.thumbnails, setInternalState: setInternalState }) })),
118
+ };
119
+ return ((0, jsx_runtime_1.jsx)(Splitter_1.Splitter, { panels: [settingsPanel, layoutPanel], localStorageKey: "editor.page-wizard.layout" }));
120
+ }