@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,50 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useState } from 'react';
|
|
4
|
+
/** Soft gradient stand-in when the media URL is missing or fails to load. */
|
|
5
|
+
export const MediaPlaceholder = ({ className = 'site-hero-media-visual', label = 'Media unavailable', }) => (_jsx("div", { className: `${className} site-hero-media-placeholder media-placeholder`.trim(), role: "img", "aria-label": label, children: _jsx("span", { className: "media-placeholder-mark", "aria-hidden": "true" }) }));
|
|
6
|
+
/**
|
|
7
|
+
* Hero media with hydration-safe rendering.
|
|
8
|
+
* Video and iframe embeds mount on the client only — browsers normalize their
|
|
9
|
+
* attributes after parse, which otherwise triggers React hydration warnings.
|
|
10
|
+
* Broken or missing media falls back to a placeholder.
|
|
11
|
+
*/
|
|
12
|
+
export const HeroMediaVisual = ({ media, variant = 'ambient', imageClassName = 'site-hero-media-visual', videoClassName = 'site-hero-media-visual', embedClassName = 'site-hero-media-visual site-hero-media-embed', }) => {
|
|
13
|
+
const videoRef = useRef(null);
|
|
14
|
+
const [interactiveReady, setInteractiveReady] = useState(false);
|
|
15
|
+
const [failed, setFailed] = useState(false);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setInteractiveReady(true);
|
|
18
|
+
}, []);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
setFailed(false);
|
|
21
|
+
}, [media]);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const el = videoRef.current;
|
|
24
|
+
if (!el || media.kind !== 'video-file' || variant !== 'ambient' || failed)
|
|
25
|
+
return;
|
|
26
|
+
el.muted = true;
|
|
27
|
+
const play = () => {
|
|
28
|
+
void el.play().catch(() => { });
|
|
29
|
+
};
|
|
30
|
+
play();
|
|
31
|
+
el.addEventListener('canplay', play);
|
|
32
|
+
return () => el.removeEventListener('canplay', play);
|
|
33
|
+
}, [media, variant, interactiveReady, failed]);
|
|
34
|
+
if (failed || !media.src) {
|
|
35
|
+
return _jsx(MediaPlaceholder, { className: imageClassName });
|
|
36
|
+
}
|
|
37
|
+
if (media.kind === 'image') {
|
|
38
|
+
return (_jsx("img", { className: imageClassName, src: media.src, alt: media.alt, width: variant === 'article' ? 1200 : undefined, height: variant === 'article' ? 630 : undefined, loading: "eager", fetchPriority: "high", decoding: "async", onError: () => setFailed(true) }));
|
|
39
|
+
}
|
|
40
|
+
if (!interactiveReady) {
|
|
41
|
+
if (media.poster) {
|
|
42
|
+
return (_jsx("img", { className: imageClassName, src: media.poster, alt: "", "aria-hidden": "true", width: variant === 'article' ? 1200 : undefined, height: variant === 'article' ? 630 : undefined, loading: "eager", fetchPriority: "high", decoding: "async", onError: () => setFailed(true) }));
|
|
43
|
+
}
|
|
44
|
+
return _jsx(MediaPlaceholder, { className: imageClassName });
|
|
45
|
+
}
|
|
46
|
+
if (media.kind === 'video-file') {
|
|
47
|
+
return (_jsx("video", { ref: videoRef, className: videoClassName, src: media.src, poster: media.poster ?? undefined, controls: variant === 'article', autoPlay: variant === 'ambient', muted: variant === 'ambient', loop: true, playsInline: true, preload: variant === 'ambient' ? 'auto' : 'metadata', "aria-hidden": variant === 'ambient' ? true : undefined, onError: () => setFailed(true) }));
|
|
48
|
+
}
|
|
49
|
+
return (_jsx("iframe", { className: embedClassName, src: media.src, title: variant === 'article' ? 'Article video' : '', allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture", allowFullScreen: true, loading: "eager", tabIndex: variant === 'ambient' ? -1 : undefined, "aria-hidden": variant === 'ambient' ? true : undefined, onError: () => setFailed(true) }));
|
|
50
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
type Props = {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
/** Shown above the blog grid as a soft section cue */
|
|
5
|
+
label?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Separates the full-bleed hero from the post grid with breathing room and a
|
|
9
|
+
* soft surface lift. Header animates on scroll; cards handle their own reveal
|
|
10
|
+
* so parent opacity does not swallow PostCard motion.
|
|
11
|
+
*/
|
|
12
|
+
export declare const IndexFeedSection: ({ children, label }: Props) => import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=IndexFeedSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexFeedSection.d.ts","sourceRoot":"","sources":["../../../../app/components/BlogUploader/site/IndexFeedSection.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,CAAA;IACnB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,qBAAwC,KAAK,gCA0B7E,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { motion, useReducedMotion } from 'framer-motion';
|
|
4
|
+
/**
|
|
5
|
+
* Separates the full-bleed hero from the post grid with breathing room and a
|
|
6
|
+
* soft surface lift. Header animates on scroll; cards handle their own reveal
|
|
7
|
+
* so parent opacity does not swallow PostCard motion.
|
|
8
|
+
*/
|
|
9
|
+
export const IndexFeedSection = ({ children, label = 'Latest stories' }) => {
|
|
10
|
+
const reduce = useReducedMotion();
|
|
11
|
+
return (_jsxs("section", { className: "site-index-feed", "aria-label": label, children: [_jsxs("div", { className: "site-index-bridge", "aria-hidden": "true", children: [_jsx("span", { className: "site-index-bridge-glow" }), _jsx("span", { className: "site-index-bridge-line" })] }), _jsxs("div", { className: "site-index-feed-inner", children: [_jsxs(motion.header, { className: "site-index-feed-head", initial: reduce ? false : { opacity: 0, y: 16 }, whileInView: reduce ? undefined : { opacity: 1, y: 0 }, viewport: { once: true, amount: 0.6 }, transition: { duration: 0.55, ease: [0.22, 1, 0.36, 1] }, children: [_jsx("p", { className: "site-index-feed-eyebrow", children: label }), _jsx("span", { className: "site-index-feed-rule", "aria-hidden": "true" })] }), _jsx("div", { className: "site-page site-index-feed-body", children: children })] })] }));
|
|
12
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Post } from '../../payload-types';
|
|
2
|
+
type BrandOption = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
};
|
|
7
|
+
type Props = {
|
|
8
|
+
initialPosts: Post[];
|
|
9
|
+
initialPage: number;
|
|
10
|
+
totalPages: number;
|
|
11
|
+
hasNextPage: boolean;
|
|
12
|
+
totalDocs?: number;
|
|
13
|
+
listAllBrands?: boolean;
|
|
14
|
+
/** When scoped to one brand on a shared host (URL), used as initial brand filter */
|
|
15
|
+
tenantSlug?: string | null;
|
|
16
|
+
showLeadCard?: boolean;
|
|
17
|
+
brands?: BrandOption[];
|
|
18
|
+
/** Show brand dropdown (shared hosts / all-brands mode) */
|
|
19
|
+
showBrandFilter?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare const InfinitePostFeed: ({ initialPosts, initialPage, totalPages: initialTotalPages, hasNextPage: initialHasNext, totalDocs: initialTotalDocs, listAllBrands, tenantSlug, showLeadCard, brands, showBrandFilter, }: Props) => import("react").JSX.Element;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=InfinitePostFeed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InfinitePostFeed.d.ts","sourceRoot":"","sources":["../../../../app/components/BlogUploader/site/InfinitePostFeed.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,qBAAqB,CAAA;AAIvD,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAa7D,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,IAAI,EAAE,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AA0BD,eAAO,MAAM,gBAAgB,GAAI,2LAW9B,KAAK,gCAmPP,CAAA"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { ClipLoader, PulseLoader } from 'react-spinners';
|
|
5
|
+
import { postPath } from '../../lib/slug';
|
|
6
|
+
import { PostCard } from '../PostCard';
|
|
7
|
+
const tenantSlugOf = (post) => {
|
|
8
|
+
const t = post.tenant;
|
|
9
|
+
if (typeof t === 'object' && t && 'slug' in t)
|
|
10
|
+
return String(t.slug);
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
const hrefFor = (post, crossBrand) => postPath(post.slug, crossBrand ? tenantSlugOf(post) : null);
|
|
14
|
+
const mergePosts = (prev, next) => {
|
|
15
|
+
const seen = new Set(prev.map((p) => String(p.id)));
|
|
16
|
+
const extras = next.filter((p) => !seen.has(String(p.id)));
|
|
17
|
+
return extras.length ? [...prev, ...extras] : prev;
|
|
18
|
+
};
|
|
19
|
+
const useAccentColor = () => {
|
|
20
|
+
const [color, setColor] = useState('#2e3a8c');
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const raw = getComputedStyle(document.documentElement).getPropertyValue('--accent').trim();
|
|
23
|
+
if (raw)
|
|
24
|
+
setColor(raw);
|
|
25
|
+
}, []);
|
|
26
|
+
return color;
|
|
27
|
+
};
|
|
28
|
+
export const InfinitePostFeed = ({ initialPosts, initialPage, totalPages: initialTotalPages, hasNextPage: initialHasNext, totalDocs: initialTotalDocs, listAllBrands = false, tenantSlug, showLeadCard = false, brands = [], showBrandFilter = false, }) => {
|
|
29
|
+
const accent = useAccentColor();
|
|
30
|
+
const [posts, setPosts] = useState(initialPosts);
|
|
31
|
+
const [page, setPage] = useState(initialPage);
|
|
32
|
+
const [totalPages, setTotalPages] = useState(initialTotalPages);
|
|
33
|
+
const [hasNext, setHasNext] = useState(initialHasNext);
|
|
34
|
+
const [totalDocs, setTotalDocs] = useState(initialTotalDocs);
|
|
35
|
+
const [loading, setLoading] = useState(false);
|
|
36
|
+
const [refreshing, setRefreshing] = useState(false);
|
|
37
|
+
const [error, setError] = useState(null);
|
|
38
|
+
const [brand, setBrand] = useState(tenantSlug?.trim() || '');
|
|
39
|
+
const [searchInput, setSearchInput] = useState('');
|
|
40
|
+
const [searchQ, setSearchQ] = useState('');
|
|
41
|
+
const sentinelRef = useRef(null);
|
|
42
|
+
const loadingRef = useRef(false);
|
|
43
|
+
const hasNextRef = useRef(initialHasNext);
|
|
44
|
+
const pageRef = useRef(initialPage);
|
|
45
|
+
const brandRef = useRef(brand);
|
|
46
|
+
const searchRef = useRef(searchQ);
|
|
47
|
+
const skipFirstFilterFetch = useRef(true);
|
|
48
|
+
const crossBrandLinks = listAllBrands && !brand;
|
|
49
|
+
const busy = loading || refreshing;
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
const t = window.setTimeout(() => setSearchQ(searchInput.trim()), 320);
|
|
52
|
+
return () => window.clearTimeout(t);
|
|
53
|
+
}, [searchInput]);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
brandRef.current = brand;
|
|
56
|
+
}, [brand]);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
searchRef.current = searchQ;
|
|
59
|
+
}, [searchQ]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
setPosts(initialPosts);
|
|
62
|
+
setPage(initialPage);
|
|
63
|
+
setTotalPages(initialTotalPages);
|
|
64
|
+
setHasNext(initialHasNext);
|
|
65
|
+
setTotalDocs(initialTotalDocs);
|
|
66
|
+
setError(null);
|
|
67
|
+
pageRef.current = initialPage;
|
|
68
|
+
hasNextRef.current = initialHasNext;
|
|
69
|
+
}, [initialPosts, initialPage, initialTotalPages, initialHasNext, initialTotalDocs]);
|
|
70
|
+
const buildParams = useCallback((pageNum) => {
|
|
71
|
+
const params = new URLSearchParams({ page: String(pageNum) });
|
|
72
|
+
const b = brandRef.current.trim();
|
|
73
|
+
const q = searchRef.current.trim();
|
|
74
|
+
if (b)
|
|
75
|
+
params.set('brand', b);
|
|
76
|
+
if (q)
|
|
77
|
+
params.set('q', q);
|
|
78
|
+
return params;
|
|
79
|
+
}, []);
|
|
80
|
+
const fetchPage = useCallback(async (pageNum, mode) => {
|
|
81
|
+
if (loadingRef.current)
|
|
82
|
+
return;
|
|
83
|
+
loadingRef.current = true;
|
|
84
|
+
if (mode === 'replace') {
|
|
85
|
+
setRefreshing(true);
|
|
86
|
+
setPosts([]);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
setLoading(true);
|
|
90
|
+
}
|
|
91
|
+
setError(null);
|
|
92
|
+
try {
|
|
93
|
+
const res = await fetch(`/api/blogs?${buildParams(pageNum).toString()}`, {
|
|
94
|
+
headers: { Accept: 'application/json' },
|
|
95
|
+
});
|
|
96
|
+
const data = (await res.json());
|
|
97
|
+
if (!res.ok)
|
|
98
|
+
throw new Error(data.error || 'Could not load posts.');
|
|
99
|
+
setPosts((prev) => mode === 'replace' ? (data.docs ?? []) : mergePosts(prev, data.docs ?? []));
|
|
100
|
+
setPage(data.page ?? pageNum);
|
|
101
|
+
setTotalPages(data.totalPages ?? 1);
|
|
102
|
+
setHasNext(Boolean(data.hasNextPage));
|
|
103
|
+
setTotalDocs(data.totalDocs);
|
|
104
|
+
pageRef.current = data.page ?? pageNum;
|
|
105
|
+
hasNextRef.current = Boolean(data.hasNextPage);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
setError(err instanceof Error ? err.message : 'Could not load posts.');
|
|
109
|
+
if (mode === 'replace')
|
|
110
|
+
setPosts([]);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
loadingRef.current = false;
|
|
114
|
+
setLoading(false);
|
|
115
|
+
setRefreshing(false);
|
|
116
|
+
}
|
|
117
|
+
}, [buildParams]);
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
if (skipFirstFilterFetch.current) {
|
|
120
|
+
skipFirstFilterFetch.current = false;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
void fetchPage(1, 'replace');
|
|
124
|
+
}, [brand, searchQ, fetchPage]);
|
|
125
|
+
const loadMore = useCallback(async () => {
|
|
126
|
+
if (loadingRef.current || !hasNextRef.current)
|
|
127
|
+
return;
|
|
128
|
+
await fetchPage(pageRef.current + 1, 'append');
|
|
129
|
+
}, [fetchPage]);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
const el = sentinelRef.current;
|
|
132
|
+
if (!el)
|
|
133
|
+
return;
|
|
134
|
+
const io = new IntersectionObserver((entries) => {
|
|
135
|
+
if (entries.some((e) => e.isIntersecting))
|
|
136
|
+
void loadMore();
|
|
137
|
+
}, { root: null, rootMargin: '320px 0px', threshold: 0 });
|
|
138
|
+
io.observe(el);
|
|
139
|
+
return () => io.disconnect();
|
|
140
|
+
}, [loadMore, posts.length, hasNext]);
|
|
141
|
+
const lead = showLeadCard && !searchQ && !brand && page === initialPage && posts[0] ? posts[0] : null;
|
|
142
|
+
const gridPosts = lead ? posts.slice(1) : posts;
|
|
143
|
+
const empty = !refreshing && !loading && posts.length === 0;
|
|
144
|
+
return (_jsxs(_Fragment, { children: [_jsxs("form", { className: "index-feed-filters", role: "search", onSubmit: (e) => {
|
|
145
|
+
e.preventDefault();
|
|
146
|
+
setSearchQ(searchInput.trim());
|
|
147
|
+
}, children: [_jsxs("label", { className: "index-feed-search", children: [_jsx("span", { className: "visually-hidden", children: "Search posts" }), _jsx("input", { type: "search", name: "q", value: searchInput, onChange: (e) => setSearchInput(e.target.value), placeholder: "Search posts\u2026", autoComplete: "off", disabled: busy })] }), showBrandFilter && brands.length > 0 ? (_jsxs("label", { className: "index-feed-brand", children: [_jsx("span", { className: "visually-hidden", children: "Filter by brand" }), _jsxs("select", { name: "brand", value: brand, onChange: (e) => setBrand(e.target.value), disabled: busy, children: [_jsx("option", { value: "", children: "All brands" }), brands.map((b) => (_jsx("option", { value: b.slug, children: b.name }, b.id)))] })] })) : null] }), refreshing ? (_jsxs("div", { className: "index-feed-loader", role: "status", "aria-live": "polite", children: [_jsx(ClipLoader, { color: accent, size: 42, speedMultiplier: 0.9 }), _jsx("p", { children: "Loading posts\u2026" })] })) : null, empty ? (_jsxs("div", { className: "index-feed-empty", role: "status", children: [_jsx("p", { className: "index-feed-empty-title", children: "No record found" }), _jsx("p", { className: "index-feed-empty-desc", children: searchQ || brand
|
|
148
|
+
? 'Try a different search or brand filter.'
|
|
149
|
+
: 'Nothing published yet. Sign in to the admin dashboard to create your first post.' })] })) : null, !refreshing && lead ? (_jsx("ul", { className: "post-grid post-grid-lead", children: _jsx(PostCard, { post: lead, priority: true, lead: true, index: 0, href: hrefFor(lead, crossBrandLinks) }) })) : null, !refreshing && gridPosts.length > 0 ? (_jsx("ul", { className: "post-grid", children: gridPosts.map((p, i) => (_jsx(PostCard, { post: p, priority: !lead && i === 0, index: i, href: hrefFor(p, crossBrandLinks || Boolean(brand)) }, p.id))) })) : null, _jsxs("div", { className: "infinite-feed-status", "aria-live": "polite", children: [loading ? (_jsxs("span", { className: "index-feed-more-loader", children: [_jsx(PulseLoader, { color: accent, size: 10, speedMultiplier: 0.85 }), _jsx("span", { children: "Loading more stories\u2026" })] })) : null, error ? (_jsxs("button", { type: "button", className: "infinite-feed-retry", onClick: () => void (posts.length ? loadMore() : fetchPage(1, 'replace')), children: [error, " \u2014 Try again"] })) : null, !hasNext && !busy && posts.length > 0 ? (_jsx("span", { className: "infinite-feed-end", children: totalDocs != null
|
|
150
|
+
? `Showing ${posts.length} of ${totalDocs} ${totalDocs === 1 ? 'post' : 'posts'}`
|
|
151
|
+
: `Page ${page} of ${totalPages}` })) : null] }), hasNext && !refreshing ? (_jsx("div", { ref: sentinelRef, className: "infinite-feed-sentinel", "aria-hidden": "true" })) : null] }));
|
|
152
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Post } from '../../payload-types';
|
|
2
|
+
export type HeroSlide = {
|
|
3
|
+
post: Post;
|
|
4
|
+
href: string;
|
|
5
|
+
};
|
|
6
|
+
type Props = {
|
|
7
|
+
slides: HeroSlide[];
|
|
8
|
+
siteName: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const SiteMediaHero: ({ slides: rawSlides, siteName }: Props) => import("react").JSX.Element | null;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=SiteMediaHero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteMediaHero.d.ts","sourceRoot":"","sources":["../../../../app/components/BlogUploader/site/SiteMediaHero.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAS/C,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,iCAAiC,KAAK,uCAgKnE,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
import useEmblaCarousel from 'embla-carousel-react';
|
|
5
|
+
import Autoplay from 'embla-carousel-autoplay';
|
|
6
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { formatDate } from '../../lib/format';
|
|
8
|
+
import { postCategoryName, resolveHeroMedia } from '../../lib/hero-post';
|
|
9
|
+
import { HeroFadeSlide } from './HeroFadeSlide';
|
|
10
|
+
import { HeroMediaVisual } from './HeroMediaVisual';
|
|
11
|
+
/** Matches `--hero-loop: 5s` on `.hero-fade-slide` so copy + slide stay in sync. */
|
|
12
|
+
const HERO_LOOP_MS = 5000;
|
|
13
|
+
export const SiteMediaHero = ({ slides: rawSlides, siteName }) => {
|
|
14
|
+
const slides = useMemo(() => rawSlides.filter((s) => Boolean(resolveHeroMedia(s.post))), [rawSlides]);
|
|
15
|
+
const autoplay = useMemo(() => Autoplay({
|
|
16
|
+
delay: HERO_LOOP_MS,
|
|
17
|
+
stopOnInteraction: false,
|
|
18
|
+
stopOnMouseEnter: true,
|
|
19
|
+
stopOnFocusIn: true,
|
|
20
|
+
}), []);
|
|
21
|
+
const [emblaRef, emblaApi] = useEmblaCarousel({
|
|
22
|
+
loop: slides.length > 1,
|
|
23
|
+
duration: 28,
|
|
24
|
+
align: 'start',
|
|
25
|
+
containScroll: 'trimSnaps',
|
|
26
|
+
watchDrag: slides.length > 1,
|
|
27
|
+
skipSnaps: false,
|
|
28
|
+
}, [autoplay]);
|
|
29
|
+
const [index, setIndex] = useState(0);
|
|
30
|
+
const [reduceMotion, setReduceMotion] = useState(false);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const mq = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
33
|
+
const sync = () => setReduceMotion(mq.matches);
|
|
34
|
+
sync();
|
|
35
|
+
mq.addEventListener('change', sync);
|
|
36
|
+
return () => mq.removeEventListener('change', sync);
|
|
37
|
+
}, []);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (!emblaApi)
|
|
40
|
+
return;
|
|
41
|
+
if (reduceMotion || slides.length <= 1) {
|
|
42
|
+
autoplay.stop();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
autoplay.play();
|
|
46
|
+
}, [emblaApi, reduceMotion, autoplay, slides.length]);
|
|
47
|
+
const onSelect = useCallback(() => {
|
|
48
|
+
if (!emblaApi)
|
|
49
|
+
return;
|
|
50
|
+
setIndex(emblaApi.selectedScrollSnap());
|
|
51
|
+
}, [emblaApi]);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (!emblaApi)
|
|
54
|
+
return;
|
|
55
|
+
onSelect();
|
|
56
|
+
emblaApi.on('select', onSelect);
|
|
57
|
+
emblaApi.on('reInit', onSelect);
|
|
58
|
+
return () => {
|
|
59
|
+
emblaApi.off('select', onSelect);
|
|
60
|
+
emblaApi.off('reInit', onSelect);
|
|
61
|
+
};
|
|
62
|
+
}, [emblaApi, onSelect]);
|
|
63
|
+
if (!slides.length)
|
|
64
|
+
return null;
|
|
65
|
+
const safeIndex = index % slides.length;
|
|
66
|
+
const { post, href } = slides[safeIndex];
|
|
67
|
+
const media = resolveHeroMedia(post);
|
|
68
|
+
if (!media)
|
|
69
|
+
return null;
|
|
70
|
+
const category = postCategoryName(post);
|
|
71
|
+
const eyebrow = category || siteName;
|
|
72
|
+
const excerpt = post.excerpt || post.seo?.metaDescription || '';
|
|
73
|
+
const multi = slides.length > 1;
|
|
74
|
+
return (_jsxs("section", { className: "site-hero-media", "aria-labelledby": "site-hero-media-title", "aria-roledescription": multi ? 'carousel' : undefined, children: [_jsxs("div", { className: "site-hero-media-bg", children: [_jsx("div", { className: "site-hero-media-embla", ref: emblaRef, children: _jsx("div", { className: "site-hero-media-embla-container", children: slides.map(({ post: slidePost }) => {
|
|
75
|
+
const slideMedia = resolveHeroMedia(slidePost);
|
|
76
|
+
if (!slideMedia)
|
|
77
|
+
return null;
|
|
78
|
+
return (_jsx("div", { className: "site-hero-media-embla-slide", children: _jsx(HeroMediaVisual, { media: slideMedia, variant: "ambient" }) }, slidePost.id));
|
|
79
|
+
}) }) }), _jsx("div", { className: "site-hero-media-scrim", "aria-hidden": "true" }), _jsx("div", { className: "site-hero-media-grain", "aria-hidden": "true" })] }), _jsxs("div", { className: "site-hero-media-content", children: [_jsxs("div", { className: "site-hero-media-copy", children: [_jsx(HeroFadeSlide, { from: "left", delayMs: 100, children: _jsx("p", { className: "site-hero-media-eyebrow", children: eyebrow }) }), _jsx(HeroFadeSlide, { from: "left", delayMs: 260, children: _jsx("h1", { id: "site-hero-media-title", className: "site-hero-media-title", children: post.title }) }), excerpt ? (_jsx(HeroFadeSlide, { from: "right", delayMs: 420, children: _jsx("p", { className: "site-hero-media-desc", children: excerpt }) })) : null, _jsx(HeroFadeSlide, { from: "left", delayMs: excerpt ? 580 : 420, className: "site-hero-media-meta-wrap", children: _jsxs("div", { className: "site-hero-media-meta", children: [post.publishedAt ? (_jsx("time", { dateTime: post.publishedAt, children: formatDate(post.publishedAt) })) : null, post.readingMinutes ? (_jsxs("span", { className: "site-hero-media-reading", children: [post.readingMinutes, " min read"] })) : null] }) }), _jsx(HeroFadeSlide, { from: "left", delayMs: excerpt ? 700 : 540, children: _jsxs(Link, { href: href, className: "site-hero-media-cta", children: [_jsx("span", { className: "site-hero-media-cta-label", children: "Read story" }), _jsx("span", { className: "site-hero-media-cta-arrow", "aria-hidden": "true", children: "\u2192" })] }) })] }, post.id), multi ? (_jsx("div", { className: "site-hero-media-dots", role: "tablist", "aria-label": "Featured posts", children: slides.map(({ post: slidePost }, i) => (_jsx("button", { type: "button", role: "tab", className: `site-hero-media-dot${i === safeIndex ? ' is-active' : ''}`, "aria-selected": i === safeIndex, "aria-label": `Show ${slidePost.title}`, onClick: () => emblaApi?.scrollTo(i) }, slidePost.id))) })) : null] }), _jsx("div", { className: "site-hero-media-edge", "aria-hidden": "true" })] }));
|
|
80
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
type Props = {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
as?: 'div' | 'section' | 'ul';
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Scroll-triggered reveal with staggered children. Respects prefers-reduced-motion.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SiteMotion: ({ children, className, as: Tag }: Props) => import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=SiteMotion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteMotion.d.ts","sourceRoot":"","sources":["../../../../app/components/BlogUploader/site/SiteMotion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEzD,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,EAAE,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,kCAA0C,KAAK,gCA+BzE,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Scroll-triggered reveal with staggered children. Respects prefers-reduced-motion.
|
|
6
|
+
*/
|
|
7
|
+
export const SiteMotion = ({ children, className, as: Tag = 'div' }) => {
|
|
8
|
+
const ref = useRef(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const el = ref.current;
|
|
11
|
+
if (!el)
|
|
12
|
+
return;
|
|
13
|
+
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
|
14
|
+
el.classList.add('is-visible');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const io = new IntersectionObserver(([entry]) => {
|
|
18
|
+
if (entry?.isIntersecting) {
|
|
19
|
+
el.classList.add('is-visible');
|
|
20
|
+
io.disconnect();
|
|
21
|
+
}
|
|
22
|
+
}, { threshold: 0.06, rootMargin: '0px 0px -8% 0px' });
|
|
23
|
+
io.observe(el);
|
|
24
|
+
return () => io.disconnect();
|
|
25
|
+
}, []);
|
|
26
|
+
return (_jsx(Tag, { ref: ref, className: `site-motion${className ? ` ${className}` : ''}`, children: children }));
|
|
27
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth chrome for the public header.
|
|
3
|
+
*
|
|
4
|
+
* Kept off the critical layout path — signing in used to force a Payload auth
|
|
5
|
+
* round-trip on every soft navigation, which made Blog ↔ Post feel stuck.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SiteNavAuth: () => import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=SiteNavAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteNavAuth.d.ts","sourceRoot":"","sources":["../../../../app/components/BlogUploader/site/SiteNavAuth.tsx"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,mCAmCvB,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
5
|
+
/**
|
|
6
|
+
* Auth chrome for the public header.
|
|
7
|
+
*
|
|
8
|
+
* Kept off the critical layout path — signing in used to force a Payload auth
|
|
9
|
+
* round-trip on every soft navigation, which made Blog ↔ Post feel stuck.
|
|
10
|
+
*/
|
|
11
|
+
export const SiteNavAuth = () => {
|
|
12
|
+
const [signedIn, setSignedIn] = useState(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
let cancelled = false;
|
|
15
|
+
fetch('/api/session', { credentials: 'same-origin' })
|
|
16
|
+
.then((r) => r.json())
|
|
17
|
+
.then((data) => {
|
|
18
|
+
if (!cancelled)
|
|
19
|
+
setSignedIn(Boolean(data.authenticated));
|
|
20
|
+
})
|
|
21
|
+
.catch(() => {
|
|
22
|
+
if (!cancelled)
|
|
23
|
+
setSignedIn(false);
|
|
24
|
+
});
|
|
25
|
+
return () => {
|
|
26
|
+
cancelled = true;
|
|
27
|
+
};
|
|
28
|
+
}, []);
|
|
29
|
+
if (signedIn === null) {
|
|
30
|
+
return _jsx("span", { className: "site-nav-btn site-nav-btn-ghost", "aria-hidden": "true" });
|
|
31
|
+
}
|
|
32
|
+
if (signedIn) {
|
|
33
|
+
return (_jsx(Link, { className: "site-nav-btn", href: "/admin", children: "Dashboard" }));
|
|
34
|
+
}
|
|
35
|
+
return (_jsx(Link, { className: "site-nav-btn site-nav-btn-primary", href: "/cms/login?redirect=/admin", children: "Sign in" }));
|
|
36
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function AdminPostDetail({ postId, onBack, onEdit: _onEdit, onViewRelated, }: {
|
|
2
|
+
postId: string;
|
|
3
|
+
onBack: () => void;
|
|
4
|
+
onEdit: (id: string) => void;
|
|
5
|
+
onViewRelated?: (id: string) => void;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=AdminPostDetail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminPostDetail.d.ts","sourceRoot":"","sources":["../../../app/components/admin/AdminPostDetail.tsx"],"names":[],"mappings":"AAcA,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,MAAM,EAAE,OAAO,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,+BAqNA"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useAdminMock } from "./mock/store";
|
|
4
|
+
import { sanitizeHtml } from "../../utils/sanitize";
|
|
5
|
+
import { ArticleDetailHero } from "../user/detail/ArticleDetailHero";
|
|
6
|
+
import { ArticleRailDetails } from "../user/detail/ArticleRailDetails";
|
|
7
|
+
import { ShareRow } from "../user/detail/ShareRow";
|
|
8
|
+
import { CommentSection } from "../user/detail/CommentSection";
|
|
9
|
+
import { ReadingProgress } from "../user/detail/ReadingProgress";
|
|
10
|
+
import { estimateReadingMinutes, extractHeadingsFromHtml, injectHeadingIds, } from "../user/detail/toc";
|
|
11
|
+
export function AdminPostDetail({ postId, onBack, onEdit: _onEdit, onViewRelated, }) {
|
|
12
|
+
const store = useAdminMock();
|
|
13
|
+
const post = store.getPost(postId);
|
|
14
|
+
const media = useMemo(() => {
|
|
15
|
+
if (!post?.featuredImageId)
|
|
16
|
+
return null;
|
|
17
|
+
const hit = store
|
|
18
|
+
.listMedia(post.brandId, "", 1, 200)
|
|
19
|
+
.items.find((m) => m.id === post.featuredImageId);
|
|
20
|
+
return hit ?? null;
|
|
21
|
+
}, [post, store]);
|
|
22
|
+
const authors = useMemo(() => {
|
|
23
|
+
if (!post)
|
|
24
|
+
return [];
|
|
25
|
+
return post.authorIds
|
|
26
|
+
.map((id) => store.terms("authors", post.brandId).find((a) => a.id === id))
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.map((a) => ({
|
|
29
|
+
id: a.id,
|
|
30
|
+
name: a.name,
|
|
31
|
+
jobTitle: a.jobTitle || null,
|
|
32
|
+
bio: a.bio || null,
|
|
33
|
+
avatarUrl: null,
|
|
34
|
+
}));
|
|
35
|
+
}, [post, store]);
|
|
36
|
+
const categories = useMemo(() => {
|
|
37
|
+
if (!post)
|
|
38
|
+
return [];
|
|
39
|
+
return post.categoryIds
|
|
40
|
+
.map((id) => store.terms("categories", post.brandId).find((c) => c.id === id))
|
|
41
|
+
.filter(Boolean);
|
|
42
|
+
}, [post, store]);
|
|
43
|
+
const tags = useMemo(() => {
|
|
44
|
+
if (!post)
|
|
45
|
+
return [];
|
|
46
|
+
return post.tagIds
|
|
47
|
+
.map((id) => store.terms("tags", post.brandId).find((t) => t.id === id))
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
}, [post, store]);
|
|
50
|
+
const related = useMemo(() => {
|
|
51
|
+
if (!post)
|
|
52
|
+
return [];
|
|
53
|
+
const primaryCat = post.categoryIds[0];
|
|
54
|
+
return store
|
|
55
|
+
.filterPosts({
|
|
56
|
+
state: "live",
|
|
57
|
+
brandId: post.brandId,
|
|
58
|
+
categoryId: primaryCat,
|
|
59
|
+
})
|
|
60
|
+
.filter((p) => p.id !== post.id)
|
|
61
|
+
.slice(0, 5)
|
|
62
|
+
.map((r) => ({
|
|
63
|
+
id: r.id,
|
|
64
|
+
title: r.title,
|
|
65
|
+
slug: r.slug,
|
|
66
|
+
publishedAt: r.publishedAt,
|
|
67
|
+
readingMinutes: r.readingMinutes ?? estimateReadingMinutes(r.contentHtml),
|
|
68
|
+
}));
|
|
69
|
+
}, [post, store]);
|
|
70
|
+
const comments = useMemo(() => {
|
|
71
|
+
if (!post)
|
|
72
|
+
return [];
|
|
73
|
+
return store
|
|
74
|
+
.comments(post.brandId)
|
|
75
|
+
.filter((c) => c.postId === post.id && c.status === "approved")
|
|
76
|
+
.map((c) => ({
|
|
77
|
+
id: c.id,
|
|
78
|
+
authorName: c.authorName,
|
|
79
|
+
body: c.body,
|
|
80
|
+
createdAt: c.createdAt,
|
|
81
|
+
}));
|
|
82
|
+
}, [post, store]);
|
|
83
|
+
const sanitized = useMemo(() => (post ? sanitizeHtml(post.contentHtml) : ""), [post]);
|
|
84
|
+
const headings = useMemo(() => extractHeadingsFromHtml(sanitized), [sanitized]);
|
|
85
|
+
const contentHtml = useMemo(() => injectHeadingIds(sanitized, headings), [sanitized, headings]);
|
|
86
|
+
const readingMinutes = post?.readingMinutes ?? (post ? estimateReadingMinutes(sanitized) : 0);
|
|
87
|
+
if (!post) {
|
|
88
|
+
return (_jsx("div", { className: "panel", children: _jsxs("div", { className: "panel-body", children: [_jsx("p", { className: "note", children: "Post not found." }), _jsx("button", { type: "button", className: "btn", onClick: onBack, children: "\u2190 Back to posts" })] }) }));
|
|
89
|
+
}
|
|
90
|
+
const primaryCategory = categories[0] ?? null;
|
|
91
|
+
const origin = typeof window !== "undefined" ? window.location.origin : "https://example.com";
|
|
92
|
+
return (_jsxs("div", { className: "bp-site-article admin-post-detail", children: [_jsx(ReadingProgress, {}), _jsx(ArticleDetailHero, { homeHref: "#", homeLabel: "Blogs", category: primaryCategory ? { slug: primaryCategory.slug, name: primaryCategory.name } : null, title: post.title, excerpt: post.excerpt, publishedAt: post.publishedAt, readingMinutes: readingMinutes, authors: authors,
|
|
93
|
+
/* Match /blog/[slug] post-details: blue animated hero, no media strip */
|
|
94
|
+
mediaUrl: null, onBack: onBack, onHome: onBack }), _jsxs("main", { className: "wrap article-shell", children: [_jsx(ArticleRailDetails, { className: "rail-details-mobile", owners: authors, related: related, hrefFor: (slug) => `#/blog/${slug}`, onSelect: (slug) => {
|
|
95
|
+
const hit = store.filterPosts({ state: "all", brandId: post.brandId }).find((p) => p.slug === slug);
|
|
96
|
+
if (hit && onViewRelated)
|
|
97
|
+
onViewRelated(hit.id);
|
|
98
|
+
} }), _jsxs("article", { className: "article", children: [media ? (_jsx("figure", { className: "article-hero-media", style: { marginBottom: 28, maxWidth: "100%" }, children: _jsx("img", { className: "article-hero-visual", src: media.url, alt: media.alt || post.title }) })) : null, _jsx("div", { className: "prose", dangerouslySetInnerHTML: { __html: contentHtml } }), categories.length > 0 || tags.length > 0 ? (_jsxs("div", { className: "tag-row", children: [categories.map((c) => (_jsx("span", { className: "tag-pill", children: c.name }, c.id))), tags.map((t) => (_jsxs("span", { className: "tag-pill", children: ["#", t.name] }, t.id)))] })) : null, _jsx("div", { className: "share-foot", children: _jsx(ShareRow, { title: post.title, slug: post.slug, origin: origin, path: `/blogs/${post.slug}` }) }), authors.map((a) => (_jsx("div", { className: "author-card", children: _jsxs("div", { children: [_jsxs("p", { className: "author-name", children: [a.name, a.jobTitle ? _jsxs("span", { children: [" \u2014 ", a.jobTitle] }) : null] }), a.bio ? _jsx("p", { className: "author-bio", children: a.bio }) : null] }) }, a.id))), _jsx(CommentSection, { postId: post.id, allowComments: post.allowComments && post.status === "published", initialComments: comments })] }), _jsxs("aside", { className: "rail", children: [_jsx(ArticleRailDetails, { className: "rail-details-desktop", owners: authors, related: related, hrefFor: (slug) => `#/blog/${slug}`, onSelect: (slug) => {
|
|
99
|
+
const hit = store
|
|
100
|
+
.filterPosts({ state: "all", brandId: post.brandId })
|
|
101
|
+
.find((p) => p.slug === slug);
|
|
102
|
+
if (hit && onViewRelated)
|
|
103
|
+
onViewRelated(hit.id);
|
|
104
|
+
} }), headings.length > 1 ? (_jsxs("nav", { className: "toc", "aria-label": "On this page", children: [_jsx("p", { className: "rail-title", children: "On this page" }), _jsx("ol", { children: headings.map((h) => (_jsx("li", { className: h.level === 3 ? "sub" : undefined, children: _jsx("a", { href: `#${h.id}`, children: h.text }) }, h.id))) })] })) : null] })] })] }));
|
|
105
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BrandForm } from "./mock/fixtures";
|
|
2
|
+
export type { BrandForm };
|
|
3
|
+
export declare function BrandSettings({ brandId, canEdit }: {
|
|
4
|
+
brandId?: string;
|
|
5
|
+
canEdit?: boolean;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
export declare function BrandsList({ onOpenSettings }: {
|
|
8
|
+
onOpenSettings?: (brandId: string) => void;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
export declare function ProfilePanel(): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=BrandSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrandSettings.d.ts","sourceRoot":"","sources":["../../../app/components/admin/BrandSettings.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,OAAc,EAAE,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,+BA2OjG;AAED,wBAAgB,UAAU,CAAC,EAAE,cAAc,EAAE,EAAE;IAAE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,+BA6D5F;AAED,wBAAgB,YAAY,gCAqD3B"}
|