diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf0634edab2..6ad1dbe5aaf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: version: 1.56.1 '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29)) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29)) '@sentry/node': specifier: ^8.33.1 version: 8.37.1 @@ -137,7 +137,7 @@ importers: version: 8.15.1(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) next: specifier: 15.4.7 - version: 15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + version: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) open: specifier: ^10.1.0 version: 10.1.0 @@ -1186,7 +1186,7 @@ importers: version: 7.0.15 '@vercel/mcp-adapter': specifier: ^1.0.0 - version: 1.0.0(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) + version: 1.0.0(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) json-schema-to-zod: specifier: 2.6.1 version: 2.6.1 @@ -1205,7 +1205,7 @@ importers: dependencies: next: specifier: ^15.2.3 - version: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + version: 15.2.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) devDependencies: '@payloadcms/eslint-config': specifier: workspace:* @@ -1274,7 +1274,7 @@ importers: dependencies: '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29)) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29)) '@sentry/types': specifier: ^8.33.1 version: 8.37.1 @@ -1662,7 +1662,7 @@ importers: version: link:../plugin-cloud-storage uploadthing: specifier: 7.3.0 - version: 7.3.0(express@5.0.1)(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(tailwindcss@4.1.13) + version: 7.3.0(express@5.0.1)(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(tailwindcss@4.1.13) devDependencies: payload: specifier: workspace:* @@ -1858,7 +1858,7 @@ importers: version: 16.9.0 next: specifier: 15.4.7 - version: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + version: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) payload: specifier: workspace:* version: link:../../packages/payload @@ -2000,7 +2000,7 @@ importers: version: 8.6.0(react@19.1.1) geist: specifier: ^1.3.0 - version: 1.4.2(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) + version: 1.4.2(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) graphql: specifier: ^16.8.1 version: 16.9.0 @@ -2012,7 +2012,7 @@ importers: version: 0.477.0(react@19.1.1) next: specifier: ^15.5.4 - version: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + version: 15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) next-themes: specifier: 0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -2199,7 +2199,7 @@ importers: version: 16.4.7 geist: specifier: ^1.3.0 - version: 1.4.2(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) + version: 1.4.2(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) graphql: specifier: ^16.8.1 version: 16.9.0 @@ -2208,10 +2208,10 @@ importers: version: 0.378.0(react@19.1.1) next: specifier: 15.4.7 - version: 15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + version: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) + version: 4.2.3(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) payload: specifier: workspace:* version: link:../../packages/payload @@ -2304,6 +2304,91 @@ importers: specifier: 3.2.3 version: 3.2.3(@types/debug@4.1.12)(@types/node@22.5.4)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(lightningcss@1.30.1)(sass-embedded@1.80.6)(sass@1.77.4)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1) + templates/with-vercel-mongodb: + dependencies: + '@payloadcms/db-mongodb': + specifier: workspace:* + version: link:../../packages/db-mongodb + '@payloadcms/next': + specifier: workspace:* + version: link:../../packages/next + '@payloadcms/richtext-lexical': + specifier: workspace:* + version: link:../../packages/richtext-lexical + '@payloadcms/storage-vercel-blob': + specifier: workspace:* + version: link:../../packages/storage-vercel-blob + '@payloadcms/ui': + specifier: workspace:* + version: link:../../packages/ui + cross-env: + specifier: 7.0.3 + version: 7.0.3 + graphql: + specifier: ^16.8.1 + version: 16.9.0 + next: + specifier: 15.4.7 + version: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + payload: + specifier: workspace:* + version: link:../../packages/payload + react: + specifier: 19.1.1 + version: 19.1.1 + react-dom: + specifier: 19.1.1 + version: 19.1.1(react@19.1.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3.2.0 + version: 3.3.0 + '@playwright/test': + specifier: 1.56.1 + version: 1.56.1 + '@testing-library/react': + specifier: 16.3.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@types/node': + specifier: ^22.5.4 + version: 22.15.30 + '@types/react': + specifier: 19.1.8 + version: 19.1.8 + '@types/react-dom': + specifier: 19.1.6 + version: 19.1.6(@types/react@19.1.8) + '@vitejs/plugin-react': + specifier: 4.5.2 + version: 4.5.2(vite@6.3.5(@types/node@22.15.30)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.80.6)(sass@1.77.4)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1)) + eslint: + specifier: ^9.16.0 + version: 9.22.0(jiti@2.5.1) + eslint-config-next: + specifier: 15.4.7 + version: 15.4.7(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3) + jsdom: + specifier: 26.1.0 + version: 26.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) + playwright: + specifier: 1.56.1 + version: 1.56.1 + playwright-core: + specifier: 1.56.1 + version: 1.56.1 + prettier: + specifier: ^3.4.2 + version: 3.5.3 + typescript: + specifier: 5.7.3 + version: 5.7.3 + vite-tsconfig-paths: + specifier: 5.1.4 + version: 5.1.4(typescript@5.7.3)(vite@6.3.5(@types/node@22.15.30)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.80.6)(sass@1.77.4)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1)) + vitest: + specifier: 3.2.3 + version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(lightningcss@1.30.1)(sass-embedded@1.80.6)(sass@1.77.4)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1) + test: devDependencies: '@aws-sdk/client-s3': @@ -2452,7 +2537,7 @@ importers: version: link:../packages/ui '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29)) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29)) '@sentry/react': specifier: ^7.77.0 version: 7.119.2(react@19.1.1) @@ -2524,7 +2609,7 @@ importers: version: 8.15.1(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) next: specifier: 15.4.7 - version: 15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + version: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) nodemailer: specifier: 7.0.9 version: 7.0.9 @@ -20668,7 +20753,7 @@ snapshots: '@sentry/utils': 7.119.2 localforage: 1.10.0 - '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29))': + '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) @@ -20684,7 +20769,7 @@ snapshots: '@sentry/vercel-edge': 8.37.1 '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.11.29)) chalk: 3.0.0 - next: 15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.10 @@ -20697,7 +20782,7 @@ snapshots: - supports-color - webpack - '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29))': + '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(react@19.1.1)(webpack@5.96.1(@swc/core@1.11.29))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) @@ -20713,7 +20798,7 @@ snapshots: '@sentry/vercel-edge': 8.37.1 '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.11.29)) chalk: 3.0.0 - next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.10 @@ -22164,7 +22249,7 @@ snapshots: '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.15.30 '@types/busboy@1.5.4': dependencies: @@ -22636,12 +22721,12 @@ snapshots: '@vercel/git-hooks@1.0.0': {} - '@vercel/mcp-adapter@1.0.0(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))': + '@vercel/mcp-adapter@1.0.0(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))': dependencies: '@modelcontextprotocol/sdk': 1.20.1 - mcp-handler: 1.0.3(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) + mcp-handler: 1.0.3(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)) optionalDependencies: - next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) '@vercel/postgres@0.9.0': dependencies: @@ -24501,8 +24586,8 @@ snapshots: '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3) eslint: 9.22.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.22.0(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.22.0(jiti@2.5.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.22.0(jiti@2.5.1)) @@ -24541,6 +24626,22 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.5.1)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.1 + eslint: 9.22.0(jiti@2.5.1) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.14 + unrs-resolver: 1.9.0 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.22.0(jiti@2.5.1)) + eslint-plugin-import-x: 4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)): dependencies: debug: 3.2.7 @@ -24552,6 +24653,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.5.1)) + transitivePeerDependencies: + - supports-color + eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3): dependencies: '@types/doctrine': 0.0.9 @@ -24601,6 +24713,35 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.22.0(jiti@2.5.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.22.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.5.1)))(eslint@9.22.0(jiti@2.5.1)) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.5.1))(typescript@5.7.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jest-dom@5.5.0(@testing-library/dom@10.4.0)(eslint@9.22.0(jiti@2.5.1)): dependencies: '@babel/runtime': 7.26.0 @@ -25328,13 +25469,13 @@ snapshots: - encoding - supports-color - geist@1.4.2(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): + geist@1.4.2(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): dependencies: - next: 15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) - geist@1.4.2(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): + geist@1.4.2(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): dependencies: - next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) gel@2.0.1: dependencies: @@ -26791,14 +26932,14 @@ snapshots: math-intrinsics@1.1.0: {} - mcp-handler@1.0.3(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): + mcp-handler@1.0.3(@modelcontextprotocol/sdk@1.20.1)(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): dependencies: '@modelcontextprotocol/sdk': 1.20.1 chalk: 5.3.0 commander: 11.1.0 redis: 4.7.1 optionalDependencies: - next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) md5@2.3.0: dependencies: @@ -27276,13 +27417,13 @@ snapshots: transitivePeerDependencies: - supports-color - next-sitemap@4.2.3(next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): + next-sitemap@4.2.3(next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.11 fast-glob: 3.3.2 minimist: 1.2.8 - next: 15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: @@ -27318,7 +27459,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): + next@15.2.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): dependencies: '@next/env': 15.2.3 '@swc/counter': 0.1.3 @@ -27346,33 +27487,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): - dependencies: - '@next/env': 15.4.7 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001720 - postcss: 8.4.31 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.6(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react@19.1.1) - optionalDependencies: - '@next/swc-darwin-arm64': 15.4.7 - '@next/swc-darwin-x64': 15.4.7 - '@next/swc-linux-arm64-gnu': 15.4.7 - '@next/swc-linux-arm64-musl': 15.4.7 - '@next/swc-linux-x64-gnu': 15.4.7 - '@next/swc-linux-x64-musl': 15.4.7 - '@next/swc-win32-arm64-msvc': 15.4.7 - '@next/swc-win32-x64-msvc': 15.4.7 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.56.1 - sass: 1.77.4 - sharp: 0.34.3 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.4.7(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): + next@15.4.7(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): dependencies: '@next/env': 15.4.7 '@swc/helpers': 0.5.15 @@ -27426,7 +27541,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): + next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4): dependencies: '@next/env': 15.5.4 '@swc/helpers': 0.5.15 @@ -29962,7 +30077,7 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uploadthing@7.3.0(express@5.0.1)(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(tailwindcss@4.1.13): + uploadthing@7.3.0(express@5.0.1)(next@15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4))(tailwindcss@4.1.13): dependencies: '@effect/platform': 0.69.8(effect@3.10.3) '@uploadthing/mime-types': 0.3.2 @@ -29970,7 +30085,7 @@ snapshots: effect: 3.10.3 optionalDependencies: express: 5.0.1 - next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) + next: 15.5.4(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.77.4) tailwindcss: 4.1.13 uri-js@4.4.1: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index fe4fa7ddf53..249cdfc12f6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,5 +5,6 @@ packages: - 'templates/blank' - 'templates/website' - 'templates/ecommerce' + - 'templates/with-vercel-mongodb' updateNotifier: false diff --git a/templates/website/next.config.js b/templates/website/next.config.js index 0cb8d12f94f..0b27ce0cc00 100644 --- a/templates/website/next.config.js +++ b/templates/website/next.config.js @@ -4,7 +4,7 @@ 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' + : undefined || process.env.__NEXT_PRIVATE_ORIGIN || 'http://127.0.0.1:3002' /** @type {import('next').NextConfig} */ const nextConfig = { diff --git a/templates/website/package.json b/templates/website/package.json index 13bb89eca95..959b5eb8522 100644 --- a/templates/website/package.json +++ b/templates/website/package.json @@ -7,7 +7,7 @@ "scripts": { "build": "cross-env NODE_OPTIONS=--no-deprecation next build", "postbuild": "next-sitemap --config next-sitemap.config.cjs", - "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev", + "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev -H 0.0.0.0 -p 3002", "dev:prod": "cross-env NODE_OPTIONS=--no-deprecation rm -rf .next && pnpm build && pnpm start", "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap", "generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types", diff --git a/templates/website/src/Footer/hooks/revalidateFooter.ts b/templates/website/src/Footer/hooks/revalidateFooter.ts index df3acec0273..a5e49f07222 100644 --- a/templates/website/src/Footer/hooks/revalidateFooter.ts +++ b/templates/website/src/Footer/hooks/revalidateFooter.ts @@ -1,12 +1,12 @@ import type { GlobalAfterChangeHook } from 'payload' -import { revalidateTag } from 'next/cache' +import { revalidateFooterTag } from '@/app/actions/revalidate' export const revalidateFooter: GlobalAfterChangeHook = ({ doc, req: { payload, context } }) => { if (!context.disableRevalidate) { payload.logger.info(`Revalidating footer`) - revalidateTag('global_footer') + revalidateFooterTag().catch(console.error) } return doc diff --git a/templates/website/src/Header/hooks/revalidateHeader.ts b/templates/website/src/Header/hooks/revalidateHeader.ts index efe176aa885..56a7d482be8 100644 --- a/templates/website/src/Header/hooks/revalidateHeader.ts +++ b/templates/website/src/Header/hooks/revalidateHeader.ts @@ -1,12 +1,12 @@ import type { GlobalAfterChangeHook } from 'payload' -import { revalidateTag } from 'next/cache' +import { revalidateHeaderTag } from '@/app/actions/revalidate' export const revalidateHeader: GlobalAfterChangeHook = ({ doc, req: { payload, context } }) => { if (!context.disableRevalidate) { payload.logger.info(`Revalidating header`) - revalidateTag('global_header') + revalidateHeaderTag().catch(console.error) } return doc diff --git a/templates/website/src/app/(frontend)/[slug]/page.tsx b/templates/website/src/app/(frontend)/[slug]/page.tsx index 1e274ff3e9f..b9e1f6408fa 100644 --- a/templates/website/src/app/(frontend)/[slug]/page.tsx +++ b/templates/website/src/app/(frontend)/[slug]/page.tsx @@ -12,6 +12,7 @@ import { RenderHero } from '@/heros/RenderHero' import { generateMeta } from '@/utilities/generateMeta' import PageClient from './page.client' import { LivePreviewListener } from '@/components/LivePreviewListener' +import { SlideModeToggle } from '@/components/SlideModeToggle' export async function generateStaticParams() { const payload = await getPayload({ config: configPromise }) @@ -41,11 +42,20 @@ type Args = { params: Promise<{ slug?: string }> + searchParams: Promise<{ + mode?: string + }> } -export default async function Page({ params: paramsPromise }: Args) { +export default async function Page({ + params: paramsPromise, + searchParams: searchParamsPromise, +}: Args) { const { isEnabled: draft } = await draftMode() const { slug = 'home' } = await paramsPromise + const searchParams = await searchParamsPromise + const slideMode = searchParams?.mode === 'slides' + // Decode to support slugs with special characters const decodedSlug = decodeURIComponent(slug) const url = '/' + decodedSlug @@ -69,13 +79,14 @@ export default async function Page({ params: paramsPromise }: Args) { return (
+ {/* Allows redirects for valid pages too */} {draft && } - - + {!slideMode && } +
) } diff --git a/templates/website/src/app/actions/revalidate.ts b/templates/website/src/app/actions/revalidate.ts new file mode 100644 index 00000000000..97e0034472c --- /dev/null +++ b/templates/website/src/app/actions/revalidate.ts @@ -0,0 +1,26 @@ +'use server' + +import { revalidateTag, revalidatePath } from 'next/cache' + +export async function revalidateFooterTag() { + revalidateTag('global_footer') +} + +export async function revalidateHeaderTag() { + revalidateTag('global_header') +} + +export async function revalidatePage(slug: string) { + revalidateTag(`pages_${slug}`) + revalidatePath(`/${slug}`) +} + +export async function revalidatePost(slug: string) { + revalidateTag(`posts_${slug}`) + revalidatePath(`/posts/${slug}`) + revalidateTag('posts-sitemap') +} + +export async function revalidateRedirects() { + revalidateTag('redirects') +} diff --git a/templates/website/src/blocks/RenderBlocks.tsx b/templates/website/src/blocks/RenderBlocks.tsx index c84634a64ad..beec8db5941 100644 --- a/templates/website/src/blocks/RenderBlocks.tsx +++ b/templates/website/src/blocks/RenderBlocks.tsx @@ -7,6 +7,8 @@ import { CallToActionBlock } from '@/blocks/CallToAction/Component' import { ContentBlock } from '@/blocks/Content/Component' import { FormBlock } from '@/blocks/Form/Component' import { MediaBlock } from '@/blocks/MediaBlock/Component' +import { SlideRenderer } from '@/components/SlideRenderer' +import { RenderHero } from '@/heros/RenderHero' const blockComponents = { archive: ArchiveBlock, @@ -18,34 +20,74 @@ const blockComponents = { export const RenderBlocks: React.FC<{ blocks: Page['layout'][0][] + hero?: Page['hero'] + slideMode?: boolean }> = (props) => { - const { blocks } = props + const { blocks, hero, slideMode } = props const hasBlocks = blocks && Array.isArray(blocks) && blocks.length > 0 - if (hasBlocks) { - return ( - - {blocks.map((block, index) => { - const { blockType } = block - - if (blockType && blockType in blockComponents) { - const Block = blockComponents[blockType] - - if (Block) { - return ( -
- {/* @ts-expect-error there may be some mismatch between the expected types here */} - -
- ) - } + if (!hasBlocks && !hero) { + return null + } + + // Render in slide mode if enabled + if (slideMode) { + const slides = blocks + .map((block, index) => { + const { blockType } = block + + if (blockType && blockType in blockComponents) { + const Block = blockComponents[blockType] + + if (Block) { + return ( + // @ts-expect-error there may be some mismatch between the expected types here + + ) } - return null - })} -
- ) + } + return null + }) + .filter((slide) => slide !== null) as React.ReactNode[] + + // Prepend Hero as the first slide if it exists + if (hero && hero.type !== 'none') { + slides.unshift( +
+
+ +
+
, + ) + } + + return } - return null + // Normal rendering mode + return ( + + {blocks.map((block, index) => { + const { blockType } = block + + if (blockType && blockType in blockComponents) { + const Block = blockComponents[blockType] + + if (Block) { + return ( +
+ {/* @ts-expect-error there may be some mismatch between the expected types here */} + +
+ ) + } + } + return null + })} +
+ ) } diff --git a/templates/website/src/collections/Pages/hooks/revalidatePage.ts b/templates/website/src/collections/Pages/hooks/revalidatePage.ts index 2a1980945a0..1e65603a73b 100644 --- a/templates/website/src/collections/Pages/hooks/revalidatePage.ts +++ b/templates/website/src/collections/Pages/hooks/revalidatePage.ts @@ -1,6 +1,6 @@ import type { CollectionAfterChangeHook, CollectionAfterDeleteHook } from 'payload' -import { revalidatePath, revalidateTag } from 'next/cache' +import { revalidatePage as revalidatePageAction } from '@/app/actions/revalidate' import type { Page } from '../../../payload-types' @@ -11,22 +11,20 @@ export const revalidatePage: CollectionAfterChangeHook = ({ }) => { if (!context.disableRevalidate) { if (doc._status === 'published') { - const path = doc.slug === 'home' ? '/' : `/${doc.slug}` + const path = doc.slug === 'home' ? '' : doc.slug - payload.logger.info(`Revalidating page at path: ${path}`) + payload.logger.info(`Revalidating page at path: /${path}`) - revalidatePath(path) - revalidateTag('pages-sitemap') + revalidatePageAction(path).catch(console.error) } // If the page was previously published, we need to revalidate the old path if (previousDoc?._status === 'published' && doc._status !== 'published') { - const oldPath = previousDoc.slug === 'home' ? '/' : `/${previousDoc.slug}` + const oldPath = previousDoc.slug === 'home' ? '' : previousDoc.slug - payload.logger.info(`Revalidating old page at path: ${oldPath}`) + payload.logger.info(`Revalidating old page at path: /${oldPath}`) - revalidatePath(oldPath) - revalidateTag('pages-sitemap') + revalidatePageAction(oldPath).catch(console.error) } } return doc @@ -34,9 +32,8 @@ export const revalidatePage: CollectionAfterChangeHook = ({ export const revalidateDelete: CollectionAfterDeleteHook = ({ doc, req: { context } }) => { if (!context.disableRevalidate) { - const path = doc?.slug === 'home' ? '/' : `/${doc?.slug}` - revalidatePath(path) - revalidateTag('pages-sitemap') + const path = doc?.slug === 'home' ? '' : doc?.slug || '' + revalidatePageAction(path).catch(console.error) } return doc diff --git a/templates/website/src/collections/Posts/hooks/revalidatePost.ts b/templates/website/src/collections/Posts/hooks/revalidatePost.ts index ff43752852e..40a623cc440 100644 --- a/templates/website/src/collections/Posts/hooks/revalidatePost.ts +++ b/templates/website/src/collections/Posts/hooks/revalidatePost.ts @@ -1,6 +1,6 @@ import type { CollectionAfterChangeHook, CollectionAfterDeleteHook } from 'payload' -import { revalidatePath, revalidateTag } from 'next/cache' +import { revalidatePost as revalidatePostAction } from '@/app/actions/revalidate' import type { Post } from '../../../payload-types' @@ -11,22 +11,14 @@ export const revalidatePost: CollectionAfterChangeHook = ({ }) => { if (!context.disableRevalidate) { if (doc._status === 'published') { - const path = `/posts/${doc.slug}` - - payload.logger.info(`Revalidating post at path: ${path}`) - - revalidatePath(path) - revalidateTag('posts-sitemap') + payload.logger.info(`Revalidating post at path: /posts/${doc.slug}`) + revalidatePostAction(doc.slug).catch(console.error) } // If the post was previously published, we need to revalidate the old path if (previousDoc._status === 'published' && doc._status !== 'published') { - const oldPath = `/posts/${previousDoc.slug}` - - payload.logger.info(`Revalidating old post at path: ${oldPath}`) - - revalidatePath(oldPath) - revalidateTag('posts-sitemap') + payload.logger.info(`Revalidating old post at path: /posts/${previousDoc.slug}`) + revalidatePostAction(previousDoc.slug).catch(console.error) } } return doc @@ -34,10 +26,7 @@ export const revalidatePost: CollectionAfterChangeHook = ({ export const revalidateDelete: CollectionAfterDeleteHook = ({ doc, req: { context } }) => { if (!context.disableRevalidate) { - const path = `/posts/${doc?.slug}` - - revalidatePath(path) - revalidateTag('posts-sitemap') + revalidatePostAction(doc?.slug || '').catch(console.error) } return doc diff --git a/templates/website/src/components/Media/ImageMedia/index.tsx b/templates/website/src/components/Media/ImageMedia/index.tsx index 8a1dc106471..b35c1b3cf1b 100644 --- a/templates/website/src/components/Media/ImageMedia/index.tsx +++ b/templates/website/src/components/Media/ImageMedia/index.tsx @@ -71,6 +71,7 @@ export const ImageMedia: React.FC = (props) => { sizes={sizes} src={src} width={!fill ? width : undefined} + unoptimized /> ) diff --git a/templates/website/src/components/SlideModeToggle/index.tsx b/templates/website/src/components/SlideModeToggle/index.tsx new file mode 100644 index 00000000000..b9c3afd4c7a --- /dev/null +++ b/templates/website/src/components/SlideModeToggle/index.tsx @@ -0,0 +1,48 @@ +'use client' + +import React from 'react' +import { useRouter, usePathname, useSearchParams } from 'next/navigation' +import { Presentation, LayoutGrid } from 'lucide-react' +import { Button } from '@/components/ui/button' + +export const SlideModeToggle: React.FC = () => { + const router = useRouter() + const pathname = usePathname() + const searchParams = useSearchParams() + const isSlideMode = searchParams.get('mode') === 'slides' + + const toggleSlideMode = () => { + const params = new URLSearchParams(searchParams.toString()) + + if (isSlideMode) { + params.delete('mode') + } else { + params.set('mode', 'slides') + } + + const newUrl = params.toString() ? `${pathname}?${params.toString()}` : pathname + router.push(newUrl) + } + + return ( + + ) +} diff --git a/templates/website/src/components/SlideRenderer/SlideControls.tsx b/templates/website/src/components/SlideRenderer/SlideControls.tsx new file mode 100644 index 00000000000..1f7c6d5e9d1 --- /dev/null +++ b/templates/website/src/components/SlideRenderer/SlideControls.tsx @@ -0,0 +1,82 @@ +'use client' + +import React from 'react' +import { ChevronLeft, ChevronRight, X } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { cn } from '@/utilities/ui' + +export interface SlideControlsProps { + currentSlide: number + totalSlides: number + onNext: () => void + onPrev: () => void + onExit: () => void + isFirstSlide: boolean + isLastSlide: boolean + className?: string +} + +export const SlideControls: React.FC = ({ + currentSlide, + totalSlides, + onNext, + onPrev, + onExit, + isFirstSlide, + isLastSlide, + className, +}) => { + return ( +
+
+
+ {/* Previous Button */} + + + {/* Slide Counter */} +
+
+ + {currentSlide + 1} / {totalSlides} + +
+ + {/* Exit Button */} + +
+ + {/* Next Button */} + +
+
+
+ ) +} diff --git a/templates/website/src/components/SlideRenderer/SlideIndicators.tsx b/templates/website/src/components/SlideRenderer/SlideIndicators.tsx new file mode 100644 index 00000000000..02a71857cba --- /dev/null +++ b/templates/website/src/components/SlideRenderer/SlideIndicators.tsx @@ -0,0 +1,39 @@ +'use client' + +import React from 'react' +import { cn } from '@/utilities/ui' + +export interface SlideIndicatorsProps { + totalSlides: number + currentSlide: number + onSlideClick: (index: number) => void + className?: string +} + +export const SlideIndicators: React.FC = ({ + totalSlides, + currentSlide, + onSlideClick, + className, +}) => { + return ( +
+
+ {Array.from({ length: totalSlides }).map((_, index) => ( +
+
+ ) +} diff --git a/templates/website/src/components/SlideRenderer/index.tsx b/templates/website/src/components/SlideRenderer/index.tsx new file mode 100644 index 00000000000..fc79f0ef9f8 --- /dev/null +++ b/templates/website/src/components/SlideRenderer/index.tsx @@ -0,0 +1,124 @@ +'use client' + +import React from 'react' +import { useRouter } from 'next/navigation' +import { cn } from '@/utilities/ui' +import { useSlideNavigation } from './useSlideNavigation' +import { SlideControls } from './SlideControls' +import { SlideIndicators } from './SlideIndicators' + +export interface SlideRendererProps { + slides: React.ReactNode[] + initialSlide?: number + showIndicators?: boolean + showControls?: boolean + transition?: 'fade' | 'slide' | 'none' + className?: string +} + +export const SlideRenderer: React.FC = ({ + slides, + initialSlide = 0, + showIndicators = true, + showControls = true, + transition = 'fade', + className, +}) => { + const router = useRouter() + const totalSlides = slides.length + + const { currentSlide, goToSlide, nextSlide, prevSlide, isFirstSlide, isLastSlide } = + useSlideNavigation({ + totalSlides, + initialSlide, + loop: false, + }) + + const handleExit = () => { + // Remove slide mode from URL + const url = new URL(window.location.href) + url.searchParams.delete('mode') + router.push(url.pathname + url.search) + } + + const getTransitionClasses = () => { + switch (transition) { + case 'fade': + return 'transition-opacity duration-500' + case 'slide': + return 'transition-transform duration-500' + case 'none': + default: + return '' + } + } + + return ( +
+ {/* Slide Container */} +
+ {slides.map((slide, index) => { + const isActive = index === currentSlide + + return ( +
currentSlide && transition === 'slide', + '-translate-x-full': !isActive && index < currentSlide && transition === 'slide', + }, + )} + aria-hidden={!isActive} + > +
{slide}
+
+ ) + })} +
+ + {/* Progress Bar */} +
+
+
+ + {/* Slide Indicators */} + {showIndicators && totalSlides > 1 && ( + + )} + + {/* Navigation Controls */} + {showControls && ( + + )} + + {/* Keyboard Hints */} +
+
+ ← → Navigate + ESC Exit +
+
+
+ ) +} diff --git a/templates/website/src/components/SlideRenderer/useSlideNavigation.ts b/templates/website/src/components/SlideRenderer/useSlideNavigation.ts new file mode 100644 index 00000000000..358565e72a1 --- /dev/null +++ b/templates/website/src/components/SlideRenderer/useSlideNavigation.ts @@ -0,0 +1,145 @@ +'use client' + +import { useCallback, useEffect, useState } from 'react' + +export interface UseSlideNavigationProps { + totalSlides: number + initialSlide?: number + loop?: boolean + autoAdvance?: boolean + autoAdvanceDelay?: number +} + +export interface UseSlideNavigationReturn { + currentSlide: number + goToSlide: (index: number) => void + nextSlide: () => void + prevSlide: () => void + isFirstSlide: boolean + isLastSlide: boolean +} + +export const useSlideNavigation = ({ + totalSlides, + initialSlide = 0, + loop = false, + autoAdvance = false, + autoAdvanceDelay = 5000, +}: UseSlideNavigationProps): UseSlideNavigationReturn => { + const [currentSlide, setCurrentSlide] = useState(initialSlide) + + const goToSlide = useCallback( + (index: number) => { + if (index >= 0 && index < totalSlides) { + setCurrentSlide(index) + } + }, + [totalSlides], + ) + + const nextSlide = useCallback(() => { + if (currentSlide < totalSlides - 1) { + setCurrentSlide((prev) => prev + 1) + } else if (loop) { + setCurrentSlide(0) + } + }, [currentSlide, totalSlides, loop]) + + const prevSlide = useCallback(() => { + if (currentSlide > 0) { + setCurrentSlide((prev) => prev - 1) + } else if (loop) { + setCurrentSlide(totalSlides - 1) + } + }, [currentSlide, totalSlides, loop]) + + // Keyboard navigation + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + switch (e.key) { + case 'ArrowRight': + case ' ': + e.preventDefault() + nextSlide() + break + case 'ArrowLeft': + e.preventDefault() + prevSlide() + break + case 'Home': + e.preventDefault() + goToSlide(0) + break + case 'End': + e.preventDefault() + goToSlide(totalSlides - 1) + break + case 'Escape': + e.preventDefault() + // Exit slide mode by removing the mode parameter from URL + const url = new URL(window.location.href) + url.searchParams.delete('mode') + window.location.href = url.pathname + url.search + break + } + } + + window.addEventListener('keydown', handleKeyDown) + return () => window.removeEventListener('keydown', handleKeyDown) + }, [nextSlide, prevSlide, goToSlide, totalSlides]) + + // Auto-advance + useEffect(() => { + if (!autoAdvance) return + + const timer = setInterval(() => { + nextSlide() + }, autoAdvanceDelay) + + return () => clearInterval(timer) + }, [autoAdvance, autoAdvanceDelay, nextSlide]) + + // Touch/swipe support + useEffect(() => { + let touchStartX = 0 + let touchEndX = 0 + + const handleTouchStart = (e: TouchEvent) => { + touchStartX = e.changedTouches[0].screenX + } + + const handleTouchEnd = (e: TouchEvent) => { + touchEndX = e.changedTouches[0].screenX + handleSwipe() + } + + const handleSwipe = () => { + const swipeThreshold = 50 + if (touchStartX - touchEndX > swipeThreshold) { + nextSlide() + } else if (touchEndX - touchStartX > swipeThreshold) { + prevSlide() + } + } + + window.addEventListener('touchstart', handleTouchStart) + window.addEventListener('touchend', handleTouchEnd) + + return () => { + window.removeEventListener('touchstart', handleTouchStart) + window.removeEventListener('touchend', handleTouchEnd) + } + }, [nextSlide, prevSlide]) + + const isFirstSlide = currentSlide === 0 + const isLastSlide = currentSlide === totalSlides - 1 + + return { + currentSlide, + goToSlide, + nextSlide, + prevSlide, + isFirstSlide, + isLastSlide, + } +} diff --git a/templates/website/src/heros/HighImpact/index.tsx b/templates/website/src/heros/HighImpact/index.tsx index ae4d9f1aebd..faf948a98b1 100644 --- a/templates/website/src/heros/HighImpact/index.tsx +++ b/templates/website/src/heros/HighImpact/index.tsx @@ -17,9 +17,20 @@ export const HighImpactHero: React.FC = ({ links, media, richText return (
+ {media && typeof media === 'object' && ( +
+ +
+ )}
{richText && } @@ -36,11 +47,6 @@ export const HighImpactHero: React.FC = ({ links, media, richText )}
-
- {media && typeof media === 'object' && ( - - )} -
) } diff --git a/templates/website/src/heros/PostHero/index.tsx b/templates/website/src/heros/PostHero/index.tsx index 905396cb083..ba510417760 100644 --- a/templates/website/src/heros/PostHero/index.tsx +++ b/templates/website/src/heros/PostHero/index.tsx @@ -15,7 +15,13 @@ export const PostHero: React.FC<{ populatedAuthors && populatedAuthors.length > 0 && formatAuthors(populatedAuthors) !== '' return ( -
+
+ {heroImage && typeof heroImage !== 'string' && ( +
+ +
+
+ )}
@@ -62,12 +68,6 @@ export const PostHero: React.FC<{
-
- {heroImage && typeof heroImage !== 'string' && ( - - )} -
-
) } diff --git a/templates/website/src/hooks/revalidateRedirects.ts b/templates/website/src/hooks/revalidateRedirects.ts index b5cc3ae4c05..4d6b4151f1b 100644 --- a/templates/website/src/hooks/revalidateRedirects.ts +++ b/templates/website/src/hooks/revalidateRedirects.ts @@ -1,11 +1,11 @@ import type { CollectionAfterChangeHook } from 'payload' -import { revalidateTag } from 'next/cache' +import { revalidateRedirects as revalidateRedirectsAction } from '@/app/actions/revalidate' export const revalidateRedirects: CollectionAfterChangeHook = ({ doc, req: { payload } }) => { payload.logger.info(`Revalidating redirects`) - revalidateTag('redirects') + revalidateRedirectsAction().catch(console.error) return doc } diff --git a/templates/website/src/payload-types.ts b/templates/website/src/payload-types.ts index e34987e1c0d..7d83ad77977 100644 --- a/templates/website/src/payload-types.ts +++ b/templates/website/src/payload-types.ts @@ -108,6 +108,7 @@ export interface Config { db: { defaultIDType: string; }; + fallbackLocale: null; globals: { header: Header; footer: Footer; diff --git a/templates/website/src/utilities/getURL.ts b/templates/website/src/utilities/getURL.ts index 7d17c644860..098bd7e2023 100644 --- a/templates/website/src/utilities/getURL.ts +++ b/templates/website/src/utilities/getURL.ts @@ -5,7 +5,7 @@ export const getServerSideURL = () => { process.env.NEXT_PUBLIC_SERVER_URL || (process.env.VERCEL_PROJECT_PRODUCTION_URL ? `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` - : 'http://localhost:3000') + : 'http://127.0.0.1:3002') ) } diff --git a/templates/with-vercel-mongodb/package.json b/templates/with-vercel-mongodb/package.json index 6521e940373..d9c0f0c65df 100644 --- a/templates/with-vercel-mongodb/package.json +++ b/templates/with-vercel-mongodb/package.json @@ -18,17 +18,17 @@ "test:int": "cross-env NODE_OPTIONS=--no-deprecation vitest run --config ./vitest.config.mts" }, "dependencies": { - "@payloadcms/db-mongodb": "3.63.0", - "@payloadcms/next": "3.63.0", - "@payloadcms/richtext-lexical": "3.63.0", - "@payloadcms/ui": "3.63.0", + "@payloadcms/db-mongodb": "workspace:*", + "@payloadcms/next": "workspace:*", + "@payloadcms/richtext-lexical": "workspace:*", + "@payloadcms/storage-vercel-blob": "workspace:*", + "@payloadcms/ui": "workspace:*", "cross-env": "^7.0.3", "graphql": "^16.8.1", "next": "15.4.7", - "payload": "3.63.0", + "payload": "workspace:*", "react": "19.1.0", - "react-dom": "19.1.0", - "@payloadcms/storage-vercel-blob": "3.63.0" + "react-dom": "19.1.0" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", @@ -48,6 +48,7 @@ "vite-tsconfig-paths": "5.1.4", "vitest": "3.2.3" }, + "packageManager": "pnpm@10.20.0", "engines": { "node": "^18.20.2 || >=20.9.0" }, @@ -57,6 +58,5 @@ "esbuild", "unrs-resolver" ] - }, - "packageManager": "pnpm@10.20.0" + } } diff --git a/templates/with-vercel-mongodb/src/payload-types.ts b/templates/with-vercel-mongodb/src/payload-types.ts index ec118e0473e..7c24a0d57f3 100644 --- a/templates/with-vercel-mongodb/src/payload-types.ts +++ b/templates/with-vercel-mongodb/src/payload-types.ts @@ -86,6 +86,7 @@ export interface Config { db: { defaultIDType: string; }; + fallbackLocale: null; globals: {}; globalsSelect: {}; locale: null; diff --git a/test/_community/payload-types.ts b/test/_community/payload-types.ts index 39b48742beb..8372cf69bbb 100644 --- a/test/_community/payload-types.ts +++ b/test/_community/payload-types.ts @@ -88,6 +88,7 @@ export interface Config { db: { defaultIDType: string; }; + fallbackLocale: null; globals: { menu: Menu; };