From d0434dda9b9d253842315f677dccd39ad97534ca Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Wed, 13 May 2026 16:36:18 +0100 Subject: [PATCH] =?UTF-8?q?feat(cms):=20upgrade=20Payload=203.33=E2=86=923?= =?UTF-8?q?.84,=20add=20SEO=20plugin,=20connect=20hardcoded=20pages=20to?= =?UTF-8?q?=20CMS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Upgrade payload + all @payloadcms/* packages to 3.84.1 - Update minor/patch deps: drizzle-kit, tailwind-merge, vitest, playwright, etc. - Fix eslint config: remove duplicate @typescript-eslint plugin registration - Add @payloadcms/plugin-seo for pages, blog-posts, locations collections - Remove manual meta fields from Pages (replaced by SEO plugin) - Add DyvoLisPage global: hero, gallery quote, working hours, whyVisit items - Add GroupVisitsPage global: hero, form texts, group types with discounts - Connect /dni-narodzhennia to birthday-packages collection (was hardcoded) - Connect /lokatsii/dyvolis to dyvolis-page global (was hardcoded) - Connect /grupovi-vidviduvannia to group-visits-page global (was hardcoded) - Remove STATIC_LOCATIONS fallback from /lokatsii (use DB or empty state) - Refactor DyvoLisHero/Gallery/WhyVisit/Tickets to accept CMS props w/ fallbacks Co-Authored-By: Claude Sonnet 4.6 --- .gitignore | 1 + eslint.config.mjs | 2 - package.json | 27 +- payload.config.ts | 29 +- pnpm-lock.yaml | 480 ++++++++++++------ src/app/(frontend)/[slug]/page.tsx | 6 +- src/app/(frontend)/dni-narodzhennia/page.tsx | 77 ++- .../(frontend)/grupovi-vidviduvannia/page.tsx | 51 +- src/app/(frontend)/korzyna/page.tsx | 52 +- src/app/(frontend)/kvytky/page.tsx | 56 +- src/app/(frontend)/lokatsii/dyvolis/page.tsx | 53 +- src/app/(frontend)/lokatsii/page.tsx | 60 +-- src/collections/Pages.ts | 8 - src/components/blocks/PricingCardClient.tsx | 7 +- src/components/sections/DyvoLisGallery.tsx | 13 +- src/components/sections/DyvoLisHero.tsx | 32 +- src/components/sections/DyvoLisTickets.tsx | 41 +- src/components/sections/DyvoLisWhyVisit.tsx | 20 +- src/components/ui/CartIcon.tsx | 5 +- src/components/ui/TariffCardClient.tsx | 13 +- src/context/CartContext.tsx | 4 +- src/globals/DyvoLisPage.ts | 94 ++++ src/globals/GroupVisitsPage.ts | 73 +++ 23 files changed, 838 insertions(+), 366 deletions(-) create mode 100644 src/globals/DyvoLisPage.ts create mode 100644 src/globals/GroupVisitsPage.ts diff --git a/.gitignore b/.gitignore index 95c1f14..3153a64 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ agentdb.rvf.lock /*.png /*.jpg /*.jpeg +.superpowers/ diff --git a/eslint.config.mjs b/eslint.config.mjs index 0e2696b..615e92c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,11 +1,9 @@ import nextConfig from 'eslint-config-next' -import tsPlugin from '@typescript-eslint/eslint-plugin' /** @type {import('eslint').Linter.Config[]} */ const eslintConfig = [ ...nextConfig, { - plugins: { '@typescript-eslint': tsPlugin }, rules: { '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], '@typescript-eslint/no-explicit-any': 'warn', diff --git a/package.json b/package.json index 4f78fab..49ed34d 100644 --- a/package.json +++ b/package.json @@ -33,48 +33,49 @@ ] }, "dependencies": { - "@payloadcms/db-postgres": "^3.33.0", - "@payloadcms/next": "^3.33.0", - "@payloadcms/richtext-lexical": "^3.33.0", + "@payloadcms/db-postgres": "^3.84.0", + "@payloadcms/next": "^3.84.0", + "@payloadcms/plugin-seo": "^3.84.1", + "@payloadcms/richtext-lexical": "^3.84.0", "@react-email/components": "^1.0.12", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cyrillic-to-translit-js": "^3.2.1", - "drizzle-kit": "0.31.7", + "drizzle-kit": "0.31.10", "graphql": "^16.9.0", "next": "^16.2.6", - "payload": "^3.33.0", + "payload": "^3.84.0", "pino": "^10.3.1", "react": "^19.1.0", "react-dom": "^19.1.0", "react-email": "^6.1.1", "resend": "^6.12.3", "sharp": "^0.34.5", - "tailwind-merge": "^3.5.0", + "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@figma/code-connect": "^1.4.4", - "@playwright/test": "^1.59.1", + "@playwright/test": "^1.60.0", "@tailwindcss/postcss": "^4.3.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", - "@types/node": "^25.6.2", + "@types/node": "^25.7.0", "@types/react": "^19.1.4", "@types/react-dom": "^19.1.2", "@types/supertest": "^7.2.0", - "@typescript-eslint/eslint-plugin": "^8.32.0", - "@typescript-eslint/parser": "^8.32.0", + "@typescript-eslint/eslint-plugin": "^8.59.3", + "@typescript-eslint/parser": "^8.59.3", "@vitejs/plugin-react": "^6.0.1", - "@vitest/coverage-v8": "^4.1.5", + "@vitest/coverage-v8": "^4.1.6", "dotenv": "^17.4.2", "eslint": "^9.28.0", "eslint-config-next": "^16.2.6", "husky": "^9.1.7", "jsdom": "^29.1.1", - "lint-staged": "^17.0.3", + "lint-staged": "^17.0.4", "pino-pretty": "^13.1.3", "postcss": "^8.5.3", "prettier": "^3.5.3", @@ -84,6 +85,6 @@ "tsx": "^4.21.0", "typescript": "^6.0.3", "vite-tsconfig-paths": "^6.1.1", - "vitest": "^4.1.5" + "vitest": "^4.1.6" } } diff --git a/payload.config.ts b/payload.config.ts index e1eee7e..a002887 100644 --- a/payload.config.ts +++ b/payload.config.ts @@ -1,6 +1,7 @@ import { buildConfig } from 'payload' import { postgresAdapter } from '@payloadcms/db-postgres' import { lexicalEditor } from '@payloadcms/richtext-lexical' +import { seoPlugin } from '@payloadcms/plugin-seo' import sharp from 'sharp' import path from 'path' import { fileURLToPath } from 'url' @@ -24,6 +25,8 @@ import { ThankYouPage } from './src/globals/ThankYouPage' import { Header } from './src/globals/Header' import { Footer } from './src/globals/Footer' import { SiteSettings } from './src/globals/SiteSettings' +import { DyvoLisPage } from './src/globals/DyvoLisPage' +import { GroupVisitsPage } from './src/globals/GroupVisitsPage' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -60,7 +63,29 @@ export default buildConfig({ BirthdayPackages, ], - globals: [HomePage, CheckoutPage, ThankYouPage, Header, Footer, SiteSettings], + globals: [ + HomePage, + CheckoutPage, + ThankYouPage, + Header, + Footer, + SiteSettings, + DyvoLisPage, + GroupVisitsPage, + ], + + plugins: [ + seoPlugin({ + collections: ['pages', 'blog-posts', 'locations'], + uploadsCollection: 'media', + generateTitle: ({ doc }) => { + const title = + (doc as { title?: string; name?: string }).title ?? (doc as { name?: string }).name ?? '' + return title ? `${title} — Шуміленд` : 'Шуміленд' + }, + generateDescription: ({ doc }) => (doc as { excerpt?: string }).excerpt ?? '', + }), + ], admin: { user: 'users', @@ -74,6 +99,8 @@ export default buildConfig({ 'header', 'footer', 'site-settings', + 'dyvolis-page', + 'group-visits-page', ], }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66e79f9..dd5d2fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,17 @@ importers: .: dependencies: '@payloadcms/db-postgres': - specifier: ^3.33.0 + specifier: ^3.84.0 version: 3.84.1(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3)) '@payloadcms/next': - specifier: ^3.33.0 - version: 3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + specifier: ^3.84.0 + version: 3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + '@payloadcms/plugin-seo': + specifier: ^3.84.1 + version: 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) '@payloadcms/richtext-lexical': - specifier: ^3.33.0 - version: 3.84.1(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)(yjs@13.6.30) + specifier: ^3.84.0 + version: 3.84.1(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)(yjs@13.6.30) '@react-email/components': specifier: ^1.0.12 version: 1.0.12(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -30,16 +33,16 @@ importers: specifier: ^3.2.1 version: 3.2.1 drizzle-kit: - specifier: 0.31.7 - version: 0.31.7 + specifier: 0.31.10 + version: 0.31.10 graphql: specifier: ^16.9.0 version: 16.14.0 next: specifier: ^16.2.6 - version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) + version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) payload: - specifier: ^3.33.0 + specifier: ^3.84.0 version: 3.84.1(graphql@16.14.0)(typescript@6.0.3) pino: specifier: ^10.3.1 @@ -60,8 +63,8 @@ importers: specifier: ^0.34.5 version: 0.34.5 tailwind-merge: - specifier: ^3.5.0 - version: 3.5.0 + specifier: ^3.6.0 + version: 3.6.0 zod: specifier: ^4.4.3 version: 4.4.3 @@ -73,8 +76,8 @@ importers: specifier: ^1.4.4 version: 1.4.4 '@playwright/test': - specifier: ^1.59.1 - version: 1.59.1 + specifier: ^1.60.0 + version: 1.60.0 '@tailwindcss/postcss': specifier: ^4.3.0 version: 4.3.0 @@ -88,8 +91,8 @@ importers: specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) '@types/node': - specifier: ^25.6.2 - version: 25.6.2 + specifier: ^25.7.0 + version: 25.7.0 '@types/react': specifier: ^19.1.4 version: 19.2.14 @@ -100,17 +103,17 @@ importers: specifier: ^7.2.0 version: 7.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.0 - version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + specifier: ^8.59.3 + version: 8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.32.0 - version: 8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + specifier: ^8.59.3 + version: 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) + version: 6.0.1(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/coverage-v8': - specifier: ^4.1.5 - version: 4.1.5(vitest@4.1.5) + specifier: ^4.1.6 + version: 4.1.6(vitest@4.1.6) dotenv: specifier: ^17.4.2 version: 17.4.2 @@ -119,7 +122,7 @@ importers: version: 9.39.4(jiti@2.7.0) eslint-config-next: specifier: ^16.2.6 - version: 16.2.6(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + version: 16.2.6(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) husky: specifier: ^9.1.7 version: 9.1.7 @@ -127,8 +130,8 @@ importers: specifier: ^29.1.1 version: 29.1.1(@noble/hashes@1.8.0) lint-staged: - specifier: ^17.0.3 - version: 17.0.3 + specifier: ^17.0.4 + version: 17.0.4 pino-pretty: specifier: ^13.1.3 version: 13.1.3 @@ -155,10 +158,10 @@ importers: version: 6.0.3 vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@6.0.3)(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) + version: 6.1.1(typescript@6.0.3)(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) vitest: - specifier: ^4.1.5 - version: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) + specifier: ^4.1.6 + version: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) packages: @@ -1524,6 +1527,13 @@ packages: next: '>=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.2 <17.0.0' payload: 3.84.1 + '@payloadcms/plugin-seo@3.84.1': + resolution: {integrity: sha512-9FYs5ML/eWR/A/rQfHt2NhPzkJWbUx5SN/+lEQ90r3c3Z8CQUVpt4vETXSI9Gxi764lTutIGemuZAJK9WRy3Lw==} + peerDependencies: + payload: 3.84.1 + react: ^19.0.1 || ^19.1.2 || ^19.2.1 + react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 + '@payloadcms/richtext-lexical@3.84.1': resolution: {integrity: sha512-KaNSz0RJFLnLc/hBRGg8Lgwk5FjCZSskA6KuufNWG5QdgUsgQe4Dx4Vr7G+VSR9zSZj+R4TVVSC0aVv4z7vL3g==} engines: {node: ^18.20.2 || >=20.9.0} @@ -1550,8 +1560,8 @@ packages: '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@playwright/test@1.59.1': - resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} + '@playwright/test@1.60.0': + resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==} engines: {node: '>=18'} hasBin: true @@ -2091,11 +2101,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.40': - resolution: {integrity: sha512-xxx6M2IpSTnnKcR0cMvIiohkiCx20/oRPtWGbenFygKCGl3zqUzdNjQ/1V4solq1LU+dgv0nQzeGOuqkqZGg0Q==} - - '@types/node@25.6.2': - resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} + '@types/node@25.7.0': + resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -2145,6 +2152,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/eslint-plugin@8.59.3': + resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.59.3 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/parser@8.59.2': resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2152,22 +2167,45 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/parser@8.59.3': + resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.59.2': resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.59.3': + resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.59.2': resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.59.3': + resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.59.2': resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/tsconfig-utils@8.59.3': + resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.59.2': resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2175,16 +2213,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.59.3': + resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/types@8.59.2': resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.59.3': + resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.59.2': resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/typescript-estree@8.59.3': + resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.59.2': resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2192,10 +2247,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.59.3': + resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.59.2': resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.59.3': + resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -2312,20 +2378,20 @@ packages: babel-plugin-react-compiler: optional: true - '@vitest/coverage-v8@4.1.5': - resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} + '@vitest/coverage-v8@4.1.6': + resolution: {integrity: sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==} peerDependencies: - '@vitest/browser': 4.1.5 - vitest: 4.1.5 + '@vitest/browser': 4.1.6 + vitest: 4.1.6 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.6': + resolution: {integrity: sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.6': + resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2335,20 +2401,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.6': + resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.6': + resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.6': + resolution: {integrity: sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.6': + resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.6': + resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -2910,6 +2976,10 @@ packages: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + drizzle-kit@0.31.10: + resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} + hasBin: true + drizzle-kit@0.31.7: resolution: {integrity: sha512-hOzRGSdyKIU4FcTSFYGKdXEjFsncVwHZ43gY3WU5Bz9j5Iadp6Rh6hxLSQ1IWXpKLBKt/d5y1cpSPcV+FcoQ1A==} hasBin: true @@ -3973,8 +4043,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@17.0.3: - resolution: {integrity: sha512-wnvMRhzC3GNpjixxleiG+pAW09dHTUgBCjMS7XouAg5E7wKUc8YdfogpF7zIgvXKDbH+452O6+XpnKm6V67rPw==} + lint-staged@17.0.4: + resolution: {integrity: sha512-+rU9lSUyVOZ/hDUmRLVGzyS2v73cDdQjX+XQz1AaOdIE4RysLq0HoPW2HrrgeNCLklkhi904VBU1bmgWLHVnkA==} engines: {node: '>=22.22.1'} hasBin: true @@ -4485,13 +4555,13 @@ packages: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true - playwright-core@1.59.1: - resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + playwright-core@1.60.0: + resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} engines: {node: '>=18'} hasBin: true - playwright@1.59.1: - resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + playwright@1.60.0: + resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} engines: {node: '>=18'} hasBin: true @@ -4849,6 +4919,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -5099,8 +5174,8 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} tailwindcss@4.2.4: resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} @@ -5275,11 +5350,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@7.21.0: + resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} undici@7.24.4: resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} @@ -5403,20 +5475,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.6: + resolution: {integrity: sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.6 + '@vitest/browser-preview': 4.1.6 + '@vitest/browser-webdriverio': 4.1.6 + '@vitest/coverage-istanbul': 4.1.6 + '@vitest/coverage-v8': 4.1.6 + '@vitest/ui': 4.1.6 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -6849,14 +6921,14 @@ snapshots: transitivePeerDependencies: - typescript - '@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)': + '@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)': dependencies: '@dnd-kit/core': 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@payloadcms/graphql': 3.84.1(graphql@16.14.0)(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(typescript@6.0.3) '@payloadcms/translations': 3.84.1 - '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) busboy: 1.6.0 dequal: 2.0.3 file-type: 21.3.4 @@ -6864,7 +6936,7 @@ snapshots: graphql-http: 1.22.4(graphql@16.14.0) graphql-playground-html: 1.6.30 http-status: 2.1.0 - next: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) + next: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) path-to-regexp: 6.3.0 payload: 3.84.1(graphql@16.14.0)(typescript@6.0.3) qs-esm: 8.0.1 @@ -6878,7 +6950,21 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-lexical@3.84.1(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)(yjs@13.6.30)': + '@payloadcms/plugin-seo@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)': + dependencies: + '@payloadcms/translations': 3.84.1 + '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + payload: 3.84.1(graphql@16.14.0)(typescript@6.0.3) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + transitivePeerDependencies: + - '@types/react' + - monaco-editor + - next + - supports-color + - typescript + + '@payloadcms/richtext-lexical@3.84.1(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)(yjs@13.6.30)': dependencies: '@faceless-ui/modal': 3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -6893,9 +6979,9 @@ snapshots: '@lexical/selection': 0.41.0 '@lexical/table': 0.41.0 '@lexical/utils': 0.41.0 - '@payloadcms/next': 3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + '@payloadcms/next': 3.84.1(@types/react@19.2.14)(graphql@16.14.0)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) '@payloadcms/translations': 3.84.1 - '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) acorn: 8.16.0 bson-objectid: 2.0.4 csstype: 3.1.3 @@ -6927,7 +7013,7 @@ snapshots: dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)': + '@payloadcms/ui@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3)': dependencies: '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -6942,7 +7028,7 @@ snapshots: date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) + next: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) object-to-formdata: 4.5.1 payload: 3.84.1(graphql@16.14.0)(typescript@6.0.3) qs-esm: 8.0.1 @@ -6964,9 +7050,9 @@ snapshots: '@pinojs/redact@0.4.0': {} - '@playwright/test@1.59.1': + '@playwright/test@1.60.0': dependencies: - playwright: 1.59.1 + playwright: 1.60.0 '@preact/signals-core@1.14.1': {} @@ -7326,7 +7412,7 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 20.19.40 + '@types/node': 25.7.0 '@types/chai@5.2.3': dependencies: @@ -7337,7 +7423,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 20.19.40 + '@types/node': 25.7.0 '@types/debug@4.1.13': dependencies: @@ -7371,19 +7457,15 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@20.19.40': + '@types/node@25.7.0': dependencies: - undici-types: 6.21.0 - - '@types/node@25.6.2': - dependencies: - undici-types: 7.19.2 + undici-types: 7.21.0 '@types/parse-json@4.0.2': {} '@types/pg@8.20.0': dependencies: - '@types/node': 20.19.40 + '@types/node': 25.7.0 pg-protocol: 1.13.0 pg-types: 2.2.0 @@ -7403,7 +7485,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.19.40 + '@types/node': 25.7.0 form-data: 4.0.5 '@types/supertest@7.2.0': @@ -7422,7 +7504,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.19.40 + '@types/node': 25.7.0 '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: @@ -7440,6 +7522,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/type-utils': 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 + eslint: 9.39.4(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.2 @@ -7452,6 +7550,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 + debug: 4.4.3 + eslint: 9.39.4(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) @@ -7461,15 +7571,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.59.3(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.59.2': dependencies: '@typescript-eslint/types': 8.59.2 '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/scope-manager@8.59.3': + dependencies: + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: typescript: 6.0.3 + '@typescript-eslint/tsconfig-utils@8.59.3(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + '@typescript-eslint/type-utils@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.59.2 @@ -7482,8 +7610,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 9.39.4(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.59.2': {} + '@typescript-eslint/types@8.59.3': {} + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) @@ -7499,6 +7641,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.59.3(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.3(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.0 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) @@ -7510,11 +7667,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + eslint: 9.39.4(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.59.2': dependencies: '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 + '@typescript-eslint/visitor-keys@8.59.3': + dependencies: + '@typescript-eslint/types': 8.59.3 + eslint-visitor-keys: 5.0.1 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -7574,15 +7747,15 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@6.0.1(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4))': + '@vitejs/plugin-react@6.0.1(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) - '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': + '@vitest/coverage-v8@4.1.6(vitest@4.1.6)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.6 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -7591,46 +7764,46 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) + vitest: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.6': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4))': + '@vitest/mocker@4.1.6(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.6': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.6': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.6 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.6': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.6 + '@vitest/utils': 4.1.6 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.6': {} - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.6': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.6 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -8199,6 +8372,13 @@ snapshots: dotenv@17.4.2: {} + drizzle-kit@0.31.10: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.12 + tsx: 4.21.0 + drizzle-kit@0.31.7: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -8236,7 +8416,7 @@ snapshots: engine.io@6.6.7: dependencies: '@types/cors': 2.8.19 - '@types/node': 20.19.40 + '@types/node': 25.7.0 '@types/ws': 8.18.1 accepts: 1.3.8 base64id: 2.0.0 @@ -8499,13 +8679,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.2.6(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): + eslint-config-next@16.2.6(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): dependencies: '@next/eslint-plugin-next': 16.2.6 eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-hooks: 7.1.1(eslint@9.39.4(jiti@2.7.0)) @@ -8538,22 +8718,22 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8564,7 +8744,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) hasown: 2.0.3 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -8576,7 +8756,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.2(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8932,7 +9112,7 @@ snapshots: happy-dom@20.9.0: dependencies: - '@types/node': 20.19.40 + '@types/node': 25.7.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 7.0.1 @@ -9420,7 +9600,7 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@17.0.3: + lint-staged@17.0.4: dependencies: listr2: 10.2.1 picomatch: 4.0.4 @@ -9795,7 +9975,7 @@ snapshots: negotiator@0.6.3: {} - next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.59.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4): + next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4): dependencies: '@next/env': 16.2.6 '@swc/helpers': 0.5.15 @@ -9814,7 +9994,7 @@ snapshots: '@next/swc-linux-x64-musl': 16.2.6 '@next/swc-win32-arm64-msvc': 16.2.6 '@next/swc-win32-x64-msvc': 16.2.6 - '@playwright/test': 1.59.1 + '@playwright/test': 1.60.0 sass: 1.77.4 sharp: 0.34.5 transitivePeerDependencies: @@ -10147,11 +10327,11 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 3.1.0 - playwright-core@1.59.1: {} + playwright-core@1.60.0: {} - playwright@1.59.1: + playwright@1.60.0: dependencies: - playwright-core: 1.59.1 + playwright-core: 1.60.0 optionalDependencies: fsevents: 2.3.2 @@ -10504,6 +10684,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -10836,7 +11018,7 @@ snapshots: tagged-tag@1.0.0: {} - tailwind-merge@3.5.0: {} + tailwind-merge@3.6.0: {} tailwindcss@4.2.4: {} @@ -11020,9 +11202,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} - - undici-types@7.19.2: {} + undici-types@7.21.0: {} undici@7.24.4: {} @@ -11121,17 +11301,17 @@ snapshots: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)): + vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.3) - vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) transitivePeerDependencies: - supports-color - typescript - vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4): + vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -11140,7 +11320,7 @@ snapshots: rollup: 4.60.3 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 @@ -11148,15 +11328,15 @@ snapshots: tsx: 4.21.0 yaml: 2.8.4 - vitest@4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)): + vitest@4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.6 + '@vitest/mocker': 4.1.6(vite@7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4)) + '@vitest/pretty-format': 4.1.6 + '@vitest/runner': 4.1.6 + '@vitest/snapshot': 4.1.6 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -11168,11 +11348,11 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.3(@types/node@25.7.0)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.4)(tsx@4.21.0)(yaml@2.8.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.6.2 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@types/node': 25.7.0 + '@vitest/coverage-v8': 4.1.6(vitest@4.1.6) happy-dom: 20.9.0 jsdom: 29.1.1(@noble/hashes@1.8.0) transitivePeerDependencies: diff --git a/src/app/(frontend)/[slug]/page.tsx b/src/app/(frontend)/[slug]/page.tsx index acc29e4..03a82d7 100644 --- a/src/app/(frontend)/[slug]/page.tsx +++ b/src/app/(frontend)/[slug]/page.tsx @@ -29,11 +29,11 @@ export async function generateMetadata({ params }: Props): Promise { if (!page) return { title: 'Не знайдено — Шуміленд' } const p = page as unknown as { title: string - meta?: { metaTitle?: string; metaDescription?: string } + meta?: { title?: string; description?: string } } return { - title: p.meta?.metaTitle ?? `${p.title} — Шуміленд`, - description: p.meta?.metaDescription ?? '', + title: p.meta?.title ?? `${p.title} — Шуміленд`, + description: p.meta?.description ?? '', } } diff --git a/src/app/(frontend)/dni-narodzhennia/page.tsx b/src/app/(frontend)/dni-narodzhennia/page.tsx index e574271..5f7f7cc 100644 --- a/src/app/(frontend)/dni-narodzhennia/page.tsx +++ b/src/app/(frontend)/dni-narodzhennia/page.tsx @@ -1,4 +1,6 @@ import type { Metadata } from 'next' +import { getPayload } from 'payload' +import configPromise from '@payload-config' import { PageHero } from '@/components/ui/PageHero' import { BirthdayBookingForm } from '@/components/forms/BirthdayBookingForm' @@ -8,41 +10,25 @@ export const metadata: Metadata = { 'Святкуйте день народження у Шуміленді! Пакети для дітей та дорослих з розвагами, аніматорами та кейтерингом.', } -const PACKAGES = [ - { - name: 'Стандарт', - price: '4 500', - features: ['До 10 дітей', 'Аніматор 2 год', 'Вхідні квитки', 'Торт від закладу'], - highlight: false, - }, - { - name: 'Преміум', - price: '8 900', - features: [ - 'До 20 дітей', - 'Аніматор 3 год', - 'Вхідні квитки', - 'Торт + солодкий стіл', - 'Декор зали', - 'Фотограф 1 год', - ], - highlight: true, - }, - { - name: 'VIP', - price: '15 000', - features: [ - 'До 40 гостей', - 'Аніматор 4 год', - 'Вхідні квитки', - 'Банкетний зал', - 'Повне меню', - 'Фотограф + відео', - 'Персональний менеджер', - ], - highlight: false, - }, -] +export const revalidate = 60 + +async function getPackages() { + try { + const payload = await getPayload({ config: configPromise }) + const result = await payload.find({ + collection: 'birthday-packages', + sort: 'sort', + limit: 20, + }) + return result.docs + } catch { + return [] + } +} + +function formatPrice(price: number): string { + return price.toLocaleString('uk-UA').replace(/,/g, ' ') +} export default async function BirthdayPage({ searchParams, @@ -51,6 +37,8 @@ export default async function BirthdayPage({ }) { const params = await searchParams const defaultPackage = params.package + const packages = await getPackages() + return (
- {PACKAGES.map((pkg) => ( + {packages.map((pkg) => (
- {pkg.highlight && ( + {pkg.featured && pkg.badge && ( - Найпопулярніший + {pkg.badge} )}
@@ -88,17 +76,18 @@ export default async function BirthdayPage({ className="mt-1 text-[42px] leading-none font-black text-white" style={{ fontFamily: 'var(--font-inter, Inter), sans-serif' }} > - {pkg.price} + {pkg.priceLabel ?? formatPrice(pkg.price)}{' '} + {pkg.currency ?? '₴'}

    - {pkg.features.map((f) => ( + {pkg.features?.map((f: { id?: string; text: string }) => (
  • - {f} + {f.text}
  • ))}
diff --git a/src/app/(frontend)/grupovi-vidviduvannia/page.tsx b/src/app/(frontend)/grupovi-vidviduvannia/page.tsx index cfb9d8f..cba7091 100644 --- a/src/app/(frontend)/grupovi-vidviduvannia/page.tsx +++ b/src/app/(frontend)/grupovi-vidviduvannia/page.tsx @@ -1,14 +1,29 @@ import type { Metadata } from 'next' +import { getPayload } from 'payload' +import configPromise from '@payload-config' import { PageHero } from '@/components/ui/PageHero' import { GroupRequestForm } from '@/components/forms/GroupRequestForm' -export const metadata: Metadata = { - title: 'Групові відвідування — Шуміленд', - description: - 'Організуйте групове відвідування Шуміленду. Спеціальні ціни для шкіл, дитячих садків і корпоративних груп.', +export const revalidate = 60 + +async function getGroupVisitsData() { + try { + const payload = await getPayload({ config: configPromise }) + return await payload.findGlobal({ slug: 'group-visits-page', depth: 0 }) + } catch { + return null + } } -const GROUPS = [ +export async function generateMetadata(): Promise { + return { + title: 'Групові відвідування — Шуміленд', + description: + 'Організуйте групове відвідування Шуміленду. Спеціальні ціни для шкіл, дитячих садків і корпоративних груп.', + } +} + +const DEFAULT_GROUPS = [ { title: 'Шкільні екскурсії', description: @@ -35,17 +50,27 @@ const GROUPS = [ }, ] -export default function GroupVisitsPage() { +export default async function GroupVisitsPage() { + const data = await getGroupVisitsData() + + const heroTitle = data?.heroTitle ?? 'Групові відвідування' + const heroSubtitle = + data?.heroSubtitle ?? + 'Спеціальні умови для організованих груп. Мінімум 10 осіб — максимум вражень.' + const formTitle = data?.formTitle ?? 'Подати заявку на групове відвідування' + const formSubtitle = + data?.formSubtitle ?? + 'Вкажіть кількість учасників та бажану дату — менеджер зателефонує і погодить деталі.' + const groups = + data?.groups && data.groups.length > 0 ? (data.groups as typeof DEFAULT_GROUPS) : DEFAULT_GROUPS + return (
- +
- {GROUPS.map((g) => ( + {groups.map((g) => (
- Подати заявку на групове відвідування + {formTitle}

- Вкажіть кількість учасників та бажану дату — менеджер зателефонує і погодить деталі. + {formSubtitle}

diff --git a/src/app/(frontend)/korzyna/page.tsx b/src/app/(frontend)/korzyna/page.tsx index 553e04d..09af29c 100644 --- a/src/app/(frontend)/korzyna/page.tsx +++ b/src/app/(frontend)/korzyna/page.tsx @@ -96,10 +96,7 @@ export default function KorzynaPage() {
🛒
-

+

Кошик порожній

@@ -123,10 +120,7 @@ export default function KorzynaPage() { return (

-

+

Ваш кошик

@@ -201,7 +195,8 @@ export default function KorzynaPage() { style={{ background: '#2d5212' }} > - Разом: {totalCount} {totalCount === 1 ? 'квиток' : totalCount < 5 ? 'квитки' : 'квитків'} + Разом: {totalCount}{' '} + {totalCount === 1 ? 'квиток' : totalCount < 5 ? 'квитки' : 'квитків'} {totalPrice} ₴ @@ -219,7 +214,10 @@ export default function KorzynaPage() {
-
-
- {globalError && ( -
+
{globalError}
)} diff --git a/src/app/(frontend)/kvytky/page.tsx b/src/app/(frontend)/kvytky/page.tsx index 52809a8..922e60f 100644 --- a/src/app/(frontend)/kvytky/page.tsx +++ b/src/app/(frontend)/kvytky/page.tsx @@ -114,16 +114,31 @@ export default async function TicketsPage() {
{[ - { name: 'Стандарт', desc: 'До 10 дітей · Аніматор 2 год · Торт від закладу', href: '/dni-narodzhennia#order-form' }, - { name: 'Преміум', desc: 'До 20 дітей · Аніматор 3 год · Декор + фотограф', href: '/dni-narodzhennia#order-form' }, - { name: 'VIP', desc: 'До 40 гостей · Аніматор 4 год · Повне меню + відео', href: '/dni-narodzhennia#order-form' }, + { + name: 'Стандарт', + desc: 'До 10 дітей · Аніматор 2 год · Торт від закладу', + href: '/dni-narodzhennia#order-form', + }, + { + name: 'Преміум', + desc: 'До 20 дітей · Аніматор 3 год · Декор + фотограф', + href: '/dni-narodzhennia#order-form', + }, + { + name: 'VIP', + desc: 'До 40 гостей · Аніматор 4 год · Повне меню + відео', + href: '/dni-narodzhennia#order-form', + }, ].map((pkg) => (
-

+

{pkg.name}

@@ -133,7 +148,10 @@ export default async function TicketsPage() { Дізнатися ціну @@ -149,16 +167,31 @@ export default async function TicketsPage() {

{[ - { name: 'Шкільні екскурсії', desc: 'Від 15 осіб · Знижка 15% · Екскурсовод', href: '/grupovi-vidviduvannia#order-form' }, - { name: 'Дитячі садки', desc: 'Від 10 осіб · Знижка 20% · Безпечний формат', href: '/grupovi-vidviduvannia#order-form' }, - { name: 'Корпоративи', desc: 'Від 20 осіб · Знижка 10% · Ексклюзивні зони', href: '/grupovi-vidviduvannia#order-form' }, + { + name: 'Шкільні екскурсії', + desc: 'Від 15 осіб · Знижка 15% · Екскурсовод', + href: '/grupovi-vidviduvannia#order-form', + }, + { + name: 'Дитячі садки', + desc: 'Від 10 осіб · Знижка 20% · Безпечний формат', + href: '/grupovi-vidviduvannia#order-form', + }, + { + name: 'Корпоративи', + desc: 'Від 20 осіб · Знижка 10% · Ексклюзивні зони', + href: '/grupovi-vidviduvannia#order-form', + }, ].map((grp) => (
-

+

{grp.name}

@@ -168,7 +201,10 @@ export default async function TicketsPage() { Дізнатися ціну diff --git a/src/app/(frontend)/lokatsii/dyvolis/page.tsx b/src/app/(frontend)/lokatsii/dyvolis/page.tsx index 006830e..5394bdb 100644 --- a/src/app/(frontend)/lokatsii/dyvolis/page.tsx +++ b/src/app/(frontend)/lokatsii/dyvolis/page.tsx @@ -1,22 +1,57 @@ import type { Metadata } from 'next' +import { getPayload } from 'payload' +import configPromise from '@payload-config' import { DyvoLisHero } from '@/components/sections/DyvoLisHero' import { DyvoLisGallery } from '@/components/sections/DyvoLisGallery' import { DyvoLisWhyVisit } from '@/components/sections/DyvoLisWhyVisit' import { DyvoLisTickets } from '@/components/sections/DyvoLisTickets' -export const metadata: Metadata = { - title: 'ДивоЛіс — Шуміленд', - description: - 'Казковий топіарний ліс у Шуміленді: фігури з безпечних матеріалів, унікальна ландшафтна композиція та повна свобода для дітей.', +export const revalidate = 60 + +async function getDyvoLisData() { + try { + const payload = await getPayload({ config: configPromise }) + return await payload.findGlobal({ slug: 'dyvolis-page', depth: 0 }) + } catch { + return null + } } -export default function DyvoLisPage() { +export async function generateMetadata(): Promise { + const data = await getDyvoLisData() + return { + title: data?.heroTitle ? `${data.heroTitle} — Шуміленд` : 'ДивоЛіс — Шуміленд', + description: + 'Казковий топіарний ліс у Шуміленді: фігури з безпечних матеріалів, унікальна ландшафтна композиція та повна свобода для дітей.', + } +} + +export default async function DyvoLisPage() { + const data = await getDyvoLisData() + return (

- - - - + t.text)} + /> + + ({ + title: item.title, + description: item.description, + })) ?? undefined + } + /> +
) } diff --git a/src/app/(frontend)/lokatsii/page.tsx b/src/app/(frontend)/lokatsii/page.tsx index cbd9d4e..b3a5e11 100644 --- a/src/app/(frontend)/lokatsii/page.tsx +++ b/src/app/(frontend)/lokatsii/page.tsx @@ -12,52 +12,6 @@ export const metadata: Metadata = { export const revalidate = 3600 -const STATIC_LOCATIONS: LocationCMS[] = [ - { - id: 'dynopark', - name: 'ДиноПарк', - slug: 'dynopark', - tagline: 'портал у світ динозаврів', - shortDesc: - 'Прогуляйтесь серед реалістичних динозаврів у повний зріст. Понад 20 видів доісторичних тварин у природному середовищі.', - image: '/images/figma/loc-dinopark.webp', - }, - { - id: 'dyvolis', - name: 'Диво Ліс', - slug: 'dyvolis', - tagline: 'зона казкових топіарних фігур', - shortDesc: - 'Чарівний ліс з інтерактивними атракціонами, мотузковими парками та пригодами для всіх вікових груп.', - image: '/images/figma/loc-divo-lis.webp', - }, - { - id: 'maze', - name: 'Дзеркальний Лабіринт', - slug: 'maze', - tagline: 'справжній виклик кмітливості', - shortDesc: 'Захоплюючий лабіринт з дзеркалами, оптичними ілюзіями та таємничими кімнатами.', - image: '/images/figma/loc-maze.webp', - }, - { - id: 'tir', - name: 'Тир з призами', - slug: 'tir', - tagline: 'перемога, яку ви розділите разом', - shortDesc: 'Влаштуйте дружні змагання, дайте малечі декілька уроків та виграйте класний приз.', - image: '/images/figma/loc-tir.webp', - }, - { - id: 'playground', - name: 'Дитячий майданчик', - slug: 'playground', - tagline: 'територія забав і нових друзів', - shortDesc: - 'Поки малеча підкорює гірки та знаходить перших друзів, ви можете нарешті зробити паузу.', - image: '/images/figma/loc-playground.webp', - }, -] - function getMediaUrl(img: Media | string | null | undefined): string | null { if (!img) return null if (typeof img === 'string') return img @@ -87,12 +41,10 @@ async function getLocations(): Promise { limit: 20, overrideAccess: true, }) - const docs = result.docs as unknown as LocationCMS[] - if (docs.length > 0) return docs + return result.docs as unknown as LocationCMS[] } catch { - // DB not available + return [] } - return STATIC_LOCATIONS } export default async function LocationsPage() { @@ -103,6 +55,14 @@ export default async function LocationsPage() {
+ {locations.length === 0 && ( +

+ Локації незабаром з'являться тут. +

+ )}
{locations.map((loc, i) => { const imgUrl = diff --git a/src/collections/Pages.ts b/src/collections/Pages.ts index c5ff210..59eadbb 100644 --- a/src/collections/Pages.ts +++ b/src/collections/Pages.ts @@ -70,13 +70,5 @@ export const Pages: CollectionConfig = { CTABlock, ], }, - { - name: 'meta', - type: 'group', - fields: [ - { name: 'metaTitle', type: 'text' }, - { name: 'metaDescription', type: 'textarea' }, - ], - }, ], } diff --git a/src/components/blocks/PricingCardClient.tsx b/src/components/blocks/PricingCardClient.tsx index 4fe75bb..c1b7b24 100644 --- a/src/components/blocks/PricingCardClient.tsx +++ b/src/components/blocks/PricingCardClient.tsx @@ -7,7 +7,7 @@ const FONT_MONT = { fontFamily: 'var(--font-montserrat, Montserrat), sans-serif' const FONT_INTER = { fontFamily: 'var(--font-inter, Inter), sans-serif' } interface PricingCardClientProps { - tariffId: string // ezy_id as string — used by checkout API + tariffId: string // ezy_id as string — used by checkout API name: string price: number | null categoryTag: string | null @@ -39,10 +39,7 @@ export function PricingCardClient({
{categoryTag && ( -

+

{categoryTag}

)} diff --git a/src/components/sections/DyvoLisGallery.tsx b/src/components/sections/DyvoLisGallery.tsx index 5f26239..e4686d9 100644 --- a/src/components/sections/DyvoLisGallery.tsx +++ b/src/components/sections/DyvoLisGallery.tsx @@ -3,9 +3,6 @@ import { useState, useEffect } from 'react' -const QUOTE = - 'Це місце – де малеча зустрічає героїв улюблених казок. Простір справжнього дитинства.' - const GALLERY = [ '/images/dyvolis/photo-01.jpg', '/images/dyvolis/photo-02.jpg', @@ -33,7 +30,13 @@ const GALLERY = [ '/images/dyvolis/photo-24.jpg', ] -export function DyvoLisGallery() { +interface DyvoLisGalleryProps { + quote?: string +} + +export function DyvoLisGallery({ + quote = 'Це місце – де малеча зустрічає героїв улюблених казок. Простір справжнього дитинства.', +}: DyvoLisGalleryProps) { const [active, setActive] = useState(0) const n = GALLERY.length @@ -58,7 +61,7 @@ export function DyvoLisGallery() { className="relative mx-auto max-w-[900px] px-8 text-center text-[20px] leading-[1.4] font-bold text-white lg:text-[28px]" style={{ fontFamily: 'var(--font-montserrat, Montserrat), sans-serif' }} > - {QUOTE} + {quote}

diff --git a/src/components/sections/DyvoLisHero.tsx b/src/components/sections/DyvoLisHero.tsx index 829340c..c41a694 100644 --- a/src/components/sections/DyvoLisHero.tsx +++ b/src/components/sections/DyvoLisHero.tsx @@ -4,12 +4,26 @@ import { BtnPrimary } from '@/components/ui/BtnPrimary' const HERO_IMG = '/images/dyvolis/hero-cat.png' const ELLIPSE_ORANGE = '/images/dyvolis/ellipse-orange.svg' -const TIPS = [ +const DEFAULT_TIPS = [ 'Унікальна ландшафтна композиція з місцями для відпочинку', 'Повна свобода переміщення - без заборон', ] -export function DyvoLisHero() { +interface DyvoLisHeroProps { + title?: string + description?: string + stat?: string + statLabel?: string + tips?: string[] +} + +export function DyvoLisHero({ + title = 'ДивоЛіс – територія магії та фантазії', + description = 'Топіарні фігури зроблені з урахуванням важливих деталей, тому ви одразу впізнаєте в них улюблених казкових героїв. Тут можна бігати, стрибати, лазити по фігурках і ставати героями власної казки.', + stat = '60+', + statLabel = 'експонатів з безпечних для дітей матеріалів', + tips = DEFAULT_TIPS, +}: DyvoLisHeroProps) { return (
{/* Left column — contained within max-width */} @@ -22,15 +36,13 @@ export function DyvoLisHero() { className="text-[36px] leading-[1.2] font-bold text-[#272727] uppercase lg:text-[64px]" style={{ fontFamily: 'var(--font-montserrat, Montserrat), sans-serif' }} > - ДивоЛіс – територія магії та фантазії + {title}

- Топіарні фігури зроблені з урахуванням важливих деталей, тому ви одразу впізнаєте в - них улюблених казкових героїв. Тут можна бігати, стрибати, лазити по фігурках і - ставати героями власної казки. + {description}

Купити квиток @@ -56,7 +68,7 @@ export function DyvoLisHero() { }} aria-hidden="true" > - 60+ + {stat}
- експонатів з безпечних -
- для дітей матеріалів + {statLabel}
- {TIPS.map((tip, i) => ( + {tips.map((tip, i) => (
{/* Counter + Add */} -
+
- + {count} - + {count}