From 7a9cfb816b225166db5cd7b1976f6c436872a9c4 Mon Sep 17 00:00:00 2001 From: Mostafa Date: Mon, 8 Dec 2025 19:21:05 +0200 Subject: [PATCH 1/7] add cloudflare template with website collections --- .../with-cloudflare-website/.editorconfig | 10 + .../with-cloudflare-website/.env.example | 14 + templates/with-cloudflare-website/.gitignore | 21 + templates/with-cloudflare-website/.npmrc | 2 + .../with-cloudflare-website/.prettierignore | 14 + .../with-cloudflare-website/.prettierrc.json | 6 + .../.vscode/extensions.json | 3 + .../.vscode/launch.json | 24 + .../.vscode/settings.json | 40 + templates/with-cloudflare-website/README.md | 317 +++ .../cloudflare-env.d.ts | 11 + .../with-cloudflare-website/components.json | 17 + .../with-cloudflare-website/eslint.config.mjs | 38 + .../with-cloudflare-website/next-env.d.ts | 5 + .../with-cloudflare-website/next.config.ts | 36 + .../open-next.config.ts | 4 + .../with-cloudflare-website/package.json | 105 + .../playwright.config.ts | 41 + .../with-cloudflare-website/postcss.config.js | 8 + .../public/favicon.ico | Bin 0 -> 15086 bytes .../public/favicon.svg | 23 + .../public/website-template-OG.webp | Bin 0 -> 101500 bytes .../with-cloudflare-website/redirects.js | 20 + .../src/Footer/Component.tsx | 34 + .../src/Footer/RowLabel.tsx | 13 + .../src/Footer/config.ts | 32 + .../src/Footer/hooks/revalidateFooter.ts | 13 + .../src/Header/Component.client.tsx | 42 + .../src/Header/Component.tsx | 11 + .../src/Header/Nav/index.tsx | 25 + .../src/Header/RowLabel.tsx | 13 + .../src/Header/config.ts | 32 + .../src/Header/hooks/revalidateHeader.ts | 13 + .../src/access/anyone.ts | 3 + .../src/access/authenticated.ts | 9 + .../src/access/authenticatedOrPublished.ts | 13 + .../(sitemaps)/pages-sitemap.xml/route.ts | 68 + .../(sitemaps)/posts-sitemap.xml/route.ts | 55 + .../src/app/(frontend)/[slug]/page.client.tsx | 15 + .../src/app/(frontend)/[slug]/page.tsx | 113 ++ .../src/app/(frontend)/globals.css | 103 + .../src/app/(frontend)/layout.tsx | 53 + .../app/(frontend)/next/exit-preview/route.ts | 7 + .../src/app/(frontend)/next/preview/route.ts | 56 + .../src/app/(frontend)/next/seed/route.ts | 31 + .../src/app/(frontend)/not-found.tsx | 18 + .../src/app/(frontend)/page.tsx | 5 + .../(frontend)/posts/[slug]/page.client.tsx | 15 + .../src/app/(frontend)/posts/[slug]/page.tsx | 108 + .../src/app/(frontend)/posts/page.client.tsx | 15 + .../src/app/(frontend)/posts/page.tsx | 63 + .../posts/page/[pageNumber]/page.client.tsx | 15 + .../posts/page/[pageNumber]/page.tsx | 88 + .../src/app/(frontend)/search/page.client.tsx | 15 + .../src/app/(frontend)/search/page.tsx | 88 + .../admin/[[...segments]]/not-found.tsx | 24 + .../(payload)/admin/[[...segments]]/page.tsx | 24 + .../src/app/(payload)/admin/importMap.js | 77 + .../src/app/(payload)/api/[...slug]/route.ts | 20 + .../(payload)/api/graphql-playground/route.ts | 7 + .../src/app/(payload)/api/graphql/route.ts | 8 + .../src/app/(payload)/custom.scss | 0 .../src/app/(payload)/layout.tsx | 31 + .../src/blocks/ArchiveBlock/Component.tsx | 65 + .../src/blocks/ArchiveBlock/config.ts | 94 + .../src/blocks/Banner/Component.tsx | 26 + .../src/blocks/Banner/config.ts | 37 + .../src/blocks/CallToAction/Component.tsx | 23 + .../src/blocks/CallToAction/config.ts | 42 + .../src/blocks/Code/Component.client.tsx | 33 + .../src/blocks/Code/Component.tsx | 21 + .../src/blocks/Code/CopyButton.tsx | 33 + .../src/blocks/Code/config.ts | 33 + .../src/blocks/Content/Component.tsx | 43 + .../src/blocks/Content/config.ts | 79 + .../src/blocks/Form/Checkbox/index.tsx | 45 + .../src/blocks/Form/Component.tsx | 163 ++ .../src/blocks/Form/Country/index.tsx | 65 + .../src/blocks/Form/Country/options.ts | 982 +++++++++ .../src/blocks/Form/Email/index.tsx | 38 + .../src/blocks/Form/Error/index.tsx | 15 + .../src/blocks/Form/Message/index.tsx | 13 + .../src/blocks/Form/Number/index.tsx | 36 + .../src/blocks/Form/Select/index.tsx | 63 + .../src/blocks/Form/State/index.tsx | 64 + .../src/blocks/Form/State/options.ts | 52 + .../src/blocks/Form/Text/index.tsx | 32 + .../src/blocks/Form/Textarea/index.tsx | 40 + .../src/blocks/Form/Width/index.tsx | 13 + .../src/blocks/Form/config.ts | 51 + .../src/blocks/Form/fields.tsx | 21 + .../src/blocks/MediaBlock/Component.tsx | 67 + .../src/blocks/MediaBlock/config.ts | 14 + .../src/blocks/RelatedPosts/Component.tsx | 32 + .../src/blocks/RenderBlocks.tsx | 51 + .../src/collections/Categories.ts | 28 + .../src/collections/Media.ts | 42 + .../collections/Pages/hooks/revalidatePage.ts | 43 + .../src/collections/Pages/index.ts | 136 ++ .../Posts/hooks/populateAuthors.ts | 37 + .../collections/Posts/hooks/revalidatePost.ts | 44 + .../src/collections/Posts/index.ts | 233 +++ .../src/collections/Users/index.ts | 26 + .../src/components/AdminBar/index.scss | 7 + .../src/components/AdminBar/index.tsx | 89 + .../BeforeDashboard/SeedButton/index.scss | 12 + .../BeforeDashboard/SeedButton/index.tsx | 88 + .../src/components/BeforeDashboard/index.scss | 24 + .../src/components/BeforeDashboard/index.tsx | 69 + .../src/components/BeforeLogin/index.tsx | 14 + .../src/components/Card/index.tsx | 84 + .../components/CollectionArchive/index.tsx | 32 + .../src/components/Link/index.tsx | 66 + .../components/LivePreviewListener/index.tsx | 10 + .../src/components/Logo/Logo.tsx | 29 + .../src/components/Media/ImageMedia/index.tsx | 77 + .../src/components/Media/VideoMedia/index.tsx | 46 + .../src/components/Media/index.tsx | 25 + .../src/components/Media/types.ts | 22 + .../src/components/PageRange/index.tsx | 57 + .../src/components/Pagination/index.tsx | 101 + .../src/components/PayloadRedirects/index.tsx | 48 + .../src/components/RichText/index.tsx | 81 + .../src/components/ui/button.tsx | 52 + .../src/components/ui/card.tsx | 48 + .../src/components/ui/checkbox.tsx | 27 + .../src/components/ui/input.tsx | 22 + .../src/components/ui/label.tsx | 19 + .../src/components/ui/pagination.tsx | 92 + .../src/components/ui/select.tsx | 144 ++ .../src/components/ui/textarea.tsx | 21 + .../src/cssVariables.js | 12 + .../src/endpoints/seed/contact-form.ts | 111 + .../src/endpoints/seed/contact-page.ts | 56 + .../src/endpoints/seed/home-static.ts | 88 + .../src/endpoints/seed/home.ts | 675 ++++++ .../src/endpoints/seed/image-1.ts | 67 + .../src/endpoints/seed/image-2.ts | 67 + .../src/endpoints/seed/image-3.ts | 67 + .../src/endpoints/seed/image-hero-1.ts | 5 + .../src/endpoints/seed/image-hero1.webp | Bin 0 -> 771366 bytes .../src/endpoints/seed/image-post1.webp | Bin 0 -> 117606 bytes .../src/endpoints/seed/image-post2.webp | Bin 0 -> 168786 bytes .../src/endpoints/seed/image-post3.webp | Bin 0 -> 112146 bytes .../src/endpoints/seed/index.ts | 298 +++ .../src/endpoints/seed/post-1.ts | 315 +++ .../src/endpoints/seed/post-2.ts | 232 +++ .../src/endpoints/seed/post-3.ts | 268 +++ .../src/environment.d.ts | 14 + .../src/fields/defaultLexical.ts | 47 + .../src/fields/link.ts | 139 ++ .../src/fields/linkGroup.ts | 28 + .../src/heros/HighImpact/index.tsx | 46 + .../src/heros/LowImpact/index.tsx | 25 + .../src/heros/MediumImpact/index.tsx | 46 + .../src/heros/PostHero/index.tsx | 73 + .../src/heros/RenderHero.tsx | 25 + .../src/heros/config.ts | 72 + .../src/hooks/populatePublishedAt.ts | 15 + .../src/hooks/revalidateRedirects.ts | 11 + .../src/migrations/index.ts | 2 + .../src/payload-types.ts | 1804 +++++++++++++++++ .../src/payload.config.ts | 111 + .../src/plugins/index.ts | 92 + .../src/providers/HeaderTheme/index.tsx | 33 + .../src/providers/Theme/InitTheme/index.tsx | 50 + .../providers/Theme/ThemeSelector/index.tsx | 51 + .../providers/Theme/ThemeSelector/types.ts | 5 + .../src/providers/Theme/index.tsx | 57 + .../src/providers/Theme/shared.ts | 17 + .../src/providers/Theme/types.ts | 10 + .../src/providers/index.tsx | 14 + .../src/search/Component.tsx | 41 + .../src/search/beforeSync.ts | 60 + .../src/search/fieldOverrides.ts | 61 + .../src/utilities/canUseDOM.ts | 1 + .../src/utilities/deepMerge.ts | 35 + .../src/utilities/formatAuthors.ts | 24 + .../src/utilities/formatDateTime.ts | 20 + .../src/utilities/generateMeta.ts | 49 + .../src/utilities/generatePreviewPath.ts | 33 + .../src/utilities/getDocument.ts | 31 + .../src/utilities/getGlobals.ts | 26 + .../src/utilities/getMeUser.ts | 43 + .../src/utilities/getMediaUrl.ts | 24 + .../src/utilities/getRedirects.ts | 26 + .../src/utilities/getURL.ts | 26 + .../src/utilities/mergeOpenGraph.ts | 22 + .../src/utilities/toKebabCase.ts | 5 + .../src/utilities/ui.ts | 12 + .../src/utilities/useClickableCard.ts | 108 + .../src/utilities/useDebounce.ts | 17 + .../tailwind.config.mjs | 153 ++ templates/with-cloudflare-website/test.env | 1 + .../tests/e2e/frontend.e2e.spec.ts | 20 + .../tests/int/api.int.spec.ts | 20 + .../with-cloudflare-website/tsconfig.json | 51 + .../with-cloudflare-website/vitest.config.mts | 12 + .../with-cloudflare-website/vitest.setup.ts | 4 + .../with-cloudflare-website/wrangler.jsonc | 66 + 200 files changed, 12554 insertions(+) create mode 100644 templates/with-cloudflare-website/.editorconfig create mode 100644 templates/with-cloudflare-website/.env.example create mode 100644 templates/with-cloudflare-website/.gitignore create mode 100644 templates/with-cloudflare-website/.npmrc create mode 100644 templates/with-cloudflare-website/.prettierignore create mode 100644 templates/with-cloudflare-website/.prettierrc.json create mode 100644 templates/with-cloudflare-website/.vscode/extensions.json create mode 100644 templates/with-cloudflare-website/.vscode/launch.json create mode 100644 templates/with-cloudflare-website/.vscode/settings.json create mode 100644 templates/with-cloudflare-website/README.md create mode 100644 templates/with-cloudflare-website/cloudflare-env.d.ts create mode 100644 templates/with-cloudflare-website/components.json create mode 100644 templates/with-cloudflare-website/eslint.config.mjs create mode 100644 templates/with-cloudflare-website/next-env.d.ts create mode 100644 templates/with-cloudflare-website/next.config.ts create mode 100644 templates/with-cloudflare-website/open-next.config.ts create mode 100644 templates/with-cloudflare-website/package.json create mode 100644 templates/with-cloudflare-website/playwright.config.ts create mode 100644 templates/with-cloudflare-website/postcss.config.js create mode 100644 templates/with-cloudflare-website/public/favicon.ico create mode 100644 templates/with-cloudflare-website/public/favicon.svg create mode 100644 templates/with-cloudflare-website/public/website-template-OG.webp create mode 100644 templates/with-cloudflare-website/redirects.js create mode 100644 templates/with-cloudflare-website/src/Footer/Component.tsx create mode 100644 templates/with-cloudflare-website/src/Footer/RowLabel.tsx create mode 100644 templates/with-cloudflare-website/src/Footer/config.ts create mode 100644 templates/with-cloudflare-website/src/Footer/hooks/revalidateFooter.ts create mode 100644 templates/with-cloudflare-website/src/Header/Component.client.tsx create mode 100644 templates/with-cloudflare-website/src/Header/Component.tsx create mode 100644 templates/with-cloudflare-website/src/Header/Nav/index.tsx create mode 100644 templates/with-cloudflare-website/src/Header/RowLabel.tsx create mode 100644 templates/with-cloudflare-website/src/Header/config.ts create mode 100644 templates/with-cloudflare-website/src/Header/hooks/revalidateHeader.ts create mode 100644 templates/with-cloudflare-website/src/access/anyone.ts create mode 100644 templates/with-cloudflare-website/src/access/authenticated.ts create mode 100644 templates/with-cloudflare-website/src/access/authenticatedOrPublished.ts create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/pages-sitemap.xml/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/posts-sitemap.xml/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.client.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/globals.css create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/layout.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/next/exit-preview/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/next/preview/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/next/seed/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/not-found.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/posts/[slug]/page.client.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/posts/[slug]/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/posts/page.client.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/posts/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/posts/page/[pageNumber]/page.client.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/posts/page/[pageNumber]/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/search/page.client.tsx create mode 100644 templates/with-cloudflare-website/src/app/(frontend)/search/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(payload)/admin/[[...segments]]/not-found.tsx create mode 100644 templates/with-cloudflare-website/src/app/(payload)/admin/[[...segments]]/page.tsx create mode 100644 templates/with-cloudflare-website/src/app/(payload)/admin/importMap.js create mode 100644 templates/with-cloudflare-website/src/app/(payload)/api/[...slug]/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(payload)/api/graphql-playground/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(payload)/api/graphql/route.ts create mode 100644 templates/with-cloudflare-website/src/app/(payload)/custom.scss create mode 100644 templates/with-cloudflare-website/src/app/(payload)/layout.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/ArchiveBlock/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/ArchiveBlock/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Banner/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Banner/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/CallToAction/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/CallToAction/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Code/Component.client.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Code/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Code/CopyButton.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Code/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Content/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Content/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Checkbox/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Country/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Country/options.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Email/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Error/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Message/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Number/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Select/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/State/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/State/options.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Text/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Textarea/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/Width/index.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/Form/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/Form/fields.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/MediaBlock/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/MediaBlock/config.ts create mode 100644 templates/with-cloudflare-website/src/blocks/RelatedPosts/Component.tsx create mode 100644 templates/with-cloudflare-website/src/blocks/RenderBlocks.tsx create mode 100644 templates/with-cloudflare-website/src/collections/Categories.ts create mode 100644 templates/with-cloudflare-website/src/collections/Media.ts create mode 100644 templates/with-cloudflare-website/src/collections/Pages/hooks/revalidatePage.ts create mode 100644 templates/with-cloudflare-website/src/collections/Pages/index.ts create mode 100644 templates/with-cloudflare-website/src/collections/Posts/hooks/populateAuthors.ts create mode 100644 templates/with-cloudflare-website/src/collections/Posts/hooks/revalidatePost.ts create mode 100644 templates/with-cloudflare-website/src/collections/Posts/index.ts create mode 100644 templates/with-cloudflare-website/src/collections/Users/index.ts create mode 100644 templates/with-cloudflare-website/src/components/AdminBar/index.scss create mode 100644 templates/with-cloudflare-website/src/components/AdminBar/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/BeforeDashboard/SeedButton/index.scss create mode 100644 templates/with-cloudflare-website/src/components/BeforeDashboard/SeedButton/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/BeforeDashboard/index.scss create mode 100644 templates/with-cloudflare-website/src/components/BeforeDashboard/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/BeforeLogin/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Card/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/CollectionArchive/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Link/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/LivePreviewListener/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Logo/Logo.tsx create mode 100644 templates/with-cloudflare-website/src/components/Media/ImageMedia/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Media/VideoMedia/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Media/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Media/types.ts create mode 100644 templates/with-cloudflare-website/src/components/PageRange/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/Pagination/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/PayloadRedirects/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/RichText/index.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/button.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/card.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/checkbox.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/input.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/label.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/pagination.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/select.tsx create mode 100644 templates/with-cloudflare-website/src/components/ui/textarea.tsx create mode 100644 templates/with-cloudflare-website/src/cssVariables.js create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/contact-form.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/contact-page.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/home-static.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/home.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-1.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-2.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-3.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-hero-1.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-hero1.webp create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-post1.webp create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-post2.webp create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/image-post3.webp create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/index.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/post-1.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/post-2.ts create mode 100644 templates/with-cloudflare-website/src/endpoints/seed/post-3.ts create mode 100644 templates/with-cloudflare-website/src/environment.d.ts create mode 100644 templates/with-cloudflare-website/src/fields/defaultLexical.ts create mode 100644 templates/with-cloudflare-website/src/fields/link.ts create mode 100644 templates/with-cloudflare-website/src/fields/linkGroup.ts create mode 100644 templates/with-cloudflare-website/src/heros/HighImpact/index.tsx create mode 100644 templates/with-cloudflare-website/src/heros/LowImpact/index.tsx create mode 100644 templates/with-cloudflare-website/src/heros/MediumImpact/index.tsx create mode 100644 templates/with-cloudflare-website/src/heros/PostHero/index.tsx create mode 100644 templates/with-cloudflare-website/src/heros/RenderHero.tsx create mode 100644 templates/with-cloudflare-website/src/heros/config.ts create mode 100644 templates/with-cloudflare-website/src/hooks/populatePublishedAt.ts create mode 100644 templates/with-cloudflare-website/src/hooks/revalidateRedirects.ts create mode 100644 templates/with-cloudflare-website/src/migrations/index.ts create mode 100644 templates/with-cloudflare-website/src/payload-types.ts create mode 100644 templates/with-cloudflare-website/src/payload.config.ts create mode 100644 templates/with-cloudflare-website/src/plugins/index.ts create mode 100644 templates/with-cloudflare-website/src/providers/HeaderTheme/index.tsx create mode 100644 templates/with-cloudflare-website/src/providers/Theme/InitTheme/index.tsx create mode 100644 templates/with-cloudflare-website/src/providers/Theme/ThemeSelector/index.tsx create mode 100644 templates/with-cloudflare-website/src/providers/Theme/ThemeSelector/types.ts create mode 100644 templates/with-cloudflare-website/src/providers/Theme/index.tsx create mode 100644 templates/with-cloudflare-website/src/providers/Theme/shared.ts create mode 100644 templates/with-cloudflare-website/src/providers/Theme/types.ts create mode 100644 templates/with-cloudflare-website/src/providers/index.tsx create mode 100644 templates/with-cloudflare-website/src/search/Component.tsx create mode 100644 templates/with-cloudflare-website/src/search/beforeSync.ts create mode 100644 templates/with-cloudflare-website/src/search/fieldOverrides.ts create mode 100644 templates/with-cloudflare-website/src/utilities/canUseDOM.ts create mode 100644 templates/with-cloudflare-website/src/utilities/deepMerge.ts create mode 100644 templates/with-cloudflare-website/src/utilities/formatAuthors.ts create mode 100644 templates/with-cloudflare-website/src/utilities/formatDateTime.ts create mode 100644 templates/with-cloudflare-website/src/utilities/generateMeta.ts create mode 100644 templates/with-cloudflare-website/src/utilities/generatePreviewPath.ts create mode 100644 templates/with-cloudflare-website/src/utilities/getDocument.ts create mode 100644 templates/with-cloudflare-website/src/utilities/getGlobals.ts create mode 100644 templates/with-cloudflare-website/src/utilities/getMeUser.ts create mode 100644 templates/with-cloudflare-website/src/utilities/getMediaUrl.ts create mode 100644 templates/with-cloudflare-website/src/utilities/getRedirects.ts create mode 100644 templates/with-cloudflare-website/src/utilities/getURL.ts create mode 100644 templates/with-cloudflare-website/src/utilities/mergeOpenGraph.ts create mode 100644 templates/with-cloudflare-website/src/utilities/toKebabCase.ts create mode 100644 templates/with-cloudflare-website/src/utilities/ui.ts create mode 100644 templates/with-cloudflare-website/src/utilities/useClickableCard.ts create mode 100644 templates/with-cloudflare-website/src/utilities/useDebounce.ts create mode 100644 templates/with-cloudflare-website/tailwind.config.mjs create mode 100644 templates/with-cloudflare-website/test.env create mode 100644 templates/with-cloudflare-website/tests/e2e/frontend.e2e.spec.ts create mode 100644 templates/with-cloudflare-website/tests/int/api.int.spec.ts create mode 100644 templates/with-cloudflare-website/tsconfig.json create mode 100644 templates/with-cloudflare-website/vitest.config.mts create mode 100644 templates/with-cloudflare-website/vitest.setup.ts create mode 100644 templates/with-cloudflare-website/wrangler.jsonc diff --git a/templates/with-cloudflare-website/.editorconfig b/templates/with-cloudflare-website/.editorconfig new file mode 100644 index 00000000000..d8e085abcb2 --- /dev/null +++ b/templates/with-cloudflare-website/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +end_of_line = lf +max_line_length = null diff --git a/templates/with-cloudflare-website/.env.example b/templates/with-cloudflare-website/.env.example new file mode 100644 index 00000000000..fbcf921a3dc --- /dev/null +++ b/templates/with-cloudflare-website/.env.example @@ -0,0 +1,14 @@ +# A generated secret for Payload (generate with `openssl rand -hex 32`) +PAYLOAD_SECRET=YOUR_SECRET_HERE + +# Used to configure CORS, format links and more. No trailing slash +NEXT_PUBLIC_SERVER_URL=http://localhost:3000 + +# Secret used to authenticate cron jobs +CRON_SECRET=YOUR_CRON_SECRET_HERE + +# Used to validate preview requests +PREVIEW_SECRET=YOUR_SECRET_HERE + +# Optional: Cloudflare environment name for deployment +# CLOUDFLARE_ENV=production diff --git a/templates/with-cloudflare-website/.gitignore b/templates/with-cloudflare-website/.gitignore new file mode 100644 index 00000000000..f91fc8c1a21 --- /dev/null +++ b/templates/with-cloudflare-website/.gitignore @@ -0,0 +1,21 @@ +build +dist / media +node_modules +.DS_Store +.env +.next +.vercel + +# Payload default media upload directory +public/media/ + +public/robots.txt +public/sitemap*.xml + + +# Playwright +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/templates/with-cloudflare-website/.npmrc b/templates/with-cloudflare-website/.npmrc new file mode 100644 index 00000000000..5ff455cdd20 --- /dev/null +++ b/templates/with-cloudflare-website/.npmrc @@ -0,0 +1,2 @@ +legacy-peer-deps=true +enable-pre-post-scripts=true diff --git a/templates/with-cloudflare-website/.prettierignore b/templates/with-cloudflare-website/.prettierignore new file mode 100644 index 00000000000..996b10e1585 --- /dev/null +++ b/templates/with-cloudflare-website/.prettierignore @@ -0,0 +1,14 @@ +**/payload-types.ts +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp +**/docs/** +tsconfig.json + diff --git a/templates/with-cloudflare-website/.prettierrc.json b/templates/with-cloudflare-website/.prettierrc.json new file mode 100644 index 00000000000..cb8ee2671df --- /dev/null +++ b/templates/with-cloudflare-website/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "printWidth": 100, + "semi": false +} diff --git a/templates/with-cloudflare-website/.vscode/extensions.json b/templates/with-cloudflare-website/.vscode/extensions.json new file mode 100644 index 00000000000..1d7ac851ea8 --- /dev/null +++ b/templates/with-cloudflare-website/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] +} diff --git a/templates/with-cloudflare-website/.vscode/launch.json b/templates/with-cloudflare-website/.vscode/launch.json new file mode 100644 index 00000000000..572ee15f7fd --- /dev/null +++ b/templates/with-cloudflare-website/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: debug full stack", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/node_modules/next/dist/bin/next", + "runtimeArgs": ["--inspect"], + "skipFiles": ["/**"], + "serverReadyAction": { + "action": "debugWithChrome", + "killOnServerStop": true, + "pattern": "- Local:.+(https?://.+)", + "uriFormat": "%s", + "webRoot": "${workspaceFolder}" + }, + "cwd": "${workspaceFolder}" + } + ] +} diff --git a/templates/with-cloudflare-website/.vscode/settings.json b/templates/with-cloudflare-website/.vscode/settings.json new file mode 100644 index 00000000000..5918b307925 --- /dev/null +++ b/templates/with-cloudflare-website/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "npm.packageManager": "pnpm", + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "editor.formatOnSaveMode": "file", + "typescript.tsdk": "node_modules/typescript/lib", + "[javascript][typescript][typescriptreact]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } + } +} diff --git a/templates/with-cloudflare-website/README.md b/templates/with-cloudflare-website/README.md new file mode 100644 index 00000000000..e59027dd88e --- /dev/null +++ b/templates/with-cloudflare-website/README.md @@ -0,0 +1,317 @@ +# Payload Website Template with Cloudflare D1 & R2 + +This is the official [Payload Website Template](https://github.com/payloadcms/payload/blob/main/templates/website) configured for deployment on Cloudflare Workers with D1 (SQLite) database and R2 object storage. + +Use it to power websites, blogs, or portfolios from small to enterprise, all running on Cloudflare's edge network. + +This template is right for you if you are working on: + +- A personal or enterprise-grade website, blog, or portfolio deployed on Cloudflare +- A content publishing platform with a fully featured publication workflow +- Edge-first applications with global distribution +- Exploring the capabilities of Payload with Cloudflare infrastructure + +Core features: + +- [Pre-configured Payload Config](#how-it-works) +- [Cloudflare D1 Database](#cloudflare-d1) +- [Cloudflare R2 Storage](#cloudflare-r2) +- [Authentication](#users-authentication) +- [Access Control](#access-control) +- [Layout Builder](#layout-builder) +- [Draft Preview](#draft-preview) +- [Live Preview](#live-preview) +- [On-demand Revalidation](#on-demand-revalidation) +- [SEO](#seo) +- [Search](#search) +- [Redirects](#redirects) +- [Jobs and Scheduled Publishing](#jobs-and-scheduled-publish) +- [Website](#website) + +## Quick Start + +To spin up this example locally, follow these steps: + +### Prerequisites + +1. Install [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) +2. Login to Cloudflare: `wrangler login` + +### Clone + +Use the `create-payload-app` CLI to clone this template directly to your machine: + +```bash +pnpx create-payload-app my-project -t with-cloudflare-website +``` + +### Cloudflare Setup + +1. Create a D1 database: + ```bash + wrangler d1 create my-website + ``` + Copy the `database_id` from the output and update `wrangler.jsonc`. + +2. Create an R2 bucket: + ```bash + wrangler r2 bucket create my-website + ``` + +3. Update `wrangler.jsonc` with your database and bucket names. + +### Development + +1. First [clone the repo](#clone) if you have not done so already +1. `cd my-project && cp .env.example .env` to copy the example environment variables +1. Update `PAYLOAD_SECRET` in `.env` (generate with `openssl rand -hex 32`) +1. `pnpm install && pnpm dev` to install dependencies and start the dev server +1. open `http://localhost:3000` to open the app in your browser + +That's it! Changes made in `./src` will be reflected in your app. Follow the on-screen instructions to login and create your first admin user. + +## Cloudflare D1 + +This template uses [Cloudflare D1](https://developers.cloudflare.com/d1/), a serverless SQLite database, as the database adapter. D1 provides: + +- Automatic global replication +- Edge-first performance +- Zero cold starts +- Generous free tier + +The database is configured in `wrangler.jsonc` and accessed via the `@payloadcms/db-d1-sqlite` adapter. + +## Cloudflare R2 + +Media uploads are stored in [Cloudflare R2](https://developers.cloudflare.com/r2/), Cloudflare's S3-compatible object storage. R2 provides: + +- No egress fees +- Global distribution via Cloudflare's network +- S3-compatible API + +The storage is configured using the `@payloadcms/storage-r2` plugin. + +> Note: Image resizing and focal point features are not available on Cloudflare Workers due to lack of sharp support. Images are stored and served as-is. + +## How it works + +The Payload config is tailored specifically to the needs of most websites. It is pre-configured in the following ways: + +### Collections + +See the [Collections](https://payloadcms.com/docs/configuration/collections) docs for details on how to extend this functionality. + +- #### Users (Authentication) + + Users are auth-enabled collections that have access to the admin panel and unpublished content. See [Access Control](#access-control) for more details. + + For additional help, see the official [Auth Example](https://github.com/payloadcms/payload/tree/main/examples/auth) or the [Authentication](https://payloadcms.com/docs/authentication/overview#authentication-overview) docs. + +- #### Posts + + Posts are used to generate blog posts, news articles, or any other type of content that is published over time. All posts are layout builder enabled so you can generate unique layouts for each post using layout-building blocks, see [Layout Builder](#layout-builder) for more details. Posts are also draft-enabled so you can preview them before publishing them to your website, see [Draft Preview](#draft-preview) for more details. + +- #### Pages + + All pages are layout builder enabled so you can generate unique layouts for each page using layout-building blocks, see [Layout Builder](#layout-builder) for more details. Pages are also draft-enabled so you can preview them before publishing them to your website, see [Draft Preview](#draft-preview) for more details. + +- #### Media + + This is the uploads enabled collection used by pages, posts, and projects to contain media like images, videos, downloads, and other assets. Media is stored in Cloudflare R2. + + > Note: Image resizing features are not available on Cloudflare Workers due to lack of sharp support. + +- #### Categories + + A taxonomy used to group posts together. Categories can be nested inside of one another, for example "News > Technology". See the official [Payload Nested Docs Plugin](https://payloadcms.com/docs/plugins/nested-docs) for more details. + +### Globals + +See the [Globals](https://payloadcms.com/docs/configuration/globals) docs for details on how to extend this functionality. + +- `Header` + + The data required by the header on your front-end like nav links. + +- `Footer` + + Same as above but for the footer of your site. + +## Access control + +Basic access control is setup to limit access to various content based based on publishing status. + +- `users`: Users can access the admin panel and create or edit content. +- `posts`: Everyone can access published posts, but only users can create, update, or delete them. +- `pages`: Everyone can access published pages, but only users can create, update, or delete them. + +For more details on how to extend this functionality, see the [Payload Access Control](https://payloadcms.com/docs/access-control/overview#access-control) docs. + +## Layout Builder + +Create unique page layouts for any type of content using a powerful layout builder. This template comes pre-configured with the following layout building blocks: + +- Hero +- Content +- Media +- Call To Action +- Archive + +Each block is fully designed and built into the front-end website that comes with this template. See [Website](#website) for more details. + +## Lexical editor + +A deep editorial experience that allows complete freedom to focus just on writing content without breaking out of the flow with support for Payload blocks, media, links and other features provided out of the box. See [Lexical](https://payloadcms.com/docs/rich-text/overview) docs. + +## Draft Preview + +All posts and pages are draft-enabled so you can preview them before publishing them to your website. To do this, these collections use [Versions](https://payloadcms.com/docs/configuration/collections#versions) with `drafts` set to `true`. This means that when you create a new post, project, or page, it will be saved as a draft and will not be visible on your website until you publish it. This also means that you can preview your draft before publishing it to your website. To do this, we automatically format a custom URL which redirects to your front-end to securely fetch the draft version of your content. + +Since the front-end of this template is statically generated, this also means that pages, posts, and projects will need to be regenerated as changes are made to published documents. To do this, we use an `afterChange` hook to regenerate the front-end when a document has changed and its `_status` is `published`. + +For more details on how to extend this functionality, see the official [Draft Preview Example](https://github.com/payloadcms/payload/tree/examples/draft-preview). + +## Live preview + +In addition to draft previews you can also enable live preview to view your end resulting page as you're editing content with full support for SSR rendering. See [Live preview docs](https://payloadcms.com/docs/live-preview/overview) for more details. + +## On-demand Revalidation + +We've added hooks to collections and globals so that all of your pages, posts, footer, or header changes will automatically be updated in the frontend via on-demand revalidation supported by Nextjs. + +> Note: if an image has been changed, for example it's been cropped, you will need to republish the page it's used on in order to be able to revalidate the Nextjs image cache. + +## SEO + +This template comes pre-configured with the official [Payload SEO Plugin](https://payloadcms.com/docs/plugins/seo) for complete SEO control from the admin panel. All SEO data is fully integrated into the front-end website that comes with this template. See [Website](#website) for more details. + +## Search + +This template also pre-configured with the official [Payload Search Plugin](https://payloadcms.com/docs/plugins/search) to showcase how SSR search features can easily be implemented into Next.js with Payload. See [Website](#website) for more details. + +## Redirects + +If you are migrating an existing site or moving content to a new URL, you can use the `redirects` collection to create a proper redirect from old URLs to new ones. This will ensure that proper request status codes are returned to search engines and that your users are not left with a broken link. This template comes pre-configured with the official [Payload Redirects Plugin](https://payloadcms.com/docs/plugins/redirects) for complete redirect control from the admin panel. All redirects are fully integrated into the front-end website that comes with this template. See [Website](#website) for more details. + +## Jobs and Scheduled Publish + +We have configured [Scheduled Publish](https://payloadcms.com/docs/versions/drafts#scheduled-publish) which uses the [jobs queue](https://payloadcms.com/docs/jobs-queue/jobs) in order to publish or unpublish your content on a scheduled time. The tasks are run on a cron schedule and can also be run as a separate instance if needed. + +> Note: When deployed on Cloudflare Workers, you can use Cloudflare Cron Triggers for scheduled tasks. + +## Website + +This template includes a beautifully designed, production-ready front-end built with the [Next.js App Router](https://nextjs.org), served right alongside your Payload app in a instance. This makes it so that you can deploy both your backend and website where you need it. + +Core features: + +- [Next.js App Router](https://nextjs.org) +- [TypeScript](https://www.typescriptlang.org) +- [React Hook Form](https://react-hook-form.com) +- [Payload Admin Bar](https://github.com/payloadcms/payload/tree/main/packages/admin-bar) +- [TailwindCSS styling](https://tailwindcss.com/) +- [shadcn/ui components](https://ui.shadcn.com/) +- User Accounts and Authentication +- Fully featured blog +- Publication workflow +- Dark mode +- Pre-made layout building blocks +- SEO +- Search +- Redirects +- Live preview + +### Cache + +Since this template runs on Cloudflare's edge network, caching is handled at the edge. For more details, see the official [Next.js Caching Docs](https://nextjs.org/docs/app/building-your-application/caching) and [Cloudflare Cache documentation](https://developers.cloudflare.com/cache/). + +## Development + +To spin up this example locally, follow the [Quick Start](#quick-start). Then [Seed](#seed) the database with a few pages, posts, and projects. + +### Working with D1 (SQLite) + +D1 and other SQL-based databases follow a strict schema for managing your data. This means that there are a few extra steps compared to working with MongoDB. + +Note that often times when making big schema changes you can run the risk of losing data if you're not manually migrating it. + +#### Local development + +During local development, Wrangler provides a local D1 instance that mirrors your production database schema. Schema changes are applied via migrations. + +#### Migrations + +[Migrations](https://payloadcms.com/docs/database/migrations) are essentially SQL code versions that keeps track of your schema. When deploying with D1 you will need to make sure you create and then run your migrations. + +Locally create a migration: + +```bash +pnpm payload migrate:create +``` + +This creates the migration files you will need to push alongside with your new configuration. + +When deploying, migrations are automatically run as part of the deploy process: + +```bash +pnpm run deploy +``` + +This command will check for any migrations that have not yet been run and try to run them and it will keep a record of migrations that have been run in the database. + +### Seed + +To seed the database with a few pages, posts, and projects you can click the 'seed database' link from the admin panel. + +The seed script will also create a demo user for demonstration purposes only: + +- Demo Author + - Email: `demo-author@payloadcms.com` + - Password: `password` + +> NOTICE: seeding the database is destructive because it drops your current database to populate a fresh one from the seed template. Only run this command if you are starting a new project or can afford to lose your current data. + +## Production + +### Deploying to Cloudflare + +This template is designed to be deployed to Cloudflare Workers. To deploy: + +1. Ensure you have set up your D1 database and R2 bucket (see [Cloudflare Setup](#cloudflare-setup)) + +2. Update `wrangler.jsonc` with your database and bucket configuration + +3. Set your `PAYLOAD_SECRET` environment variable in Cloudflare: + ```bash + wrangler secret put PAYLOAD_SECRET + ``` + +4. Deploy your application: + ```bash + pnpm run deploy + ``` + +This will: +- Run database migrations +- Build your Next.js application with OpenNext +- Deploy to Cloudflare Workers + +### Preview Deployment + +To test your deployment locally before going live: + +```bash +pnpm run preview +``` + +### Environment-specific Deployments + +You can configure multiple environments in `wrangler.jsonc` (e.g., staging, production) and deploy to them using: + +```bash +CLOUDFLARE_ENV=staging pnpm run deploy +``` + +## Questions + +If you have any issues or questions, reach out to us on [Discord](https://discord.com/invite/payload) or start a [GitHub discussion](https://github.com/payloadcms/payload/discussions). diff --git a/templates/with-cloudflare-website/cloudflare-env.d.ts b/templates/with-cloudflare-website/cloudflare-env.d.ts new file mode 100644 index 00000000000..56eff9b0429 --- /dev/null +++ b/templates/with-cloudflare-website/cloudflare-env.d.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +// Generated by Wrangler by running `wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts` +// Run `pnpm run generate:types:cloudflare` to regenerate this file +declare namespace Cloudflare { + interface Env { + R2: R2Bucket + D1: D1Database + ASSETS: Fetcher + } +} +interface CloudflareEnv extends Cloudflare.Env {} diff --git a/templates/with-cloudflare-website/components.json b/templates/with-cloudflare-website/components.json new file mode 100644 index 00000000000..24e429706ae --- /dev/null +++ b/templates/with-cloudflare-website/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/app/(frontend)/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/utilities/ui" + } +} diff --git a/templates/with-cloudflare-website/eslint.config.mjs b/templates/with-cloudflare-website/eslint.config.mjs new file mode 100644 index 00000000000..7acd77dd1b3 --- /dev/null +++ b/templates/with-cloudflare-website/eslint.config.mjs @@ -0,0 +1,38 @@ +import { dirname } from 'path' +import { fileURLToPath } from 'url' +import { FlatCompat } from '@eslint/eslintrc' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}) + +const eslintConfig = [ + ...compat.extends('next/core-web-vitals', 'next/typescript'), + { + rules: { + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-empty-object-type': 'warn', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + vars: 'all', + args: 'after-used', + ignoreRestSiblings: false, + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^(_|ignore)', + }, + ], + }, + }, + { + ignores: ['.next/'], + }, +] + +export default eslintConfig diff --git a/templates/with-cloudflare-website/next-env.d.ts b/templates/with-cloudflare-website/next-env.d.ts new file mode 100644 index 00000000000..1b3be0840f3 --- /dev/null +++ b/templates/with-cloudflare-website/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/templates/with-cloudflare-website/next.config.ts b/templates/with-cloudflare-website/next.config.ts new file mode 100644 index 00000000000..29659317ea5 --- /dev/null +++ b/templates/with-cloudflare-website/next.config.ts @@ -0,0 +1,36 @@ +import { withPayload } from '@payloadcms/next/withPayload' + +import redirects from './redirects.js' + +const NEXT_PUBLIC_SERVER_URL = process.env.VERCEL_PROJECT_PRODUCTION_URL + ? `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` + : undefined || process.env.__NEXT_PRIVATE_ORIGIN || 'http://localhost:3000' + +/** @type {import('next').NextConfig} */ +const nextConfig = { + images: { + remotePatterns: [ + ...[NEXT_PUBLIC_SERVER_URL /* 'https://example.com' */].map((item) => { + const url = new URL(item) + + return { + hostname: url.hostname, + protocol: url.protocol.replace(':', '') as 'http' | 'https', + } + }), + ], + }, + webpack: (webpackConfig: any) => { + webpackConfig.resolve.extensionAlias = { + '.cjs': ['.cts', '.cjs'], + '.js': ['.ts', '.tsx', '.js', '.jsx'], + '.mjs': ['.mts', '.mjs'], + } + + return webpackConfig + }, + reactStrictMode: true, + redirects, +} + +export default withPayload(nextConfig, { devBundleServerPackages: false }) diff --git a/templates/with-cloudflare-website/open-next.config.ts b/templates/with-cloudflare-website/open-next.config.ts new file mode 100644 index 00000000000..893435b1c33 --- /dev/null +++ b/templates/with-cloudflare-website/open-next.config.ts @@ -0,0 +1,4 @@ +// default open-next.config.ts file created by @opennextjs/cloudflare +import { defineCloudflareConfig } from '@opennextjs/cloudflare/config' + +export default defineCloudflareConfig({}) diff --git a/templates/with-cloudflare-website/package.json b/templates/with-cloudflare-website/package.json new file mode 100644 index 00000000000..bdeb487e1d6 --- /dev/null +++ b/templates/with-cloudflare-website/package.json @@ -0,0 +1,105 @@ +{ + "name": "with-cloudflare-website", + "version": "1.0.0", + "description": "Website template for Payload with Cloudflare D1 and R2", + "license": "MIT", + "type": "module", + "scripts": { + "build": "cross-env NODE_OPTIONS=\"--no-deprecation --max-old-space-size=8000\" next build", + "deploy": "pnpm run deploy:database && pnpm run deploy:app", + "deploy:app": "opennextjs-cloudflare build --env=$CLOUDFLARE_ENV && opennextjs-cloudflare deploy --env=$CLOUDFLARE_ENV", + "deploy:database": "cross-env NODE_ENV=production PAYLOAD_SECRET=ignore payload migrate && wrangler d1 execute D1 --command 'PRAGMA optimize' --env=$CLOUDFLARE_ENV --remote", + "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev", + "devsafe": "rm -rf .next && rm -rf .open-next && cross-env NODE_OPTIONS=--no-deprecation next dev", + "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap", + "generate:types": "pnpm run generate:types:cloudflare && pnpm run generate:types:payload", + "generate:types:cloudflare": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts", + "generate:types:payload": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types", + "ii": "pnpm install --ignore-workspace", + "lint": "cross-env NODE_OPTIONS=--no-deprecation next lint", + "lint:fix": "cross-env NODE_OPTIONS=--no-deprecation next lint --fix", + "payload": "cross-env NODE_OPTIONS=--no-deprecation payload", + "preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview --env=$CLOUDFLARE_ENV", + "reinstall": "cross-env NODE_OPTIONS=--no-deprecation rm -rf node_modules && rm pnpm-lock.yaml && pnpm --ignore-workspace install", + "start": "cross-env NODE_OPTIONS=--no-deprecation next start", + "test": "pnpm run test:int && pnpm run test:e2e", + "test:e2e": "cross-env NODE_OPTIONS=\"--no-deprecation --no-experimental-strip-types\" pnpm exec playwright test --config=playwright.config.ts", + "test:int": "cross-env NODE_OPTIONS=--no-deprecation vitest run --config ./vitest.config.mts" + }, + "dependencies": { + "@opennextjs/cloudflare": "^1.11.0", + "@payloadcms/admin-bar": "workspace:*", + "@payloadcms/db-d1-sqlite": "workspace:*", + "@payloadcms/live-preview-react": "workspace:*", + "@payloadcms/next": "workspace:*", + "@payloadcms/plugin-form-builder": "workspace:*", + "@payloadcms/plugin-nested-docs": "workspace:*", + "@payloadcms/plugin-redirects": "workspace:*", + "@payloadcms/plugin-search": "workspace:*", + "@payloadcms/plugin-seo": "workspace:*", + "@payloadcms/richtext-lexical": "workspace:*", + "@payloadcms/storage-r2": "workspace:*", + "@payloadcms/ui": "workspace:*", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slot": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cross-env": "^7.0.3", + "dotenv": "16.4.7", + "geist": "^1.3.0", + "graphql": "^16.8.2", + "lucide-react": "^0.378.0", + "next": "15.4.8", + "payload": "workspace:*", + "prism-react-renderer": "^2.3.1", + "react": "19.2.1", + "react-dom": "19.2.1", + "react-hook-form": "7.45.4", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.2.0", + "@playwright/test": "1.56.1", + "@tailwindcss/typography": "^0.5.13", + "@testing-library/react": "16.3.0", + "@types/escape-html": "^1.0.2", + "@types/node": "22.5.4", + "@types/react": "19.2.1", + "@types/react-dom": "19.2.1", + "@vitejs/plugin-react": "4.5.2", + "autoprefixer": "^10.4.19", + "copyfiles": "^2.4.1", + "eslint": "^9.16.0", + "eslint-config-next": "15.4.7", + "jsdom": "26.1.0", + "playwright": "1.56.1", + "playwright-core": "1.56.1", + "postcss": "^8.4.38", + "prettier": "^3.4.2", + "tailwindcss": "^3.4.3", + "typescript": "5.7.3", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.2.3", + "wrangler": "~4.46.0" + }, + "engines": { + "node": "^18.20.2 || >=20.9.0", + "pnpm": "^9 || ^10" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild", + "unrs-resolver" + ] + }, + "cloudflare": { + "bindings": { + "PAYLOAD_SECRET": { + "description": "Generate a random string using `openssl rand -hex 32`" + } + } + } +} diff --git a/templates/with-cloudflare-website/playwright.config.ts b/templates/with-cloudflare-website/playwright.config.ts new file mode 100644 index 00000000000..c60fa9dcfab --- /dev/null +++ b/templates/with-cloudflare-website/playwright.config.ts @@ -0,0 +1,41 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +import 'dotenv/config' + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests/e2e', + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'], channel: 'chromium' }, + }, + ], + webServer: { + command: 'pnpm dev', + reuseExistingServer: true, + url: 'http://localhost:3000', + }, +}) diff --git a/templates/with-cloudflare-website/postcss.config.js b/templates/with-cloudflare-website/postcss.config.js new file mode 100644 index 00000000000..393a10f832b --- /dev/null +++ b/templates/with-cloudflare-website/postcss.config.js @@ -0,0 +1,8 @@ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} + +export default config diff --git a/templates/with-cloudflare-website/public/favicon.ico b/templates/with-cloudflare-website/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1ec2c191e9b317ccab3be0afe38084ae2dd1f271 GIT binary patch literal 15086 zcmds8XNXlt6uw45V~+(pyI5eO=o-Z+>Y^wb1&I-jtgb)S0xovkpljVH;;I;X1;w_C zVv8{vLW({M=nutc?CA2aMXW2I zMWcOtgVR)FcPqpA+%VqfYa2!pmx=nEN`_Iu0%?$8&Sr)lDD7i2N#;)rR?cJomH86$ zpUjjb!v<{q%$&;%A3@V_Hh6(KS*&jL;VUbEM)YDEmrD`1+CKOO2Cr0s73MPk%dFZg z?L07qn1RU+RcE0em`fX{lRsdp>d=6XxcwQE({EF zlO|1Q%a$!PckW!OQl&~@cB2@9Ri)!xkhC9Qoik?+y?XVE1Vthd8a#M#(zYdhVFmnG zQk`!=4Zz%xIfvP^oyn6Y)3ayKv{3KgzfYq^ zjiQ+|XVUA}ueEaL&!4Am-MV@9AH@vp-+RH|yLWH8diAOn4=M@@3aDz;sure3jT+I8 z9Xk^0?A*DNAm;^36#E%BI?bCmr-KI%Cd6>yzyV54P1R!P+O;cPxNt#h}_hmzBM?(D*Cr-rRMrO^LHH7)ct&OsjQ~Q7Q z>eVHRd-(9-l%1U&m=Cr8@%vK}{n?^L3u~+{Sg;^4A8P-vT)EPd?UpTDI?Cfak|{|1 ze)~T?J)N-TLHnKFm%9EaOZ@m9+PrzQ)tw&-ezA6b`SPWO9SwkTmTAR`71nsh+UxAuvvPIZ^SX8GEP35`P}<`^B_)OS?Aa5CRW7)3;|2{HG{_M< z+EkMG@&0AHckiB@jeEwr!s~jbB=M{BXB=RuVCmAORI_GHSA8yzrLxAqZ{NOzYiAj& z-Lv`)mE`;{bvI%E)VXtK&;2dhfPKZGLx*IO=CcRCp&Yg?HD;MDV$KFO~Ln#k)euq-#RyRg& z(xgfB{P}Ye3ieep2CRn)3kzkKanDDN9HCaNTE*COfom(vWV(>k+Qqkf@#4ieJP#i} zq%mX0P+neM!t)dS#`W*tUu)k18?e`8{>wp5Yk$|SU2)jm6yQ6WI(4ent_wWCT#Fg> z8?$d)I1{>b>5?1Rrp(5T8>wEsdcOTdu>!N8e*BQEJ#)MynpbeXgFQ_UzSssZ%k&dx zlD3U`9dq}aH*c)>ar^dd%FN76+O~ubSXIJx@oVNl{4{Oa)V#l#KYxDE_ZP*C@iP^C zH2*cH|1byAh7zy?Z2g%NQ65*8SNy={hL*EXd27QGH^3#CDg5l~UL)YP1H(5GE-#M* zS@;j;vU(Tr{iPScHnNzP<}qJnF0FRJSBN>CIY>fmOD;2FUCKrL3`Gp1GWRNlI6#6^ z3^pU*Fy10fF$_$$SYhk@=2oBM!)pYIEULW=#9SyV|2*4}JLXVQcNKdswn$ zNz5MI#;@E?_{KLXm&H8eE)(}^D&Z^z=Qs1_%~Pw)GnkPhN5l<~#4s78pvS-hpPPVN2wr$&5&kp{zasiQZwd z{^j>C`^H#m)~s1V-@t|MPEfMrA9iluyy-fY2=R_ZMMc6rB^dv28LRCacWU*P^aNhYob||>*6=SwjSR%&iCbd+f=xxoM#{KneF8RDL^W5YPW5LEOfAU#~xlwd@hsElWz{?j^+EsB%%=JEC0N-5Px!vhT(m);3rV+1(G%o;};dgV+oq&na}RxmBzwuy5VI zeY?4?!u!K|7QfxFA?f1z8uPbGnfczaHx#sc_wKm$N>pbNrwy6!t2U6w|Ii?Y-L8(y z?lMCcgn2t=EOB0^hw|IZ?U-e%$C(1==gc}?)Gc8CgxREUMLq*gJTC~*m=rqD{SWG$ BvZnw5 literal 0 HcmV?d00001 diff --git a/templates/with-cloudflare-website/public/favicon.svg b/templates/with-cloudflare-website/public/favicon.svg new file mode 100644 index 00000000000..d7ccc5aa98f --- /dev/null +++ b/templates/with-cloudflare-website/public/favicon.svg @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/templates/with-cloudflare-website/public/website-template-OG.webp b/templates/with-cloudflare-website/public/website-template-OG.webp new file mode 100644 index 0000000000000000000000000000000000000000..ceb0efc471c7503324f6fe561322d264291de2bb GIT binary patch literal 101500 zcmV)dK&QV_Nk&F=i~#^wMM6+kP&goHi~#_!M+2P!DzF500ssI2C8d-TMP$BP|7|aS z1OINXe%JQ7!ALjkbCbiLre{a_W`F^8YFS2fw?~ zkKO;@^ojQW<^Sq_Sbu!_1^)Z?AKtI^5AVOSp8`ME|Fi#&{DA%c`|5f{w{n!4d_s?$r zFMogjOZP+k-|m;#N8=yJzpQ_2{b>IK{-^wZyRZ7c?7R#%&+`BE|H%6V`qA@$?|R@A{r?;M=i1-j|IGZ4_m}v;^Pl;DC;otcp8q-i*ZvpvyZh(+AN3!8|Godo{{=@#C`Oo!V?0?q(&;Nb$Kj^ReALf77 zf5QJ!|Fivf=r{5&=YQZoyZ@a37ybADKl#7BFZ{maKWP8&f2sH}{Zs!-`Ahrt{?S>T zfBa=PiWrLY`IE+*M8=y$#+yXOn?%N&M8=y$#+yXOn?#l0Ik3)J^!obCUY{~`IZoO! zj%3+wa^Qbq!A-&E?^$b{UNZ=JYtKY4e60mm92-=%<$3grMm}Wj%oVnn z>vD63_aLG5mc2qK^4F)PR_)Ugd_dR_lCnZCl_=II__~=0o8})%_D3b`mL%G2g&-rV z>G63-93M-xw32V1uF{dhR`JI0ab0xwIogf~wR`HE2iMs{-o}3*;*Kr}RdM#M7Hzr7 zHlgx>inhI>mX_@W znESW=^i_3Yv`})BoLFG^_Xt|onZFkE{lhdHw9xIwU%_%A{>0Kiz&~vm`IE-m{r?7= zM8=y$#+yXOn?$|N8GGa=E*!9@$Ikur`sC9rpzqqvF3D#!tKAVWZmnEu_d02{rdCr6 z2}Hu{qzW{&r}Seo{`NrURrgr@D|coswD6L$?4^QU`o1EkJ1}_L+d2nKJ%T06B>28$ z>T;d5W5s*Ms;bYKJZZE{X|zmfWxphR11&XwB^CwQ$8PpRXZ@ow&cAQ}v01sn2UwJL`7W*mIv$FgBz z>e5V6?CyR7P@70sCSC2hDngEX`!L}kV?A)Anz%Lr_SctDZ1IE-{Y~7@G9U4As-~r+ zd(P7}^d)@PUmi2UU1ylp#MK-d$SsUx6mgZII{FAP)Iuc6q64a5WOmkR>HO&!LNfVYL6i66(D)LS_5S!Cv_FHm&{2cAdp0erkpM!*TD4FPOFG^d z1-n^oFJr`1>@?X)jMl4ehnJ^$Zq)-MQgA|7dK_<=SYa%59&Ws$z%4xkv?S0c^@aKE zN_PCgnA02H7j!fMv+K=1-_(9=H@-w3VviVx5uW=)Z)fvCR1n|~-2x<_)a`v@ImVa);UE!?1eYsA zG)Y7F80!X3sWux3001D360OtBU3aU@aEIUE0EFQKp7!#xU2eD>E7_dzXpm$b2JUbF z8FF=UC9tvdAV(E4a?4@v2m8HvxXR1TxijuZO|Pd(Fc6*w1% zgF94VW~Kc=2#_{xmfHffAE?5XcdNup8|5J>+q06irG2df9uMQkdGTxijT}_Jf(UeE z>A??cU>WOdIVb?zM=~l5N&(AlRBZL&s{VY1e03YCwOjl&LSx@^wS;4S9$7iLSbjaN zrx)>~7kYaKAOHXWE8WM2$dejv6VO!cqaQMO z(xCF{PXGV_12qQ4LDjbE6gRADzY)FWOc@9iy<~1&Hb@05%l>3vINF}4;WJzxQiO`% zO*8784svh+NW@)gG&MLdU|QVKe90ck`Q@MHB;a)1+1_v^9U!$@i-n^fGIzrA^Qw;Y zpuUj#WJX=AAY|3ZBba~35DX-(jiS7*1QVV)K+Ix+^g-YHgZqldM#d zC?g2g@M_JqJl%gmTI2`Ew*a$0qGSF)gm^q@r@0RF@C>-ZL7{Y%-*<(X<1FfM+I#GT zS-pzD5|meaiuvWCA-vo00gqV~-VBJdWdc|CstfM{H&Qmkm6D+#(XE3G3XKQ179_7_ zUfFB{Ri!@wSk0!^!Ssr7{oBd1c){=4U>&o-ObGG&%(?>w515?3PTgtV4up`uUVz`x^6mwRWCyq$P#F|0CYd=m<7oQ|>p@nCl)^tgj*3=$1 zv5^9-$U7X!{m@AX?v5OI+f;*Ow;gAn3cOlPd-rT<8jJ3l~n0}k4E`Z<|YFwWIMY?Xlm@0Kr|{_wJo z3=uJUwGec}7YaY$xQD4cr^TAxZR<*HAXAC{K`l}&Ar<%JG}t-A8876|8)?Mq|4~Yz z18RJXixwuLTej3JO(qU*7?i>J+(fR)2PTCk5}l&B8d3{qm(wl8(?6Apkcr7n1rX31 z1-A--O)iIsTGB2K;=l+;qkmz$fEuaGWAzU>vrJ{&Sj0x}+w{vJ3QmHyv!uA-0@ZXQ zlPdp~7fZePiMOdoQm6Gy1`;H$)cbe<0-DIS#JY4NIsWp$>=HCM*V4VxK&i)UIA2*i zC<3pP0IzW<{zKhbQO@;*W}m0}JnIxm8g(_r2zI7FK{tL9K{>aWrxuGBiXq;#kGEk=NI-w^IUANa1S1kj!BJF*x?tR3LGtm} zLh7HQOl;s2OeIYV=!quw*Vtj;u%~*R3bK|=y8(U=CVl_QW|9JaAY6#$VTgR02~(fS z3@iXC2~OH{M9P)#roR+r%<9^So2nkcFyiVX_WWZ3Zoa@-&Do}(EtV-|uTPmgK7Djr z{lA4a(GJvmE?={$icSTt2EH0xyDK~(5VeI47WUuWEtFY5Mt86!qnSzA7c3h>jp`)dy zOycB#00TCc!@YodP1F>+oW%D>>Jdko*NrxbjW&s18iy&h>GOLO_&*c{ECP!j<*+bR z06#?o<)EXtG_pqeJOuGvk-{_ySzj6cG;;HaPI_aS5;z$dp0oC8wKs-3Ft&d%aZMyS zQkhO4_b{|;yc25%+Rre2AVGLOyvtbj!Oy6yJCD$1M$N_GEVMfhc z;GY_C#N39|8|=fy&#PrAe661TwLm3~b-v4WGNDwlF!6vTP{E2b7VQa=9i~0jgwHr| zC;=bykAP%NNiaFui-25o(zlqr!r59^T2_C*NLi^!kovXeE=WMmf6tSt7L0%1#F*1) znA2!+GLHe#6Yp` z#NtMJr$8?=_LZj}Z4T#1fGd%rHz2NxGCwKjN2e?rePSh!weZI1AD%#L29&K4*Ban` zKUnX#TN7CU-~%POEN8Zyz@E6MqyjyQaM5Zzkz^=2rs%|O{4>a?PI5i~00000 zVx1r{buAP|jC{%CO`>B>vqhw-=dhE!1*tfI8)X_xu)XFYm}g3xq)K+`L$3Nr{pXoB zO#L_O;Za-~$6WzTC!tm}C=SF{D*i{ige#hzP6c#?p^wqTPBFv)003Et*L^mkAMLd~ zyBF0>16urPvkDv5#Og($hq1fqgA&2wI*GxBgUeo?eU|l!H3f-(pF_MrrQ;Q|S~>gY zid}0fv8qD|RP-*trM3Mbx>*e}Bkibkp4C`dm%loSo9}dARV3WD=$-zHqi3Z5SM0~y z>$}f%e#1wdMqc`!%KFh@JBZN52@#*P{x}jn3>*p5;PQ?n^ciEfJ&a>-KjWOk&p>xa}^mc^w;piv%RI?u-v(6a@EC9(7tc zO6^@U3=HRyd~T^$&dTeYR4Bo0i|_yd7IdG@rwp49-4@PU-kRN$@+2$~J1BUfZ7^uF z61G;=bB-FNbI#Ux#(sz5X>Eq1E6sB3beW;1P-}OJchQGDnwhIk?eDE8`nn>DHte5# z_E>{zJ0P=GG=fjtST@gJMCOm#d4{wTy5d5;Ue7i0*&wf3xL&w$lV|w3>3u$fu(}ox z@1NkhUo`WX+eSV?09r;0So?;bN(0dYiZa6&0jB&}dT|REQM@Ql3K)uKh@=Mg+rkb0 zGv{G!_qg|?yO{n2a_0J~Nv(O{2cj5OY0}^T0Qx&`N=doH_St5kxc^I?6yY*;jEA!J zZX5K1h7}GH`{5L^eqWtdI*ARWG9gECa#sWbB?53WwAJiu*M|e|3b46BOZ*A6$RjbS zG7|7pS&xPBvJxUx?3q&2O-06e=iho?N4t-4=Dfv-su@D|FTxa-QAI}L$fhgMv10Z5 zABJ17WV?d4TdNjZe2}w#Qs=n5?fatr=ek;a3m%HwXvfTR8KbsmoF_x(l#8<4uR+0c z_Di&rNSL%jL=KHoJ^pzux!)BrpVp$%AOI1J%BM&nv42q5eNBkekzM#gcB}~Oatqi$ zFOn0@5O;E!8Ma<;eM-cd8WWg={}rqKF5sF`H3jn`uIc}#{tzK_2i^}@=z5;i3!7Qr z)p%75uJ#?tYuXJrZH$Zh2YSu=4CKCC?lUQHDl?*%=5vt;7uht;PiFYJa(WcLw|)Su zDd^&Si745y1ZbEJmrn?v?~sQ{o6jHpdiH>$yx}_lzfYMuo2VnduIgqv@sI%N>V^!3 z!gXT4;|Tw5^KjM_aHT(>#}`|RMfaU5ZFs z000002bom>7u+SZ_wkv`+u%B#JESa|bShhnH@TRY8V@oH)2_mEYkW46#~-;2XOciC z>lSps?4QVZpkdtV6T#x;6rQ2LbmE-q7Q+ST;Vw9?BM7!yBNu)WITd*hgjbpLoJW!M zAr1xFzgdw?bePGh(!1jue@(Ne^nq;#PZ@8r)c3w4$tvf-eK6QgC0%0x*0h2606ViX zFDwIa4$hb_SZa~p{h6{|t5brt{}jUcKBRmGPV|1=-eZxcUeRO?y7|sUmzLcX@R|he z-zyMDkV<~3XXU3eQOV|LN}?OgK1jBuZ5+2KuBbG2Yb0Irsl#b9(M6y*&&?HiOhWg? z9eGwhTZ&`vj2p~a;$IEZ zhwu|){pf{v;;7o^di_n6O+tS%UBo5rWQ$#J&Z57xJhT&F~qiQgs zDg&RkoJH;vlxk`;=;eo3i#PyY2A5IMcnbL1~n+|Z-R45LFFA=7*%E|22A zsoMz*-SVVciVrtPRKVd!o%HoC3j+Ge4;7iecMP+l@G2fBR+TPoG_Yii&ssAKeQUr1 zzE5k38Y~Q~yAv>wreLQWI}aDru$Qb70nsDg2nCI|*Ld=&5W&x4sFqDn-PVh_MRLPf z1;*Qf;g)u`gA18rQk~g`h&DSn|0s<9j_tzqkmk|+Ud#kj4BD;UJ94}qTk!ATPDnp? zYl@q8iK3|={ar{{De(2vII@$cYTN!W&+hJBxO%8_ zli>cx1`n@xZD^X{oi4wQ9@)?R@GV93I0zPubP40Zi#uZ5zIb{++}iw&jF6#PZ_UOH zfvUm&!=S^SdWjm&6r{$NG&rEjYy+lNCt*WxNcqS{2uH)8l5?YMtoe+H;Zn(fri%a; z;^~AJ;A!rn)K$9J1zI`xR0JF#!tC!c5h}%=s|5mgdGkAmegRT$W#-*++GCek^~J5s zh9^vNVfPK+y3Wf9`FF*t6tkB+Tu`GOe@-;d`LUq8K>Z>UL_h2VH;ZdC$uxfC2}F}3dVfFG=TFhyYN!gZ2H8t zgl3C=b+{{Vzlksw!8=<2;E$48B>y(6teuvDUJ+Im9gfsKws7*+)}H$OJbw5Jl`t4qErDXxhFD_8UCD^I<&L`;*-TR+zVYB zU;#UENA}eQPtDtv!dU)3BBX~1R?3n0s$=1^JVCI_=Y|6=IsLY~|hKaD4 zaG5*tT!~$D6Q6QG(NCL^zt$F%$>g6`wE7S%q0WDCMATK;<`@rwMLbgN&9DPsoQt;ddFyBN-%3-CwjM4J8=Y_W${9 zEt%;j6oyb+D-lN0-X^|x4EmaCx^d65m42=#*sDLuK;pR}W+D z925BUP-zx(R|B8o3ZKN(nNvV}nB$H?0VjZy4tCi<@rBW3GN>v|6CR!j{{l!J-5yfq z88X(){b{gKE1#k#6qpgU@6k<4|6=W!8;el$e*E$McFCy=Jw6Qde~3%(Ps zZ)d$ru#8&?#elNo0R~ljYrVm6^NQi~!+2z#`h3^7QWUTN00BJtaE$dTNrmk?{M||k z$Xd!hr9UiFE3J9B??f@a6>hzTkbFeaMMq{f707CAA$LEG0f8IIg~GJh1c#Ch7?{Tk@hRKmtV8^8aQ$5Us6uR$O_A1uhMlu@`}i&rGIOD|Rr0Q`Wf3#Naf z6T{fd-zrTiiGYzfR|5ScC=xP`$keEp#iS6$d)2?i75OMbS8mh=NFBh7d;Ly6lUMfq zyIK+K+AVCvXInP!W*#>*-N+`qfmyd4d`lNyy(YIr0G{&0SnW5=xZJ>vJ0Uta?%;+b zp8djG1N_>!;HF4&*(iGC>h54xjF zU%Sa4yp#&z;>;H-kLWuPh(~zgAUL%^ZUZB^6AX8gGxFhUq|4d6XY08BVz2=D8IGbx zbQgz%2fyGdO$q8OgKYId?dGB(dkMORZTWERwa)*M&~;CEd%dxHFvu6L#%&lCmP5z! z29AUrYL88zHg4X`)gtJ|BPg^k?mx7FY>Dguf#RCyBtT)-8Z1~Yisv{Y2tc_#C<2=` zF3c0v6Mz0JNjikzmBld21~0Uh4wvvQ@Yd1Qcsb-b-70M-;_d(u?dS5NM88;RdJ$uA zglOo_V&6X4^{O-9CsQc7o2LC$LtN?o$5Lc<*XSmmupXh)W=rkEtR| z(IvVK+Nx;VIM-jkFsGhi{Y8Kifa!-~DPd@aM6DmMc7U%875o3bGChA?&7D6ZHj@Q& zr5Mb;ZJ{P^UsB5st}fa|HFYUO_&6-|rysD}=MN#qs1H(hdc5!liC;& zXy?OlEc!M{$e<0KH!5bcqCr{mvm6hY1KkB^8^HzUT#h0fN#Z#Ss)CRukY{A+zua76 zF>tJ*-~hU?g(-RJgU*KIXi7$;Z3{qfVa&tM)|(7uSj z*;Y^%qK>kWm&3SyMAKzDE)HM%)VOOWlZlFNQA&Riz|@+IJ~Bn}lzbXCGe$V|oMwoy zAHAJ1$^Bi+$-0I~KmdCq4gsyNegZ*?UBf^SDJBLFs+8q)S*ok^J2gS4xW`J>-j_EM zQ7Gupa<^*qmt$&|V9@L$%s;Olo4t08*^;YgoFukK9-UqaWBRt<6Ob^Ons0Iq^84+) z9OU&RmDPQu{QF+~>sxsPW8g zF-Nf=7G6SoD^v_zh~v$PFp2i_=9%~GjH7+pK)?z#DzbwVicykt_(v@yUvS+l3JL+J z2ZThvu2V92CQIx0l{F$e^)SbYi^2;>&=dg2O@N-j^_ohjmVa8MaN)JO>AUy%m6 ze1K3xuEcc@9nn@Q!9rtH*^<37O0mzI}7&L%8E-PG-~~HTP&q_=Dq;^)1hg< z9H6y2kbJaCw>v^;PLhEM{GGZl1LG5kD(Yx$8?lYevY)2{)MY>3qTLb(AJVBKBG+ZS43@txE$qwusd>>sv zM{_{!alo`sq!DLIfyW_a=HADGl)jXOPkm5n=7sn} zQ3RiPiLSA_{BO0|={2v(T@0{MD*I`l%00hWs;X&W8~v(Q>O?4q^p@=YW20;aZB6N3n-AH#Wt7+pMV0i0_Zjj$bPEO zff&^x89burWA^)WOZ6@fuN8K-?OI}b&KrUL0#PM?rqLN2Du@VW^3p1bI3my}tZ@`1 z?8pr1aD=xRo)6-FEo@7_7YR8K9IaY-lOOTxWU>J|?yPtF_KW~A zv)p1BW_CsJWCoXexW?M*cL!yODPo**z>Da`_(UFg!hr|XiJ7(y5Lw4WN2Bul-=-6? z4gz!m<+waqVW$!5M4OMc`@;|SI?hncK8R$`!zOWx8Um2Kt%_LW~ia!QE+Hx6jLiQog)F+ z-f)XesaKo8jrK_nanve|C5$WU*JJZ;)5{wNp&amjP))CFddOT_y_P~@^B!xNHV!%HzIOI z*A_>rTb6mfTOm()scF<==KyZ_2$jgjlVrs4fOgMw2ONx;U$=!O`5b5=wEc~#mr;MX zRbquM{3$ww|06_1X21bp{{G$-?Wl^I0$*HW<7&O1>?M*yBp9F?qmbVsWC;|Irz0sm z$-V5$BXPP$v@me8EPyFH9W_sd+I>?~%DunhHG zH*+?U)d$inO~)JL-k-Q}RHFi`>=WXd^6eg14hJOzE&a09!5B9`Hx#e!a&&0(%g;Yf z4YZ|>_p$Qoi`5K^QZYs}x`$YR$JtPU%y6;TOeE`w*O1qgJn1VBbQ~`Ia6N{Bv0|W^ zq!Ta8(o>#Nh`)0$?TW?*b`sc#078mpVBu6P7`|EaljlF*#>YveSXv%n0iFO6GiLd$ zQH}zIWpnw`@bzzqMTxSyU$&<6$7=T?H{&8GN2oF%m}LWoepS)IB~wvixOx4LOD&|y zWDpbBMlD7Lv@q%^G&*P4)p=E8yh&oh6!}Q3F^lvAhoYf%Z5fEzoIGh?9be@5-EAb| z8%kBS=RT^JU?(7v>W@Tr%F)_M3$~~TY-i10&p#CWbO3N3D<#>%C)do*2x&MFMd;`g zHfhV?tTPv=e$}=;|2BL-*rRWaO5h0UkKWANl!3;*rht!R>-JAgP$&h>mwWk3moy^C zh&KDF)_X#>WJxN)^^H&L#c%Cd-)!=wwTMGrFwb5hAF9;6jeD9wm^lfzQsQT(Pm4k* zd8)_pQ5zeYlA+)N2v@Frl!&PMmqS(cbe;wy0bF9)9f?bGoej0qvIoA zI-vs%A$+u%r*iEqmlwV+NZiplC}{@hVp$zy0}4+hDn1l&a9!6J;-Y?Vy;TuV1Ogeu z@F3`rq4qi3au>Ab&Y!Q)nAEulp47q51vTo_D}-*rac$vR>Jws9#*w9yg-}Hs|N1}h zPyb}!{eS=WVaNULK;7KoSXr^oem7mAnd!b10rJ}}E_H^RMNHr>ec@0a2WKVZXWGuv zUDkvJxWvn0fAU+9%sY7RlI)n2dmfkTwcj&a4J%Q-=k z6wq`zKxB2Qm>|(L<%IXPE8%oa-0+>v>T4pivtnMr1TaxjZQDD@h;anWDTARAKoX_F z>DvaK%MFq`88$ZVHO{;MPpNy=k^fS#GmBaF>^2k2y&h&aa7lY5jnLxe@>8H+|9YUl z5U8B>Oe!zC@`yeC8-MG0&u))Do&}^$vIPhN=%^E8$B0{vOj1uvZ^pU{=!6hUY6jIV z&gx2G1-lu6LVO?t1wp8CG5L#FRmw80!9YS&6r7UAE4zWdt@w$EJPclgXcT7ymHOCM}t?+dnS5VVq0;y-u zN{F5M#|+aE0r=PFbiIDZPxZkNvPbvebA;b;UQ~Yk0ryRqM@6mPGhA?y#n$-#V) zOsM)EM>$yP{At(kf>7X{2-cq#ts(mGDC-4<0Y`zfb)c^X+rMgugJoKhh~Bg*(nmF) zksvB|)WlqT`HaL@IIWo!O$iG9YH_n5*GMB>xc(%}tfa(uD3Q#b4dq3KP96eLz1kAesn=~aqy zKFp}0)3&gk~os`hnEAopqC~x{IQT*Qqiu^So6@TzLXdI#CG-J;n0)R|= zu8m)0(64vbrlqnugR6kE&9bWB_t4LYS<`XPmFFRieiN`2ET%-S=rSJ{&#hy=5#LGi zwBti80IOMxi>17AP&FYs``A3Wko7~GF_fGcAEzza}^Qd}@Z@Fp6mTp6Tt z_WDddQz_8T+w-y&-`s&soW@Qr=jM}HxX7CnDS?q?^=VUto1N=uA?n%xMD^VFEEq6B zB?hL#-26Ma6^vs4yhz(@vYsHxM?kJ&cH9IEx;uKy`4Y%&7+v-0(&YWa1O0`%dUVA! z_q#RrtN5G7DF7mm;pb%>FjU)DQ!>>AE`i!k;Mj7piZ>}0R>+1Gq zlr4+VMyDR{#5kt%%o29Jpz~_Zg@bDy7M2rVPl!v8gWtaFfrl88SCq-hquG9divXB- zr&fTsFJ~sH;?SOI40tw}_|;`;@fA0sAk=GSWuQ-l2+E598~67MdRU&-w)o`GYlrZw z7YwPL{ju?5cDPo)-KxsG^!gNIBI0X@A^E%REV{f_j_z^jXD9kRJ8GRgd{t5$>VA&) zaP1N*^g3Qz9+qvWw z#&Ao~KE#B%X)6>N`&J|Fbqs0sLx*nY#HeMe=#O}@_HVOBz{Ag4_ErFQ>oPiePU{31 z`$EoToX$#azcxgFr=UybA%umT@Xu7C#h(@|2TMjN>N2odCKvrSa`C^WZw$LAj>wv=s)YVXTGAKz63}j-`!w)oZ1W;Ha0G zD&0$qf+yWtKYs;)1PI*@iO>V1jmad@zOl!W0HYQ&;#i=GAg;%$p0+#E?>;;B1At^H zB3kSfb=Hns6(v3o1qbF6?z6h~HohOpvQ^pgptM(Sy^+f7!|V>IR#V7~)EdJuT+(^I zraxN30J#>Mu|{e*MltfEp?f;G)adS(O761Cuic~r3u!<`IA|zRX>5CtIEr3&Ock(VeR|E{4K=xLC=Xs@v%0LmXMl=BD=@cfUIhI3A|j zh)5F5VflYb8&?p!3d*Qs2nwPL3U|KJOhF)m;A{T|z4F!3}J-5{OpHP>p7H7=<{Cdf=jeR8uBU$<2<<5Sb)`?3Xo5lmk_$7H@c zxfPxCGj;?D5o%m6{(`-C$&5>m3WQV&Zr6nNR+&q$e1XoOv|ar3ugw^6zl?kMWVMMb zE?Xr1lkVw$O}7h5H$k+#Gb;N_)}NwoSN~snrx(;oeq0AM_(j4_&S$rd8|&vCpf^kW z&B8}*E^<;1gCG5$0>R3BY4cWz$L|IpL@h~#lMKpK<=S$-=fS^E>N+7>9N;B^?%`xR z_9uDHLn7u{uFKdNf-L(pxtQ$nG`1k?ntYvb(7`3h`eV2MR`rui$wr$8KaW(Q@3484n;DL%8GQCWW%9Js5hwnA` zOPksB3LMBsPof-v6iG@i-5lzPMc~smS0{bVchmi>IU)Kk^1p)kzdV0iI5PRLQlku>VsGYeOPj2YayJN4#h%u47MGA7`0*dJ8FtX$#tV@4gdN z1**L5CL-(Tx{h-|?tN03US(6}5DxNSD>wx%eZJ5Jm~^}PQe}@%$3HyM1w@sltPYztp5#5 z6D*i4i~*w)t~VZdgV_^jO`o!ybK9@eZ6R6bXkPQzAss8G&dHp=?NEWqZaqC;&dUM?Ij60U6c zjWMSof4f%_3MJ;nup06kO~Mtr64$vJDwRZD+kYbi*}mOTyo& zC|uCwA^3R?hH6P%sV!3IL3C4T911sZp4Or+oe10G zqqFLEdIjyqu{Vj+^g&DUVFIy9Xu{HgVUC?P+(?WR?b|P~B*Sy00!U8%TVzg<;@L_P z`hw$5z5&pK>cxQgXuh?U&a z98!uJz2c8x_Y>lyY3=kF_MvQu_`(ht9W{$U(*(`ej&71KmAHb}TGxXC8ZUlx^!YTc z%n=M&WkeXcjrKrUvRRK2LNY>2W{{V|&C$_;fM1O6m)ReJgJ628oyeiuK$7%@I7TUY zeD911E;BgyjwX?Sctypg+eFOSDtKjdma!Uja=Ug8`Ig%;9NMAQm5kC3>iV9BQY!b! zskT%bfEz0RO{KUrciWln0BD=f`PdQiQJUVBY@2s>L{IM4%wOa zTA|ggyv#6j$7?9%_x2{BQbK*f|p zHt~Z#f_SXFV?|;T@ugJXdd?EIK4Xv|`BBKKzPM|%LBpi#mIY`TaZ_<=s^U2x03$52 zQ*vBwpVSfpEe+zGEfQ8}Lvs3d8yKd5d;4ICuJ@*GA~?jH!NXKZ?RTm^_l%~|IV*oK zF&WDj!n0mmI*Xi_e)L^3IrQ6gJ%Vd=hV^6JRs>rz_B|E8?i_I(hlsJF-RypllL&Ss zt)Z_eCoU6!2E?;c5VkikwAEx=NqUnT_cTgT#uLER+9PvSo?PA#6qY>_G1ANy=U&p& zv$1eVhlE=WJ8=^&Q5j`~Y!|w!UVR>uOUjv4EU1Rtw< z#9qO%ZM8z!8Sz00wFOuJ>D$S6AD>9KPqoQ32-1>9=q*`G;3cs%k+q={vIi+x)yGuk zFN>eW0B>D;IQsu5^V+*NWSF8I>y+55RGkEGvnU4DX6cVRdCfh}o2FPQkcT|GneZG7 zUY5suop?6iDS4@-S&#rLnPtiki@<25Oe4w1)5>N=Ax-}ZYCsDSI;p*x1Gd7F*uYY) zV3XO@0cTB2weV#Zo!H`g4ypK3+_RIan6|mAum9k$@Zn9tedWFWg6dr4}Ez)^_22Y7&1OtIsB{qeh>u>_Se;hF~;1w zh6)8kf5v2$W}&{Lb=Yh{FU+x!Ql%wRYJ{wL@!ZZEJIQ>V&e=j_%SM`M&Tskh|YA?(chbbf@OC4h$>AM5y-8A-jQ8Em* z916V+4J*Wnfj21&z%VSSVPh#|lWPQ?4O4PRH|bBZI%??Q>Y6XA1A%NYgG?&yh#6^> zsVwMPZ(Ni4ym|T{*#{(vsOhT&2^F&-TZ6psx`{a%%PEy5HzPdAMDLwzsr=v5O+y^gF(rNE^t(_T~ zs(Q&(#^(ZWEQr-gYYk|3iRUR%(-ENS7-2Vcq@|?Wywpk*(%&%OKELyAuW8djTyIte z)V5FBVq1tjBWYYbV+@-)LL2R>Ke}T=_E3UP_JDDJmSIh7NdCE!1FhS!oagDye%g~q zh0uFc#5N3OXIU_?0XpJ$*<*mA5em={9y({to@3g088t>>tRL*aPU(~3$fWe+R|L2J z9f52IUS)3uNG?Q03b!eMHjxev$V;oZE1AFte91mK2HDaJXbPYsK$^}B>=851`M?)fnXxT8+Pj;}M+E=m4lr1^k+}5SW2P?gRnF0ltSns6C2e)Jo0a zH8^Z7;Uucplk%cequbm7*UP8z?^-U%4iX(m32a7Ije@%BBD|;@=%Qj-Wy$zIYPER) zynRsI02)n7K-9QM2_@Xz_i_6C0S-m8M&6<_{Ek9Yl{`;kz2*T6y0faU)@YBH7YkuQ zY7fo%Jn>$CJ4t$>WIWQymeEv?Nl{!=%HWT>qTF%pbA%cyOa$tcu(I-sy{2;0e4K91 z7lc~_a8TK+f|o0s?7b{6po0pJ9LLbWL9%Q*-raTnT;p|?%if_&-9+&>THr9zY4e`>(jxT zvu*D%J5ve$LF4KAM9gHG8L83oUTIW>GnNmqm(xQXBk25NGK6LgQ^am|S5{BZ8wzsN z81OI5iX^b2lDy0tXoylW*HJZ6(Yf+?}g8YcYHRB{&O)J9sDIdW$ZxmYiM_M`JSzK#K4snJqP zptW@Kq=Rj$0zmR-{3pK{o5{v2YCTe6PJXhT zYP{M;P^$qU0T2a)&T-aeh}HT@d(}eE#cu`?z#M`54cv*|sJt;BKKBz4eVFbd|GG8% z5M()Rlq}eM4V>)|G~5b8wROQ2J~v zdF}d5Y%xrN=r%NovD&#J4qDO1NMmsn=il?6LWeMVeLW#C&qCk?N)A+9HKMG?oNC^O zcZqRhf55>d+ZaQ|HX|5-xeOdB*vUv7?1|qtk+Vjfk4!fnda5PgGuk>E}jLC z`!w;-JZVu@kt`7UHeIY4TCxQKxcQb=g+C5&-Rrle3WokbuldT$;N+2>2Y!n>?uJ*@q&Fdz6SK!7oGA6N5T`b zt->m~M)CBmSj*n*X}_M)d<_J(ak#aO;|b1@ZR=X-gI?~|Cl1-%Hlmw z-%;Cez@NXfdpI&5Y(&QBvn0gQKw{&y_+w#{fUZTy?gLFA`V0HByS$(}IugjxGY=bz z4qbnzHFY6ARsgc+NdbM@w5{My{5SI*!ee}GH|+B52R13b{vQV1a=pdP-$%t6N_3ca zY7S&v=gfLICB8o;v(mOue_}2|FD_1hyekk=1-|gRJq?>N+yg(l9kGaLoJ$%)C&v~p zd*7!sH7-NG(1^k~6UxzP;*!xHazI=4x?S;roGgZp1C-#Zky~4U;8rc{MnnJ3uA*0P zrv(=cI1K2mhVSwEHq&l}kFI0mSW*)`mI`=CTNy<>`o>Jda#Yp=y@M)wdG#OwNkF#0 zBou&$H*Unh(z=N!Va9Dlva+nV;#mchq~YoXxrH#E^2MH$-N|#G(A%#4Qg_twAtT(H z7}Gg5o3IrW)EV_dPlIkVEehb7urr@hneh+-7Qwd{IsM2C+g8tak2?#S=4}W;f)et<__wc0uL!Zp#@Jx@o?2o#&b+*=_RWrg^}5kq*h{(AsYb~ z+lC$!G1_JBLO6`ux<42Lvz`&#>}28n&8cI7;1V1M9)ZBXNz1tdm6)XOlG*ppXUfYU{U)kGl^8=wlA`aKc{n_{m?|I-= z5=OCi<1n;i=C`-EbBW-+KORzS?@S9Min$TN?(<}~2V_iJt#W#^zJh@(uF6!tE5O_{ z+Q*dvA^2<|lfi9tI6bm^6@)f86h)%BQM1n4r_-g!8d0+5R7HLrtC<~mb)J(a>{PsfAw2xNdCr!X5Z?e9b z0nT}nvaaTsKQBEp#m~66Mf{N_&SwX8ayRYc{vj1vSQ5Y2gFnRJ8)jyaqP9IHx0w8; z?L$C3v+M$Gq0WsP_aQ3Iw~0~qJObL>2~ECt_e9A1mZ>BJ4{Z+NZ0V{>FlGcD%1I3Q zu=!YQkz&7re1^hL`j5tvrMa5u9B#I*WoK0g3fM+cLCM-!Xh@@Hf%_exPJwUN<@lbT zXO;&AbNOaXj9^m_-YxIFLny{wn~6+|=?OWmNQrb4#`FD`*p~yrZM(cpT=AVz5n(bn zi2<&ta~xNgAYOe0;Ib9`&!oW_TVeCWK!hmq4|PXFO81^96rc~JoC5v}u|u4#XjtrT zd*{5IK-`w9&sKIkd8FQBa1u(5mk|5Y`wMu(U#(V^d@YKQzPHGZucnrSa{fUOFpY=G z%=3ibZ*ZgTJ$kU&RJ8Vi>Q-Y%*k>XS0=iW5cZl=tap+n!9qwW3u?J2Xb)CK-H?>PTnNB!Y!S|Kk^qBo$)bugJ#a$uvy zFkiiQ1$VNkO1j}9OkEBMepL!cdowPSJK^8bzLirQ*sFx%8fsW6wGk1@R~|VLrT({_ z5sESr{n!4w{hP_p^k%%u=7=UFw18K{@Lh{BCjf)-L)?MsfRZ~l=;-z4%&r}W0yp|G z+3s9SMsYlMrr(L7o*#Ka&id#JIye8_V~1U0-E3***K@8&DW8$^|EqNIcpSeu=!lFflQ@?$U(nF(j|~(DQd=W5z8sO_yC=!`*9=!945lLrI-5ZrGKg+_#%H6E- z!k~;6j8)83+-D3?-3-KIFDV!REEeou&0c&st9ZgWbt9g3iuyQ7G!6L(cZnaHqjzJq zGJ#)!a;`D%wD6Q9rfW~yTy;B5OA>C#!KnU4rZV0y>kJhLP5x%AXyHVBwXlMsy`d;I zS<5uK#_9Nef^SmxWF7v!I*4K^JP`LuiS4|g|K)Uzi_9$-fA;<~4^e3))XU;a zS*`3OpzNKfj*f1=2nhK81V2O;A>zZuV<60s=gEd4-K0Sn-gUo0(eHs4vMp0E&td1z zUB6Bg?TEIj$Wpr`B$$92vVK+K6w+Sfv8Perx<1)+$rqP;ONW?}{P!esQ9Vl6z<_*! zjju#*m$a=Ge0dT}zun0Bbr^!XSS^DsRC<>HZla)eOF%%55!Gp(n?A=HV0735>1b48 zXFQ@!(3l|BgtKV6-SeEKTqN^ZF#*;ZcwH33{Y`OVGa)D)oAxJs@r~2-EPO# zZQlNoUqagR+Etuk*rf|D52+)wtf|)WW&w$K-EOZvQaLgNEs*+F)AzZrWet2l6v>85-NqFanH0Pz$s zFAx6ST$j-UKFM)p7Ec)oPZ7w6hNNdOhRiKNh>uLEuNSZ3p8IyUfT)-UnH1~tbxH+@N^4@0cf1-`D^cojqfWb}YuT*@gZsa@r*NGj}JUiDRQU8|q5pAUQgV*~e z&u5Nfg{V>S``!;N(jaeYK7jZ6R5|`G#uNWW1rTR#DIOJ1xu2~$;o7^|NPAA}YJF)z zjT(}wRH90tHUfBg0O%^;m7+Hz1_bXU^%>N#XRKsMw^9Tuj%?wxAXx>-4M4qO>Gi(3 z1R7xQaB?n{61udIgk9VKD8pP(%yEyl`lcG;2&_S=I)s>vf=yJK^!<9|ed^+?Nx5 zE7nNODkX#41b7P4Qjt8@~F zfp**gbGI?%lW0_hU8TYfLoxhbKMX7amH)l9%#EGt01VBfO;}mFECozksnk!pFyE=m z?6=txL2>3P`;lcg2za(2-V08B5-4{q1@$_v;MJ$?*+&PAYtNj-M(A+Y z%#pV$`WW1#Y}kp?=`S&VaBBa|Hk-{|ss~%Ut%7lg5wD;EQBsvqS}VQR`b)C_vO;Qt zTD|gD){x9(>M}{LG^Bj~3El1y{8-Sh7RDKR_#K>B!qo}>oYo4hwFkKI_%}a$n*4fp ztU+-)A^qsyj+@_FI|x&9HBE%r;rVkwaA^<+;%y-4&M?D}d@XrnD1^6=qm z8%x};t31&F&A@5m3-_{)YUgs%C9CAyba-dq^gh9?VD({yX2kKa1gMS-AOo=Gw>erf zXm(N-WuzUubl?CClvpfkMPqC^Krf#v9ud7lWbzn#cKw7dUin*hn-AUPQZK?DD&UO) z3h9~K@X}nx;Wg;>x2XwOD8i&Hxr*hK3iYA;hL@MW2z7Wd?|H3Sq%>eCJw8}y8UT!h z2nr@4+CVgcU=Xt5GJ?q8LWYoOQGL?o6m)Yh&ndGU;Y?Ems#OvU<@&5NT!=jHp*fs( z4$=4eS%DMq_zT!59ZuBK)7b#go~yv%o-~KHa?5&rt^1~aJU!%M)%zQjG)ZUn%waIm zpQU6-Lf}FJ?WN#?ta|Sq1*zw^imh|Vwrv4YAi}`Bn&A|yeJlFCZj60|%%FeADAl^s@_D&<2)X=iXM_cO7!G{8vPp8?Llzu6T&h z04BdiqY#DmZ#Uc3`-KW`CC-i&4_xu((ML~Uo8CMMzZQDr>xGwe18rFcmluCmx8f%k zh5R5Nz~~n4sNH8u%Z7wxA*9cD>2(wSx#isEkNiNwY>0J204I#cQ@zCsepFBKao%ox z_?(+*x4yV)n(>5ER+J1q;%nEj0>J%`x1y0--^!B`4&ji1NsfSqT zLLJ89W7yj<2iZJ3t&l8LLAn2}E6}8k{;VGl^V3uo{g#|dDE_Tf>;h}$RZ54kL$1@{ z+$=t!<>AZJ^Vjf+`PQBGkPmW~gEvrj$!>@}9u_Jszs+GO5dow*#N_I#vtaiZB|Hj` zS#c-Upx;UJ8+ynbZVe*y36zj^&B>rs@{PQ0TH@PF&`lf*g_tal{(f4&_J1CGS<=6z zA>^Odn&u?Odw^F0CwT)nX+D3viWBpom72uRJrct{29kY zT0BFdAv>>C-Vr4%MTt4LJ48N-pMK<^)m=wv^*H~xPEn7y+42DGC)La9VO*fn^WC!n z4-qvsd=D6~SIv+-pY2HJyBl!xL0f_5 zj?1Af&5_vU#ZZrlmX}@?G9^Jt=!mKg_YQZehkd;z-znVUe6;2R-xy@AC#xl*G@;9^ zSmvl}JbQXkfQj)mL(4^V!tii%DCLm6p+fN0qk9PKDs*=iDXw?s3wTTZA7f^+l5%V> zcC^^1UNrq4f;dutMJDb%I}vT`pl(5o9MC30;17fSWP_vQ0W?7$I>gH)^upFQZLCqb zd575?%Y}kFqfjs||GYU^$h z8Z_b36W_GEC=a(({Pr_-M4ae34(<};@8?LY+*2+i>bM`)B>8$Hxx)+p}(^58+gqdfMFn@ zF>io&Oo$iIC;}w-&m0rfmn!f7rqT;64ZO^YHUw*B9zpIjzNNr5*5Aa$xl)a$Vsg!8*p94N1_hIuefQ!!cv4`VC3V8RKc#rIxs&gg&(v9pT=*mpL&z{g zH18uB`sbjLZ<&@gc;!pE>>1tVq=1&tM6c%WmPcnf6muJbjMCr}TzYwSnGi*hvTL5! zO{nro9yMH-CLn9YL{N++elhn!vL?h+zNyo%Ut~eZk^Yz2*S=?5%WurOqyd)GoZpQ)&ZQ|k&FE@eH`zjt>XzdB(4`Cy8F zt5v^DuFtt%GCLA}O5Db!y0gr)-{wi$U<4oa>Xm2G0?h3C7CgK!bAQGM&|LrN3iwf)-(pYgvJP{6Z>huYzc#BM*+i+`*uYaiJ1ZimswN}5)l<(t3 zI-%Y9dGiSUqyu?7*%gk5tEH|k&qU%h=h5d=!!bHdmyZl;$pn_M2vlf9{dj3*A%e}Ay}T`9l;{i)8v)qC14nnUp5&|qWAk{oIr`| zbL`Bl|Lb_tMa_;wDwnXuxiw53&p@>XHLl;O%g>H@ji1_zZfM5%RAtN*YrLeMG7&1a zOki%rJqWZ+!Mk=~)5;bqZ&!PZW!WbP?4+_guNn%Eb|QpIIIzSulCKn{+?cV)m(<_X z@wHUdx#p{8-F}ngMQ9ppDmcxzc!>=)(EdojZ-6-I2e@INlS17Oc^+jsi392c4(76{ zNy&97XXueth1e!IqTG?fEXQ)Pc`cICn>s+BM5_KGUb|FRiWidm@^l1uZr6IA1TSVy z2!S};dL$iaCv{_WC`0T|#isy1KDxy33j(I%i!J%*+PW(2u0o6X#$%F7v-{ucFqoFSG@F>!I z^aDXU|H^12ix1q}^q8lDuM`GMe3g?j>Heag0Py6WVV}{5ZfA!?*>on~lQ&@gceHk; z;9J1eN)VoudeRxl-5B&dBcS=GY z5rV(nuud(l6SZ|8c=+}`ywJ2O6Mtg_0X*V9po?)RJ=j8PP-77DDDXJnALQ@QCkrJH zKxaC$!kk@J(oLtVwWSxJTBsIOVRwG+3E#!CtTCGk-%}<#(G4DJ*Oy62 zMUJ<#wBQzvxAVidA&hHBTcB|$t9J=7aS0H1?QTpC*aA;LJ<{3DbC+STr=?z&rVV?0qIgJdA z<(Lg!yuD7QVm1A&IO`ztsL0R}iw0Go&A>${XCnTEbN}*!O|6-Z0SG#6fp1n)kVC!0 z^$-NqR5Zh({A z+d6lAX7>^vQr=JM+(n!H1=w^J{qi*5R|3(??3an#x#8`aE>>=%*>xiB;k+Ue25F*l zBUVGe-<_leyC?eFFnYoThx714gM#&Kp}**7Y`A`k2+vjw(R=^ zi~$%;G9L8i7XXYUZxb1_BiqyT0~Q_rd5%(HYzFuw3OxP##HV@WENvMAKvPHV#<2Gf zN6dHNAWuoqn9dbFV3OB(rLe|;#@JN?uSv6%~BWEqa9ez#`4SmafJU_~Zo z?OXrF|GS<+>0n_Io@RU5Mxv*jT)rIk;`H$v7_;fUhQ0EB0cho6IhPh89Qc3q1v%a@ zEV}x~vvUDI5**X{6T2+g)D+uz?Z@~4*r9Jxoh+RtyGyyO<;hV#06d<&9*9XsA*uv@ zh;+z$=zcegnkKAAHJqm?3gg9X_Qr-H&CigK)vwabFGcJDU7<)LmV-3tPQyP&h?h_y z!?2iembU=FDnanLaHay8gir$QT%;Q+a~{`1S)jlLHC~ooe!48ZcBHmBX`w)mF)zDm zIEjnPnDy3WY6(S22!G>J;1#OkF6`7qSD>Hf|LPY3Sw*2q9j^31R8ajrt;VcDA8PSyD$Kb)yz z>EOuG6?|v9POsL3Wxmr5^G;L<2`~B|CIdBWw7D650xq1MA z+h*9cNdju=wAXbKPWLBh44WdS(PS~)hQI$g&j+Y`bHRaH#RGsIh$IoW{E~%^mbKNS zWZxBHZj4Eu3HP5(MY})&2`nn}@{e-(hyQqd5QL01L2~jN-Oj%Ne=}>zfy-wwDi!sT zNdVapS;Wi4s;)^gc8OiQwoe!Le=+H5TIWYJPP1}|lzkvxm#}k-c-|M|{IH~1urejb zU`jLMhg&^hERv7H;9{hL8U5`9k$W?NNd4ne=A4VUw zPlM=5BdEf53P=Lf7b)d@gxdg}XP(V3uE_p0=V$Nm-fU$na1e(fV?8Nez~1=Kr1->W zUYR(K4yIymS7CPI+5Un17W<}9jn`5*a+dmIJApQ1Mcq(bS{+SH^X+9(Rca6TBijHO1A; z0GZn44IKhK1D@8oF^^Df*HH5@fqWq2ykb5R2l}oL8#^vg{3%&f)trjC*)(*1s-hEc zw6VQO-Wzd-dan=CP!a$KdME+Bod#lNBKz!@F^BfUhBoeKW4%!PV|;Fc2TlfrY7_gL zUx4WbinJfqIFGl4rEAcCKdt6Q;p#c1Sf}PHgKwZLF7WTSJ&UiMpVX-wMaV5LBCfQn z9T_+jmqY>&b@+Yx2#kOv1k2=&(s-h0dW!84s09eqR0R*C2q?&a3>O2{*mc&j}i-sRgb;H=isR$v1M>Nsw=c{ z5Ti+}>Tw^aBGnntw>tEU8|9V_$weie%QXQOqwjbMGZ+H{q`-|e98Yo;V^oi`%1&7M zcH70c%O#qPfpCq0IkufYf}#fyamXH)2Dwctoz^^hdMQPxD{#kx*0@2#FzHN$#sAz^ zMp*O!?!k_aOL)Vu1-zr62R(xw09yc3p7rgEb76c?q;Ncx+D$t~pBZZOqrLUdG3=nY z&KZlf-f){rx9+Z2^zA{{ls zp@UJ`%=p%1(n1mxHtJcM?O9Z`QbeWEjv8qu`Ol{7mC9H#{fC9=y1EqL;6oN{TV=f_ zvft!@c?SE5TeN`5VHz5y&>|DnE?f)~adoroZPJ!<1xmXJVX`>)awDf%8;)T2qoWXd z<`UU~?Z-<{(Y}#G_0DVRa{bZP1t6`Ro8-7vzc0tm+^PJVV!oPuoB*Zqox-Y)@drqE z9`dIHuP|?K0*Ck9s?X$+8f0wR23<7Fv~CAH)Mk-NSB!1~TZ_u)!;HZ5CUy2L$Qw6r z>I~w4rRz;bfhI%`%QedKxSE;i25Zw}cn+(%Uiv#6xt)nkX?ge(CgZCN-m0sXK6t0( z))9ixYb%cyRgdfN=?3a|GjS~{+wP9^I{dYM;k=na9a%%Z?UNgDi>SA|`==g*3`@!& zcMre|gOlm5hmu**Lm1G-VJN?&pbOoux-+-cF4L5_z=$Mjxc=|@@(zu)aS+?i>*5T* zASolrSRz1t$oo{?)7`lu(QsZ$*-4562`I2k9yBvB93znuChn45CdGe|8 zJxkwu`6pGP3Z)aNKjA5`>C<_%$5G3kqyLpa?ki#MR$0n}_!le;-#*m2r5#U&^a91p z*T9`tX?SRuvbCGo4uDV^zG^q7=OBfty`$*;i{gK>FkhdK7RHFJa*!aV^&qtiP0hf4 z(8mN`+=EtxVRbn?cwjxJI-Phlx&u5DicxE!s*pB5g(6FiJ|Spj$cgaFkEJH-SdEwN z@GX(7Dy8D^0A{}YUYWb>g+c}HdB@(K+jd$2(q|e3d_j0GvUSLF3bgHG z#CMYw$>O6<7AeiLkWL?x>54`>8vM+9`;Ov{Wc&6{&L1!BF(^C!_C58vm)^vN zz>aVXldt6iUMr>~0>s}OX&TrnJ@07~;Lu$6!yXI#(V3_Y5Z2AQlM!Ggu>jMD->P6!PbW}GxMaZCO~zM+Eb=1l&OnE zW_0R!mzX7d-D!Dv^u8X7)okRq?@&52dn|@7&mEfcy>#a-ok`FmJ4#Kh*4~HQdl;@G zaZ^|48Ex}N{@m5^L~R(1Rq>cduu9O4(!W#f1?L#W!b7S(j>14yD7}TPlpM8t+EYx) z?&92ufq|`HSU6h#It(Mvi#a~~-?%*$>}2Sp7cz+IA30p&{6^WX$viLvwz){@Ho$E zEDkikG&3FpMacMw&ZiMPV4rjJXgOqwZ16XWM@$#0WUlyLNF*)$78P1a=`^RbxuKvG zxA;FST>RND_Kp+dPv;pHOzi+;Za*!hI}|o)cwVAS%4XK~IrlllZV4|8n@8=@nVm@S zw>7Z(z0XcOLr;JQ0yc>vGs2Ft{fGc7E%&X*NV{fRchJDiAU8qC%lkq)xWaIf>QJCG z3VDBM$)}ZXN#>%tVe`qJ*_Cq4)N9u`!Wo@{kI#Y=Dx2^GVq1NRt)qYOyO8oTK(7EN zCoo(APiPt|K&T^~w{xz@*&;l5U;qGcSO5S4^W+!C&*u=3V_j02E-_Mo%JCC{A=E@y zV-jvzr|zzw9r|!7s&Us&haN2)Q{(tch7rCc_Uz@>=9vkvxLj~`pilNQ;eHVkZtLt( z!)_1lZ}3voJ0+X6ny)ewl77_gx-8XpY?Veu*cISI9W<=DhnrjZVgLOryGK<)bI>x# zcDX9HW!aB_x=Y|MTk`Bp(&&43QC|)KBwjQ%Whvv%9znDBVie9(3Ns*1TdYTQD&f15 zeZJO~ArxmRoq{d$>6kLLv}43W%fC0u9HmANDLy>kRF0pjTN;Bj#zPX3=TMd?2gt4l zIYU32y_;_9E>ZNIXoc!rBcUst5Jk5pke7YaZ7%7l$o6-0w^qoCH{aQ=0D`o=OFr1rR%N z3af3!F_SKT6iqg*%;Axi)c86$eQ zsHxuvoaXpw%zybo*_pAm39!_VY=#XTlw;Cw);k_s6XkTL73->2gyZvc%673>Ph?j2 zZM>u-ht7H{a04P}xIDBJtOnx_=M_2=Xvp_K4n+pYr9^otTLClU;vg8GXZvs<#gJ4! z=3JB|GtOzhUBj&{4!h(SyMUr4TSFw&p3is!yyGTTIv-nl(&D)}1oo%o^Hu4)%9tSx zjLc5OSw9AmW?ZX#idtO3OWIEOlV1+xhrpB?%9h|Z;;QUlAU}Wq|1>A~z(KcTV!wzv zav$hzb$eIh`}54BahIB@k)~&IA3wYpg&MLz>Z+gFFCFQvvTyZwDucACYqP%Pq6I37#~pbAhQQ*v2^RO%b6#xh zV!Okw+ySo;ZG&U{xnu+t4$rAAMT!VB5Lc(}?IXLP2z#{y!9he2S<?B1zrtO>41- z>>Ce1)qwDkH3;j#v8j}HP^>qZHJ`hb!k8GJy)%sI7;A`MiI8yn-p9RYC>Roxe!pUj zFQW$LqrZ0@bdEYxqBZOuv^Xkre=q)_{NCNsP^lhDP+!qP=6yi);NHY042LzV%{F){ zx~uY(mt%~zJ`>X%k1QHei@K!xEG0q@1iUy;8L-3I>Nb!|gcHN2Lg?zK;Mr}T!3q`D&0veWWFH%<%i@77mkYCDMTN7wo<*6D`k+G>j9=JsdBcTm6S6IXaM&g6F#53e9MT1+A!@jH4AK~gcT7jtr`9a8I z$B)JR%W#3DZ1SGK$5VJuD)RC)pt&<2p*{f3aT7x`z|Q_2<&MM)v!gdEy=RWauhv?h zyff~acC0oMUQ`2PdP5VAOyW$1cb+B>G7emw=+11&&9CpicIyfB4u=3BY8($;N6 zJM3*y*8ZK1tDimpIdVJ!r<<^ zfTnGXasETwXG6*OZ&0DGvnT9ja)y-R*l1SRK@&LU?7*6!JGtH`c?z!}R6YGY6-A@b zxF3D>iy}{l;(FC>$y<0z53E$-K!$MuLA13sJ#;ElB4#wM;x)xQ4y&qKnP8bAjy=#M z{ydyYsy+ZX!K{AILilwAn}7|wzB~ubzPI|(UD?rn;7EKzIZK-e+Xd`s&|QX10E^Ks z2-8Yk&1lyiRQ>yNmQdNYohNM)!A~d*{_oK@!c*c9d@|p*q@TseKzw)(c$V}~Rtoit zp%<3d!P{;$)p0!%pM$tSdD~ae8IDWo5c2~)hCZa9F`rs4L!{Z9&pqaz z+Q@&&H^@5oww{DB1SFvL$p`TXSSw)sv8mj|0e6|?jo|!bLt}X{v~I9~g1>6KamG>` zv?0L!K-bodGTgVI000j&`yvUT5H?URcLk^FKzTf93vri~aIJDnCg2&NMnczaHz(6soUw*s4`xn2Z^#3eZI@RVjWgW_%W_lnQLwn_`eN!%-)95{?v|jZM7wWO%tK5 zVR&^dwl^2&i&nnoYjeB+gn=6BW?P!jY9QQ$y{w74zL()H5qo?+bnB#fo0OOeSy2t; z*tkao1TGkrRf=Y)Y;$?Q5a;K{A6YJt@}XH(@6;Cq{T{Lhkw{S5gWX}tWrWgR;WhSU zZDV@(Ph~6^k)Q5A9iaMPj*3Gxjcg1*g3PZjRG7Gx>z-ds!h}k|1>5|lZALUu<#J1% z*-$3+Xl}GPpg$(2H#wsyb5AyV%5SB$-|mECId>WMD!wkbZ%jP`y;$2Vp`wE{7L63G zXDqh!bTB3_)v`3endf~jTE31fRh`j?TPfnng=sNRaJ#SiD(6nuLhBEG5=ye@mj(N6 z3^nvPV0@m5Nv~6ETR<%jd4p9@nT{FbT%s&k`NwaWgYFv7V~{V*Yz2>xXaKS^4%N`f zb55`TGk&JNDjU~L>!jIlluJV*N!=~aLu_JUIppf4_5(OK7*wupqa{5hlq^WxC#sw> z?-$zLa}4nC=W(mm?%55VeVh_!6CD|b2dGV6P=v|Oy1Q3Jg2nY;6-(EW|D=fx&f>ZO zD!w3d4H!1+N>X~jqyf8dVEPB310=feh2L6Uy!TId_IfwM5Oj^w0CW};)3*&XuZ>b{ zwB#w*dYo()ogZ}G4w@Fmls4u{5TPXv8vT%Lb;D&t1eX${@5|&pG?&iQE%N|`}YNJ`3OT3sxE5P*^ud*|Bjtoq-S_^j*8a@H3Da7OB@ak2*igycwdaeqy8 zr;Y=BlgD-h;e22XL3By3lisn=gO`Z@)sO5hp^CiBLxEWrao9&{gKA_ZQwMCE#Gti& zoHe2-7TBstPO+VK$op+%0zV7=udEw>xcG!5bZroth<dEBy31*l3njIl|&NNhC7`xccSEG`syo!9M|jjx)EG2%HHIMFMY`UYGcS zy1XK_Bh8rqXQ!+iLEZ0~QGa}%0i_uwpb+FVD>-hPj9$NiZ}8_nbT$4a-#;;|(k6lb z7!qvTTIEMHoUO@6_p;n=0-Rk-vg#k{x-}q+fKV;IEe2m`0kU)F)>`x7Gzip8=0Eu4 z^tNB7FNuy!qtILiAKOwbOlI~?k9aWcy7%gx^D$Ye>2lSKNjopLJq7(jp<3d`KuYcA zG3u??LVg5h%g=On&h?%eh!-J4J1phdu>?WuYxta4%tZ%t*W;LCCh}j;w`h1Z5QuMv zfHU(<0SzcWAQ0Sw6x39tRZ<}7nPHG08A0GbPCF?sexXx102;%LVmzO+(!&|7a!XbN z1+4&-|Ga!3dQilYh(RR0JBIj`Jo||eXSgp!Ozh!+PpCS8!!LykQN{)^K_i;5bno-W z>!oRTiAfLk4OfhS{jUsPOVp#oeV{#Rm{rL(NI8y$8Ll?`+gY=5sZ9D~PdTA%x9e=Fl&qkdW0@tdem`@B=&;LkHR%nA33PKoiD-@6_a z5^;FKSH+4njiAVY{S_Q;@FyR=!#4nb>R1gW_(x!>M_9Lxo$gd;44&?NuKVObU;k{q zCHoXW6N75vqDzlU;(sakL8@AhTG={{!c<Il&`>`D8@W^=W&LDuY0viU?Ay_Cl5G#UBWbgx>aV^Llz`cMPqrLw(378? zkK1`j%mZTCxTSv_CRr=@#e9Qz=Z{S&JjNlL1VlFo3gfw(Q6teXgCSY3lcCq!BnF33 zS)YLn!1n$2$*gm4s-K9=3zh1HT~|T!Ojmpq6I(Gu#Zf#cGy@Cc5(k(0LC4H2{?I$71tPhY@zomQtT3oK%r=VYlMVCWUTx?*6Q?Mobwl;C5C8x-0~i1eEu-Whn(b+{@pXq)KyCS(n_UfP8`4HPbUBWEr1RW6O%e;3 zW$1BD);_XMi!5`ohT-0&2RG1P89({Za0dPRVUyGs?+*`*x^5zPVwS9aMy(!sMaS1?L$qo3%%r@BwLqM&25MJiGB z2sR}c%sIPCZ6ULd9CV$m76Ei{A^=;F+;(@AwV-$?h3|L>r~EDpw({=WX>Qq=WTbNo zX{0_-TN(rgV7t0*inLux`%$VNtLSwm=?Ox!9d%5uH{KdWwq0xlRP=Z}1ot{@58JFZ zoU^fQgUaxj^rYSd+kjWIwVL<3#C;sVWiV zhX94z7GX9_{EJFcJXnV|`j&E%BBc&2C!0(9z1#H!%)}Z@ToR?!&}CjtdT?6t){i>i z8Y9dH2@3a$)9I!(qXI9H7^>AZ`te@x;ljzY+;PkUr7P-*@cD{WbS>c|B2m&EUhAN( z`QmYKz#%w6od(;+Z4j0}KEfh zc?UFt9lFDN?jLxM_pI;F1r?9Ac{H%@lH8^^ z^0gU4sZ*{~|MAlspzc})#JX#K*8sFe6_D4Uasg$`BlU_Xq<_I6F9N~CI6hzcdVa?jSp6=@(%{-l9 z_g3+}Qz3D}xL!lBjob3>KEq;pgov($<~0&HL#`SMJk?^6naPIIIqR_SBvH8T6oo@dz zfB*mi8No^;BY%LfBFAh3QFkeC7YcT;L=a%ukj)$PsTb=WCwIJdmD{ zp8zb93`YuQ(RDm|K_T^j3Ui-!rdTAfUpiCnYjiuDUlLUaLx%lA)6kTdAtp0Gj_N*` zVfuG=Jy+)?=`5K1jTnj(!bDt3pRH3)gptqH52u|!{#8{vrZmj(D?x1g>^i#}x(cl2 zCYiL7!k|G+Lc>@OdU=LPSS`wIB(V`I-cnJ!RWx^tgXUxyJV`6B{)Oy;D5lSHRkADV z*@Y8g-Z$Mg%z@}Olat>ncx`^idkbH%+8*F9{`=JqChZU*Gs@G6Z9?=D{6}@J-o4joj z6#<|~-~*nbCSI%&i~yBC192(3Jb!)-Qiv`E7ZvSn*$d=#BsdlD&Sd~@j1&y@j0CUc zXqq%u#ZZ9bH)Wc@(ABnWkk_Q|1V>(lg5lzW4O9V_(zu2ymP&+pX!guJa}5FMV55%X z8KI$_BHLXJ2a6M)Exv7$t!9O~U4u#I`i^)$d}q+IvJbc&XIp~agqoFp?>)XEOQ5va z_rR{;G4pJ^eKp7i_U2D5AF6cndL2rG((W$+R4D-w&tlWHICL?uE1?Hf)t=Zt6{cVn zRVbKR_ICSo8<(=ZD}hda*U{B_{R6j%4D>{6+ZugU^8E*JPFA&C!SRe&iuA?7#>+Y0 zYntTOh_OGg0UDo~HwlCZ6Zm2k)$F3M2WF9K27a{$m;fq;XRZ9#{k^O5ox!9+)&kYe z2EHJm5p8)E-4Wfx9)tQ2T%bST!hGleu(< z`U&W$2Wv=`lG2(;+QD2hLQyQ`_iyM zEZp`cR8%g&L}UL`egOsjv}bJoY(MtHI%ofy-;+qG zaC%5P`eks{dz@L;>TVbuW39UbLLct_wn9fSYs%452RYJM&$H59 za`&g9L%ic1pR_IM+lXGq9gXo?p2n)0nnoK7E?ZGGniKg$H&h|FJhKy@t9*UgheFZ_ z#LKEseqFaZm~wGkbv0~Hm8&cE@W}|ZorT&kSRV2)a!X1yZUAbo?FsZc;MR9bSnj>1 zbpjxgJ6LbKx`s|}IGvKCtT+tuDOqw%g%oT-!Z^(Gb;)YI+6#-+g@x)}8>>G-)GVo_ zXS$FEL~w2zb(2^A)MqA1#=t@2Nhhos6g&xu_!<<JN6j=AGdvAulrfgZC4UB( z_f2AYV|Ofu%hnD}@V+!oE9euja-fgU*8oRAxWB1MKuJMhT~1d2oH9>^tDO1Y3lj`^ zn9IMk#PP+m_K50?|RU;IPX1_VU>pX#l>L_m`L*Ls2| zg?UV6WM78Ba2v)UGRk(#aHbKZ@S_|O&9pnE>;kDH0?a|8Y=l5LjH&jfz+`3$18w%% zgON7vdxrlz5qUO<6>8Q%{0@A~ka^2uC35zC34TM%9Yb8&fXr+MFyI~i?;ZE>MH% zZ|40IC=}65cR1l-Aa?z3zuAQ91=zdi+t!}|0000000+;y)t+yVg+BrYMknCAWYKX_ z|OHeDKFY-1>4PuJY5SWmfYbBnqJGl8~j@SmYF@%9f*i3oFp^JNpU)TlK@w zfjuvsOp$`yocdfn4f{v%9_E535pM)o?7T+fV7-!y3=gD%aOgYwZ>hWgziR-LDDdHq z)y3Colku1zeS7>22#MBuT+?}rbnd>bnkz7#O)#JU0KvHNx?vFumgy!KI*rGt{r+uh>&st184H*FwO`61 zhL6{?vJmOe?Q?~}k9ghc>3M&Dma>6PB{YVh?LKS~V&SJf`#6wmfC2j89gwDz-4()` zuh2Sr6T`*2^H;xKryr)uKOe#suOyUW34x>e9CGuR8Tm~T9vhqEtbPFK33Y8@%uQze zQ=+L91IZHrgHE=h$TRciMt^Z5BLy5<*EhWHvvQf_*Et7Co=Rp7G8Xg&CVG)Im2*I_ zEO^mlO-jacYFdE!dc)K0rM*K-~ug&8`jDA$MLmRCHI;EOAYxDP$7vup?l3 zKfjC)=qqWKT(&Y$M4Tz@Ud5-_&YEy>+iI6{+YvE}?q*M1QcWp?_COpbcs3e0ye%;f z8;5~1sE$jokIEcrgp!H#69Hp+?zh`OC|yf{q~m{S>lJdo$sZ_PC^if!jmwZ#rzHsD zCgq?@@7fON$*VrEJy)^ zpB^AdiVdDt-}Ws*>+=EykNp>C)8-S}rh-QcfWWg&WOQcW2M9RNOD0-e0Uy2;%7^ge z$XP8udj1SSa_sf9sEUDTN_tdTAr*jMZ(?s}ftOK0HOH@SWC87PdMlt(sL?Z&J*}6O z0ce~TJ<&&r?^AodexC&9{)Hhz+{%tPQ+F|qdW4E76%Nxjf8Nc@0`4jx)@{1lv4%=a ztx9#Y?wGIdVwy{CdM)qE;v^nNAXD#)nt3qPLhO?fWrH2wrVMGQx>`~=1%-2xYP0Ab+p`}}3*A*6F#R9}E( zi)=m$M&7rz&~ozWPE9r(GD5Mdx55PA<7xY2GX<9z<+i{tm13I2h{KDhbrW0Pu-9ck z0zHsrGxa>oyhdC45(Ir8-Ae@xrD?kk=R&-U~T~Nlt2+Wt@=Nk+lomF zpEl|>WEXb}UqjqlUKbuVpPIz?sJd&`jZ!c)lNKXMPfl?$OsE|cj*(EG+0tQBi4nU? zCt#GN3!iy)c5Rf1FdQki`{_9uj8(=GL)W9J8sBE1D57TGL zJ}mY=tR<>Kd>TM*e^})@?$X>rW9Zby_ot9=2oBD8ry9yq@kmw3-m9+k`QQWtDnH}4 z9x6JE+1&CA5s&u)%B)_!jJj9GiF#$yRx&M?#z587T>0r#LP7e9x>-?Z#B<=q& zMcG1BM7c!7B|4h~_(Q8!n2W1YPs=lG4L2EpkF~9anDRJz%V3l9vDheYS0XeQU>l0~ z0p0nSL3{8iJ8m|1W;>^9U~*6^yv}2QhOZ^eV{BmQl&q)HGc!olB}6MbE6ZiuJ9Dn5 zi2-EE7JYeg(IHo1IGZUwwlJ6DRL(xH_UQ5Hs_^JkXOL+1aWy2yE&+tQ=CgMY{_sQF zaVt2fG3&eXJ7KT$Enk`H+h-?@!w20}!F0d?_f?$>?Xc2{DKIK39G?i|U|jR4N<&iO zV#>CxcAPr@N3^4?@DM50ubX9d&!?1PW+RIb$V14ty=>j|W$++v=T!Kg=R~nc>5i~g zS&f%KooX4ka06`G86?p%2frQ+Aj z@8XR@*^C@p=kXn6>;gD4(7QW0h8)gnpqf$#Iyc=V#WAFk%{SbcAMj_eYWAP!fYayn z^`Idsz;xC?mL~d7k!!`0)y9Q zh$Bbq?>Ddzi^N)Q8OEofSq7u@NWBX0>Hgt+naLysaU*h~U^oj5M^p$ui;nhrlKp}b z!|r=8sTzdGxZmv5+yv{cO0m@4MP8WWT`?+rag@#Jj&0zv@~N2~sa_*b8kU(G~r-bElV- zy(0~s-y|dXRB&BP!Mo)E|MSko0=)68W|7-{D`mAo69aVu2Y5&2Ey*5u7jtRo&s~W% zf_72VQ3J3D8;n6C40R-4f40Zk7!2|?yy!UKxH@lrM}+Q%a&4Epwo~qhAtOTR8!s5w zsQYlO$)$1}hMs2OnX!s77VhwP0u4_p*w2*_mlHtq^M=x80EFGmMqc#J7{JYRw8`=` zqD4n3-QvI1)aakFNOKG)h{ve8E-&a5)T&mHVhliQGg3-KRag@%BbHz6Q~W7Pmb&Hc zRPU7xf$B%CM19!|6O>11NTDlH3`TkoP-ro!tMe_H{AVS1Z4xZH%q|M!+A-#*$KA$6 zfsb7M)3fOXZG{k%xw{VDv9oFoZxyk~@^706`|TM5s`d$nLzLXoTNx&MVT?e3+RPbc zQ3lspi=R54hL8{b+~PQ;eF*t2!74D0_F5T%SuSHOPK>voXT(fcwL>FBsZXs@v%=~` zOhx0=3rp5vqwJFad9CN_MJobn55^YP^9JA1g`49&;9Jriyn8$;? zrcexYXn~8_MTtn=n(*p@rP_yaxmKADzp_(=*i>dL6En&O@-K$#?Lf#8`J^EWXWL$! z`$V#p3Wi*Z3^?IE+`n#61m#-h*|(0pn$CaV<}7-U$$Z8%8}E=ZaE8-9CtfGN1FA2H-ZLAQkeOa{C&3EObJG!H!V1EHA$|t2 zjNR@s2xOrU((<{LqkD9K!Q_n845So49IzeAZl z>BiSK)LNd%iZ(mA0t1(vF;s}Jx2d_5|{R>e&8F75*T zaMb1G5jK0qZB;>4%iXK~#Ec(sTf-lR_zBe?mFb z=^7t$S0-RT?xVEa_s`Cz)Jz#3tDm-jQDbW>iFGt1)%cM6V`B%1Xz{%C%Mcu`sslM! zJ=AxKbeMC}@C&cu?xcn~)t&a&I-xac$v}sPrg#yWXUk9!qHFv3^i+;!A>Lu}PZizQ zVaGo@st+1LJHb+_L3gms0(l?aWePQ>u@twTOWQ1tUgZA$$E%v-Y53##AnDXjv=Z(@ ziftA$jt@C$hY3i zF!(ryM$#KghsjXo{6CaQZ+0$jclwBZoMa(MvWg@t{3T5`g}K~)>ICj(kH;F)keHg7 zv_O>*Vw@*&)m+*w%<{ZDgxQ4n6qH5lqt>FhJjKexQ6Cz%#jWf|v+@kuNHCDYLumBdwy(>&3npCY! zj?CB1Tp`b4#wRn^oC-{BHIx4{6=ucUrO6JyGfMnC%K9J}M~XB-rc<9KgU6RgER;O4 z_IS*4tiL=&^TXA=Fxzl0~Rk z#DqrvmA9I+-IQO*ikU*Q?*f>6a5Md1zZsOPQmmR-r!xz2Q<#COl{qh&Jm7#MX(5`Y zs+fe4tG=bap*5oc4<~#QzTJgMm3gV%m#Wpqv()lQO$qszD;^`h8vYffKpt8*LY>Sm zE+<9bk$-F;lVs^dHsI;p?$6Iz7K2>`6$5stR~v^Yw3<%8D|6q^se*2IAAgCM8kqC8 zLv7=u9v<5Wldyxd4@dC*Aclr=2{vR1EoG6{dI~7u9mgqD1b^%zBgq{1Hdg~X+*4bw z#xcn>*$Z%L=e5cZCzVGEz`XGeCy!TrAQ6~q*o-(lc)_$sY2u_?|MHcgs%NRH9z%mu z2B+S>KM*A5?^z-Ps@fX)mJr|GGav0JMWKc+sLAMoB~(Vh&UPz2R9H05=6#Ob5hHpT z$)x?^`{)h$coVhbr5<=ji7Q{5V(N`pue+aII&t5XO?;p8u*q27Um8;_w9VwzF6Ur& z-9D17g7!7W4Ib#kYU~MdOtm5$HldCp8CzjxiX%#U8hOR4{d2yX8T!D5B`T1}xlV@s znly@6EDP$#GR8bm+c7(44#vDCZp+ah>wRPYKAk6;hVdysxk8$Lz<qbqH_GHaPCOO{C%*BsLE)GO|IArnpt-_cjwg#2q>r)XhiM!;V#ZRT8) zy)LG*&G9Rs+klp*X+K)V=S)AcQ$A$#pjw4`3S==y8DKkwg0(Y6#Sn{I0>7A)^F{_r z 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�@{-S#_@^{@&hw5z*Fvrz)}r? z3Av0h9EstvCO-JBX9d{LCxgPY0Upc&-2>#ePyh{O+b;|_djzT};m9Rl5dsi>rHIF{ z9%IRL%p7~^>ctK21QDSq_2ZDk*c9ain)7VxTu5FE$RTT}Wx=u>06gHGShDsy*sy(Y zO`#?gTId5_A|8?teaV{bD&3E8oZmvRjdf1A3aQ(;32Zv&Sp=~8;qyR2+^-8-MZn_2 zgYYhB6HO-H`3oKg6Q|>AZtQ}u&C{Oo?Bu}9%ftA4zk09=GL#yR34u}5}Xv7@Asto+>?oG`X$shzzOi(40~D;sf|O1H>qWqn+U!k?&Z4yM9SoDfzYWLs^u!C?)tm ztIskL33T=BlYWVA>}Y!RiaC!E!6kbMuR0-lLSQXzkZd=iK}abf`xnTc$%jJp$)d!{ zWIzdHg$V=(fYJbQ{@j%4{a!WU{`an&RFBmy|O z+@a<(6DdoVpS4VDQp7}f$qz{bc-m!~ILuuFsl7<~d7z2Fh%fsTjx$T$rU57i>N*y3 z_j?df{(;GdS*F6r2IOTI8!#vYKM;P-6-)hW( z?WT2*sW8E4<(9;V$#9}5M}Il;xGZJS_uv~wT`|-aFVwF1d9ai=7#t>92P6pn?aKo7 zLwz(IH}gUtNOaEc?5{p79O|So`Xrh&o6|{Y&m$Pbu>ocs+i~u`{(SKdiqQpP5@UZ~m}0a50Kn}}ga7~l literal 0 HcmV?d00001 diff --git a/templates/with-cloudflare-website/redirects.js b/templates/with-cloudflare-website/redirects.js new file mode 100644 index 00000000000..21b76ecc1b8 --- /dev/null +++ b/templates/with-cloudflare-website/redirects.js @@ -0,0 +1,20 @@ +const redirects = async () => { + const internetExplorerRedirect = { + destination: '/ie-incompatible.html', + has: [ + { + type: 'header', + key: 'user-agent', + value: '(.*Trident.*)', // all ie browsers + }, + ], + permanent: false, + source: '/:path((?!ie-incompatible.html$).*)', // all pages except the incompatibility page + } + + const redirects = [internetExplorerRedirect] + + return redirects +} + +export default redirects diff --git a/templates/with-cloudflare-website/src/Footer/Component.tsx b/templates/with-cloudflare-website/src/Footer/Component.tsx new file mode 100644 index 00000000000..868908fa8a1 --- /dev/null +++ b/templates/with-cloudflare-website/src/Footer/Component.tsx @@ -0,0 +1,34 @@ +import { getCachedGlobal } from '@/utilities/getGlobals' +import Link from 'next/link' +import React from 'react' + +import type { Footer } from '@/payload-types' + +import { ThemeSelector } from '@/providers/Theme/ThemeSelector' +import { CMSLink } from '@/components/Link' +import { Logo } from '@/components/Logo/Logo' + +export async function Footer() { + const footerData: Footer = await getCachedGlobal('footer', 1)() + + const navItems = footerData?.navItems || [] + + return ( +
+
+ + + + +
+ + +
+
+
+ ) +} diff --git a/templates/with-cloudflare-website/src/Footer/RowLabel.tsx b/templates/with-cloudflare-website/src/Footer/RowLabel.tsx new file mode 100644 index 00000000000..a6f949459c6 --- /dev/null +++ b/templates/with-cloudflare-website/src/Footer/RowLabel.tsx @@ -0,0 +1,13 @@ +'use client' +import { Header } from '@/payload-types' +import { RowLabelProps, useRowLabel } from '@payloadcms/ui' + +export const RowLabel: React.FC = () => { + const data = useRowLabel[number]>() + + const label = data?.data?.link?.label + ? `Nav item ${data.rowNumber !== undefined ? data.rowNumber + 1 : ''}: ${data?.data?.link?.label}` + : 'Row' + + return
{label}
+} diff --git a/templates/with-cloudflare-website/src/Footer/config.ts b/templates/with-cloudflare-website/src/Footer/config.ts new file mode 100644 index 00000000000..ca9b54bc462 --- /dev/null +++ b/templates/with-cloudflare-website/src/Footer/config.ts @@ -0,0 +1,32 @@ +import type { GlobalConfig } from 'payload' + +import { link } from '@/fields/link' +import { revalidateFooter } from './hooks/revalidateFooter' + +export const Footer: GlobalConfig = { + slug: 'footer', + access: { + read: () => true, + }, + fields: [ + { + name: 'navItems', + type: 'array', + fields: [ + link({ + appearances: false, + }), + ], + maxRows: 6, + admin: { + initCollapsed: true, + components: { + RowLabel: '@/Footer/RowLabel#RowLabel', + }, + }, + }, + ], + hooks: { + afterChange: [revalidateFooter], + }, +} diff --git a/templates/with-cloudflare-website/src/Footer/hooks/revalidateFooter.ts b/templates/with-cloudflare-website/src/Footer/hooks/revalidateFooter.ts new file mode 100644 index 00000000000..df3acec0273 --- /dev/null +++ b/templates/with-cloudflare-website/src/Footer/hooks/revalidateFooter.ts @@ -0,0 +1,13 @@ +import type { GlobalAfterChangeHook } from 'payload' + +import { revalidateTag } from 'next/cache' + +export const revalidateFooter: GlobalAfterChangeHook = ({ doc, req: { payload, context } }) => { + if (!context.disableRevalidate) { + payload.logger.info(`Revalidating footer`) + + revalidateTag('global_footer') + } + + return doc +} diff --git a/templates/with-cloudflare-website/src/Header/Component.client.tsx b/templates/with-cloudflare-website/src/Header/Component.client.tsx new file mode 100644 index 00000000000..a4bd6584b76 --- /dev/null +++ b/templates/with-cloudflare-website/src/Header/Component.client.tsx @@ -0,0 +1,42 @@ +'use client' +import { useHeaderTheme } from '@/providers/HeaderTheme' +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import React, { useEffect, useState } from 'react' + +import type { Header } from '@/payload-types' + +import { Logo } from '@/components/Logo/Logo' +import { HeaderNav } from './Nav' + +interface HeaderClientProps { + data: Header +} + +export const HeaderClient: React.FC = ({ data }) => { + /* Storing the value in a useState to avoid hydration errors */ + const [theme, setTheme] = useState(null) + const { headerTheme, setHeaderTheme } = useHeaderTheme() + const pathname = usePathname() + + useEffect(() => { + setHeaderTheme(null) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]) + + useEffect(() => { + if (headerTheme && headerTheme !== theme) setTheme(headerTheme) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [headerTheme]) + + return ( +
+
+ + + + +
+
+ ) +} diff --git a/templates/with-cloudflare-website/src/Header/Component.tsx b/templates/with-cloudflare-website/src/Header/Component.tsx new file mode 100644 index 00000000000..02d2e644352 --- /dev/null +++ b/templates/with-cloudflare-website/src/Header/Component.tsx @@ -0,0 +1,11 @@ +import { HeaderClient } from './Component.client' +import { getCachedGlobal } from '@/utilities/getGlobals' +import React from 'react' + +import type { Header } from '@/payload-types' + +export async function Header() { + const headerData: Header = await getCachedGlobal('header', 1)() + + return +} diff --git a/templates/with-cloudflare-website/src/Header/Nav/index.tsx b/templates/with-cloudflare-website/src/Header/Nav/index.tsx new file mode 100644 index 00000000000..070fcca91dd --- /dev/null +++ b/templates/with-cloudflare-website/src/Header/Nav/index.tsx @@ -0,0 +1,25 @@ +'use client' + +import React from 'react' + +import type { Header as HeaderType } from '@/payload-types' + +import { CMSLink } from '@/components/Link' +import Link from 'next/link' +import { SearchIcon } from 'lucide-react' + +export const HeaderNav: React.FC<{ data: HeaderType }> = ({ data }) => { + const navItems = data?.navItems || [] + + return ( + + ) +} diff --git a/templates/with-cloudflare-website/src/Header/RowLabel.tsx b/templates/with-cloudflare-website/src/Header/RowLabel.tsx new file mode 100644 index 00000000000..a6f949459c6 --- /dev/null +++ b/templates/with-cloudflare-website/src/Header/RowLabel.tsx @@ -0,0 +1,13 @@ +'use client' +import { Header } from '@/payload-types' +import { RowLabelProps, useRowLabel } from '@payloadcms/ui' + +export const RowLabel: React.FC = () => { + const data = useRowLabel[number]>() + + const label = data?.data?.link?.label + ? `Nav item ${data.rowNumber !== undefined ? data.rowNumber + 1 : ''}: ${data?.data?.link?.label}` + : 'Row' + + return
{label}
+} diff --git a/templates/with-cloudflare-website/src/Header/config.ts b/templates/with-cloudflare-website/src/Header/config.ts new file mode 100644 index 00000000000..58fe89c809f --- /dev/null +++ b/templates/with-cloudflare-website/src/Header/config.ts @@ -0,0 +1,32 @@ +import type { GlobalConfig } from 'payload' + +import { link } from '@/fields/link' +import { revalidateHeader } from './hooks/revalidateHeader' + +export const Header: GlobalConfig = { + slug: 'header', + access: { + read: () => true, + }, + fields: [ + { + name: 'navItems', + type: 'array', + fields: [ + link({ + appearances: false, + }), + ], + maxRows: 6, + admin: { + initCollapsed: true, + components: { + RowLabel: '@/Header/RowLabel#RowLabel', + }, + }, + }, + ], + hooks: { + afterChange: [revalidateHeader], + }, +} diff --git a/templates/with-cloudflare-website/src/Header/hooks/revalidateHeader.ts b/templates/with-cloudflare-website/src/Header/hooks/revalidateHeader.ts new file mode 100644 index 00000000000..efe176aa885 --- /dev/null +++ b/templates/with-cloudflare-website/src/Header/hooks/revalidateHeader.ts @@ -0,0 +1,13 @@ +import type { GlobalAfterChangeHook } from 'payload' + +import { revalidateTag } from 'next/cache' + +export const revalidateHeader: GlobalAfterChangeHook = ({ doc, req: { payload, context } }) => { + if (!context.disableRevalidate) { + payload.logger.info(`Revalidating header`) + + revalidateTag('global_header') + } + + return doc +} diff --git a/templates/with-cloudflare-website/src/access/anyone.ts b/templates/with-cloudflare-website/src/access/anyone.ts new file mode 100644 index 00000000000..bf37c3a1157 --- /dev/null +++ b/templates/with-cloudflare-website/src/access/anyone.ts @@ -0,0 +1,3 @@ +import type { Access } from 'payload' + +export const anyone: Access = () => true diff --git a/templates/with-cloudflare-website/src/access/authenticated.ts b/templates/with-cloudflare-website/src/access/authenticated.ts new file mode 100644 index 00000000000..e2dc34d2a8c --- /dev/null +++ b/templates/with-cloudflare-website/src/access/authenticated.ts @@ -0,0 +1,9 @@ +import type { AccessArgs } from 'payload' + +import type { User } from '@/payload-types' + +type isAuthenticated = (args: AccessArgs) => boolean + +export const authenticated: isAuthenticated = ({ req: { user } }) => { + return Boolean(user) +} diff --git a/templates/with-cloudflare-website/src/access/authenticatedOrPublished.ts b/templates/with-cloudflare-website/src/access/authenticatedOrPublished.ts new file mode 100644 index 00000000000..e49198fbaaa --- /dev/null +++ b/templates/with-cloudflare-website/src/access/authenticatedOrPublished.ts @@ -0,0 +1,13 @@ +import type { Access } from 'payload' + +export const authenticatedOrPublished: Access = ({ req: { user } }) => { + if (user) { + return true + } + + return { + _status: { + equals: 'published', + }, + } +} diff --git a/templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/pages-sitemap.xml/route.ts b/templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/pages-sitemap.xml/route.ts new file mode 100644 index 00000000000..c73e1ea7559 --- /dev/null +++ b/templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/pages-sitemap.xml/route.ts @@ -0,0 +1,68 @@ +import { getServerSideSitemap } from 'next-sitemap' +import { getPayload } from 'payload' +import config from '@payload-config' +import { unstable_cache } from 'next/cache' + +const getPagesSitemap = unstable_cache( + async () => { + const payload = await getPayload({ config }) + const SITE_URL = + process.env.NEXT_PUBLIC_SERVER_URL || + process.env.VERCEL_PROJECT_PRODUCTION_URL || + 'https://example.com' + + const results = await payload.find({ + collection: 'pages', + overrideAccess: false, + draft: false, + depth: 0, + limit: 1000, + pagination: false, + where: { + _status: { + equals: 'published', + }, + }, + select: { + slug: true, + updatedAt: true, + }, + }) + + const dateFallback = new Date().toISOString() + + const defaultSitemap = [ + { + loc: `${SITE_URL}/search`, + lastmod: dateFallback, + }, + { + loc: `${SITE_URL}/posts`, + lastmod: dateFallback, + }, + ] + + const sitemap = results.docs + ? results.docs + .filter((page) => Boolean(page?.slug)) + .map((page) => { + return { + loc: page?.slug === 'home' ? `${SITE_URL}/` : `${SITE_URL}/${page?.slug}`, + lastmod: page.updatedAt || dateFallback, + } + }) + : [] + + return [...defaultSitemap, ...sitemap] + }, + ['pages-sitemap'], + { + tags: ['pages-sitemap'], + }, +) + +export async function GET() { + const sitemap = await getPagesSitemap() + + return getServerSideSitemap(sitemap) +} diff --git a/templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/posts-sitemap.xml/route.ts b/templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/posts-sitemap.xml/route.ts new file mode 100644 index 00000000000..0716abbc2c8 --- /dev/null +++ b/templates/with-cloudflare-website/src/app/(frontend)/(sitemaps)/posts-sitemap.xml/route.ts @@ -0,0 +1,55 @@ +import { getServerSideSitemap } from 'next-sitemap' +import { getPayload } from 'payload' +import config from '@payload-config' +import { unstable_cache } from 'next/cache' + +const getPostsSitemap = unstable_cache( + async () => { + const payload = await getPayload({ config }) + const SITE_URL = + process.env.NEXT_PUBLIC_SERVER_URL || + process.env.VERCEL_PROJECT_PRODUCTION_URL || + 'https://example.com' + + const results = await payload.find({ + collection: 'posts', + overrideAccess: false, + draft: false, + depth: 0, + limit: 1000, + pagination: false, + where: { + _status: { + equals: 'published', + }, + }, + select: { + slug: true, + updatedAt: true, + }, + }) + + const dateFallback = new Date().toISOString() + + const sitemap = results.docs + ? results.docs + .filter((post) => Boolean(post?.slug)) + .map((post) => ({ + loc: `${SITE_URL}/posts/${post?.slug}`, + lastmod: post.updatedAt || dateFallback, + })) + : [] + + return sitemap + }, + ['posts-sitemap'], + { + tags: ['posts-sitemap'], + }, +) + +export async function GET() { + const sitemap = await getPostsSitemap() + + return getServerSideSitemap(sitemap) +} diff --git a/templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.client.tsx b/templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.client.tsx new file mode 100644 index 00000000000..2d526692800 --- /dev/null +++ b/templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.client.tsx @@ -0,0 +1,15 @@ +'use client' +import { useHeaderTheme } from '@/providers/HeaderTheme' +import React, { useEffect } from 'react' + +const PageClient: React.FC = () => { + /* Force the header to be dark mode while we have an image behind it */ + const { setHeaderTheme } = useHeaderTheme() + + useEffect(() => { + setHeaderTheme('light') + }, [setHeaderTheme]) + return +} + +export default PageClient diff --git a/templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.tsx b/templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.tsx new file mode 100644 index 00000000000..1e274ff3e9f --- /dev/null +++ b/templates/with-cloudflare-website/src/app/(frontend)/[slug]/page.tsx @@ -0,0 +1,113 @@ +import type { Metadata } from 'next' + +import { PayloadRedirects } from '@/components/PayloadRedirects' +import configPromise from '@payload-config' +import { getPayload, type RequiredDataFromCollectionSlug } from 'payload' +import { draftMode } from 'next/headers' +import React, { cache } from 'react' +import { homeStatic } from '@/endpoints/seed/home-static' + +import { RenderBlocks } from '@/blocks/RenderBlocks' +import { RenderHero } from '@/heros/RenderHero' +import { generateMeta } from '@/utilities/generateMeta' +import PageClient from './page.client' +import { LivePreviewListener } from '@/components/LivePreviewListener' + +export async function generateStaticParams() { + const payload = await getPayload({ config: configPromise }) + const pages = await payload.find({ + collection: 'pages', + draft: false, + limit: 1000, + overrideAccess: false, + pagination: false, + select: { + slug: true, + }, + }) + + const params = pages.docs + ?.filter((doc) => { + return doc.slug !== 'home' + }) + .map(({ slug }) => { + return { slug } + }) + + return params +} + +type Args = { + params: Promise<{ + slug?: string + }> +} + +export default async function Page({ params: paramsPromise }: Args) { + const { isEnabled: draft } = await draftMode() + const { slug = 'home' } = await paramsPromise + // Decode to support slugs with special characters + const decodedSlug = decodeURIComponent(slug) + const url = '/' + decodedSlug + let page: RequiredDataFromCollectionSlug<'pages'> | null + + page = await queryPageBySlug({ + slug: decodedSlug, + }) + + // Remove this code once your website is seeded + if (!page && slug === 'home') { + page = homeStatic + } + + if (!page) { + return + } + + const { hero, layout } = page + + return ( +
+ + {/* Allows redirects for valid pages too */} + + + {draft && } + + + +
+ ) +} + +export async function generateMetadata({ params: paramsPromise }: Args): Promise { + const { slug = 'home' } = await paramsPromise + // Decode to support slugs with special characters + const decodedSlug = decodeURIComponent(slug) + const page = await queryPageBySlug({ + slug: decodedSlug, + }) + + return generateMeta({ doc: page }) +} + +const queryPageBySlug = cache(async ({ slug }: { slug: string }) => { + const { isEnabled: draft } = await draftMode() + + const payload = await getPayload({ config: configPromise }) + + const result = await payload.find({ + collection: 'pages', + draft, + limit: 1, + pagination: false, + overrideAccess: draft, + where: { + slug: { + equals: slug, + }, + }, + }) + + return result.docs?.[0] || null +}) diff --git a/templates/with-cloudflare-website/src/app/(frontend)/globals.css b/templates/with-cloudflare-website/src/app/(frontend)/globals.css new file mode 100644 index 00000000000..2c785c1da08 --- /dev/null +++ b/templates/with-cloudflare-website/src/app/(frontend)/globals.css @@ -0,0 +1,103 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + h1, + h2, + h3, + h4, + h5, + h6 { + font-size: unset; + font-weight: unset; + } + + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 240 5% 96%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 240 6% 80%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.2rem; + + --success: 196 52% 74%; + --warning: 34 89% 85%; + --error: 10 100% 86%; + } + + [data-theme='dark'] { + --background: 0 0% 0%; + --foreground: 210 40% 98%; + + --card: 0 0% 4%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 0, 0%, 15%, 0.8; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + + --success: 196 100% 14%; + --warning: 34 51% 25%; + --error: 10 39% 43%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground min-h-[100vh] flex flex-col; + } +} + +html { + opacity: 0; +} + +html[data-theme='dark'], +html[data-theme='light'] { + opacity: initial; +} diff --git a/templates/with-cloudflare-website/src/app/(frontend)/layout.tsx b/templates/with-cloudflare-website/src/app/(frontend)/layout.tsx new file mode 100644 index 00000000000..853877fa38a --- /dev/null +++ b/templates/with-cloudflare-website/src/app/(frontend)/layout.tsx @@ -0,0 +1,53 @@ +import type { Metadata } from 'next' + +import { cn } from '@/utilities/ui' +import { GeistMono } from 'geist/font/mono' +import { GeistSans } from 'geist/font/sans' +import React from 'react' + +import { AdminBar } from '@/components/AdminBar' +import { Footer } from '@/Footer/Component' +import { Header } from '@/Header/Component' +import { Providers } from '@/providers' +import { InitTheme } from '@/providers/Theme/InitTheme' +import { mergeOpenGraph } from '@/utilities/mergeOpenGraph' +import { draftMode } from 'next/headers' + +import './globals.css' +import { getServerSideURL } from '@/utilities/getURL' + +export default async function RootLayout({ children }: { children: React.ReactNode }) { + const { isEnabled } = await draftMode() + + return ( + + + + + + + + + + +
+ {children} +