@canvas-digital/blog-sdk 2.0.0
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/README.md +110 -0
- package/dist/BlogPlatform.d.ts +40 -0
- package/dist/BlogPlatform.d.ts.map +1 -0
- package/dist/BlogPlatform.js +38 -0
- package/dist/admin/components/BlogAdmin.d.ts +10 -0
- package/dist/admin/components/BlogAdmin.d.ts.map +1 -0
- package/dist/admin/components/BlogAdmin.js +36 -0
- package/dist/admin/components/CategoryManager.d.ts +5 -0
- package/dist/admin/components/CategoryManager.d.ts.map +1 -0
- package/dist/admin/components/CategoryManager.js +43 -0
- package/dist/admin/components/MediaManager.d.ts +7 -0
- package/dist/admin/components/MediaManager.d.ts.map +1 -0
- package/dist/admin/components/MediaManager.js +37 -0
- package/dist/admin/components/PostEditor.d.ts +7 -0
- package/dist/admin/components/PostEditor.d.ts.map +1 -0
- package/dist/admin/components/PostEditor.js +160 -0
- package/dist/admin/components/PostList.d.ts +8 -0
- package/dist/admin/components/PostList.d.ts.map +1 -0
- package/dist/admin/components/PostList.js +32 -0
- package/dist/admin/components/TagManager.d.ts +5 -0
- package/dist/admin/components/TagManager.d.ts.map +1 -0
- package/dist/admin/components/TagManager.js +41 -0
- package/dist/admin/components/editor/RichTextEditor.d.ts +8 -0
- package/dist/admin/components/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/admin/components/editor/RichTextEditor.js +47 -0
- package/dist/admin/components/internal/States.d.ts +16 -0
- package/dist/admin/components/internal/States.d.ts.map +1 -0
- package/dist/admin/components/internal/States.js +15 -0
- package/dist/admin/hooks/useAsync.d.ts +23 -0
- package/dist/admin/hooks/useAsync.d.ts.map +1 -0
- package/dist/admin/hooks/useAsync.js +40 -0
- package/dist/admin/index.d.ts +10 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +9 -0
- package/dist/admin/theme.d.ts +6 -0
- package/dist/admin/theme.d.ts.map +1 -0
- package/dist/admin/theme.js +52 -0
- package/dist/admin/types.d.ts +27 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +1 -0
- package/dist/blog-client.iife.js +1 -0
- package/dist/client/admin-client.d.ts +33 -0
- package/dist/client/admin-client.d.ts.map +1 -0
- package/dist/client/admin-client.js +153 -0
- package/dist/client/errors.d.ts +14 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +26 -0
- package/dist/client/http.d.ts +12 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +135 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/pagination.d.ts +4 -0
- package/dist/client/pagination.d.ts.map +1 -0
- package/dist/client/pagination.js +32 -0
- package/dist/client/public-client.d.ts +23 -0
- package/dist/client/public-client.d.ts.map +1 -0
- package/dist/client/public-client.js +94 -0
- package/dist/client/types.d.ts +115 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +1 -0
- package/dist/components/BlogUploader/BackButton.d.ts +5 -0
- package/dist/components/BlogUploader/BackButton.d.ts.map +1 -0
- package/dist/components/BlogUploader/BackButton.js +27 -0
- package/dist/components/BlogUploader/CommentSection.d.ts +12 -0
- package/dist/components/BlogUploader/CommentSection.d.ts.map +1 -0
- package/dist/components/BlogUploader/CommentSection.js +65 -0
- package/dist/components/BlogUploader/PostCard.d.ts +17 -0
- package/dist/components/BlogUploader/PostCard.d.ts.map +1 -0
- package/dist/components/BlogUploader/PostCard.js +42 -0
- package/dist/components/BlogUploader/PostFormatHero.d.ts +7 -0
- package/dist/components/BlogUploader/PostFormatHero.d.ts.map +1 -0
- package/dist/components/BlogUploader/PostFormatHero.js +47 -0
- package/dist/components/BlogUploader/ReadingProgress.d.ts +9 -0
- package/dist/components/BlogUploader/ReadingProgress.d.ts.map +1 -0
- package/dist/components/BlogUploader/ReadingProgress.js +28 -0
- package/dist/components/BlogUploader/RichText.d.ts +5 -0
- package/dist/components/BlogUploader/RichText.d.ts.map +1 -0
- package/dist/components/BlogUploader/RichText.js +59 -0
- package/dist/components/BlogUploader/ShareRow.d.ts +12 -0
- package/dist/components/BlogUploader/ShareRow.d.ts.map +1 -0
- package/dist/components/BlogUploader/ShareRow.js +13 -0
- package/dist/components/BlogUploader/ViewBeacon.d.ts +12 -0
- package/dist/components/BlogUploader/ViewBeacon.d.ts.map +1 -0
- package/dist/components/BlogUploader/ViewBeacon.js +37 -0
- package/dist/components/BlogUploader/dashboard/BrandSettings.d.ts +28 -0
- package/dist/components/BlogUploader/dashboard/BrandSettings.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/BrandSettings.js +60 -0
- package/dist/components/BlogUploader/dashboard/BrandSwitcher.d.ts +14 -0
- package/dist/components/BlogUploader/dashboard/BrandSwitcher.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/BrandSwitcher.js +25 -0
- package/dist/components/BlogUploader/dashboard/Chips.d.ts +15 -0
- package/dist/components/BlogUploader/dashboard/Chips.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/Chips.js +15 -0
- package/dist/components/BlogUploader/dashboard/CommentsManager.d.ts +19 -0
- package/dist/components/BlogUploader/dashboard/CommentsManager.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/CommentsManager.js +32 -0
- package/dist/components/BlogUploader/dashboard/LogOutButton.d.ts +4 -0
- package/dist/components/BlogUploader/dashboard/LogOutButton.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/LogOutButton.js +22 -0
- package/dist/components/BlogUploader/dashboard/MediaLibrary.d.ts +16 -0
- package/dist/components/BlogUploader/dashboard/MediaLibrary.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/MediaLibrary.js +124 -0
- package/dist/components/BlogUploader/dashboard/MediaPicker.d.ts +19 -0
- package/dist/components/BlogUploader/dashboard/MediaPicker.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/MediaPicker.js +99 -0
- package/dist/components/BlogUploader/dashboard/PostsTable.d.ts +46 -0
- package/dist/components/BlogUploader/dashboard/PostsTable.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/PostsTable.js +109 -0
- package/dist/components/BlogUploader/dashboard/Shell.d.ts +25 -0
- package/dist/components/BlogUploader/dashboard/Shell.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/Shell.js +128 -0
- package/dist/components/BlogUploader/dashboard/TermManager.d.ts +29 -0
- package/dist/components/BlogUploader/dashboard/TermManager.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/TermManager.js +96 -0
- package/dist/components/BlogUploader/dashboard/ToastProvider.d.ts +6 -0
- package/dist/components/BlogUploader/dashboard/ToastProvider.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/ToastProvider.js +5 -0
- package/dist/components/BlogUploader/dashboard/UsersManager.d.ts +32 -0
- package/dist/components/BlogUploader/dashboard/UsersManager.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/UsersManager.js +98 -0
- package/dist/components/BlogUploader/dashboard/charts.d.ts +22 -0
- package/dist/components/BlogUploader/dashboard/charts.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/charts.js +79 -0
- package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.d.ts +25 -0
- package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.js +62 -0
- package/dist/components/BlogUploader/dashboard/editor/PostEditor.d.ts +95 -0
- package/dist/components/BlogUploader/dashboard/editor/PostEditor.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/PostEditor.js +649 -0
- package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.d.ts +37 -0
- package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.js +475 -0
- package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.d.ts +11 -0
- package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.js +31 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.d.ts +12 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.js +5 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.d.ts +4 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.js +31 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.d.ts +4 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.js +35 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.d.ts +11 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.js +23 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.d.ts +50 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.js +101 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.d.ts +22 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.js +51 -0
- package/dist/components/BlogUploader/dashboard/editor/load.d.ts +10 -0
- package/dist/components/BlogUploader/dashboard/editor/load.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/load.js +141 -0
- package/dist/components/BlogUploader/dashboard/loadTerms.d.ts +13 -0
- package/dist/components/BlogUploader/dashboard/loadTerms.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/loadTerms.js +41 -0
- package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.d.ts +8 -0
- package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.js +35 -0
- package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.d.ts +9 -0
- package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.js +40 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.d.ts +5 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.js +29 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.d.ts +10 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.js +31 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectForm.d.ts +27 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectForm.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectForm.js +79 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectList.d.ts +20 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectList.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectList.js +33 -0
- package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.d.ts +11 -0
- package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.js +54 -0
- package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.d.ts +9 -0
- package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.js +38 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.d.ts +28 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.js +29 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.d.ts +17 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.js +8 -0
- package/dist/components/BlogUploader/dashboard/seo/shared.d.ts +18 -0
- package/dist/components/BlogUploader/dashboard/seo/shared.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/shared.js +6 -0
- package/dist/components/BlogUploader/dashboard/tools/ExportTool.d.ts +8 -0
- package/dist/components/BlogUploader/dashboard/tools/ExportTool.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/tools/ExportTool.js +78 -0
- package/dist/components/BlogUploader/dashboard/tools/ImportTool.d.ts +7 -0
- package/dist/components/BlogUploader/dashboard/tools/ImportTool.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/tools/ImportTool.js +70 -0
- package/dist/components/BlogUploader/dashboard/upload.d.ts +47 -0
- package/dist/components/BlogUploader/dashboard/upload.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/upload.js +68 -0
- package/dist/components/BlogUploader/site/ArticleDetailHero.d.ts +27 -0
- package/dist/components/BlogUploader/site/ArticleDetailHero.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/ArticleDetailHero.js +13 -0
- package/dist/components/BlogUploader/site/ArticleRailDetails.d.ts +27 -0
- package/dist/components/BlogUploader/site/ArticleRailDetails.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/ArticleRailDetails.js +17 -0
- package/dist/components/BlogUploader/site/BlogIndexView.d.ts +28 -0
- package/dist/components/BlogUploader/site/BlogIndexView.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/BlogIndexView.js +34 -0
- package/dist/components/BlogUploader/site/BrandTableOfContents.d.ts +18 -0
- package/dist/components/BlogUploader/site/BrandTableOfContents.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/BrandTableOfContents.js +15 -0
- package/dist/components/BlogUploader/site/HeroFadeSlide.d.ts +11 -0
- package/dist/components/BlogUploader/site/HeroFadeSlide.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/HeroFadeSlide.js +3 -0
- package/dist/components/BlogUploader/site/HeroMediaVisual.d.ts +23 -0
- package/dist/components/BlogUploader/site/HeroMediaVisual.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/HeroMediaVisual.js +50 -0
- package/dist/components/BlogUploader/site/IndexFeedSection.d.ts +14 -0
- package/dist/components/BlogUploader/site/IndexFeedSection.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/IndexFeedSection.js +12 -0
- package/dist/components/BlogUploader/site/InfinitePostFeed.d.ts +23 -0
- package/dist/components/BlogUploader/site/InfinitePostFeed.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/InfinitePostFeed.js +152 -0
- package/dist/components/BlogUploader/site/SiteMediaHero.d.ts +12 -0
- package/dist/components/BlogUploader/site/SiteMediaHero.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/SiteMediaHero.js +80 -0
- package/dist/components/BlogUploader/site/SiteMotion.d.ts +12 -0
- package/dist/components/BlogUploader/site/SiteMotion.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/SiteMotion.js +27 -0
- package/dist/components/BlogUploader/site/SiteNavAuth.d.ts +8 -0
- package/dist/components/BlogUploader/site/SiteNavAuth.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/SiteNavAuth.js +36 -0
- package/dist/components/admin/AdminPostDetail.d.ts +7 -0
- package/dist/components/admin/AdminPostDetail.d.ts.map +1 -0
- package/dist/components/admin/AdminPostDetail.js +105 -0
- package/dist/components/admin/BrandSettings.d.ts +11 -0
- package/dist/components/admin/BrandSettings.d.ts.map +1 -0
- package/dist/components/admin/BrandSettings.js +71 -0
- package/dist/components/admin/BrandSwitcher.d.ts +3 -0
- package/dist/components/admin/BrandSwitcher.d.ts.map +1 -0
- package/dist/components/admin/BrandSwitcher.js +12 -0
- package/dist/components/admin/CategoryManager.d.ts +2 -0
- package/dist/components/admin/CategoryManager.d.ts.map +1 -0
- package/dist/components/admin/CategoryManager.js +1 -0
- package/dist/components/admin/Chips.d.ts +15 -0
- package/dist/components/admin/Chips.d.ts.map +1 -0
- package/dist/components/admin/Chips.js +15 -0
- package/dist/components/admin/CommentsManager.d.ts +6 -0
- package/dist/components/admin/CommentsManager.d.ts.map +1 -0
- package/dist/components/admin/CommentsManager.js +30 -0
- package/dist/components/admin/Dashboard.d.ts +3 -0
- package/dist/components/admin/Dashboard.d.ts.map +1 -0
- package/dist/components/admin/Dashboard.js +34 -0
- package/dist/components/admin/MediaLibrary.d.ts +4 -0
- package/dist/components/admin/MediaLibrary.d.ts.map +1 -0
- package/dist/components/admin/MediaLibrary.js +119 -0
- package/dist/components/admin/MediaManager.d.ts +2 -0
- package/dist/components/admin/MediaManager.d.ts.map +1 -0
- package/dist/components/admin/MediaManager.js +1 -0
- package/dist/components/admin/MediaPicker.d.ts +10 -0
- package/dist/components/admin/MediaPicker.d.ts.map +1 -0
- package/dist/components/admin/MediaPicker.js +86 -0
- package/dist/components/admin/PostEditor.d.ts +2 -0
- package/dist/components/admin/PostEditor.d.ts.map +1 -0
- package/dist/components/admin/PostEditor.js +1 -0
- package/dist/components/admin/PostList.d.ts +13 -0
- package/dist/components/admin/PostList.d.ts.map +1 -0
- package/dist/components/admin/PostList.js +93 -0
- package/dist/components/admin/PostsTable.d.ts +15 -0
- package/dist/components/admin/PostsTable.d.ts.map +1 -0
- package/dist/components/admin/PostsTable.js +106 -0
- package/dist/components/admin/Shell.d.ts +18 -0
- package/dist/components/admin/Shell.d.ts.map +1 -0
- package/dist/components/admin/Shell.js +99 -0
- package/dist/components/admin/TagManager.d.ts +2 -0
- package/dist/components/admin/TagManager.d.ts.map +1 -0
- package/dist/components/admin/TagManager.js +1 -0
- package/dist/components/admin/TermManager.d.ts +9 -0
- package/dist/components/admin/TermManager.d.ts.map +1 -0
- package/dist/components/admin/TermManager.js +105 -0
- package/dist/components/admin/UsersManager.d.ts +5 -0
- package/dist/components/admin/UsersManager.d.ts.map +1 -0
- package/dist/components/admin/UsersManager.js +96 -0
- package/dist/components/admin/api/mappers.d.ts +37 -0
- package/dist/components/admin/api/mappers.d.ts.map +1 -0
- package/dist/components/admin/api/mappers.js +174 -0
- package/dist/components/admin/charts.d.ts +30 -0
- package/dist/components/admin/charts.d.ts.map +1 -0
- package/dist/components/admin/charts.js +79 -0
- package/dist/components/admin/editor/FormatContentPanel.d.ts +25 -0
- package/dist/components/admin/editor/FormatContentPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/FormatContentPanel.js +62 -0
- package/dist/components/admin/editor/PostEditor.d.ts +5 -0
- package/dist/components/admin/editor/PostEditor.d.ts.map +1 -0
- package/dist/components/admin/editor/PostEditor.js +404 -0
- package/dist/components/admin/editor/RichTextEditor.d.ts +42 -0
- package/dist/components/admin/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/components/admin/editor/RichTextEditor.js +475 -0
- package/dist/components/admin/editor/SeoAnalysisPanel.d.ts +11 -0
- package/dist/components/admin/editor/SeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/SeoAnalysisPanel.js +31 -0
- package/dist/components/admin/editor/YoastCollapsible.d.ts +12 -0
- package/dist/components/admin/editor/YoastCollapsible.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastCollapsible.js +5 -0
- package/dist/components/admin/editor/YoastInsightsPanel.d.ts +4 -0
- package/dist/components/admin/editor/YoastInsightsPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastInsightsPanel.js +31 -0
- package/dist/components/admin/editor/YoastInternalLinksPanel.d.ts +4 -0
- package/dist/components/admin/editor/YoastInternalLinksPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastInternalLinksPanel.js +35 -0
- package/dist/components/admin/editor/YoastSeoAnalysisPanel.d.ts +11 -0
- package/dist/components/admin/editor/YoastSeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastSeoAnalysisPanel.js +23 -0
- package/dist/components/admin/editor/YoastSeoMetabox.d.ts +54 -0
- package/dist/components/admin/editor/YoastSeoMetabox.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastSeoMetabox.js +101 -0
- package/dist/components/admin/editor/YoastSnippetField.d.ts +22 -0
- package/dist/components/admin/editor/YoastSnippetField.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastSnippetField.js +51 -0
- package/dist/components/admin/editor/load.d.ts +10 -0
- package/dist/components/admin/editor/load.d.ts.map +1 -0
- package/dist/components/admin/editor/load.js +141 -0
- package/dist/components/admin/index.d.ts +28 -0
- package/dist/components/admin/index.d.ts.map +1 -0
- package/dist/components/admin/index.js +27 -0
- package/dist/components/admin/internal/States.d.ts +16 -0
- package/dist/components/admin/internal/States.d.ts.map +1 -0
- package/dist/components/admin/internal/States.js +15 -0
- package/dist/components/admin/lib/format.d.ts +7 -0
- package/dist/components/admin/lib/format.d.ts.map +1 -0
- package/dist/components/admin/lib/format.js +43 -0
- package/dist/components/admin/lib/publishing.d.ts +8 -0
- package/dist/components/admin/lib/publishing.d.ts.map +1 -0
- package/dist/components/admin/lib/publishing.js +10 -0
- package/dist/components/admin/lib/robots.d.ts +13 -0
- package/dist/components/admin/lib/robots.d.ts.map +1 -0
- package/dist/components/admin/lib/robots.js +22 -0
- package/dist/components/admin/mock/fixtures.d.ts +240 -0
- package/dist/components/admin/mock/fixtures.d.ts.map +1 -0
- package/dist/components/admin/mock/fixtures.js +546 -0
- package/dist/components/admin/mock/store.d.ts +139 -0
- package/dist/components/admin/mock/store.d.ts.map +1 -0
- package/dist/components/admin/mock/store.js +1067 -0
- package/dist/components/admin/seo/Ga4Settings.d.ts +34 -0
- package/dist/components/admin/seo/Ga4Settings.d.ts.map +1 -0
- package/dist/components/admin/seo/Ga4Settings.js +80 -0
- package/dist/components/admin/seo/RedirectAnalyticsDashboard.d.ts +5 -0
- package/dist/components/admin/seo/RedirectAnalyticsDashboard.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectAnalyticsDashboard.js +24 -0
- package/dist/components/admin/seo/RedirectDetail.d.ts +11 -0
- package/dist/components/admin/seo/RedirectDetail.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectDetail.js +30 -0
- package/dist/components/admin/seo/RedirectForm.d.ts +29 -0
- package/dist/components/admin/seo/RedirectForm.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectForm.js +89 -0
- package/dist/components/admin/seo/RedirectList.d.ts +10 -0
- package/dist/components/admin/seo/RedirectList.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectList.js +28 -0
- package/dist/components/admin/seo/RobotsEditor.d.ts +5 -0
- package/dist/components/admin/seo/RobotsEditor.d.ts.map +1 -0
- package/dist/components/admin/seo/RobotsEditor.js +50 -0
- package/dist/components/admin/seo/SearchConsoleSettings.d.ts +3 -0
- package/dist/components/admin/seo/SearchConsoleSettings.d.ts.map +1 -0
- package/dist/components/admin/seo/SearchConsoleSettings.js +1 -0
- package/dist/components/admin/seo/SeoBrandList.d.ts +3 -0
- package/dist/components/admin/seo/SeoBrandList.d.ts.map +1 -0
- package/dist/components/admin/seo/SeoBrandList.js +1 -0
- package/dist/components/admin/seo/shared.d.ts +17 -0
- package/dist/components/admin/seo/shared.d.ts.map +1 -0
- package/dist/components/admin/seo/shared.js +7 -0
- package/dist/components/admin/tools/ExportTool.d.ts +3 -0
- package/dist/components/admin/tools/ExportTool.d.ts.map +1 -0
- package/dist/components/admin/tools/ExportTool.js +1 -0
- package/dist/components/admin/tools/ImportTool.d.ts +3 -0
- package/dist/components/admin/tools/ImportTool.d.ts.map +1 -0
- package/dist/components/admin/tools/ImportTool.js +1 -0
- package/dist/components/admin/tools/ToolsHub.d.ts +10 -0
- package/dist/components/admin/tools/ToolsHub.d.ts.map +1 -0
- package/dist/components/admin/tools/ToolsHub.js +106 -0
- package/dist/components/admin/tools/index.d.ts +3 -0
- package/dist/components/admin/tools/index.d.ts.map +1 -0
- package/dist/components/admin/tools/index.js +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +2 -0
- package/dist/components/user/BlogCard.d.ts +20 -0
- package/dist/components/user/BlogCard.d.ts.map +1 -0
- package/dist/components/user/BlogCard.js +22 -0
- package/dist/components/user/BlogCategories.d.ts +6 -0
- package/dist/components/user/BlogCategories.d.ts.map +1 -0
- package/dist/components/user/BlogCategories.js +11 -0
- package/dist/components/user/BlogDetail.d.ts +25 -0
- package/dist/components/user/BlogDetail.d.ts.map +1 -0
- package/dist/components/user/BlogDetail.js +90 -0
- package/dist/components/user/BlogList.d.ts +20 -0
- package/dist/components/user/BlogList.d.ts.map +1 -0
- package/dist/components/user/BlogList.js +56 -0
- package/dist/components/user/BlogSearch.d.ts +8 -0
- package/dist/components/user/BlogSearch.d.ts.map +1 -0
- package/dist/components/user/BlogSearch.js +19 -0
- package/dist/components/user/BlogTags.d.ts +6 -0
- package/dist/components/user/BlogTags.d.ts.map +1 -0
- package/dist/components/user/BlogTags.js +11 -0
- package/dist/components/user/FeaturedBlogs.d.ts +8 -0
- package/dist/components/user/FeaturedBlogs.d.ts.map +1 -0
- package/dist/components/user/FeaturedBlogs.js +12 -0
- package/dist/components/user/RelatedBlogs.d.ts +9 -0
- package/dist/components/user/RelatedBlogs.d.ts.map +1 -0
- package/dist/components/user/RelatedBlogs.js +12 -0
- package/dist/components/user/SiteMediaHero.d.ts +14 -0
- package/dist/components/user/SiteMediaHero.d.ts.map +1 -0
- package/dist/components/user/SiteMediaHero.js +43 -0
- package/dist/components/user/detail/ArticleDetailHero.d.ts +30 -0
- package/dist/components/user/detail/ArticleDetailHero.d.ts.map +1 -0
- package/dist/components/user/detail/ArticleDetailHero.js +29 -0
- package/dist/components/user/detail/ArticleRailDetails.d.ts +24 -0
- package/dist/components/user/detail/ArticleRailDetails.d.ts.map +1 -0
- package/dist/components/user/detail/ArticleRailDetails.js +12 -0
- package/dist/components/user/detail/BackButton.d.ts +7 -0
- package/dist/components/user/detail/BackButton.d.ts.map +1 -0
- package/dist/components/user/detail/BackButton.js +18 -0
- package/dist/components/user/detail/CommentSection.d.ts +28 -0
- package/dist/components/user/detail/CommentSection.d.ts.map +1 -0
- package/dist/components/user/detail/CommentSection.js +68 -0
- package/dist/components/user/detail/HeroFadeSlide.d.ts +12 -0
- package/dist/components/user/detail/HeroFadeSlide.d.ts.map +1 -0
- package/dist/components/user/detail/HeroFadeSlide.js +5 -0
- package/dist/components/user/detail/ReadingProgress.d.ts +2 -0
- package/dist/components/user/detail/ReadingProgress.d.ts.map +1 -0
- package/dist/components/user/detail/ReadingProgress.js +20 -0
- package/dist/components/user/detail/ShareRow.d.ts +7 -0
- package/dist/components/user/detail/ShareRow.d.ts.map +1 -0
- package/dist/components/user/detail/ShareRow.js +7 -0
- package/dist/components/user/detail/toc.d.ts +14 -0
- package/dist/components/user/detail/toc.d.ts.map +1 -0
- package/dist/components/user/detail/toc.js +106 -0
- package/dist/components/user/index.d.ts +14 -0
- package/dist/components/user/index.d.ts.map +1 -0
- package/dist/components/user/index.js +13 -0
- package/dist/components/user/internal/States.d.ts +18 -0
- package/dist/components/user/internal/States.d.ts.map +1 -0
- package/dist/components/user/internal/States.js +21 -0
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAsync.d.ts +23 -0
- package/dist/hooks/useAsync.d.ts.map +1 -0
- package/dist/hooks/useAsync.js +40 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/lib/access.d.ts +64 -0
- package/dist/lib/access.d.ts.map +1 -0
- package/dist/lib/access.js +127 -0
- package/dist/lib/canonical.d.ts +15 -0
- package/dist/lib/canonical.d.ts.map +1 -0
- package/dist/lib/canonical.js +34 -0
- package/dist/lib/comments.d.ts +9 -0
- package/dist/lib/comments.d.ts.map +1 -0
- package/dist/lib/comments.js +23 -0
- package/dist/lib/dashboard.d.ts +39 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +157 -0
- package/dist/lib/data-transfer.d.ts +23 -0
- package/dist/lib/data-transfer.d.ts.map +1 -0
- package/dist/lib/data-transfer.js +436 -0
- package/dist/lib/default-author.d.ts +12 -0
- package/dist/lib/default-author.d.ts.map +1 -0
- package/dist/lib/default-author.js +57 -0
- package/dist/lib/format-media.d.ts +6 -0
- package/dist/lib/format-media.d.ts.map +1 -0
- package/dist/lib/format-media.js +18 -0
- package/dist/lib/format.d.ts +7 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +43 -0
- package/dist/lib/hero-post.d.ts +24 -0
- package/dist/lib/hero-post.d.ts.map +1 -0
- package/dist/lib/hero-post.js +95 -0
- package/dist/lib/lexical-build.d.ts +30 -0
- package/dist/lib/lexical-build.d.ts.map +1 -0
- package/dist/lib/lexical-build.js +57 -0
- package/dist/lib/lexical-doc.d.ts +88 -0
- package/dist/lib/lexical-doc.d.ts.map +1 -0
- package/dist/lib/lexical-doc.js +385 -0
- package/dist/lib/lexical-dom.d.ts +19 -0
- package/dist/lib/lexical-dom.d.ts.map +1 -0
- package/dist/lib/lexical-dom.js +181 -0
- package/dist/lib/lexical.d.ts +31 -0
- package/dist/lib/lexical.d.ts.map +1 -0
- package/dist/lib/lexical.js +59 -0
- package/dist/lib/post-categories.d.ts +11 -0
- package/dist/lib/post-categories.d.ts.map +1 -0
- package/dist/lib/post-categories.js +27 -0
- package/dist/lib/post-format.d.ts +39 -0
- package/dist/lib/post-format.d.ts.map +1 -0
- package/dist/lib/post-format.js +82 -0
- package/dist/lib/publishing.d.ts +3 -0
- package/dist/lib/publishing.d.ts.map +1 -0
- package/dist/lib/publishing.js +1 -0
- package/dist/lib/queries.d.ts +49 -0
- package/dist/lib/queries.d.ts.map +1 -0
- package/dist/lib/queries.js +340 -0
- package/dist/lib/redirect-analytics.d.ts +27 -0
- package/dist/lib/redirect-analytics.d.ts.map +1 -0
- package/dist/lib/redirect-analytics.js +147 -0
- package/dist/lib/redirects.d.ts +39 -0
- package/dist/lib/redirects.d.ts.map +1 -0
- package/dist/lib/redirects.js +96 -0
- package/dist/lib/revalidate.d.ts +30 -0
- package/dist/lib/revalidate.d.ts.map +1 -0
- package/dist/lib/revalidate.js +91 -0
- package/dist/lib/robots.d.ts +19 -0
- package/dist/lib/robots.d.ts.map +1 -0
- package/dist/lib/robots.js +38 -0
- package/dist/lib/seo-analysis.d.ts +28 -0
- package/dist/lib/seo-analysis.d.ts.map +1 -0
- package/dist/lib/seo-analysis.js +153 -0
- package/dist/lib/seo-limits.d.ts +19 -0
- package/dist/lib/seo-limits.d.ts.map +1 -0
- package/dist/lib/seo-limits.js +39 -0
- package/dist/lib/seo.d.ts +50 -0
- package/dist/lib/seo.d.ts.map +1 -0
- package/dist/lib/seo.js +238 -0
- package/dist/lib/slug.d.ts +3 -0
- package/dist/lib/slug.d.ts.map +1 -0
- package/dist/lib/slug.js +9 -0
- package/dist/lib/stats.d.ts +71 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +207 -0
- package/dist/lib/tenant-host.d.ts +9 -0
- package/dist/lib/tenant-host.d.ts.map +1 -0
- package/dist/lib/tenant-host.js +15 -0
- package/dist/lib/tenant.d.ts +41 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/lib/tenant.js +140 -0
- package/dist/lib/toc.d.ts +16 -0
- package/dist/lib/toc.d.ts.map +1 -0
- package/dist/lib/toc.js +28 -0
- package/dist/lib/yoast-snippet.d.ts +25 -0
- package/dist/lib/yoast-snippet.d.ts.map +1 -0
- package/dist/lib/yoast-snippet.js +79 -0
- package/dist/pages/admin/BlogAdmin.d.ts +9 -0
- package/dist/pages/admin/BlogAdmin.d.ts.map +1 -0
- package/dist/pages/admin/BlogAdmin.js +234 -0
- package/dist/pages/admin/index.d.ts +2 -0
- package/dist/pages/admin/index.d.ts.map +1 -0
- package/dist/pages/admin/index.js +1 -0
- package/dist/pages/index.d.ts +3 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +2 -0
- package/dist/pages/user/UserBlogPage.d.ts +10 -0
- package/dist/pages/user/UserBlogPage.d.ts.map +1 -0
- package/dist/pages/user/UserBlogPage.js +15 -0
- package/dist/pages/user/index.d.ts +2 -0
- package/dist/pages/user/index.d.ts.map +1 -0
- package/dist/pages/user/index.js +1 -0
- package/dist/services/admin-client.d.ts +33 -0
- package/dist/services/admin-client.d.ts.map +1 -0
- package/dist/services/admin-client.js +154 -0
- package/dist/services/admin-sdk-client.d.ts +285 -0
- package/dist/services/admin-sdk-client.d.ts.map +1 -0
- package/dist/services/admin-sdk-client.js +242 -0
- package/dist/services/errors.d.ts +14 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +26 -0
- package/dist/services/http.d.ts +24 -0
- package/dist/services/http.d.ts.map +1 -0
- package/dist/services/http.js +159 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/pagination.d.ts +4 -0
- package/dist/services/pagination.d.ts.map +1 -0
- package/dist/services/pagination.js +32 -0
- package/dist/services/public-client.d.ts +23 -0
- package/dist/services/public-client.d.ts.map +1 -0
- package/dist/services/public-client.js +94 -0
- package/dist/services/types.d.ts +124 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +1 -0
- package/dist/style.css +3105 -0
- package/dist/styles/adminTheme.d.ts +6 -0
- package/dist/styles/adminTheme.d.ts.map +1 -0
- package/dist/styles/adminTheme.js +52 -0
- package/dist/styles/index.d.ts +3 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +2 -0
- package/dist/styles/userTheme.d.ts +8 -0
- package/dist/styles/userTheme.d.ts.map +1 -0
- package/dist/styles/userTheme.js +60 -0
- package/dist/types/admin.d.ts +28 -0
- package/dist/types/admin.d.ts.map +1 -0
- package/dist/types/admin.js +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/user.d.ts +41 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +1 -0
- package/dist/user/components/BlogCard.d.ts +15 -0
- package/dist/user/components/BlogCard.d.ts.map +1 -0
- package/dist/user/components/BlogCard.js +31 -0
- package/dist/user/components/BlogCategories.d.ts +6 -0
- package/dist/user/components/BlogCategories.d.ts.map +1 -0
- package/dist/user/components/BlogCategories.js +11 -0
- package/dist/user/components/BlogDetail.d.ts +7 -0
- package/dist/user/components/BlogDetail.d.ts.map +1 -0
- package/dist/user/components/BlogDetail.js +19 -0
- package/dist/user/components/BlogList.d.ts +8 -0
- package/dist/user/components/BlogList.d.ts.map +1 -0
- package/dist/user/components/BlogList.js +18 -0
- package/dist/user/components/BlogSearch.d.ts +8 -0
- package/dist/user/components/BlogSearch.d.ts.map +1 -0
- package/dist/user/components/BlogSearch.js +19 -0
- package/dist/user/components/BlogTags.d.ts +6 -0
- package/dist/user/components/BlogTags.d.ts.map +1 -0
- package/dist/user/components/BlogTags.js +11 -0
- package/dist/user/components/FeaturedBlogs.d.ts +8 -0
- package/dist/user/components/FeaturedBlogs.d.ts.map +1 -0
- package/dist/user/components/FeaturedBlogs.js +12 -0
- package/dist/user/components/RelatedBlogs.d.ts +9 -0
- package/dist/user/components/RelatedBlogs.d.ts.map +1 -0
- package/dist/user/components/RelatedBlogs.js +12 -0
- package/dist/user/components/internal/States.d.ts +18 -0
- package/dist/user/components/internal/States.d.ts.map +1 -0
- package/dist/user/components/internal/States.js +16 -0
- package/dist/user/hooks/useAsync.d.ts +21 -0
- package/dist/user/hooks/useAsync.d.ts.map +1 -0
- package/dist/user/hooks/useAsync.js +40 -0
- package/dist/user/index.d.ts +11 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +10 -0
- package/dist/user/sanitize.d.ts +2 -0
- package/dist/user/sanitize.d.ts.map +1 -0
- package/dist/user/sanitize.js +120 -0
- package/dist/user/theme.d.ts +8 -0
- package/dist/user/theme.d.ts.map +1 -0
- package/dist/user/theme.js +60 -0
- package/dist/user/types.d.ts +41 -0
- package/dist/user/types.d.ts.map +1 -0
- package/dist/user/types.js +1 -0
- package/dist/utils/env.d.ts +16 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +57 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/sanitize.d.ts +2 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +120 -0
- package/package.json +63 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { headers } from 'next/headers';
|
|
2
|
+
import { cache } from 'react';
|
|
3
|
+
import { getPayload } from 'payload';
|
|
4
|
+
import config from '@payload-config';
|
|
5
|
+
import { allowTenantSlugOverride, DEV_TENANT_HEADER, isSharedPreviewHost, } from './tenant-host';
|
|
6
|
+
/**
|
|
7
|
+
* Tenant resolution.
|
|
8
|
+
*
|
|
9
|
+
* The renderer is a single deployment serving every brand, so which brand a
|
|
10
|
+
* request belongs to is derived from the Host header — never from a path prefix
|
|
11
|
+
* and never from an environment variable. That is what lets one origin sit
|
|
12
|
+
* behind fifteen `/blog` rewrites without any per-brand configuration.
|
|
13
|
+
*
|
|
14
|
+
* In local development several brands share localhost, so `?_tenant=slug` (and
|
|
15
|
+
* a short-lived cookie set from it) selects the brand when the Host alone is
|
|
16
|
+
* ambiguous.
|
|
17
|
+
*/
|
|
18
|
+
export { ADMIN_BRAND_PARAM, DEV_TENANT_COOKIE, DEV_TENANT_HEADER, DEV_TENANT_PARAM } from './tenant-host';
|
|
19
|
+
/** One Payload instance per request — pages + layout used to open it twice. */
|
|
20
|
+
export const getPayloadClient = cache(async () => getPayload({ config }));
|
|
21
|
+
const normaliseHost = (host) => host.trim().toLowerCase().replace(/\.$/, '');
|
|
22
|
+
/** Strip the port for matching, but keep it available for local development. */
|
|
23
|
+
const hostVariants = (host) => {
|
|
24
|
+
const h = normaliseHost(host);
|
|
25
|
+
const withoutPort = h.replace(/:\d+$/, '');
|
|
26
|
+
const withoutWww = withoutPort.replace(/^www\./, '');
|
|
27
|
+
return [...new Set([h, withoutPort, withoutWww])];
|
|
28
|
+
};
|
|
29
|
+
const findTenantBySlug = async (slug) => {
|
|
30
|
+
const payload = await getPayloadClient();
|
|
31
|
+
const found = await payload.find({
|
|
32
|
+
collection: 'tenants',
|
|
33
|
+
where: { slug: { equals: slug } },
|
|
34
|
+
limit: 1,
|
|
35
|
+
depth: 0,
|
|
36
|
+
pagination: false,
|
|
37
|
+
overrideAccess: true,
|
|
38
|
+
});
|
|
39
|
+
return found.docs[0] ?? null;
|
|
40
|
+
};
|
|
41
|
+
export const resolveTenantByHost = async (host) => {
|
|
42
|
+
const payload = await getPayloadClient();
|
|
43
|
+
const candidates = host ? hostVariants(host) : [];
|
|
44
|
+
if (candidates.length) {
|
|
45
|
+
const match = await payload.find({
|
|
46
|
+
collection: 'tenants',
|
|
47
|
+
where: {
|
|
48
|
+
or: [
|
|
49
|
+
{ 'domains.hostname': { in: candidates } },
|
|
50
|
+
{ primaryDomain: { in: candidates } },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
limit: 1,
|
|
54
|
+
depth: 0,
|
|
55
|
+
pagination: false,
|
|
56
|
+
overrideAccess: true,
|
|
57
|
+
});
|
|
58
|
+
if (match.docs[0])
|
|
59
|
+
return match.docs[0];
|
|
60
|
+
}
|
|
61
|
+
// Development convenience only: with no matching host, fall back to the first
|
|
62
|
+
// tenant so `localhost:3000/blog` works without editing /etc/hosts. In
|
|
63
|
+
// production an unmatched host is a misconfiguration and must not silently
|
|
64
|
+
// serve another brand's content.
|
|
65
|
+
if (process.env.NEXT_PUBLIC_APP_ENV !== 'production') {
|
|
66
|
+
const first = await payload.find({
|
|
67
|
+
collection: 'tenants',
|
|
68
|
+
limit: 1,
|
|
69
|
+
depth: 0,
|
|
70
|
+
sort: 'createdAt',
|
|
71
|
+
pagination: false,
|
|
72
|
+
overrideAccess: true,
|
|
73
|
+
});
|
|
74
|
+
return first.docs[0] ?? null;
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Brand slug from the current request override header (set by middleware from
|
|
80
|
+
* `?_tenant=` on public pages, or `?brand=` / cookie on admin).
|
|
81
|
+
*/
|
|
82
|
+
export const getExplicitTenantSlug = async () => {
|
|
83
|
+
const h = await headers();
|
|
84
|
+
const host = h.get('host');
|
|
85
|
+
if (!allowTenantSlugOverride(host))
|
|
86
|
+
return null;
|
|
87
|
+
return h.get(DEV_TENANT_HEADER)?.trim() || null;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* On localhost / *.vercel.app, public listings match admin "All brands" by default.
|
|
91
|
+
* Pass `tenantFromQuery` from `?_tenant=` to scope to one brand.
|
|
92
|
+
*/
|
|
93
|
+
export const shouldListAllBrands = async (tenantFromQuery) => {
|
|
94
|
+
const h = await headers();
|
|
95
|
+
const host = h.get('host');
|
|
96
|
+
if (!isSharedPreviewHost(host))
|
|
97
|
+
return false;
|
|
98
|
+
if (tenantFromQuery?.trim())
|
|
99
|
+
return false;
|
|
100
|
+
// Layout / API with no query: also treat a public _tenant header as scoped.
|
|
101
|
+
const explicit = await getExplicitTenantSlug();
|
|
102
|
+
return !explicit;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Resolve the tenant for the current request.
|
|
106
|
+
*
|
|
107
|
+
* On a real brand domain, the Host header wins. On shared preview hosts
|
|
108
|
+
* (localhost, *.vercel.app), `?_tenant=` (public) or `?brand=` (admin) selects
|
|
109
|
+
* a brand. Public default with no picker is all-brands listings.
|
|
110
|
+
*
|
|
111
|
+
* Wrapped in React cache so layout + page share one lookup per request.
|
|
112
|
+
*/
|
|
113
|
+
export const getCurrentTenant = cache(async (overrideSlug) => {
|
|
114
|
+
const h = await headers();
|
|
115
|
+
const host = h.get('host');
|
|
116
|
+
const canPickBrand = allowTenantSlugOverride(host);
|
|
117
|
+
let slug = overrideSlug?.trim() || '';
|
|
118
|
+
if (!slug && canPickBrand) {
|
|
119
|
+
slug = h.get(DEV_TENANT_HEADER)?.trim() || '';
|
|
120
|
+
}
|
|
121
|
+
if (slug && canPickBrand) {
|
|
122
|
+
const bySlug = await findTenantBySlug(slug);
|
|
123
|
+
if (bySlug)
|
|
124
|
+
return bySlug;
|
|
125
|
+
}
|
|
126
|
+
return resolveTenantByHost(host);
|
|
127
|
+
});
|
|
128
|
+
/** Absolute origin for canonical URLs and the sitemap. */
|
|
129
|
+
export const tenantOrigin = (tenant, requestHost) => {
|
|
130
|
+
if (process.env.NEXT_PUBLIC_APP_ENV === 'production') {
|
|
131
|
+
return `https://${normaliseHost(tenant.primaryDomain)}`;
|
|
132
|
+
}
|
|
133
|
+
const host = requestHost ? normaliseHost(requestHost) : 'localhost:3000';
|
|
134
|
+
const protocol = host.startsWith('localhost') || host.startsWith('127.0.0.1') ? 'http' : 'https';
|
|
135
|
+
return `${protocol}://${host}`;
|
|
136
|
+
};
|
|
137
|
+
export const currentOrigin = async (tenant) => {
|
|
138
|
+
const h = await headers();
|
|
139
|
+
return tenantOrigin(tenant, h.get('host') ?? undefined);
|
|
140
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The contents rail on an article.
|
|
3
|
+
*
|
|
4
|
+
* Built from the stored document rather than from the rendered DOM, so it exists
|
|
5
|
+
* on the server, needs no JavaScript, and cannot disagree with the article: the
|
|
6
|
+
* same slug function generates the anchor here and the `id` in the renderer
|
|
7
|
+
* (see components/RichText.tsx).
|
|
8
|
+
*/
|
|
9
|
+
export type Heading = {
|
|
10
|
+
id: string;
|
|
11
|
+
text: string;
|
|
12
|
+
level: 2 | 3;
|
|
13
|
+
};
|
|
14
|
+
export declare const headingId: (text: string) => string;
|
|
15
|
+
export declare const extractHeadings: (content: unknown) => Heading[];
|
|
16
|
+
//# sourceMappingURL=toc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../app/lib/toc.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,CAAA;AAEhE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAA2C,CAAA;AAEpF,eAAO,MAAM,eAAe,GAAI,SAAS,OAAO,KAAG,OAAO,EAyBzD,CAAA"}
|
package/dist/lib/toc.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { walk } from './lexical';
|
|
2
|
+
import { slugify } from './slug';
|
|
3
|
+
export const headingId = (text) => `h-${slugify(text).slice(0, 60)}`;
|
|
4
|
+
export const extractHeadings = (content) => {
|
|
5
|
+
const out = [];
|
|
6
|
+
const seen = new Set();
|
|
7
|
+
walk(content?.root, (node) => {
|
|
8
|
+
if (node.type !== 'heading')
|
|
9
|
+
return;
|
|
10
|
+
const tag = String(node.tag ?? '');
|
|
11
|
+
if (tag !== 'h2' && tag !== 'h3')
|
|
12
|
+
return;
|
|
13
|
+
const text = (Array.isArray(node.children) ? node.children : [])
|
|
14
|
+
.map((child) => (typeof child.text === 'string' ? child.text : ''))
|
|
15
|
+
.join('')
|
|
16
|
+
.trim();
|
|
17
|
+
if (!text)
|
|
18
|
+
return;
|
|
19
|
+
// Two sections called "Method" would otherwise fight over one anchor.
|
|
20
|
+
let id = headingId(text);
|
|
21
|
+
let n = 2;
|
|
22
|
+
while (seen.has(id))
|
|
23
|
+
id = `${headingId(text)}-${n++}`;
|
|
24
|
+
seen.add(id);
|
|
25
|
+
out.push({ id, text, level: tag === 'h2' ? 2 : 3 });
|
|
26
|
+
});
|
|
27
|
+
return out;
|
|
28
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type SnippetContext = {
|
|
2
|
+
title: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
excerpt: string;
|
|
5
|
+
siteName: string;
|
|
6
|
+
separator?: string;
|
|
7
|
+
categoryName?: string;
|
|
8
|
+
focusKeyphrase?: string;
|
|
9
|
+
contentText?: string;
|
|
10
|
+
date?: string;
|
|
11
|
+
};
|
|
12
|
+
export type SnippetVariable = {
|
|
13
|
+
label: string;
|
|
14
|
+
token: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const SEO_TITLE_VARIABLES: SnippetVariable[];
|
|
18
|
+
export declare const META_DESCRIPTION_VARIABLES: SnippetVariable[];
|
|
19
|
+
export declare const expandSnippet: (template: string, ctx: SnippetContext) => string;
|
|
20
|
+
export declare const brandTitleTemplateToSnippet: (titleTemplate?: string | null) => string;
|
|
21
|
+
export declare const generateSeoTitleSnippet: (titleTemplate?: string | null) => string;
|
|
22
|
+
export declare const generateMetaDescriptionSnippet: (ctx: SnippetContext) => string;
|
|
23
|
+
export declare const resolveSeoTitle: (stored: string | null | undefined, ctx: SnippetContext) => string;
|
|
24
|
+
export declare const resolveMetaDescription: (stored: string | null | undefined, ctx: SnippetContext) => string;
|
|
25
|
+
//# sourceMappingURL=yoast-snippet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yoast-snippet.d.ts","sourceRoot":"","sources":["../../app/lib/yoast-snippet.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAShD,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,eAAe,EAMvD,CAAA;AAID,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,KAAK,cAAc,KAAG,MAqBrE,CAAA;AAED,eAAO,MAAM,2BAA2B,GAAI,gBAAgB,MAAM,GAAG,IAAI,KAAG,MAI3E,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,gBAAgB,MAAM,GAAG,IAAI,KAAG,MAC5B,CAAA;AAE5C,eAAO,MAAM,8BAA8B,GAAI,KAAK,cAAc,KAAG,MAiBpE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,cAAc,KAAG,MAGxF,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,cAAc,KAAG,MAM/F,CAAA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { slugify } from './slug';
|
|
2
|
+
export const SEO_TITLE_VARIABLES = [
|
|
3
|
+
{ label: 'Title', token: '%%title%%', description: 'Post title' },
|
|
4
|
+
{ label: 'Page', token: '%%page%%', description: 'Same as post title' },
|
|
5
|
+
{ label: 'Separator', token: '%%sep%%', description: 'Title separator (|)' },
|
|
6
|
+
{ label: 'Site title', token: '%%sitename%%', description: 'Site / brand name' },
|
|
7
|
+
{ label: 'Slug', token: '%%slug%%', description: 'URL slug' },
|
|
8
|
+
{ label: 'Primary category', token: '%%category%%', description: 'Main category' },
|
|
9
|
+
{ label: 'Focus keyphrase', token: '%%focuskw%%', description: 'SEO focus keyphrase' },
|
|
10
|
+
{ label: 'Date', token: '%%date%%', description: 'Publish date' },
|
|
11
|
+
];
|
|
12
|
+
export const META_DESCRIPTION_VARIABLES = [
|
|
13
|
+
{ label: 'Excerpt', token: '%%excerpt%%', description: 'Post excerpt' },
|
|
14
|
+
{ label: 'Title', token: '%%title%%', description: 'Post title' },
|
|
15
|
+
{ label: 'Site title', token: '%%sitename%%', description: 'Site / brand name' },
|
|
16
|
+
{ label: 'Focus keyphrase', token: '%%focuskw%%', description: 'SEO focus keyphrase' },
|
|
17
|
+
{ label: 'Primary category', token: '%%category%%', description: 'Main category' },
|
|
18
|
+
];
|
|
19
|
+
const hasSnippetTokens = (value) => /%%\w+%%/.test(value);
|
|
20
|
+
export const expandSnippet = (template, ctx) => {
|
|
21
|
+
if (!template.trim())
|
|
22
|
+
return '';
|
|
23
|
+
if (!hasSnippetTokens(template))
|
|
24
|
+
return template.trim();
|
|
25
|
+
const sep = ctx.separator ?? '|';
|
|
26
|
+
const date = ctx.date ?? '';
|
|
27
|
+
return template
|
|
28
|
+
.replace(/%%title%%/g, ctx.title)
|
|
29
|
+
.replace(/%%page%%/g, ctx.title)
|
|
30
|
+
.replace(/%%sep%%/g, sep)
|
|
31
|
+
.replace(/%%sitename%%/g, ctx.siteName)
|
|
32
|
+
.replace(/%%slug%%/g, ctx.slug || slugify(ctx.title))
|
|
33
|
+
.replace(/%%excerpt%%/g, ctx.excerpt)
|
|
34
|
+
.replace(/%%category%%/g, ctx.categoryName ?? "")
|
|
35
|
+
.replace(/%%focuskw%%/g, ctx.focusKeyphrase ?? "")
|
|
36
|
+
.replace(/%%date%%/g, date)
|
|
37
|
+
.replace(/\s{2,}/g, " ")
|
|
38
|
+
.replace(/\s+\|/g, " |")
|
|
39
|
+
.replace(/\|\s+/g, "| ")
|
|
40
|
+
.trim();
|
|
41
|
+
};
|
|
42
|
+
export const brandTitleTemplateToSnippet = (titleTemplate) => {
|
|
43
|
+
const raw = (titleTemplate ?? '').trim();
|
|
44
|
+
if (!raw)
|
|
45
|
+
return '%%title%% %%sep%% %%sitename%%';
|
|
46
|
+
return raw.replace(/%s/g, '%%title%%').replace(/%site%/gi, '%%sitename%%');
|
|
47
|
+
};
|
|
48
|
+
export const generateSeoTitleSnippet = (titleTemplate) => brandTitleTemplateToSnippet(titleTemplate);
|
|
49
|
+
export const generateMetaDescriptionSnippet = (ctx) => {
|
|
50
|
+
if (ctx.excerpt.trim())
|
|
51
|
+
return '%%excerpt%%';
|
|
52
|
+
const plain = (ctx.contentText ?? '').trim().replace(/\s+/g, ' ');
|
|
53
|
+
if (!plain)
|
|
54
|
+
return '%%excerpt%%';
|
|
55
|
+
let text = plain;
|
|
56
|
+
const phrase = ctx.focusKeyphrase?.trim();
|
|
57
|
+
if (phrase && !text.toLowerCase().includes(phrase.toLowerCase())) {
|
|
58
|
+
const intro = `${phrase}: `;
|
|
59
|
+
const room = 156 - intro.length;
|
|
60
|
+
text = intro + (text.length > room ? `${text.slice(0, room - 1).trim()}…` : text);
|
|
61
|
+
}
|
|
62
|
+
else if (text.length > 156) {
|
|
63
|
+
text = `${text.slice(0, 153).trim()}…`;
|
|
64
|
+
}
|
|
65
|
+
return text;
|
|
66
|
+
};
|
|
67
|
+
export const resolveSeoTitle = (stored, ctx) => {
|
|
68
|
+
const expanded = expandSnippet(stored ?? '', ctx);
|
|
69
|
+
return expanded || ctx.title;
|
|
70
|
+
};
|
|
71
|
+
export const resolveMetaDescription = (stored, ctx) => {
|
|
72
|
+
const expanded = expandSnippet(stored ?? '', ctx);
|
|
73
|
+
if (expanded)
|
|
74
|
+
return expanded;
|
|
75
|
+
if (ctx.excerpt.trim())
|
|
76
|
+
return ctx.excerpt.trim();
|
|
77
|
+
const plain = (ctx.contentText ?? '').trim().replace(/\s+/g, ' ');
|
|
78
|
+
return plain ? plain.slice(0, 155) : '';
|
|
79
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AdminSdkConfig, AdminTheme, Branding } from "../../types/admin";
|
|
2
|
+
export type BlogAdminProps = {
|
|
3
|
+
config: AdminSdkConfig;
|
|
4
|
+
theme?: AdminTheme;
|
|
5
|
+
branding?: Branding;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function BlogAdmin({ config, theme, branding, className }: BlogAdminProps): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=BlogAdmin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlogAdmin.d.ts","sourceRoot":"","sources":["../../../app/pages/admin/BlogAdmin.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAuB9E,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA8WF,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,+BAM/E"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { cx, themeVars } from "../../styles/adminTheme";
|
|
4
|
+
import { Shell } from "../../components/admin/Shell";
|
|
5
|
+
import { Dashboard } from "../../components/admin/Dashboard";
|
|
6
|
+
import { PostList } from "../../components/admin/PostList";
|
|
7
|
+
import { PostEditor } from "../../components/admin/PostEditor";
|
|
8
|
+
import { AdminPostDetail } from "../../components/admin/AdminPostDetail";
|
|
9
|
+
import { CategoryManager, TagManager, AuthorsManager } from "../../components/admin/TermManager";
|
|
10
|
+
import { MediaLibrary } from "../../components/admin/MediaLibrary";
|
|
11
|
+
import { CommentsManager } from "../../components/admin/CommentsManager";
|
|
12
|
+
import { UsersManager } from "../../components/admin/UsersManager";
|
|
13
|
+
import { BrandSettings, BrandsList, ProfilePanel } from "../../components/admin/BrandSettings";
|
|
14
|
+
import { AdminMockProvider, useAdminMock } from "../../components/admin/mock/store";
|
|
15
|
+
import { RedirectList } from "../../components/admin/seo/RedirectList";
|
|
16
|
+
import { RedirectForm, redirectToFormValues } from "../../components/admin/seo/RedirectForm";
|
|
17
|
+
import { RedirectDetail } from "../../components/admin/seo/RedirectDetail";
|
|
18
|
+
import { RedirectAnalyticsDashboard } from "../../components/admin/seo/RedirectAnalyticsDashboard";
|
|
19
|
+
import { RobotsEditor } from "../../components/admin/seo/RobotsEditor";
|
|
20
|
+
import { Ga4Settings, SitemapPanel } from "../../components/admin/seo/Ga4Settings";
|
|
21
|
+
import { SearchConsoleSettings } from "../../components/admin/seo/SearchConsoleSettings";
|
|
22
|
+
import { BrandPickPanel } from "../../components/admin/seo/shared";
|
|
23
|
+
import { ExportTool, ImportTool, ToolsHub } from "../../components/admin/tools";
|
|
24
|
+
function BlogAdminInner({ theme, branding, className, }) {
|
|
25
|
+
const store = useAdminMock();
|
|
26
|
+
const [activeNav, setActiveNav] = useState("overview");
|
|
27
|
+
const [editingId, setEditingId] = useState(undefined);
|
|
28
|
+
const [viewingId, setViewingId] = useState(undefined);
|
|
29
|
+
const [redirectId, setRedirectId] = useState(undefined);
|
|
30
|
+
const [settingsBrandId, setSettingsBrandId] = useState(undefined);
|
|
31
|
+
const openEditor = (id) => {
|
|
32
|
+
setViewingId(undefined);
|
|
33
|
+
setEditingId(id);
|
|
34
|
+
setActiveNav("posts-new");
|
|
35
|
+
};
|
|
36
|
+
const openView = (id) => {
|
|
37
|
+
setEditingId(undefined);
|
|
38
|
+
setViewingId(id);
|
|
39
|
+
};
|
|
40
|
+
const navigate = (key) => {
|
|
41
|
+
setActiveNav(key);
|
|
42
|
+
if (key !== "posts-new")
|
|
43
|
+
setEditingId(undefined);
|
|
44
|
+
setViewingId(undefined);
|
|
45
|
+
if (key !== "redirects-new" && key !== "redirects-all" && key !== "redirects") {
|
|
46
|
+
setRedirectId(undefined);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const postFilterForNav = (nav) => {
|
|
50
|
+
if (nav === "attention")
|
|
51
|
+
return "attention";
|
|
52
|
+
if (nav === "scheduled")
|
|
53
|
+
return "scheduled";
|
|
54
|
+
if (nav === "trash")
|
|
55
|
+
return "trash";
|
|
56
|
+
return "all";
|
|
57
|
+
};
|
|
58
|
+
const requireBrand = (title, render) => {
|
|
59
|
+
const brandId = store.activeBrandId ?? store.brands[0]?.id;
|
|
60
|
+
if (!brandId) {
|
|
61
|
+
return _jsx(BrandPickPanel, { title: title, onPick: (id) => store.setActiveBrandId(id) });
|
|
62
|
+
}
|
|
63
|
+
if (!store.activeBrandId) {
|
|
64
|
+
return (_jsxs(_Fragment, { children: [_jsx(BrandPickPanel, { title: title, onPick: (id) => store.setActiveBrandId(id) }), _jsx("p", { className: "note", children: "Showing first brand until one is selected." }), render(brandId)] }));
|
|
65
|
+
}
|
|
66
|
+
return render(brandId);
|
|
67
|
+
};
|
|
68
|
+
const viewingPost = viewingId ? store.getPost(viewingId) : undefined;
|
|
69
|
+
const getTitle = () => {
|
|
70
|
+
if (viewingId)
|
|
71
|
+
return viewingPost?.title || "Post";
|
|
72
|
+
if (activeNav === "posts-new" && !editingId)
|
|
73
|
+
return "Add Post";
|
|
74
|
+
if (activeNav === "posts-new" || editingId)
|
|
75
|
+
return "Edit Post";
|
|
76
|
+
if (activeNav.startsWith("posts") || activeNav === "attention" || activeNav === "scheduled" || activeNav === "trash")
|
|
77
|
+
return "Posts";
|
|
78
|
+
if (activeNav === "categories")
|
|
79
|
+
return "Categories";
|
|
80
|
+
if (activeNav === "tags")
|
|
81
|
+
return "Tags";
|
|
82
|
+
if (activeNav === "authors")
|
|
83
|
+
return "Authors";
|
|
84
|
+
if (activeNav === "media")
|
|
85
|
+
return "Media";
|
|
86
|
+
if (activeNav === "comments")
|
|
87
|
+
return "Comments";
|
|
88
|
+
if (activeNav === "overview")
|
|
89
|
+
return "Dashboard";
|
|
90
|
+
if (activeNav.startsWith("redirects"))
|
|
91
|
+
return "Redirects";
|
|
92
|
+
if (activeNav === "robots")
|
|
93
|
+
return "Robots.txt";
|
|
94
|
+
if (activeNav === "sitemap")
|
|
95
|
+
return "XML Sitemap";
|
|
96
|
+
if (activeNav === "analytics")
|
|
97
|
+
return "Google Analytics";
|
|
98
|
+
if (activeNav === "search-console")
|
|
99
|
+
return "Search Console";
|
|
100
|
+
if (activeNav === "users")
|
|
101
|
+
return "People";
|
|
102
|
+
if (activeNav === "settings")
|
|
103
|
+
return "Settings";
|
|
104
|
+
if (activeNav === "brands")
|
|
105
|
+
return "Brands";
|
|
106
|
+
if (activeNav === "profile")
|
|
107
|
+
return "Profile";
|
|
108
|
+
if (activeNav.startsWith("tools"))
|
|
109
|
+
return "Tools";
|
|
110
|
+
return activeNav.charAt(0).toUpperCase() + activeNav.slice(1);
|
|
111
|
+
};
|
|
112
|
+
const renderContent = () => {
|
|
113
|
+
if (viewingId) {
|
|
114
|
+
return (_jsx(AdminPostDetail, { postId: viewingId, onBack: () => {
|
|
115
|
+
setViewingId(undefined);
|
|
116
|
+
setActiveNav("posts-all");
|
|
117
|
+
}, onEdit: (id) => openEditor(id), onViewRelated: (id) => setViewingId(id) }));
|
|
118
|
+
}
|
|
119
|
+
if (activeNav === "posts-new" || editingId) {
|
|
120
|
+
return (_jsx(PostEditor, { postId: editingId, onDone: () => {
|
|
121
|
+
setEditingId(undefined);
|
|
122
|
+
setActiveNav("posts-all");
|
|
123
|
+
} }));
|
|
124
|
+
}
|
|
125
|
+
if (activeNav === "posts" ||
|
|
126
|
+
activeNav === "posts-all" ||
|
|
127
|
+
activeNav === "attention" ||
|
|
128
|
+
activeNav === "scheduled" ||
|
|
129
|
+
activeNav === "trash") {
|
|
130
|
+
return (_jsx(PostList, { filterState: postFilterForNav(activeNav), onCreate: () => openEditor(), onEdit: (id) => openEditor(id), onView: (id) => openView(id) }));
|
|
131
|
+
}
|
|
132
|
+
switch (activeNav) {
|
|
133
|
+
case "overview":
|
|
134
|
+
return _jsx(Dashboard, {});
|
|
135
|
+
case "categories":
|
|
136
|
+
return _jsx(CategoryManager, {});
|
|
137
|
+
case "tags":
|
|
138
|
+
return _jsx(TagManager, {});
|
|
139
|
+
case "authors":
|
|
140
|
+
return _jsx(AuthorsManager, {});
|
|
141
|
+
case "media":
|
|
142
|
+
return _jsx(MediaLibrary, {});
|
|
143
|
+
case "comments":
|
|
144
|
+
return _jsx(CommentsManager, { onOpenPost: (id) => openEditor(id) });
|
|
145
|
+
case "redirects":
|
|
146
|
+
return (_jsxs(_Fragment, { children: [_jsx(RedirectAnalyticsDashboard, { data: store.redirectAnalytics }), _jsxs("div", { className: "btn-row", style: { marginTop: 16 }, children: [_jsx("button", { type: "button", className: "btn", onClick: () => navigate("redirects-all"), children: "All redirects" }), _jsx("button", { type: "button", className: "btn btn-primary", onClick: () => navigate("redirects-new"), children: "Add redirect" })] })] }));
|
|
147
|
+
case "redirects-all":
|
|
148
|
+
if (redirectId) {
|
|
149
|
+
return (_jsx(RedirectDetail, { redirectId: redirectId, onEdit: () => setActiveNav("redirects-new"), onBack: () => setRedirectId(undefined) }));
|
|
150
|
+
}
|
|
151
|
+
return (_jsx(RedirectList, { onCreate: () => {
|
|
152
|
+
setRedirectId(undefined);
|
|
153
|
+
navigate("redirects-new");
|
|
154
|
+
}, onView: (id) => setRedirectId(id), onEdit: (id) => {
|
|
155
|
+
setRedirectId(id);
|
|
156
|
+
navigate("redirects-new");
|
|
157
|
+
} }));
|
|
158
|
+
case "redirects-new": {
|
|
159
|
+
const existing = redirectId ? store.getRedirect(redirectId) : undefined;
|
|
160
|
+
return (_jsx(RedirectForm, { mode: existing ? "edit" : "create", initial: existing ? redirectToFormValues(existing) : undefined, onDone: () => {
|
|
161
|
+
setRedirectId(undefined);
|
|
162
|
+
navigate("redirects-all");
|
|
163
|
+
}, onCancel: () => {
|
|
164
|
+
setRedirectId(undefined);
|
|
165
|
+
navigate("redirects-all");
|
|
166
|
+
} }));
|
|
167
|
+
}
|
|
168
|
+
case "robots":
|
|
169
|
+
return requireBrand("Robots.txt", (brandId) => _jsx(RobotsEditor, { brandId: brandId }));
|
|
170
|
+
case "sitemap":
|
|
171
|
+
return requireBrand("XML Sitemap", (brandId) => _jsx(SitemapPanel, { brandId: brandId }));
|
|
172
|
+
case "analytics":
|
|
173
|
+
return requireBrand("Google Analytics", (brandId) => _jsx(Ga4Settings, { brandId: brandId }));
|
|
174
|
+
case "search-console":
|
|
175
|
+
return requireBrand("Search Console", (brandId) => _jsx(SearchConsoleSettings, { brandId: brandId }));
|
|
176
|
+
case "users":
|
|
177
|
+
return _jsx(UsersManager, {});
|
|
178
|
+
case "settings":
|
|
179
|
+
return _jsx(BrandSettings, { brandId: settingsBrandId ?? store.activeBrandId ?? store.brands[0]?.id });
|
|
180
|
+
case "brands":
|
|
181
|
+
return (_jsx(BrandsList, { onOpenSettings: (id) => {
|
|
182
|
+
setSettingsBrandId(id);
|
|
183
|
+
navigate("settings");
|
|
184
|
+
} }));
|
|
185
|
+
case "profile":
|
|
186
|
+
return _jsx(ProfilePanel, {});
|
|
187
|
+
case "tools":
|
|
188
|
+
return (_jsx(ToolsHub, { onExport: () => navigate("tools-export"), onImport: () => navigate("tools-import") }));
|
|
189
|
+
case "tools-export":
|
|
190
|
+
return _jsx(ExportTool, {});
|
|
191
|
+
case "tools-import":
|
|
192
|
+
return _jsx(ImportTool, {});
|
|
193
|
+
default:
|
|
194
|
+
return _jsx(Dashboard, {});
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
const postCount = store.postCounts().all;
|
|
198
|
+
return (_jsxs("div", { className: cx("bp-admin-wrapper", branding?.className, className), style: {
|
|
199
|
+
...themeVars(theme, branding),
|
|
200
|
+
}, children: [branding?.css ? _jsx("style", { children: branding.css }) : null, _jsx(Shell, { active: activeNav, onNavigate: navigate, title: getTitle(), wide: Boolean(viewingId), subtitle: viewingId
|
|
201
|
+
? viewingPost?.status === "published"
|
|
202
|
+
? "Published post"
|
|
203
|
+
: "Draft preview"
|
|
204
|
+
: activeNav === "overview"
|
|
205
|
+
? `Editorial overview · last 30 days · ${store.brands.length} brands`
|
|
206
|
+
: activeNav.startsWith("posts") && activeNav !== "posts-new"
|
|
207
|
+
? `${postCount} posts across ${store.activeBrand ? "this brand" : "all brands"}`
|
|
208
|
+
: store.activeBrand
|
|
209
|
+
? store.activeBrand.name
|
|
210
|
+
: undefined, actions: _jsx(_Fragment, { children: _jsxs("div", { style: { display: "flex", gap: 12, alignItems: "center" }, children: [_jsxs("select", { className: "fld fld-sm", style: { minWidth: 140 }, "aria-label": "Brand filter", value: store.activeBrandId ?? "", onChange: (e) => store.setActiveBrandId(e.target.value || null), children: [_jsx("option", { value: "", children: "All brands" }), store.brands.map((b) => (_jsx("option", { value: b.id, children: b.name }, b.id)))] }), activeNav === "overview" ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "btn-group", style: { display: "flex", background: "var(--d-rule)", borderRadius: 6, overflow: "hidden" }, children: [_jsx("button", { type: "button", className: "btn btn-ghost btn-sm", style: { borderRadius: 0, opacity: 0.6 }, children: "7d" }), _jsx("button", { type: "button", className: "btn btn-ghost btn-sm", style: {
|
|
211
|
+
borderRadius: 0,
|
|
212
|
+
background: "var(--d-accent-soft)",
|
|
213
|
+
color: "var(--d-accent)",
|
|
214
|
+
fontWeight: 600,
|
|
215
|
+
}, children: "30d" }), _jsx("button", { type: "button", className: "btn btn-ghost btn-sm", style: { borderRadius: 0, opacity: 0.6 }, children: "90d" })] }), _jsx("button", { type: "button", className: "btn btn-primary btn-sm", onClick: () => openEditor(), children: "+ New post" })] })) : null, viewingId ? (_jsx("button", { type: "button", className: "btn btn-primary", onClick: () => openEditor(viewingId), children: "Edit post" })) : null, (activeNav.startsWith("posts") ||
|
|
216
|
+
activeNav === "attention" ||
|
|
217
|
+
activeNav === "scheduled" ||
|
|
218
|
+
activeNav === "trash") &&
|
|
219
|
+
activeNav !== "posts-new" &&
|
|
220
|
+
!viewingId ? (_jsx("button", { type: "button", className: "btn btn-primary btn-sm", onClick: () => openEditor(), children: "+ Add new" })) : null] }) }), branding: branding, userName: store.profile.name, userRole: store.profile.globalRole === "platform-admin" ? "Platform admin" : store.profile.globalRole, onProfile: () => navigate("profile"), children: renderContent() })] }));
|
|
221
|
+
}
|
|
222
|
+
function BlogAdminBootGate({ theme, branding, className, }) {
|
|
223
|
+
const store = useAdminMock();
|
|
224
|
+
if (store.live && store.bootStatus === "loading") {
|
|
225
|
+
return (_jsx("div", { className: className, role: "status", style: { padding: 24 }, children: "Connecting to Admin API\u2026" }));
|
|
226
|
+
}
|
|
227
|
+
if (store.live && store.bootStatus === "error") {
|
|
228
|
+
return (_jsxs("div", { className: className, role: "alert", style: { padding: 24 }, children: [_jsx("p", { children: "Could not load Admin SDK data." }), _jsx("p", { style: { color: "#b91c1c" }, children: store.bootError ?? "Unknown error" }), _jsx("button", { type: "button", className: "btn btn-primary", onClick: () => void store.refreshFromApi(), children: "Retry" })] }));
|
|
229
|
+
}
|
|
230
|
+
return _jsx(BlogAdminInner, { theme: theme, branding: branding, className: className });
|
|
231
|
+
}
|
|
232
|
+
export function BlogAdmin({ config, theme, branding, className }) {
|
|
233
|
+
return (_jsx(AdminMockProvider, { config: config, children: _jsx(BlogAdminBootGate, { theme: theme, branding: branding, className: className }) }));
|
|
234
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../app/pages/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./BlogAdmin";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../app/pages/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BlogTheme, Branding, BlogSdkConfig } from "../../types/user";
|
|
2
|
+
export type UserBlogPageProps = {
|
|
3
|
+
config: BlogSdkConfig;
|
|
4
|
+
theme?: BlogTheme;
|
|
5
|
+
branding?: Branding;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
/** Public browsing page: published list → detail (BlogUploader layout). */
|
|
9
|
+
export declare function UserBlogPage({ config, theme, branding, className, }: UserBlogPageProps): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=UserBlogPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserBlogPage.d.ts","sourceRoot":"","sources":["../../../app/pages/user/UserBlogPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE,iBAAiB,+BAkCnB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { BlogDetail, BlogList } from "../../components/user";
|
|
4
|
+
/** Public browsing page: published list → detail (BlogUploader layout). */
|
|
5
|
+
export function UserBlogPage({ config, theme, branding, className, }) {
|
|
6
|
+
const [selectedSlug, setSelectedSlug] = useState(null);
|
|
7
|
+
if (selectedSlug) {
|
|
8
|
+
return (_jsx(BlogDetail, { className: className, config: config, slug: selectedSlug, theme: theme, branding: branding, blogDetailsHero: true, onBack: () => setSelectedSlug(null), onHome: () => setSelectedSlug(null), onSelectRelated: (slug) => {
|
|
9
|
+
setSelectedSlug(slug);
|
|
10
|
+
} }));
|
|
11
|
+
}
|
|
12
|
+
return (_jsx(BlogList, { className: className, config: config, theme: theme ?? { layout: "grid", columns: 3, showExcerpt: true, showDate: true }, branding: branding, title: "Stories", description: "Published stories, guides, and updates from our team.", onSelect: (blog) => {
|
|
13
|
+
setSelectedSlug(blog.slug);
|
|
14
|
+
} }));
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../app/pages/user/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./UserBlogPage";
|