@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.
- package/.prettierrc +3 -0
- package/dist/client-components/api.js +6 -0
- package/dist/client-components/index.js +36 -0
- package/dist/components/ActionButton.js +9 -0
- package/dist/components/Error.js +28 -0
- package/dist/config/config.js +654 -0
- package/dist/config/types.js +2 -0
- package/dist/editor/ComponentInfo.js +31 -0
- package/dist/editor/ConfirmationDialog.js +32 -0
- package/dist/editor/ContentTree.js +406 -0
- package/dist/editor/ContextMenu.js +117 -0
- package/dist/editor/Editor.js +55 -0
- package/dist/editor/EditorWarning.js +13 -0
- package/dist/editor/EditorWarnings.js +24 -0
- package/dist/editor/FieldEditorPopup.js +24 -0
- package/dist/editor/FieldHistory.js +40 -0
- package/dist/editor/FieldList.js +63 -0
- package/dist/editor/FieldListField.js +164 -0
- package/dist/editor/FieldListFieldWithFallbacks.js +114 -0
- package/dist/editor/FloatingToolbar.js +92 -0
- package/dist/editor/ImageEditor.js +55 -0
- package/dist/editor/InsertMenu.js +164 -0
- package/dist/editor/ItemInfo.js +30 -0
- package/dist/editor/LinkEditorDialog.js +89 -0
- package/dist/editor/MainLayout.js +46 -0
- package/dist/editor/NewEditorClient.js +9 -0
- package/dist/editor/PictureCropper.js +332 -0
- package/dist/editor/PictureEditor.js +104 -0
- package/dist/editor/PictureEditorDialog.js +194 -0
- package/dist/editor/ScrollingContentTree.js +30 -0
- package/dist/editor/Terminal.js +109 -0
- package/dist/editor/Titlebar.js +11 -0
- package/dist/editor/ai/AiPopup.js +25 -0
- package/dist/editor/ai/AiResponseMessage.js +24 -0
- package/dist/editor/ai/AiTerminal.js +241 -0
- package/dist/editor/ai/AiToolCall.js +18 -0
- package/dist/editor/ai/EditorAiTerminal.js +9 -0
- package/dist/editor/ai/editorAiContext.js +14 -0
- package/dist/editor/client/DialogContext.js +29 -0
- package/dist/editor/client/EditorClient.js +1336 -0
- package/dist/editor/client/GenericDialog.js +27 -0
- package/dist/editor/client/editContext.js +59 -0
- package/dist/editor/client/helpers.js +31 -0
- package/dist/editor/client/itemsRepository.js +255 -0
- package/dist/editor/client/operations.js +398 -0
- package/dist/editor/client/pageModelBuilder.js +129 -0
- package/dist/editor/commands/commands.js +2 -0
- package/dist/editor/commands/componentCommands.js +277 -0
- package/dist/editor/commands/createVersionCommand.js +26 -0
- package/dist/editor/commands/deleteVersionCommand.js +55 -0
- package/dist/editor/commands/itemCommands.js +134 -0
- package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +94 -0
- package/dist/editor/commands/undo.js +32 -0
- package/dist/editor/component-designer/ComponentDesigner.js +58 -0
- package/dist/editor/component-designer/ComponentDesignerAiTerminal.js +9 -0
- package/dist/editor/component-designer/ComponentDesignerMenu.js +67 -0
- package/dist/editor/component-designer/ComponentEditor.js +59 -0
- package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +16 -0
- package/dist/editor/component-designer/ComponentRenderingEditor.js +71 -0
- package/dist/editor/component-designer/ComponentsDropdown.js +22 -0
- package/dist/editor/component-designer/PlaceholdersEditor.js +70 -0
- package/dist/editor/component-designer/RenderingsDropdown.js +25 -0
- package/dist/editor/component-designer/TemplateEditor.js +144 -0
- package/dist/editor/component-designer/aiContext.js +18 -0
- package/dist/editor/componentTreeHelper.js +97 -0
- package/dist/editor/control-center/ControlCenterMenu.js +59 -0
- package/dist/editor/control-center/IndexOverview.js +27 -0
- package/dist/editor/control-center/IndexSettings.js +106 -0
- package/dist/editor/control-center/Status.js +7 -0
- package/dist/editor/editor-warnings/ItemLocked.js +40 -0
- package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +16 -0
- package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +16 -0
- package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
- package/dist/editor/editor-warnings/ValidationErrors.js +27 -0
- package/dist/editor/field-types/AttachmentEditor.js +7 -0
- package/dist/editor/field-types/CheckboxEditor.js +32 -0
- package/dist/editor/field-types/DropLinkEditor.js +51 -0
- package/dist/editor/field-types/DropListEditor.js +58 -0
- package/dist/editor/field-types/ImageFieldEditor.js +36 -0
- package/dist/editor/field-types/InternalLinkFieldEditor.js +64 -0
- package/dist/editor/field-types/LinkFieldEditor.js +58 -0
- package/dist/editor/field-types/MultiLineText.js +35 -0
- package/dist/editor/field-types/PictureFieldEditor.js +59 -0
- package/dist/editor/field-types/RawEditor.js +33 -0
- package/dist/editor/field-types/ReactQuill.js +366 -0
- package/dist/editor/field-types/RichTextEditor.js +46 -0
- package/dist/editor/field-types/RichTextEditorComponent.js +72 -0
- package/dist/editor/field-types/SingleLineText.js +92 -0
- package/dist/editor/field-types/TreeListEditor.js +137 -0
- package/dist/editor/fieldTypes.js +2 -0
- package/dist/editor/media-selector/AiImageSearch.js +110 -0
- package/dist/editor/media-selector/AiImageSearchPrompt.js +58 -0
- package/dist/editor/media-selector/MediaSelector.js +11 -0
- package/dist/editor/media-selector/Preview.js +9 -0
- package/dist/editor/media-selector/Thumbnails.js +11 -0
- package/dist/editor/media-selector/TreeSelector.js +171 -0
- package/dist/editor/media-selector/UploadZone.js +80 -0
- package/dist/editor/menubar/ActionsMenu.js +33 -0
- package/dist/editor/menubar/ActiveUsers.js +13 -0
- package/dist/editor/menubar/ApproveAndPublish.js +13 -0
- package/dist/editor/menubar/BrowseHistory.js +14 -0
- package/dist/editor/menubar/ItemLanguageVersion.js +36 -0
- package/dist/editor/menubar/LanguageSelector.js +33 -0
- package/dist/editor/menubar/Menu.js +65 -0
- package/dist/editor/menubar/NavButtons.js +43 -0
- package/dist/editor/menubar/PageSelector.js +50 -0
- package/dist/editor/menubar/PageViewerControls.js +37 -0
- package/dist/editor/menubar/Separator.js +8 -0
- package/dist/editor/menubar/SiteInfo.js +26 -0
- package/dist/editor/menubar/User.js +18 -0
- package/dist/editor/menubar/VersionSelector.js +49 -0
- package/dist/editor/page-editor-chrome/CommentHighlighting.js +214 -0
- package/dist/editor/page-editor-chrome/CommentHighlightings.js +17 -0
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js +27 -0
- package/dist/editor/page-editor-chrome/FieldActionIndicators.js +15 -0
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +27 -0
- package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +15 -0
- package/dist/editor/page-editor-chrome/FrameMenu.js +178 -0
- package/dist/editor/page-editor-chrome/FrameMenus.js +24 -0
- package/dist/editor/page-editor-chrome/InlineEditor.js +101 -0
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +35 -0
- package/dist/editor/page-editor-chrome/NoLayout.js +21 -0
- package/dist/editor/page-editor-chrome/PageEditorChrome.js +65 -0
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +109 -0
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +82 -0
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +147 -0
- package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
- package/dist/editor/page-viewer/EditorForm.js +130 -0
- package/dist/editor/page-viewer/MiniMap.js +257 -0
- package/dist/editor/page-viewer/PageViewer.js +64 -0
- package/dist/editor/page-viewer/PageViewerFrame.js +696 -0
- package/dist/editor/page-viewer/pageViewContext.js +117 -0
- package/dist/editor/pageModel.js +2 -0
- package/dist/editor/picture-shared.js +28 -0
- package/dist/editor/reviews/Comment.js +112 -0
- package/dist/editor/reviews/Comments.js +24 -0
- package/dist/editor/reviews/PreviewInfo.js +13 -0
- package/dist/editor/reviews/Reviews.js +165 -0
- package/dist/editor/reviews/reviewCommands.js +44 -0
- package/dist/editor/reviews/useReviews.js +48 -0
- package/dist/editor/services/aiService.js +99 -0
- package/dist/editor/services/componentDesignerService.js +79 -0
- package/dist/editor/services/contentService.js +104 -0
- package/dist/editor/services/editService.js +322 -0
- package/dist/editor/services/indexService.js +25 -0
- package/dist/editor/services/reviewsService.js +43 -0
- package/dist/editor/services/serviceHelper.js +67 -0
- package/dist/editor/services/systemService.js +7 -0
- package/dist/editor/services/translationService.js +15 -0
- package/dist/editor/services-server/api.js +119 -0
- package/dist/editor/services-server/graphQL.js +56 -0
- package/dist/editor/sidebar/ComponentPalette.js +55 -0
- package/dist/editor/sidebar/ComponentTree.js +362 -0
- package/dist/editor/sidebar/Debug.js +60 -0
- package/dist/editor/sidebar/DictionaryEditor.js +160 -0
- package/dist/editor/sidebar/EditHistory.js +74 -0
- package/dist/editor/sidebar/GraphQL.js +115 -0
- package/dist/editor/sidebar/Insert.js +24 -0
- package/dist/editor/sidebar/MainContentTree.js +52 -0
- package/dist/editor/sidebar/Performance.js +34 -0
- package/dist/editor/sidebar/Sessions.js +31 -0
- package/dist/editor/sidebar/Sidebar.js +15 -0
- package/dist/editor/sidebar/SidebarView.js +76 -0
- package/dist/editor/sidebar/Translations.js +160 -0
- package/dist/editor/sidebar/Validation.js +52 -0
- package/dist/editor/sidebar/ViewSelector.js +15 -0
- package/dist/editor/sidebar/Workbox.js +80 -0
- package/dist/editor/ui/CenteredMessage.js +7 -0
- package/dist/editor/ui/CopyToClipboardButton.js +17 -0
- package/dist/editor/ui/DialogButtons.js +7 -0
- package/dist/editor/ui/Icons.js +75 -0
- package/dist/editor/ui/ItemNameDialog.js +45 -0
- package/dist/editor/ui/ItemNameDialogNew.js +61 -0
- package/dist/editor/ui/ItemSearch.js +93 -0
- package/dist/editor/ui/PerfectTree.js +223 -0
- package/dist/editor/ui/Section.js +12 -0
- package/dist/editor/ui/SimpleIconButton.js +11 -0
- package/dist/editor/ui/SimpleMenu.js +9 -0
- package/dist/editor/ui/SimpleTable.js +11 -0
- package/dist/editor/ui/SimpleTabs.js +21 -0
- package/dist/editor/ui/SimpleToolbar.js +7 -0
- package/dist/editor/ui/Spinner.js +7 -0
- package/dist/editor/ui/Splitter.js +187 -0
- package/dist/editor/ui/StackedPanels.js +69 -0
- package/dist/editor/ui/Toolbar.js +7 -0
- package/dist/editor/utils/id-helper.js +7 -0
- package/dist/editor/utils/insertOptions.js +45 -0
- package/dist/editor/utils/itemutils.js +25 -0
- package/dist/editor/utils/useMemoDebug.js +20 -0
- package/dist/editor/utils.js +328 -0
- package/dist/editor/views/CompareView.js +147 -0
- package/dist/editor/views/EditView.js +17 -0
- package/dist/editor/views/ItemEditor.js +24 -0
- package/dist/editor/views/SingleEditView.js +25 -0
- package/dist/index.js +22 -0
- package/dist/page-wizard/PageWizard.js +62 -0
- package/dist/page-wizard/SelectWizard.js +43 -0
- package/dist/page-wizard/WizardSteps.js +71 -0
- package/dist/page-wizard/service.js +26 -0
- package/dist/page-wizard/startPageWizardCommand.js +23 -0
- package/dist/page-wizard/steps/BuildPageStep.js +138 -0
- package/dist/page-wizard/steps/CollectStep.js +124 -0
- package/dist/page-wizard/steps/ComponentTypesSelector.js +211 -0
- package/dist/page-wizard/steps/Components.js +94 -0
- package/dist/page-wizard/steps/CreatePage.js +142 -0
- package/dist/page-wizard/steps/CreatePageAndLayoutStep.js +230 -0
- package/dist/page-wizard/steps/EditButton.js +7 -0
- package/dist/page-wizard/steps/FieldEditor.js +30 -0
- package/dist/page-wizard/steps/Generate.js +11 -0
- package/dist/page-wizard/steps/ImagesStep.js +159 -0
- package/dist/page-wizard/steps/LayoutStep.js +120 -0
- package/dist/page-wizard/steps/SelectStep.js +150 -0
- package/dist/page-wizard/steps/schema.js +140 -0
- package/dist/page-wizard/steps/usePageCreator.js +194 -0
- package/dist/splash-screen/NewPage.js +131 -0
- package/dist/splash-screen/SectionHeadline.js +9 -0
- package/dist/splash-screen/SplashScreen.js +81 -0
- package/dist/tour/Tour.js +321 -0
- package/dist/tour/default-tour.js +231 -0
- package/dist/tour/preview-tour.js +93 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/types.js +2 -0
- package/eslint.config.mjs +4 -0
- package/images/bg-shape-black.webp +0 -0
- package/package.json +52 -0
- package/src/client-components/api.ts +6 -0
- package/src/client-components/index.ts +19 -0
- package/src/components/ActionButton.tsx +43 -0
- package/src/components/Error.tsx +57 -0
- package/src/config/config.tsx +737 -0
- package/src/config/types.ts +263 -0
- package/src/editor/ComponentInfo.tsx +77 -0
- package/src/editor/ConfirmationDialog.tsx +103 -0
- package/src/editor/ContentTree.tsx +654 -0
- package/src/editor/ContextMenu.tsx +155 -0
- package/src/editor/Editor.tsx +91 -0
- package/src/editor/EditorWarning.tsx +34 -0
- package/src/editor/EditorWarnings.tsx +33 -0
- package/src/editor/FieldEditorPopup.tsx +65 -0
- package/src/editor/FieldHistory.tsx +74 -0
- package/src/editor/FieldList.tsx +190 -0
- package/src/editor/FieldListField.tsx +387 -0
- package/src/editor/FieldListFieldWithFallbacks.tsx +211 -0
- package/src/editor/FloatingToolbar.tsx +163 -0
- package/src/editor/ImageEditor.tsx +129 -0
- package/src/editor/InsertMenu.tsx +332 -0
- package/src/editor/ItemInfo.tsx +90 -0
- package/src/editor/LinkEditorDialog.tsx +192 -0
- package/src/editor/MainLayout.tsx +94 -0
- package/src/editor/NewEditorClient.tsx +11 -0
- package/src/editor/PictureCropper.tsx +505 -0
- package/src/editor/PictureEditor.tsx +206 -0
- package/src/editor/PictureEditorDialog.tsx +381 -0
- package/src/editor/PublishDialog.ignore +74 -0
- package/src/editor/ScrollingContentTree.tsx +47 -0
- package/src/editor/Terminal.tsx +215 -0
- package/src/editor/Titlebar.tsx +23 -0
- package/src/editor/ai/AiPopup.tsx +59 -0
- package/src/editor/ai/AiResponseMessage.tsx +82 -0
- package/src/editor/ai/AiTerminal.tsx +450 -0
- package/src/editor/ai/AiToolCall.tsx +46 -0
- package/src/editor/ai/EditorAiTerminal.tsx +20 -0
- package/src/editor/ai/editorAiContext.ts +18 -0
- package/src/editor/client/DialogContext.tsx +49 -0
- package/src/editor/client/EditorClient.tsx +1831 -0
- package/src/editor/client/GenericDialog.tsx +50 -0
- package/src/editor/client/editContext.ts +330 -0
- package/src/editor/client/helpers.ts +44 -0
- package/src/editor/client/itemsRepository.ts +391 -0
- package/src/editor/client/operations.ts +610 -0
- package/src/editor/client/pageModelBuilder.ts +182 -0
- package/src/editor/commands/commands.ts +23 -0
- package/src/editor/commands/componentCommands.tsx +408 -0
- package/src/editor/commands/createVersionCommand.ts +33 -0
- package/src/editor/commands/deleteVersionCommand.ts +71 -0
- package/src/editor/commands/itemCommands.tsx +186 -0
- package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +201 -0
- package/src/editor/commands/undo.ts +39 -0
- package/src/editor/component-designer/ComponentDesigner.tsx +70 -0
- package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx +11 -0
- package/src/editor/component-designer/ComponentDesignerMenu.tsx +91 -0
- package/src/editor/component-designer/ComponentEditor.tsx +97 -0
- package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +31 -0
- package/src/editor/component-designer/ComponentRenderingEditor.tsx +104 -0
- package/src/editor/component-designer/ComponentsDropdown.tsx +39 -0
- package/src/editor/component-designer/PlaceholdersEditor.tsx +183 -0
- package/src/editor/component-designer/RenderingsDropdown.tsx +36 -0
- package/src/editor/component-designer/TemplateEditor.tsx +236 -0
- package/src/editor/component-designer/aiContext.ts +23 -0
- package/src/editor/componentTreeHelper.tsx +114 -0
- package/src/editor/control-center/ControlCenterMenu.tsx +71 -0
- package/src/editor/control-center/IndexOverview.tsx +50 -0
- package/src/editor/control-center/IndexSettings.tsx +266 -0
- package/src/editor/control-center/Status.tsx +7 -0
- package/src/editor/editor-warnings/ItemLocked.tsx +63 -0
- package/src/editor/editor-warnings/NoLanguageWriteAccess.tsx +22 -0
- package/src/editor/editor-warnings/NoWorkflowWriteAccess.tsx +23 -0
- package/src/editor/editor-warnings/NoWriteAccess.tsx +15 -0
- package/src/editor/editor-warnings/ValidationErrors.tsx +54 -0
- package/src/editor/field-types/AttachmentEditor.tsx +9 -0
- package/src/editor/field-types/CheckboxEditor.tsx +47 -0
- package/src/editor/field-types/DropLinkEditor.tsx +75 -0
- package/src/editor/field-types/DropListEditor.tsx +84 -0
- package/src/editor/field-types/ImageFieldEditor.tsx +65 -0
- package/src/editor/field-types/InternalLinkFieldEditor.tsx +112 -0
- package/src/editor/field-types/LinkFieldEditor.tsx +85 -0
- package/src/editor/field-types/MultiLineText.tsx +63 -0
- package/src/editor/field-types/PictureFieldEditor.tsx +121 -0
- package/src/editor/field-types/RawEditor.tsx +53 -0
- package/src/editor/field-types/ReactQuill.tsx +580 -0
- package/src/editor/field-types/RichTextEditor.tsx +22 -0
- package/src/editor/field-types/RichTextEditorComponent.tsx +108 -0
- package/src/editor/field-types/SingleLineText.tsx +150 -0
- package/src/editor/field-types/TreeListEditor.tsx +261 -0
- package/src/editor/fieldTypes.ts +140 -0
- package/src/editor/media-selector/AiImageSearch.tsx +186 -0
- package/src/editor/media-selector/AiImageSearchPrompt.tsx +95 -0
- package/src/editor/media-selector/MediaSelector.tsx +42 -0
- package/src/editor/media-selector/Preview.tsx +14 -0
- package/src/editor/media-selector/Thumbnails.tsx +48 -0
- package/src/editor/media-selector/TreeSelector.tsx +292 -0
- package/src/editor/media-selector/UploadZone.tsx +137 -0
- package/src/editor/menubar/ActionsMenu.tsx +47 -0
- package/src/editor/menubar/ActiveUsers.tsx +17 -0
- package/src/editor/menubar/ApproveAndPublish.tsx +18 -0
- package/src/editor/menubar/BrowseHistory.tsx +37 -0
- package/src/editor/menubar/ItemLanguageVersion.tsx +52 -0
- package/src/editor/menubar/LanguageSelector.tsx +152 -0
- package/src/editor/menubar/Menu.tsx +83 -0
- package/src/editor/menubar/NavButtons.tsx +74 -0
- package/src/editor/menubar/PageSelector.tsx +139 -0
- package/src/editor/menubar/PageViewerControls.tsx +99 -0
- package/src/editor/menubar/Separator.tsx +12 -0
- package/src/editor/menubar/SiteInfo.tsx +53 -0
- package/src/editor/menubar/User.tsx +27 -0
- package/src/editor/menubar/VersionSelector.tsx +143 -0
- package/src/editor/page-editor-chrome/CommentHighlighting.tsx +287 -0
- package/src/editor/page-editor-chrome/CommentHighlightings.tsx +35 -0
- package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +44 -0
- package/src/editor/page-editor-chrome/FieldActionIndicators.tsx +23 -0
- package/src/editor/page-editor-chrome/FieldEditedIndicator.tsx +64 -0
- package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +35 -0
- package/src/editor/page-editor-chrome/FrameMenu.tsx +263 -0
- package/src/editor/page-editor-chrome/FrameMenus.tsx +48 -0
- package/src/editor/page-editor-chrome/InlineEditor.tsx +147 -0
- package/src/editor/page-editor-chrome/LockedFieldIndicator.tsx +61 -0
- package/src/editor/page-editor-chrome/NoLayout.tsx +36 -0
- package/src/editor/page-editor-chrome/PageEditorChrome.tsx +119 -0
- package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +154 -0
- package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +171 -0
- package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +233 -0
- package/src/editor/page-viewer/DeviceToolbar.tsx +70 -0
- package/src/editor/page-viewer/EditorForm.tsx +247 -0
- package/src/editor/page-viewer/MiniMap.tsx +351 -0
- package/src/editor/page-viewer/PageViewer.tsx +127 -0
- package/src/editor/page-viewer/PageViewerFrame.tsx +1030 -0
- package/src/editor/page-viewer/pageViewContext.ts +186 -0
- package/src/editor/pageModel.ts +191 -0
- package/src/editor/picture-shared.tsx +53 -0
- package/src/editor/reviews/Comment.tsx +265 -0
- package/src/editor/reviews/Comments.tsx +50 -0
- package/src/editor/reviews/PreviewInfo.tsx +35 -0
- package/src/editor/reviews/Reviews.tsx +280 -0
- package/src/editor/reviews/reviewCommands.tsx +47 -0
- package/src/editor/reviews/useReviews.tsx +70 -0
- package/src/editor/services/aiService.ts +155 -0
- package/src/editor/services/componentDesignerService.ts +151 -0
- package/src/editor/services/contentService.ts +159 -0
- package/src/editor/services/editService.ts +462 -0
- package/src/editor/services/indexService.ts +24 -0
- package/src/editor/services/reviewsService.ts +45 -0
- package/src/editor/services/serviceHelper.ts +95 -0
- package/src/editor/services/systemService.ts +5 -0
- package/src/editor/services/translationService.ts +21 -0
- package/src/editor/services-server/api.ts +150 -0
- package/src/editor/services-server/graphQL.ts +106 -0
- package/src/editor/sidebar/ComponentPalette.tsx +146 -0
- package/src/editor/sidebar/ComponentTree.tsx +512 -0
- package/src/editor/sidebar/ComponentTree2.tsxx +490 -0
- package/src/editor/sidebar/Debug.tsx +105 -0
- package/src/editor/sidebar/DictionaryEditor.tsx +261 -0
- package/src/editor/sidebar/EditHistory.tsx +134 -0
- package/src/editor/sidebar/GraphQL.tsx +164 -0
- package/src/editor/sidebar/Insert.tsx +35 -0
- package/src/editor/sidebar/MainContentTree.tsx +95 -0
- package/src/editor/sidebar/Performance.tsx +53 -0
- package/src/editor/sidebar/Sessions.tsx +35 -0
- package/src/editor/sidebar/Sidebar.tsx +20 -0
- package/src/editor/sidebar/SidebarView.tsx +150 -0
- package/src/editor/sidebar/Translations.tsx +276 -0
- package/src/editor/sidebar/Validation.tsx +102 -0
- package/src/editor/sidebar/ViewSelector.tsx +49 -0
- package/src/editor/sidebar/Workbox.tsx +209 -0
- package/src/editor/ui/CenteredMessage.tsx +7 -0
- package/src/editor/ui/CopyToClipboardButton.tsx +23 -0
- package/src/editor/ui/DialogButtons.tsx +11 -0
- package/src/editor/ui/Icons.tsx +585 -0
- package/src/editor/ui/ItemNameDialog.tsx +94 -0
- package/src/editor/ui/ItemNameDialogNew.tsx +118 -0
- package/src/editor/ui/ItemSearch.tsx +173 -0
- package/src/editor/ui/PerfectTree.tsx +550 -0
- package/src/editor/ui/Section.tsx +35 -0
- package/src/editor/ui/SimpleIconButton.tsx +43 -0
- package/src/editor/ui/SimpleMenu.tsx +48 -0
- package/src/editor/ui/SimpleTable.tsx +63 -0
- package/src/editor/ui/SimpleTabs.tsx +55 -0
- package/src/editor/ui/SimpleToolbar.tsx +7 -0
- package/src/editor/ui/Spinner.tsx +7 -0
- package/src/editor/ui/Splitter.tsx +247 -0
- package/src/editor/ui/StackedPanels.tsx +134 -0
- package/src/editor/ui/Toolbar.tsx +7 -0
- package/src/editor/utils/id-helper.ts +3 -0
- package/src/editor/utils/insertOptions.ts +69 -0
- package/src/editor/utils/itemutils.ts +29 -0
- package/src/editor/utils/useMemoDebug.ts +28 -0
- package/src/editor/utils.ts +435 -0
- package/src/editor/views/CompareView.tsx +256 -0
- package/src/editor/views/EditView.tsx +27 -0
- package/src/editor/views/ItemEditor.tsx +58 -0
- package/src/editor/views/SingleEditView.tsx +44 -0
- package/src/fonts/Geist-Black.woff2 +0 -0
- package/src/fonts/Geist-Bold.woff2 +0 -0
- package/src/fonts/Geist-ExtraBold.woff2 +0 -0
- package/src/fonts/Geist-ExtraLight.woff2 +0 -0
- package/src/fonts/Geist-Light.woff2 +0 -0
- package/src/fonts/Geist-Medium.woff2 +0 -0
- package/src/fonts/Geist-Regular.woff2 +0 -0
- package/src/fonts/Geist-SemiBold.woff2 +0 -0
- package/src/fonts/Geist-Thin.woff2 +0 -0
- package/src/fonts/Geist[wght].woff2 +0 -0
- package/src/index.ts +7 -0
- package/src/page-wizard/PageWizard.tsx +163 -0
- package/src/page-wizard/SelectWizard.tsx +109 -0
- package/src/page-wizard/WizardSteps.tsx +207 -0
- package/src/page-wizard/service.ts +35 -0
- package/src/page-wizard/startPageWizardCommand.ts +27 -0
- package/src/page-wizard/steps/BuildPageStep.tsx +266 -0
- package/src/page-wizard/steps/CollectStep.tsx +233 -0
- package/src/page-wizard/steps/ComponentTypesSelector.tsx +443 -0
- package/src/page-wizard/steps/Components.tsx +193 -0
- package/src/page-wizard/steps/CreatePage.tsx +285 -0
- package/src/page-wizard/steps/CreatePageAndLayoutStep.tsx +384 -0
- package/src/page-wizard/steps/EditButton.tsx +34 -0
- package/src/page-wizard/steps/FieldEditor.tsx +102 -0
- package/src/page-wizard/steps/Generate.tsx +32 -0
- package/src/page-wizard/steps/ImagesStep.tsx +318 -0
- package/src/page-wizard/steps/LayoutStep.tsx +228 -0
- package/src/page-wizard/steps/SelectStep.tsx +256 -0
- package/src/page-wizard/steps/schema.ts +180 -0
- package/src/page-wizard/steps/usePageCreator.ts +279 -0
- package/src/splash-screen/NewPage.tsx +232 -0
- package/src/splash-screen/SectionHeadline.tsx +21 -0
- package/src/splash-screen/SplashScreen.tsx +156 -0
- package/src/tour/Tour.tsx +558 -0
- package/src/tour/default-tour.tsx +300 -0
- package/src/tour/preview-tour.tsx +127 -0
- package/src/types.ts +302 -0
- package/styles.css +476 -0
- package/tsconfig.build.json +21 -0
- 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
|
+
}
|