@kilivi/payloadcms-theme-management 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +37 -7
  2. package/dist/components/ServerThemeInjector.d.ts +13 -1
  3. package/dist/components/ServerThemeInjector.d.ts.map +1 -1
  4. package/dist/components/ServerThemeInjector.js +24 -1
  5. package/dist/components/ServerThemeInjector.js.map +1 -1
  6. package/dist/components/ThemeLivePreviewSync.d.ts +3 -0
  7. package/dist/components/ThemeLivePreviewSync.d.ts.map +1 -1
  8. package/dist/components/ThemeLivePreviewSync.js +28 -4
  9. package/dist/components/ThemeLivePreviewSync.js.map +1 -1
  10. package/dist/components/typographyPreviewUtils.d.ts +5 -0
  11. package/dist/components/typographyPreviewUtils.d.ts.map +1 -1
  12. package/dist/components/typographyPreviewUtils.js +16 -10
  13. package/dist/components/typographyPreviewUtils.js.map +1 -1
  14. package/dist/constants/themeFonts.d.ts +94 -168
  15. package/dist/constants/themeFonts.d.ts.map +1 -1
  16. package/dist/constants/themeFonts.js +260 -140
  17. package/dist/constants/themeFonts.js.map +1 -1
  18. package/dist/endpoints/themeFonts.d.ts +5 -0
  19. package/dist/endpoints/themeFonts.d.ts.map +1 -0
  20. package/dist/endpoints/themeFonts.js +138 -0
  21. package/dist/endpoints/themeFonts.js.map +1 -0
  22. package/dist/fields/AppearancePreviewField.d.ts.map +1 -1
  23. package/dist/fields/AppearancePreviewField.js +196 -133
  24. package/dist/fields/AppearancePreviewField.js.map +1 -1
  25. package/dist/fields/FontSelectField.css +155 -0
  26. package/dist/fields/FontSelectField.d.ts +4 -2
  27. package/dist/fields/FontSelectField.d.ts.map +1 -1
  28. package/dist/fields/FontSelectField.js +80 -118
  29. package/dist/fields/FontSelectField.js.map +1 -1
  30. package/dist/fields/StylePresetField.d.ts.map +1 -1
  31. package/dist/fields/StylePresetField.js +31 -30
  32. package/dist/fields/StylePresetField.js.map +1 -1
  33. package/dist/fields/ThemePreviewField.css +63 -1
  34. package/dist/fields/ThemePreviewField.d.ts.map +1 -1
  35. package/dist/fields/ThemePreviewField.js +2 -5
  36. package/dist/fields/ThemePreviewField.js.map +1 -1
  37. package/dist/fields/themeConfigurationField.d.ts.map +1 -1
  38. package/dist/fields/themeConfigurationField.js +320 -271
  39. package/dist/fields/themeConfigurationField.js.map +1 -1
  40. package/dist/hooks/useNativeLivePreview.d.ts +15 -0
  41. package/dist/hooks/useNativeLivePreview.d.ts.map +1 -0
  42. package/dist/hooks/useNativeLivePreview.js +18 -0
  43. package/dist/hooks/useNativeLivePreview.js.map +1 -0
  44. package/dist/hooks/useThemeFonts.d.ts +10 -0
  45. package/dist/hooks/useThemeFonts.d.ts.map +1 -0
  46. package/dist/hooks/useThemeFonts.js +36 -0
  47. package/dist/hooks/useThemeFonts.js.map +1 -0
  48. package/dist/index.d.ts +3 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +9 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/next-fonts.d.ts +3 -0
  53. package/dist/next-fonts.d.ts.map +1 -0
  54. package/dist/next-fonts.js +360 -0
  55. package/dist/next-fonts.js.map +1 -0
  56. package/dist/payload-types.d.ts +10 -6
  57. package/dist/payload-types.d.ts.map +1 -1
  58. package/dist/payload-types.js.map +1 -1
  59. package/dist/presets.d.ts +6 -0
  60. package/dist/presets.d.ts.map +1 -1
  61. package/dist/presets.js.map +1 -1
  62. package/dist/style-presets.d.ts +27 -18
  63. package/dist/style-presets.d.ts.map +1 -1
  64. package/dist/style-presets.js +399 -217
  65. package/dist/style-presets.js.map +1 -1
  66. package/dist/translations.d.ts +5 -0
  67. package/dist/translations.d.ts.map +1 -1
  68. package/dist/translations.js +10 -0
  69. package/dist/translations.js.map +1 -1
  70. package/dist/utils/livePreviewThemeRuntime.d.ts +6 -1
  71. package/dist/utils/livePreviewThemeRuntime.d.ts.map +1 -1
  72. package/dist/utils/livePreviewThemeRuntime.js +11 -1
  73. package/dist/utils/livePreviewThemeRuntime.js.map +1 -1
  74. package/dist/utils/resolveThemeConfiguration.d.ts +15 -0
  75. package/dist/utils/resolveThemeConfiguration.d.ts.map +1 -1
  76. package/dist/utils/resolveThemeConfiguration.js +41 -8
  77. package/dist/utils/resolveThemeConfiguration.js.map +1 -1
  78. package/dist/utils/themeUtils.d.ts.map +1 -1
  79. package/dist/utils/themeUtils.js +60 -2
  80. package/dist/utils/themeUtils.js.map +1 -1
  81. package/package.json +5 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, GlobalConfig, Plugin, TabsField } from 'payload'\nimport { DEFAULT_LIVE_PREVIEW_BREAKPOINTS } from './constants/devicePreviews.js'\nimport { createThemeConfigurationField } from './fields/themeConfigurationField.js'\nimport type { ThemeTab } from './fields/themeConfigurationField.js'\nimport type { SiteThemeConfiguration } from './payload-types.js'\nimport type { ThemePreset } from './presets.js'\nimport { allThemePresets } from './presets.js'\nimport { mergeThemeManagementI18n } from './i18n.js'\nimport { getTranslations, translations } from './translations.js'\nimport type {\n FetchThemeConfigurationOptions,\n PluginLogger,\n ThemeManagementLivePreviewOptions,\n ThemeManagementLivePreviewUrlArgs,\n ThemeManagementPluginOptions,\n} from './types.js'\n\nconst THEME_FIELD_NAME = 'themeConfiguration'\n\n/**\n * Removes existing theme configuration from a group field (legacy)\n */\nconst removeExistingThemeField = (fields: Field[] = []): Field[] =>\n fields.filter((field) => {\n const candidate = field as { name?: unknown }\n return candidate?.name !== THEME_FIELD_NAME\n })\n\n/**\n * Finds the tabs field in the collection fields array\n */\nconst findTabsField = (fields: Field[] = []): TabsField | null => {\n for (const field of fields) {\n if (field.type === 'tabs') {\n return field as TabsField\n }\n }\n return null\n}\n\n/**\n * Removes existing Appearance Settings tab if it exists\n */\nconst removeExistingThemeTab = (\n tabs: NonNullable<TabsField['tabs']>,\n): NonNullable<TabsField['tabs']> => {\n const knownLabels = Object.values(translations).map((t) => t.tabLabel)\n return tabs.filter((tab) => {\n // Normalize label to string (support localized object or plain string)\n let labelValues: string[] = []\n if (typeof tab.label === 'object' && tab.label !== null) {\n labelValues = Object.values(tab.label as Record<string, string>)\n } else if (typeof tab.label === 'string') {\n labelValues = [tab.label]\n }\n\n // If any of the label values match a known plugin tab label, remove it\n const matchesKnown = labelValues.some((v) => knownLabels.includes(v))\n\n return !matchesKnown\n })\n}\n\n/**\n * Injects theme tab into existing tabs field\n */\nconst injectThemeTab = (\n fields: Field[] | undefined,\n themeTab: ThemeTab,\n enableLogging: boolean,\n): Field[] => {\n // First, remove any legacy theme field (group-based)\n const sanitizedFields = removeExistingThemeField(fields ?? [])\n\n // Find the tabs field\n const tabsField = findTabsField(sanitizedFields)\n\n if (!tabsField || !tabsField.tabs) {\n if (enableLogging) {\n console.warn('Theme Management Plugin: No tabs field found. Creating a new tabs structure.')\n }\n\n // If no tabs exist, create a basic tabs structure with just the theme tab\n const newTabsField: TabsField = {\n type: 'tabs',\n tabs: [themeTab],\n }\n\n return [...sanitizedFields, newTabsField]\n }\n\n // Remove existing theme tab if present\n const sanitizedTabs = removeExistingThemeTab(tabsField.tabs)\n\n // Add theme tab to the end\n const updatedTabs = [...sanitizedTabs, themeTab]\n\n if (enableLogging) {\n console.log('Theme Management Plugin: injecting Appearance Settings tab')\n }\n\n // Update the tabs field\n const updatedTabsField: TabsField = {\n ...tabsField,\n tabs: updatedTabs,\n }\n\n // Replace the old tabs field with the updated one\n return sanitizedFields.map((field) => (field.type === 'tabs' ? updatedTabsField : field))\n}\n\nconst ensureCollectionsArray = (collections: Config['collections']): CollectionConfig[] =>\n Array.isArray(collections) ? collections : []\n\nconst ensureEndpointsArray = (endpoints: Config['endpoints']): NonNullable<Config['endpoints']> =>\n Array.isArray(endpoints) ? endpoints : []\n\ntype NormalizedLivePreviewOptions = {\n enabled: boolean\n injectRoute: boolean\n routePath: string\n pageCollection: string\n pageSlug: string\n fallbackToFirstPage: boolean\n tenantField: string\n tenantQueryParam: string\n breakpoints?: ThemeManagementLivePreviewOptions['breakpoints']\n url?: ThemeManagementLivePreviewOptions['url']\n}\n\ntype NormalizedCacheRevalidationOptions = {\n enabled: boolean\n injectRoute: boolean\n routePath: string\n secret?: string\n tags: string[]\n paths: string[]\n}\n\ntype MinimalPayloadRequest = ThemeManagementLivePreviewUrlArgs['req']\n\nconst normalizeLivePreviewOptions = (\n livePreview: ThemeManagementPluginOptions['livePreview'],\n): NormalizedLivePreviewOptions => {\n if (!livePreview) {\n // undefined or false → live preview not configured; show ThemePreviewField instead\n return {\n enabled: false,\n injectRoute: false,\n routePath: '/theme/preview',\n pageCollection: 'pages',\n pageSlug: 'home',\n fallbackToFirstPage: true,\n tenantField: 'tenant',\n tenantQueryParam: 'tenant',\n breakpoints: undefined,\n }\n }\n\n const raw = typeof livePreview === 'object' ? livePreview : {}\n\n return {\n enabled: raw.enabled ?? true,\n injectRoute: raw.injectRoute ?? false,\n routePath: normalizeRoutePath(raw.routePath),\n pageCollection: raw.pageCollection ?? 'pages',\n pageSlug: raw.pageSlug ?? 'home',\n fallbackToFirstPage: raw.fallbackToFirstPage ?? true,\n tenantField: raw.tenantField ?? 'tenant',\n tenantQueryParam: raw.tenantQueryParam ?? 'tenant',\n breakpoints: raw.breakpoints ?? DEFAULT_LIVE_PREVIEW_BREAKPOINTS,\n url: raw.url,\n }\n}\n\nconst dedupeStrings = (values: (string | undefined)[]): string[] => [\n ...new Set(\n values.filter((value): value is string => typeof value === 'string' && value.trim().length > 0),\n ),\n]\n\nconst normalizeRoutePath = (path: string | undefined): string => {\n if (!path || !path.trim()) {\n return '/theme/revalidate'\n }\n\n return path.startsWith('/') ? path : `/${path}`\n}\n\nconst normalizeCacheRevalidationOptions = (args: {\n cacheRevalidation: ThemeManagementPluginOptions['cacheRevalidation']\n standaloneCollectionSlug: string\n useStandaloneCollection: boolean\n}): NormalizedCacheRevalidationOptions => {\n const { cacheRevalidation, standaloneCollectionSlug, useStandaloneCollection } = args\n\n if (cacheRevalidation === false) {\n return {\n enabled: false,\n injectRoute: false,\n routePath: '/theme/revalidate',\n tags: [],\n paths: [],\n }\n }\n\n const raw = typeof cacheRevalidation === 'object' && cacheRevalidation ? cacheRevalidation : {}\n const defaultTag = `global_${standaloneCollectionSlug}`\n\n return {\n enabled: raw.enabled ?? useStandaloneCollection,\n injectRoute: raw.injectRoute ?? true,\n routePath: normalizeRoutePath(raw.routePath),\n secret: raw.secret,\n tags: dedupeStrings([defaultTag, ...(raw.tags ?? [])]),\n paths: dedupeStrings(raw.paths ?? []),\n }\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> | undefined => {\n if (value && typeof value === 'object') {\n return value as Record<string, unknown>\n }\n return undefined\n}\n\nconst pickString = (value: unknown): string | undefined => {\n if (typeof value === 'string' && value.trim()) return value\n return undefined\n}\n\nconst extractTenantValue = (value: unknown): string | undefined => {\n if (!value) return undefined\n if (typeof value === 'string') return pickString(value)\n\n const tenantRecord = asRecord(value)\n if (!tenantRecord) return undefined\n\n return (\n pickString(tenantRecord.id) ??\n pickString(tenantRecord.slug) ??\n pickString(tenantRecord.value) ??\n pickString(tenantRecord.tenant)\n )\n}\n\nconst resolveTenantSlug = (\n req: MinimalPayloadRequest,\n tenantField: string,\n data?: Record<string, unknown>,\n): string | undefined => {\n const fromData = extractTenantValue(data?.[tenantField])\n if (fromData) return fromData\n\n const query = req.query\n if (query && typeof URLSearchParams !== 'undefined' && query instanceof URLSearchParams) {\n return (\n pickString(query.get('tenant')) ??\n pickString(query.get('tenantSlug')) ??\n pickString(query.get('tenantId'))\n )\n }\n\n const queryRecord = asRecord(query)\n const fromQuery =\n extractTenantValue(queryRecord?.tenant) ??\n extractTenantValue(queryRecord?.tenantSlug) ??\n extractTenantValue(queryRecord?.tenantId)\n if (fromQuery) return fromQuery\n\n const userRecord = asRecord(req.user)\n const fromUser =\n extractTenantValue(userRecord?.[tenantField]) ??\n extractTenantValue(userRecord?.tenant) ??\n extractTenantValue(userRecord?.tenantSlug)\n if (fromUser) return fromUser\n\n const headers = req.headers\n if (headers && typeof Headers !== 'undefined' && headers instanceof Headers) {\n return (\n pickString(headers.get('x-tenant-id')) ??\n pickString(headers.get('x-tenant')) ??\n pickString(headers.get('payload-tenant'))\n )\n }\n\n const headerRecord = asRecord(headers)\n return (\n extractTenantValue(headerRecord?.['x-tenant-id']) ??\n extractTenantValue(headerRecord?.['x-tenant']) ??\n extractTenantValue(headerRecord?.['payload-tenant'])\n )\n}\n\nconst buildDefaultPreviewPath = (\n pageSlug: string,\n tenantSlug: string | undefined,\n tenantQueryParam: string,\n): string => {\n const normalizedSlug = pageSlug === 'home' ? '' : pageSlug\n const basePath = normalizedSlug ? `/${normalizedSlug}` : '/'\n\n if (!tenantSlug) {\n return basePath\n }\n\n const separator = basePath.includes('?') ? '&' : '?'\n return `${basePath}${separator}${tenantQueryParam}=${encodeURIComponent(tenantSlug)}`\n}\n\nconst resolveLivePreviewUrl = async (args: {\n req: MinimalPayloadRequest\n data?: Record<string, unknown>\n livePreview: NormalizedLivePreviewOptions\n enableLogging: boolean\n}): Promise<string> => {\n const { req, data, livePreview, enableLogging } = args\n\n const tenantSlug = resolveTenantSlug(req, livePreview.tenantField, data)\n\n const tenantWhere = tenantSlug\n ? {\n [livePreview.tenantField]: {\n equals: tenantSlug,\n },\n }\n : undefined\n\n const homeWhere = {\n and: [\n {\n slug: {\n equals: livePreview.pageSlug,\n },\n },\n ...(tenantWhere ? [tenantWhere] : []),\n ],\n }\n\n try {\n const preferredPageResponse = await req.payload.find({\n collection: livePreview.pageCollection,\n where: homeWhere,\n depth: 0,\n draft: true,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n })\n\n let page = preferredPageResponse?.docs?.[0]\n\n if (!page && livePreview.fallbackToFirstPage) {\n const fallbackResponse = await req.payload.find({\n collection: livePreview.pageCollection,\n where: tenantWhere,\n depth: 0,\n draft: true,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n })\n\n page = fallbackResponse?.docs?.[0]\n }\n\n const pageRecord = asRecord(page)\n const resolvedPageSlug = pickString(pageRecord?.slug) ?? livePreview.pageSlug\n\n if (livePreview.url) {\n return await livePreview.url({\n page: pageRecord,\n pageSlug: resolvedPageSlug,\n tenantSlug,\n req,\n })\n }\n\n return buildDefaultPreviewPath(resolvedPageSlug, tenantSlug, livePreview.tenantQueryParam)\n } catch (error) {\n if (enableLogging) {\n req.payload.logger?.warn?.('Theme Management Plugin: live preview URL fallback used', error)\n }\n\n return buildDefaultPreviewPath(livePreview.pageSlug, tenantSlug, livePreview.tenantQueryParam)\n }\n}\n\nconst createPreviewAdminConfig = (\n normalizedLivePreview: NormalizedLivePreviewOptions,\n enableLogging: boolean,\n) => {\n if (!normalizedLivePreview.enabled) {\n return {}\n }\n\n return {\n livePreview: {\n breakpoints: normalizedLivePreview.breakpoints,\n url: ({ data, req }: { data?: unknown; req: unknown }) =>\n resolveLivePreviewUrl({\n req: req as MinimalPayloadRequest,\n data: asRecord(data),\n livePreview: normalizedLivePreview,\n enableLogging,\n }),\n },\n preview: (data: Record<string, unknown>, options: { req?: unknown }) => {\n const req = options?.req\n if (!req) return null\n\n return resolveLivePreviewUrl({\n req: req as MinimalPayloadRequest,\n data,\n livePreview: normalizedLivePreview,\n enableLogging,\n })\n },\n }\n}\n\nconst readSecretFromRequest = async (req: unknown): Promise<string | undefined> => {\n const requestRecord = asRecord(req)\n const headersValue = requestRecord?.headers\n\n if (headersValue && typeof Headers !== 'undefined' && headersValue instanceof Headers) {\n return (\n pickString(headersValue.get('x-theme-revalidate-secret')) ??\n pickString(headersValue.get('x-revalidate-secret'))\n )\n }\n\n const headerRecord = asRecord(headersValue)\n const fromHeaders =\n pickString(headerRecord?.['x-theme-revalidate-secret']) ??\n pickString(headerRecord?.['x-revalidate-secret'])\n if (fromHeaders) {\n return fromHeaders\n }\n\n const requestWithJson = req as { json?: () => Promise<unknown> }\n const body =\n typeof requestWithJson?.json === 'function' ? await requestWithJson.json() : undefined\n const bodyRecord = asRecord(body)\n const fromBody = pickString(bodyRecord?.secret)\n if (fromBody) {\n return fromBody\n }\n\n const queryRecord = asRecord(requestRecord?.query)\n return pickString(queryRecord?.secret)\n}\n\nconst executeThemeRevalidation = async (options: {\n tags: string[]\n paths: string[]\n enableLogging: boolean\n logger?: PluginLogger\n}): Promise<{ tags: string[]; paths: string[] }> => {\n const { tags, paths, enableLogging, logger } = options\n\n try {\n const { revalidatePath, revalidateTag } = await import('next/cache')\n\n tags.forEach((tag) => revalidateTag(tag))\n paths.forEach((path) => revalidatePath(path))\n\n if (enableLogging) {\n logger?.info?.(\n `Theme Management Plugin: revalidated cache tags=[${tags.join(', ')}] paths=[${paths.join(', ')}]`,\n )\n }\n } catch (error) {\n if (enableLogging) {\n logger?.error?.('Theme Management Plugin: cache invalidation failed:', error)\n }\n throw error\n }\n\n return { tags, paths }\n}\n\nconst readQueryStringFromRequest = (req: unknown, paramName: string): string | undefined => {\n const reqRecord = asRecord(req)\n\n // Try URLSearchParams from native fetch/Node.js\n const queryValue = reqRecord?.query\n if (\n queryValue &&\n typeof URLSearchParams !== 'undefined' &&\n queryValue instanceof URLSearchParams\n ) {\n return pickString(queryValue.get(paramName))\n }\n\n // Try object form (common in Payload)\n const queryRecord = asRecord(queryValue)\n if (queryRecord) {\n const rawValue = queryRecord[paramName]\n if (Array.isArray(rawValue)) {\n return pickString(rawValue[0])\n }\n return pickString(rawValue)\n }\n\n // Try manual URL parsing as fallback\n const urlValue = pickString(reqRecord?.url) ?? pickString(reqRecord?.originalUrl)\n if (urlValue) {\n try {\n const url = new URL(urlValue, 'http://localhost')\n return pickString(url.searchParams.get(paramName))\n } catch {\n // Ignore parse errors\n }\n }\n\n return undefined\n}\n\nconst createLivePreviewEndpoint = (options: {\n livePreview: NormalizedLivePreviewOptions\n enableLogging: boolean\n}) => {\n const { livePreview, enableLogging } = options\n\n if (!livePreview.enabled || !livePreview.injectRoute) {\n return null\n }\n\n return {\n path: livePreview.routePath,\n method: 'get',\n handler: async (req: unknown) => {\n const previewSecret = process.env.PREVIEW_SECRET ?? process.env.PAYLOAD_PREVIEW_SECRET\n\n if (previewSecret) {\n const providedSecret =\n readQueryStringFromRequest(req, 'previewSecret') ??\n readQueryStringFromRequest(req, 'preview')\n if (providedSecret !== previewSecret) {\n return jsonResponse({ error: 'Unauthorized' }, 401)\n }\n }\n\n const pageSlug = readQueryStringFromRequest(req, 'pageSlug') ?? livePreview.pageSlug\n const tenantSlug = readQueryStringFromRequest(req, 'tenant')\n\n // Redirect to the actual client page (standard Payload live preview behavior)\n const destination = buildDefaultPreviewPath(\n pageSlug,\n tenantSlug,\n livePreview.tenantQueryParam,\n )\n\n if (enableLogging) {\n console.log('Theme Management Plugin: live preview redirect', destination)\n }\n\n return {\n status: 307,\n headers: {\n Location: destination,\n },\n }\n },\n }\n}\n\nconst createCacheRevalidationEndpoint = (options: {\n cacheRevalidation: NormalizedCacheRevalidationOptions\n enableLogging: boolean\n}) => {\n const { cacheRevalidation, enableLogging } = options\n\n if (!cacheRevalidation.enabled || !cacheRevalidation.injectRoute) {\n return null\n }\n\n return {\n path: cacheRevalidation.routePath,\n method: 'post',\n handler: async (req: unknown) => {\n const reqRecord = asRecord(req)\n const payload = asRecord(reqRecord?.payload)\n const logger = payload?.logger as PluginLogger | undefined\n\n if (cacheRevalidation.secret) {\n const providedSecret = await readSecretFromRequest(req)\n if (providedSecret !== cacheRevalidation.secret) {\n return jsonResponse({ error: 'Unauthorized' }, 401)\n }\n }\n\n try {\n const result = await executeThemeRevalidation({\n tags: cacheRevalidation.tags,\n paths: cacheRevalidation.paths,\n enableLogging,\n logger,\n })\n\n return jsonResponse({ ok: true, revalidated: result })\n } catch {\n return jsonResponse({ ok: false, error: 'Revalidation failed' }, 500)\n }\n },\n }\n}\n\nconst mergeEndpoint = (\n endpoints: NonNullable<Config['endpoints']>,\n endpoint: unknown,\n): NonNullable<Config['endpoints']> => {\n if (!endpoint) {\n return endpoints\n }\n\n const record = endpoint as unknown as { path?: string; method?: string }\n\n const withoutExisting = endpoints.filter((candidate) => {\n const candidateRecord = candidate as unknown as { path?: string; method?: string }\n return !(\n candidateRecord?.path === record?.path &&\n typeof candidateRecord.method === 'string' &&\n typeof record.method === 'string' &&\n candidateRecord.method.toLowerCase() === record.method.toLowerCase()\n )\n })\n\n return [...withoutExisting, endpoint as unknown as NonNullable<Config['endpoints']>[number]]\n}\n\nconst jsonResponse = (body: Record<string, unknown>, status = 200): unknown => {\n if (typeof Response !== 'undefined' && typeof Response.json === 'function') {\n return Response.json(body, { status })\n }\n\n return {\n status,\n json: async () => body,\n }\n}\n\nexport const themeManagementPlugin = (options: ThemeManagementPluginOptions = {}): Plugin => {\n return (config: Config): Config => {\n const {\n enabled = true,\n targetCollection = 'site-settings',\n useStandaloneCollection = false,\n standaloneCollectionSlug = 'appearance-settings',\n // Allow either string or localized object; default comes from plugin translations\n standaloneCollectionLabel = getTranslations().standaloneCollectionLabel,\n themePresets = allThemePresets,\n defaultTheme = 'cool',\n includeColorModeToggle = true,\n includeCustomCSS = true,\n customThemeConfigurationFields,\n customThemeConfigurationSections,\n includeBrandIdentity = false,\n enableAdvancedFeatures = true,\n enableLogging = false,\n livePreview = true,\n cacheRevalidation,\n i18n,\n } = options\n\n const normalizedLivePreview = normalizeLivePreviewOptions(livePreview)\n const normalizedCacheRevalidation = normalizeCacheRevalidationOptions({\n cacheRevalidation,\n standaloneCollectionSlug,\n useStandaloneCollection,\n })\n\n if (!enabled) {\n if (enableLogging) {\n console.log('Theme Management Plugin: disabled via options, skipping.')\n }\n return config\n }\n\n // Register the plugin's translations into Payload's native i18n\n // (`theme-management` namespace), merging in any user-provided extensions or\n // overrides. This config is used as the base for every return path below.\n const configWithI18n: Config = {\n ...config,\n i18n: mergeThemeManagementI18n(config.i18n, i18n),\n }\n\n const themeTab = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n customThemeConfigurationFields,\n customThemeConfigurationSections,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\n // Always show the static ModePreview panel; it hides at runtime when the user\n // actively enters livePreview mode (isLivePreviewing = true in context).\n useThemePreviewField: true,\n })\n\n // If using standalone collection, create a new global\n if (useStandaloneCollection) {\n if (enableLogging) {\n console.log(\n `Theme Management Plugin: creating standalone global \"${standaloneCollectionSlug}\"`,\n )\n }\n\n // Extract the fields from the tab directly (no wrapping in group)\n const tabFields = (themeTab.fields ?? []) as Field[]\n\n /**\n * Hook to auto-populate lightMode and darkMode colors when theme changes\n */\n type BeforeChangeArgs = {\n data?: {\n themeConfiguration?: {\n theme?: string\n lightMode?: Record<string, unknown>\n darkMode?: Record<string, unknown>\n }\n }\n }\n\n const beforeChangeHook = async (args: BeforeChangeArgs) => {\n const { data } = args\n\n // If theme is being changed, auto-populate color modes\n if (data?.themeConfiguration?.theme) {\n const themeName = data.themeConfiguration.theme\n const selectedPreset = themePresets.find((p) => p.name === themeName)\n\n if (selectedPreset) {\n // Initialize light and dark mode colors from preset if not already set\n if (!data.themeConfiguration.lightMode) {\n data.themeConfiguration.lightMode = {}\n }\n if (!data.themeConfiguration.darkMode) {\n data.themeConfiguration.darkMode = {}\n }\n\n // Only populate if not manually edited (first time or empty)\n const isLightModeEmpty = !data.themeConfiguration.lightMode?.background\n const isDarkModeEmpty = !data.themeConfiguration.darkMode?.background\n\n if (isLightModeEmpty && selectedPreset.lightMode) {\n data.themeConfiguration.lightMode = { ...selectedPreset.lightMode }\n }\n\n if (isDarkModeEmpty && selectedPreset.darkMode) {\n data.themeConfiguration.darkMode = { ...selectedPreset.darkMode }\n }\n }\n }\n\n return data\n }\n\n const standaloneGlobal: GlobalConfig = {\n slug: standaloneCollectionSlug,\n label: standaloneCollectionLabel,\n admin: {\n group: 'Settings',\n ...createPreviewAdminConfig(normalizedLivePreview, enableLogging),\n },\n // Provide a broad access object but cast to GlobalConfig['access'] to satisfy types\n access: ((): GlobalConfig['access'] => {\n const accessObj = {\n read: () => true,\n create: ({ req }: { req?: { user?: unknown } }) => !!req?.user,\n update: ({ req }: { req?: { user?: unknown } }) => !!req?.user,\n delete: ({ req }: { req?: { user?: unknown } }) => !!req?.user,\n } as unknown as GlobalConfig['access']\n return accessObj\n })(),\n fields: tabFields,\n hooks: {\n beforeChange: [beforeChangeHook],\n afterChange: [\n async ({ doc, req }) => {\n // Invalidate cache after appearance settings change\n if (!req?.context?.disableRevalidate && normalizedCacheRevalidation.enabled) {\n try {\n await executeThemeRevalidation({\n tags: normalizedCacheRevalidation.tags,\n paths: normalizedCacheRevalidation.paths,\n enableLogging,\n logger: req?.payload?.logger as PluginLogger | undefined,\n })\n } catch {\n // no-op: logging is handled in executeThemeRevalidation\n }\n }\n return doc\n },\n ],\n },\n }\n\n const globals = Array.isArray(configWithI18n.globals) ? configWithI18n.globals : []\n\n // Check if global already exists\n const existingIndex = globals.findIndex((g) => g.slug === standaloneCollectionSlug)\n\n if (existingIndex !== -1) {\n if (enableLogging) {\n console.warn(\n `Theme Management Plugin: global \"${standaloneCollectionSlug}\" already exists, skipping creation.`,\n )\n }\n return configWithI18n\n }\n\n const currentEndpoints = ensureEndpointsArray(configWithI18n.endpoints)\n const livePreviewEndpoint = createLivePreviewEndpoint({\n livePreview: normalizedLivePreview,\n enableLogging,\n })\n let endpoints = mergeEndpoint(currentEndpoints, livePreviewEndpoint)\n const cacheEndpoint = createCacheRevalidationEndpoint({\n cacheRevalidation: normalizedCacheRevalidation,\n enableLogging,\n })\n endpoints = mergeEndpoint(endpoints, cacheEndpoint)\n\n return {\n ...configWithI18n,\n endpoints,\n globals: [...globals, standaloneGlobal],\n }\n }\n\n // Otherwise, add as tab to existing collection\n let collectionTouched = false\n\n const collections = ensureCollectionsArray(configWithI18n.collections).map((collection) => {\n if (collection.slug !== targetCollection) {\n return collection\n }\n\n collectionTouched = true\n\n if (enableLogging) {\n console.log(`Theme Management Plugin: enhancing collection \"${collection.slug}\"`)\n }\n\n const existingFields = Array.isArray(collection.fields) ? collection.fields : []\n\n const fields = injectThemeTab(existingFields, themeTab, enableLogging)\n\n const admin = {\n ...collection.admin,\n ...createPreviewAdminConfig(normalizedLivePreview, enableLogging),\n }\n\n return {\n ...collection,\n fields,\n admin,\n }\n })\n\n if (!collectionTouched) {\n if (enableLogging) {\n console.warn(\n `Theme Management Plugin: collection \"${targetCollection}\" was not found, leaving config untouched.`,\n )\n }\n return configWithI18n\n }\n\n const currentEndpoints = ensureEndpointsArray(configWithI18n.endpoints)\n const livePreviewEndpoint = createLivePreviewEndpoint({\n livePreview: normalizedLivePreview,\n enableLogging,\n })\n let endpoints = mergeEndpoint(currentEndpoints, livePreviewEndpoint)\n const cacheEndpoint = createCacheRevalidationEndpoint({\n cacheRevalidation: normalizedCacheRevalidation,\n enableLogging,\n })\n endpoints = mergeEndpoint(endpoints, cacheEndpoint)\n\n return {\n ...configWithI18n,\n endpoints,\n collections,\n }\n }\n}\n\ntype FetchOptionsInput = string | FetchThemeConfigurationOptions\n\nexport const fetchThemeConfiguration = async (\n options?: FetchOptionsInput,\n): Promise<SiteThemeConfiguration | null> => {\n const normalizedOptions = typeof options === 'string' ? { tenantSlug: options } : (options ?? {})\n\n const {\n tenantSlug,\n collectionSlug = 'site-settings', // Can be overridden to 'appearance-settings' if using standalone\n depth,\n locale,\n draft,\n queryParams = {},\n useGlobal = false, // Set to true if using standalone global instead of collection\n signal,\n } = normalizedOptions\n\n try {\n if (useGlobal) {\n // Fetch from global endpoint\n const params = new URLSearchParams()\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n // For globals, keep tenant param for backwards compatibility, and also add where[...] filter\n if (tenantSlug) {\n params.set('tenant', tenantSlug)\n params.set('where[tenant][equals]', String(tenantSlug))\n }\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value === undefined) return\n params.set(key, String(value))\n })\n\n const queryString = params.toString()\n const url = `/api/globals/${collectionSlug}${queryString ? `?${queryString}` : ''}`\n\n const response = await fetch(url, { signal })\n if (!response.ok) {\n throw new Error(`Failed to fetch theme global (status ${response.status})`)\n }\n\n const data = (await response.json()) as {\n themeConfiguration?: SiteThemeConfiguration\n }\n\n return data?.themeConfiguration ?? null\n } else {\n // Fetch from collection endpoint (legacy/default behavior)\n const params = new URLSearchParams({ limit: '1' })\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n // For collections, use a where[tenant][equals] filter so Payload's find endpoint applies tenant scoping\n if (tenantSlug) params.set('where[tenant][equals]', String(tenantSlug))\n if (locale) params.set('locale', locale)\n if (draft) params.set('draft', 'true')\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value === undefined) return\n params.set(key, String(value))\n })\n\n const url = `/api/${collectionSlug}?${params.toString()}`\n\n const response = await fetch(url, { signal })\n if (!response.ok) {\n throw new Error(`Failed to fetch theme configuration (status ${response.status})`)\n }\n\n const data = (await response.json()) as {\n docs?: Array<{ themeConfiguration?: SiteThemeConfiguration }>\n }\n\n const doc = data.docs?.[0]\n\n return doc?.themeConfiguration ?? null\n }\n } catch (error) {\n console.warn('Failed to fetch theme configuration:', error)\n return null\n }\n}\n\nexport const getThemePreset = (themeName: string): ThemePreset | null => {\n return allThemePresets.find((preset) => preset.name === themeName) || null\n}\n\nexport const getAvailableThemePresets = (): ThemePreset[] => {\n return allThemePresets\n}\n\nexport { defaultThemePresets, allThemePresets } from './presets.js'\nexport type { ThemePreset, ThemeTypographyPreset } from './presets.js'\nexport type { ThemeTab } from './fields/themeConfigurationField.js'\nexport {\n extendedThemePresets,\n allExtendedThemePresets,\n extendedThemeToCSSVariables,\n} from './extended-presets.js'\nexport type { ExtendedThemePreset, ShadcnColorTokens } from './extended-presets.js'\nexport {\n applyExtendedTheme,\n generateExtendedThemeCSS,\n resetExtendedTheme,\n getExtendedThemeTokens,\n createUseExtendedTheme,\n getTailwindVarReferences,\n} from './utils/extendedThemeHelpers.js'\nexport type {\n ThemeManagementPluginOptions,\n ThemeManagementCacheRevalidationOptions,\n FetchThemeConfigurationOptions,\n ThemeManagementLivePreviewOptions,\n ThemeManagementLivePreviewUrlArgs,\n PluginLogger,\n} from './types.js'\nexport type {\n SiteThemeConfiguration,\n ThemeColorOverride,\n ThemeTypographyOverride,\n ThemeCustomization,\n ThemeVisualEffects,\n ThemeComponentStyles,\n} from './payload-types.js'\nexport {\n DEFAULT_THEME_CONFIGURATION,\n resolveThemeConfiguration,\n} from './utils/resolveThemeConfiguration.js'\nexport type {\n ResolvedThemeConfiguration,\n ResolvedVisualEffects,\n ResolvedComponentStyles,\n} from './utils/resolveThemeConfiguration.js'\nexport { allStylePresets, stylePresetCategories } from './style-presets.js'\nexport type { StylePreset } from './style-presets.js'\nexport { generateThemeColorsCss, hexToHsl } from './utils/themeColors.js'\nexport { generateThemeCSS, getThemeStyles } from './utils/themeUtils.js'\nexport { getThemeHtmlAttributes } from './utils/themeHtmlAttributes.js'\n\n// Dynamic theme CSS generation\nexport {\n generateThemeCSS as generatePresetCSS,\n generateAllThemesCSS,\n} from './utils/generateThemeCSS.js'\nexport { getThemeDynamicCSS, getAllDynamicThemesCSS } from './utils/themeCSS.js'\n\nexport type { Mode, ThemeDefaults } from './providers/Theme/types.js'\nexport { ThemeProvider, useTheme } from './providers/Theme/index.js'\n\n// Font loading utilities for Next.js integration\nexport {\n getFontLoaderCode,\n getThemeFontFamilies,\n ThemeFontProvider,\n useThemeFonts,\n FONT_IMPORT_MAP,\n} from './providers/font-loader.js'\n\n// Note: Do NOT re-export client components from the root entry to avoid\n// server-side evaluation during `payload generate:importmap`.\n// If needed, import directly from subpath: `@kilivi/payloadcms-theme-management/fields/ThemeLivePreview`\n\nexport const ThemeManagementPlugin = themeManagementPlugin\n/** @deprecated use {@link themeManagementPlugin} */\nexport const themeConfigurationPlugin = themeManagementPlugin\n\n// Export plugin translations for consumers to merge into their payload translations\nexport {\n translations,\n getTranslations,\n registerTranslations,\n availableLanguages,\n THEME_MANAGEMENT_I18N_NAMESPACE,\n} from './translations.js'\nexport type { PluginTranslations, Language, DeepPartial } from './translations.js'\n\n// Native Payload i18n helpers (theme-management namespace)\nexport {\n mergeThemeManagementI18n,\n getThemeManagementI18nTranslations,\n} from './i18n.js'\nexport type {\n ThemeManagementI18nOptions,\n ThemeManagementI18nTranslations,\n} from './i18n.js'\n\nexport default themeManagementPlugin\n"],"names":["DEFAULT_LIVE_PREVIEW_BREAKPOINTS","createThemeConfigurationField","allThemePresets","mergeThemeManagementI18n","getTranslations","translations","THEME_FIELD_NAME","removeExistingThemeField","fields","filter","field","candidate","name","findTabsField","type","removeExistingThemeTab","tabs","knownLabels","Object","values","map","t","tabLabel","tab","labelValues","label","matchesKnown","some","v","includes","injectThemeTab","themeTab","enableLogging","sanitizedFields","tabsField","console","warn","newTabsField","sanitizedTabs","updatedTabs","log","updatedTabsField","ensureCollectionsArray","collections","Array","isArray","ensureEndpointsArray","endpoints","normalizeLivePreviewOptions","livePreview","enabled","injectRoute","routePath","pageCollection","pageSlug","fallbackToFirstPage","tenantField","tenantQueryParam","breakpoints","undefined","raw","normalizeRoutePath","url","dedupeStrings","Set","value","trim","length","path","startsWith","normalizeCacheRevalidationOptions","args","cacheRevalidation","standaloneCollectionSlug","useStandaloneCollection","tags","paths","defaultTag","secret","asRecord","pickString","extractTenantValue","tenantRecord","id","slug","tenant","resolveTenantSlug","req","data","fromData","query","URLSearchParams","get","queryRecord","fromQuery","tenantSlug","tenantId","userRecord","user","fromUser","headers","Headers","headerRecord","buildDefaultPreviewPath","normalizedSlug","basePath","separator","encodeURIComponent","resolveLivePreviewUrl","tenantWhere","equals","homeWhere","and","preferredPageResponse","payload","find","collection","where","depth","draft","limit","overrideAccess","pagination","page","docs","fallbackResponse","pageRecord","resolvedPageSlug","error","logger","createPreviewAdminConfig","normalizedLivePreview","preview","options","readSecretFromRequest","requestRecord","headersValue","fromHeaders","requestWithJson","body","json","bodyRecord","fromBody","executeThemeRevalidation","revalidatePath","revalidateTag","forEach","tag","info","join","readQueryStringFromRequest","paramName","reqRecord","queryValue","rawValue","urlValue","originalUrl","URL","searchParams","createLivePreviewEndpoint","method","handler","previewSecret","process","env","PREVIEW_SECRET","PAYLOAD_PREVIEW_SECRET","providedSecret","jsonResponse","destination","status","Location","createCacheRevalidationEndpoint","result","ok","revalidated","mergeEndpoint","endpoint","record","withoutExisting","candidateRecord","toLowerCase","Response","themeManagementPlugin","config","targetCollection","standaloneCollectionLabel","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","customThemeConfigurationFields","customThemeConfigurationSections","includeBrandIdentity","enableAdvancedFeatures","i18n","normalizedCacheRevalidation","configWithI18n","useThemePreviewField","tabFields","beforeChangeHook","themeConfiguration","theme","themeName","selectedPreset","p","lightMode","darkMode","isLightModeEmpty","background","isDarkModeEmpty","standaloneGlobal","admin","group","access","accessObj","read","create","update","delete","hooks","beforeChange","afterChange","doc","context","disableRevalidate","globals","existingIndex","findIndex","g","currentEndpoints","livePreviewEndpoint","cacheEndpoint","collectionTouched","existingFields","fetchThemeConfiguration","normalizedOptions","collectionSlug","locale","queryParams","useGlobal","signal","params","set","String","entries","key","queryString","toString","response","fetch","Error","getThemePreset","preset","getAvailableThemePresets","defaultThemePresets","extendedThemePresets","allExtendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","allStylePresets","stylePresetCategories","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","generatePresetCSS","generateAllThemesCSS","getThemeDynamicCSS","getAllDynamicThemesCSS","ThemeProvider","useTheme","getFontLoaderCode","getThemeFontFamilies","ThemeFontProvider","useThemeFonts","FONT_IMPORT_MAP","ThemeManagementPlugin","themeConfigurationPlugin","registerTranslations","availableLanguages","THEME_MANAGEMENT_I18N_NAMESPACE","getThemeManagementI18nTranslations"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, GlobalConfig, Plugin, TabsField } from 'payload'\nimport { themeFontEndpoints } from './endpoints/themeFonts.js'\nimport { DEFAULT_LIVE_PREVIEW_BREAKPOINTS } from './constants/devicePreviews.js'\nimport { createThemeConfigurationField } from './fields/themeConfigurationField.js'\nimport type { ThemeTab } from './fields/themeConfigurationField.js'\nimport type { SiteThemeConfiguration } from './payload-types.js'\nimport type { ThemePreset } from './presets.js'\nimport { allThemePresets } from './presets.js'\nimport { mergeThemeManagementI18n } from './i18n.js'\nimport { getTranslations, translations } from './translations.js'\nimport type {\n FetchThemeConfigurationOptions,\n PluginLogger,\n ThemeManagementLivePreviewOptions,\n ThemeManagementLivePreviewUrlArgs,\n ThemeManagementPluginOptions,\n} from './types.js'\n\nconst THEME_FIELD_NAME = 'themeConfiguration'\n\n/**\n * Removes existing theme configuration from a group field (legacy)\n */\nconst removeExistingThemeField = (fields: Field[] = []): Field[] =>\n fields.filter((field) => {\n const candidate = field as { name?: unknown }\n return candidate?.name !== THEME_FIELD_NAME\n })\n\n/**\n * Finds the tabs field in the collection fields array\n */\nconst findTabsField = (fields: Field[] = []): TabsField | null => {\n for (const field of fields) {\n if (field.type === 'tabs') {\n return field as TabsField\n }\n }\n return null\n}\n\n/**\n * Removes existing Appearance Settings tab if it exists\n */\nconst removeExistingThemeTab = (\n tabs: NonNullable<TabsField['tabs']>,\n): NonNullable<TabsField['tabs']> => {\n const knownLabels = Object.values(translations).map((t) => t.tabLabel)\n return tabs.filter((tab) => {\n // Normalize label to string (support localized object or plain string)\n let labelValues: string[] = []\n if (typeof tab.label === 'object' && tab.label !== null) {\n labelValues = Object.values(tab.label as Record<string, string>)\n } else if (typeof tab.label === 'string') {\n labelValues = [tab.label]\n }\n\n // If any of the label values match a known plugin tab label, remove it\n const matchesKnown = labelValues.some((v) => knownLabels.includes(v))\n\n return !matchesKnown\n })\n}\n\n/**\n * Injects theme tab into existing tabs field\n */\nconst injectThemeTab = (\n fields: Field[] | undefined,\n themeTab: ThemeTab,\n enableLogging: boolean,\n): Field[] => {\n // First, remove any legacy theme field (group-based)\n const sanitizedFields = removeExistingThemeField(fields ?? [])\n\n // Find the tabs field\n const tabsField = findTabsField(sanitizedFields)\n\n if (!tabsField || !tabsField.tabs) {\n if (enableLogging) {\n console.warn('Theme Management Plugin: No tabs field found. Creating a new tabs structure.')\n }\n\n // If no tabs exist, create a basic tabs structure with just the theme tab\n const newTabsField: TabsField = {\n type: 'tabs',\n tabs: [themeTab],\n }\n\n return [...sanitizedFields, newTabsField]\n }\n\n // Remove existing theme tab if present\n const sanitizedTabs = removeExistingThemeTab(tabsField.tabs)\n\n // Add theme tab to the end\n const updatedTabs = [...sanitizedTabs, themeTab]\n\n if (enableLogging) {\n console.log('Theme Management Plugin: injecting Appearance Settings tab')\n }\n\n // Update the tabs field\n const updatedTabsField: TabsField = {\n ...tabsField,\n tabs: updatedTabs,\n }\n\n // Replace the old tabs field with the updated one\n return sanitizedFields.map((field) => (field.type === 'tabs' ? updatedTabsField : field))\n}\n\nconst ensureCollectionsArray = (collections: Config['collections']): CollectionConfig[] =>\n Array.isArray(collections) ? collections : []\n\nconst ensureEndpointsArray = (endpoints: Config['endpoints']): NonNullable<Config['endpoints']> =>\n Array.isArray(endpoints) ? endpoints : []\n\ntype NormalizedLivePreviewOptions = {\n enabled: boolean\n injectRoute: boolean\n routePath: string\n pageCollection: string\n pageSlug: string\n fallbackToFirstPage: boolean\n tenantField: string\n tenantQueryParam: string\n breakpoints?: ThemeManagementLivePreviewOptions['breakpoints']\n url?: ThemeManagementLivePreviewOptions['url']\n}\n\ntype NormalizedCacheRevalidationOptions = {\n enabled: boolean\n injectRoute: boolean\n routePath: string\n secret?: string\n tags: string[]\n paths: string[]\n}\n\ntype MinimalPayloadRequest = ThemeManagementLivePreviewUrlArgs['req']\n\nconst normalizeLivePreviewOptions = (\n livePreview: ThemeManagementPluginOptions['livePreview'],\n): NormalizedLivePreviewOptions => {\n if (!livePreview) {\n // undefined or false → live preview not configured; show ThemePreviewField instead\n return {\n enabled: false,\n injectRoute: false,\n routePath: '/theme/preview',\n pageCollection: 'pages',\n pageSlug: 'home',\n fallbackToFirstPage: true,\n tenantField: 'tenant',\n tenantQueryParam: 'tenant',\n breakpoints: undefined,\n }\n }\n\n const raw = typeof livePreview === 'object' ? livePreview : {}\n\n return {\n enabled: raw.enabled ?? true,\n injectRoute: raw.injectRoute ?? false,\n routePath: normalizeRoutePath(raw.routePath),\n pageCollection: raw.pageCollection ?? 'pages',\n pageSlug: raw.pageSlug ?? 'home',\n fallbackToFirstPage: raw.fallbackToFirstPage ?? true,\n tenantField: raw.tenantField ?? 'tenant',\n tenantQueryParam: raw.tenantQueryParam ?? 'tenant',\n breakpoints: raw.breakpoints ?? DEFAULT_LIVE_PREVIEW_BREAKPOINTS,\n url: raw.url,\n }\n}\n\nconst dedupeStrings = (values: (string | undefined)[]): string[] => [\n ...new Set(\n values.filter((value): value is string => typeof value === 'string' && value.trim().length > 0),\n ),\n]\n\nconst normalizeRoutePath = (path: string | undefined): string => {\n if (!path || !path.trim()) {\n return '/theme/revalidate'\n }\n\n return path.startsWith('/') ? path : `/${path}`\n}\n\nconst normalizeCacheRevalidationOptions = (args: {\n cacheRevalidation: ThemeManagementPluginOptions['cacheRevalidation']\n standaloneCollectionSlug: string\n useStandaloneCollection: boolean\n}): NormalizedCacheRevalidationOptions => {\n const { cacheRevalidation, standaloneCollectionSlug, useStandaloneCollection } = args\n\n if (cacheRevalidation === false) {\n return {\n enabled: false,\n injectRoute: false,\n routePath: '/theme/revalidate',\n tags: [],\n paths: [],\n }\n }\n\n const raw = typeof cacheRevalidation === 'object' && cacheRevalidation ? cacheRevalidation : {}\n const defaultTag = `global_${standaloneCollectionSlug}`\n\n return {\n enabled: raw.enabled ?? useStandaloneCollection,\n injectRoute: raw.injectRoute ?? true,\n routePath: normalizeRoutePath(raw.routePath),\n secret: raw.secret,\n tags: dedupeStrings([defaultTag, ...(raw.tags ?? [])]),\n paths: dedupeStrings(raw.paths ?? []),\n }\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> | undefined => {\n if (value && typeof value === 'object') {\n return value as Record<string, unknown>\n }\n return undefined\n}\n\nconst pickString = (value: unknown): string | undefined => {\n if (typeof value === 'string' && value.trim()) return value\n return undefined\n}\n\nconst extractTenantValue = (value: unknown): string | undefined => {\n if (!value) return undefined\n if (typeof value === 'string') return pickString(value)\n\n const tenantRecord = asRecord(value)\n if (!tenantRecord) return undefined\n\n return (\n pickString(tenantRecord.id) ??\n pickString(tenantRecord.slug) ??\n pickString(tenantRecord.value) ??\n pickString(tenantRecord.tenant)\n )\n}\n\nconst resolveTenantSlug = (\n req: MinimalPayloadRequest,\n tenantField: string,\n data?: Record<string, unknown>,\n): string | undefined => {\n const fromData = extractTenantValue(data?.[tenantField])\n if (fromData) return fromData\n\n const query = req.query\n if (query && typeof URLSearchParams !== 'undefined' && query instanceof URLSearchParams) {\n return (\n pickString(query.get('tenant')) ??\n pickString(query.get('tenantSlug')) ??\n pickString(query.get('tenantId'))\n )\n }\n\n const queryRecord = asRecord(query)\n const fromQuery =\n extractTenantValue(queryRecord?.tenant) ??\n extractTenantValue(queryRecord?.tenantSlug) ??\n extractTenantValue(queryRecord?.tenantId)\n if (fromQuery) return fromQuery\n\n const userRecord = asRecord(req.user)\n const fromUser =\n extractTenantValue(userRecord?.[tenantField]) ??\n extractTenantValue(userRecord?.tenant) ??\n extractTenantValue(userRecord?.tenantSlug)\n if (fromUser) return fromUser\n\n const headers = req.headers\n if (headers && typeof Headers !== 'undefined' && headers instanceof Headers) {\n return (\n pickString(headers.get('x-tenant-id')) ??\n pickString(headers.get('x-tenant')) ??\n pickString(headers.get('payload-tenant'))\n )\n }\n\n const headerRecord = asRecord(headers)\n return (\n extractTenantValue(headerRecord?.['x-tenant-id']) ??\n extractTenantValue(headerRecord?.['x-tenant']) ??\n extractTenantValue(headerRecord?.['payload-tenant'])\n )\n}\n\nconst buildDefaultPreviewPath = (\n pageSlug: string,\n tenantSlug: string | undefined,\n tenantQueryParam: string,\n): string => {\n const normalizedSlug = pageSlug === 'home' ? '' : pageSlug\n const basePath = normalizedSlug ? `/${normalizedSlug}` : '/'\n\n if (!tenantSlug) {\n return basePath\n }\n\n const separator = basePath.includes('?') ? '&' : '?'\n return `${basePath}${separator}${tenantQueryParam}=${encodeURIComponent(tenantSlug)}`\n}\n\nconst resolveLivePreviewUrl = async (args: {\n req: MinimalPayloadRequest\n data?: Record<string, unknown>\n livePreview: NormalizedLivePreviewOptions\n enableLogging: boolean\n}): Promise<string> => {\n const { req, data, livePreview, enableLogging } = args\n\n const tenantSlug = resolveTenantSlug(req, livePreview.tenantField, data)\n\n const tenantWhere = tenantSlug\n ? {\n [livePreview.tenantField]: {\n equals: tenantSlug,\n },\n }\n : undefined\n\n const homeWhere = {\n and: [\n {\n slug: {\n equals: livePreview.pageSlug,\n },\n },\n ...(tenantWhere ? [tenantWhere] : []),\n ],\n }\n\n try {\n const preferredPageResponse = await req.payload.find({\n collection: livePreview.pageCollection,\n where: homeWhere,\n depth: 0,\n draft: true,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n })\n\n let page = preferredPageResponse?.docs?.[0]\n\n if (!page && livePreview.fallbackToFirstPage) {\n const fallbackResponse = await req.payload.find({\n collection: livePreview.pageCollection,\n where: tenantWhere,\n depth: 0,\n draft: true,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n })\n\n page = fallbackResponse?.docs?.[0]\n }\n\n const pageRecord = asRecord(page)\n const resolvedPageSlug = pickString(pageRecord?.slug) ?? livePreview.pageSlug\n\n if (livePreview.url) {\n return await livePreview.url({\n page: pageRecord,\n pageSlug: resolvedPageSlug,\n tenantSlug,\n req,\n })\n }\n\n return buildDefaultPreviewPath(resolvedPageSlug, tenantSlug, livePreview.tenantQueryParam)\n } catch (error) {\n if (enableLogging) {\n req.payload.logger?.warn?.('Theme Management Plugin: live preview URL fallback used', error)\n }\n\n return buildDefaultPreviewPath(livePreview.pageSlug, tenantSlug, livePreview.tenantQueryParam)\n }\n}\n\nconst createPreviewAdminConfig = (\n normalizedLivePreview: NormalizedLivePreviewOptions,\n enableLogging: boolean,\n) => {\n if (!normalizedLivePreview.enabled) {\n return {}\n }\n\n return {\n livePreview: {\n breakpoints: normalizedLivePreview.breakpoints,\n url: ({ data, req }: { data?: unknown; req: unknown }) =>\n resolveLivePreviewUrl({\n req: req as MinimalPayloadRequest,\n data: asRecord(data),\n livePreview: normalizedLivePreview,\n enableLogging,\n }),\n },\n preview: (data: Record<string, unknown>, options: { req?: unknown }) => {\n const req = options?.req\n if (!req) return null\n\n return resolveLivePreviewUrl({\n req: req as MinimalPayloadRequest,\n data,\n livePreview: normalizedLivePreview,\n enableLogging,\n })\n },\n }\n}\n\nconst readSecretFromRequest = async (req: unknown): Promise<string | undefined> => {\n const requestRecord = asRecord(req)\n const headersValue = requestRecord?.headers\n\n if (headersValue && typeof Headers !== 'undefined' && headersValue instanceof Headers) {\n return (\n pickString(headersValue.get('x-theme-revalidate-secret')) ??\n pickString(headersValue.get('x-revalidate-secret'))\n )\n }\n\n const headerRecord = asRecord(headersValue)\n const fromHeaders =\n pickString(headerRecord?.['x-theme-revalidate-secret']) ??\n pickString(headerRecord?.['x-revalidate-secret'])\n if (fromHeaders) {\n return fromHeaders\n }\n\n const requestWithJson = req as { json?: () => Promise<unknown> }\n const body =\n typeof requestWithJson?.json === 'function' ? await requestWithJson.json() : undefined\n const bodyRecord = asRecord(body)\n const fromBody = pickString(bodyRecord?.secret)\n if (fromBody) {\n return fromBody\n }\n\n const queryRecord = asRecord(requestRecord?.query)\n return pickString(queryRecord?.secret)\n}\n\nconst executeThemeRevalidation = async (options: {\n tags: string[]\n paths: string[]\n enableLogging: boolean\n logger?: PluginLogger\n}): Promise<{ tags: string[]; paths: string[] }> => {\n const { tags, paths, enableLogging, logger } = options\n\n try {\n const { revalidatePath, revalidateTag } = await import('next/cache')\n\n tags.forEach((tag) => revalidateTag(tag))\n paths.forEach((path) => revalidatePath(path))\n\n if (enableLogging) {\n logger?.info?.(\n `Theme Management Plugin: revalidated cache tags=[${tags.join(', ')}] paths=[${paths.join(', ')}]`,\n )\n }\n } catch (error) {\n if (enableLogging) {\n logger?.error?.('Theme Management Plugin: cache invalidation failed:', error)\n }\n throw error\n }\n\n return { tags, paths }\n}\n\nconst readQueryStringFromRequest = (req: unknown, paramName: string): string | undefined => {\n const reqRecord = asRecord(req)\n\n // Try URLSearchParams from native fetch/Node.js\n const queryValue = reqRecord?.query\n if (\n queryValue &&\n typeof URLSearchParams !== 'undefined' &&\n queryValue instanceof URLSearchParams\n ) {\n return pickString(queryValue.get(paramName))\n }\n\n // Try object form (common in Payload)\n const queryRecord = asRecord(queryValue)\n if (queryRecord) {\n const rawValue = queryRecord[paramName]\n if (Array.isArray(rawValue)) {\n return pickString(rawValue[0])\n }\n return pickString(rawValue)\n }\n\n // Try manual URL parsing as fallback\n const urlValue = pickString(reqRecord?.url) ?? pickString(reqRecord?.originalUrl)\n if (urlValue) {\n try {\n const url = new URL(urlValue, 'http://localhost')\n return pickString(url.searchParams.get(paramName))\n } catch {\n // Ignore parse errors\n }\n }\n\n return undefined\n}\n\nconst createLivePreviewEndpoint = (options: {\n livePreview: NormalizedLivePreviewOptions\n enableLogging: boolean\n}) => {\n const { livePreview, enableLogging } = options\n\n if (!livePreview.enabled || !livePreview.injectRoute) {\n return null\n }\n\n return {\n path: livePreview.routePath,\n method: 'get',\n handler: async (req: unknown) => {\n const previewSecret = process.env.PREVIEW_SECRET ?? process.env.PAYLOAD_PREVIEW_SECRET\n\n if (previewSecret) {\n const providedSecret =\n readQueryStringFromRequest(req, 'previewSecret') ??\n readQueryStringFromRequest(req, 'preview')\n if (providedSecret !== previewSecret) {\n return jsonResponse({ error: 'Unauthorized' }, 401)\n }\n }\n\n const pageSlug = readQueryStringFromRequest(req, 'pageSlug') ?? livePreview.pageSlug\n const tenantSlug = readQueryStringFromRequest(req, 'tenant')\n\n // Redirect to the actual client page (standard Payload live preview behavior)\n const destination = buildDefaultPreviewPath(\n pageSlug,\n tenantSlug,\n livePreview.tenantQueryParam,\n )\n\n if (enableLogging) {\n console.log('Theme Management Plugin: live preview redirect', destination)\n }\n\n return {\n status: 307,\n headers: {\n Location: destination,\n },\n }\n },\n }\n}\n\nconst createCacheRevalidationEndpoint = (options: {\n cacheRevalidation: NormalizedCacheRevalidationOptions\n enableLogging: boolean\n}) => {\n const { cacheRevalidation, enableLogging } = options\n\n if (!cacheRevalidation.enabled || !cacheRevalidation.injectRoute) {\n return null\n }\n\n return {\n path: cacheRevalidation.routePath,\n method: 'post',\n handler: async (req: unknown) => {\n const reqRecord = asRecord(req)\n const payload = asRecord(reqRecord?.payload)\n const logger = payload?.logger as PluginLogger | undefined\n\n if (cacheRevalidation.secret) {\n const providedSecret = await readSecretFromRequest(req)\n if (providedSecret !== cacheRevalidation.secret) {\n return jsonResponse({ error: 'Unauthorized' }, 401)\n }\n }\n\n try {\n const result = await executeThemeRevalidation({\n tags: cacheRevalidation.tags,\n paths: cacheRevalidation.paths,\n enableLogging,\n logger,\n })\n\n return jsonResponse({ ok: true, revalidated: result })\n } catch {\n return jsonResponse({ ok: false, error: 'Revalidation failed' }, 500)\n }\n },\n }\n}\n\nconst mergeEndpoint = (\n endpoints: NonNullable<Config['endpoints']>,\n endpoint: unknown,\n): NonNullable<Config['endpoints']> => {\n if (!endpoint) {\n return endpoints\n }\n\n const record = endpoint as unknown as { path?: string; method?: string }\n\n const withoutExisting = endpoints.filter((candidate) => {\n const candidateRecord = candidate as unknown as { path?: string; method?: string }\n return !(\n candidateRecord?.path === record?.path &&\n typeof candidateRecord.method === 'string' &&\n typeof record.method === 'string' &&\n candidateRecord.method.toLowerCase() === record.method.toLowerCase()\n )\n })\n\n return [...withoutExisting, endpoint as unknown as NonNullable<Config['endpoints']>[number]]\n}\n\nconst jsonResponse = (body: Record<string, unknown>, status = 200): unknown => {\n if (typeof Response !== 'undefined' && typeof Response.json === 'function') {\n return Response.json(body, { status })\n }\n\n return {\n status,\n json: async () => body,\n }\n}\n\nexport const themeManagementPlugin = (options: ThemeManagementPluginOptions = {}): Plugin => {\n return (config: Config): Config => {\n const {\n enabled = true,\n targetCollection = 'site-settings',\n useStandaloneCollection = false,\n standaloneCollectionSlug = 'appearance-settings',\n // Allow either string or localized object; default comes from plugin translations\n standaloneCollectionLabel = getTranslations().standaloneCollectionLabel,\n themePresets = allThemePresets,\n defaultTheme = 'cool',\n includeColorModeToggle = true,\n includeCustomCSS = true,\n customThemeConfigurationFields,\n customThemeConfigurationSections,\n includeBrandIdentity = false,\n enableAdvancedFeatures = true,\n enableLogging = false,\n livePreview = true,\n cacheRevalidation,\n i18n,\n } = options\n\n const normalizedLivePreview = normalizeLivePreviewOptions(livePreview)\n const normalizedCacheRevalidation = normalizeCacheRevalidationOptions({\n cacheRevalidation,\n standaloneCollectionSlug,\n useStandaloneCollection,\n })\n\n if (!enabled) {\n if (enableLogging) {\n console.log('Theme Management Plugin: disabled via options, skipping.')\n }\n return config\n }\n\n // Register the plugin's translations into Payload's native i18n\n // (`theme-management` namespace), merging in any user-provided extensions or\n // overrides. This config is used as the base for every return path below.\n const configWithI18n: Config = {\n ...config,\n i18n: mergeThemeManagementI18n(config.i18n, i18n),\n }\n\n const themeTab = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n customThemeConfigurationFields,\n customThemeConfigurationSections,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\n // Always show the static ModePreview panel; it hides at runtime when the user\n // actively enters livePreview mode (isLivePreviewing = true in context).\n useThemePreviewField: true,\n })\n\n // If using standalone collection, create a new global\n if (useStandaloneCollection) {\n if (enableLogging) {\n console.log(\n `Theme Management Plugin: creating standalone global \"${standaloneCollectionSlug}\"`,\n )\n }\n\n // Extract the fields from the tab directly (no wrapping in group)\n const tabFields = (themeTab.fields ?? []) as Field[]\n\n /**\n * Hook to auto-populate lightMode and darkMode colors when theme changes\n */\n type BeforeChangeArgs = {\n data?: {\n themeConfiguration?: {\n theme?: string\n lightMode?: Record<string, unknown>\n darkMode?: Record<string, unknown>\n }\n }\n }\n\n const beforeChangeHook = async (args: BeforeChangeArgs) => {\n const { data } = args\n\n // If theme is being changed, auto-populate color modes\n if (data?.themeConfiguration?.theme) {\n const themeName = data.themeConfiguration.theme\n const selectedPreset = themePresets.find((p) => p.name === themeName)\n\n if (selectedPreset) {\n // Initialize light and dark mode colors from preset if not already set\n if (!data.themeConfiguration.lightMode) {\n data.themeConfiguration.lightMode = {}\n }\n if (!data.themeConfiguration.darkMode) {\n data.themeConfiguration.darkMode = {}\n }\n\n // Only populate if not manually edited (first time or empty)\n const isLightModeEmpty = !data.themeConfiguration.lightMode?.background\n const isDarkModeEmpty = !data.themeConfiguration.darkMode?.background\n\n if (isLightModeEmpty && selectedPreset.lightMode) {\n data.themeConfiguration.lightMode = { ...selectedPreset.lightMode }\n }\n\n if (isDarkModeEmpty && selectedPreset.darkMode) {\n data.themeConfiguration.darkMode = { ...selectedPreset.darkMode }\n }\n }\n }\n\n return data\n }\n\n const standaloneGlobal: GlobalConfig = {\n slug: standaloneCollectionSlug,\n label: standaloneCollectionLabel,\n admin: {\n group: 'Settings',\n ...createPreviewAdminConfig(normalizedLivePreview, enableLogging),\n },\n // Provide a broad access object but cast to GlobalConfig['access'] to satisfy types\n access: ((): GlobalConfig['access'] => {\n const accessObj = {\n read: () => true,\n create: ({ req }: { req?: { user?: unknown } }) => !!req?.user,\n update: ({ req }: { req?: { user?: unknown } }) => !!req?.user,\n delete: ({ req }: { req?: { user?: unknown } }) => !!req?.user,\n } as unknown as GlobalConfig['access']\n return accessObj\n })(),\n fields: tabFields,\n hooks: {\n beforeChange: [beforeChangeHook],\n afterChange: [\n async ({ doc, req }) => {\n // Invalidate cache after appearance settings change\n if (!req?.context?.disableRevalidate && normalizedCacheRevalidation.enabled) {\n try {\n await executeThemeRevalidation({\n tags: normalizedCacheRevalidation.tags,\n paths: normalizedCacheRevalidation.paths,\n enableLogging,\n logger: req?.payload?.logger as PluginLogger | undefined,\n })\n } catch {\n // no-op: logging is handled in executeThemeRevalidation\n }\n }\n return doc\n },\n ],\n },\n }\n\n const globals = Array.isArray(configWithI18n.globals) ? configWithI18n.globals : []\n\n // Check if global already exists\n const existingIndex = globals.findIndex((g) => g.slug === standaloneCollectionSlug)\n\n if (existingIndex !== -1) {\n if (enableLogging) {\n console.warn(\n `Theme Management Plugin: global \"${standaloneCollectionSlug}\" already exists, skipping creation.`,\n )\n }\n return configWithI18n\n }\n\n const currentEndpoints = ensureEndpointsArray(configWithI18n.endpoints)\n const livePreviewEndpoint = createLivePreviewEndpoint({\n livePreview: normalizedLivePreview,\n enableLogging,\n })\n let endpoints = mergeEndpoint(currentEndpoints, livePreviewEndpoint)\n const cacheEndpoint = createCacheRevalidationEndpoint({\n cacheRevalidation: normalizedCacheRevalidation,\n enableLogging,\n })\n endpoints = mergeEndpoint(endpoints, cacheEndpoint)\n themeFontEndpoints.forEach((endpoint) => {\n endpoints = mergeEndpoint(endpoints, endpoint)\n })\n\n return {\n ...configWithI18n,\n endpoints,\n globals: [...globals, standaloneGlobal],\n }\n }\n\n // Otherwise, add as tab to existing collection\n let collectionTouched = false\n\n const collections = ensureCollectionsArray(configWithI18n.collections).map((collection) => {\n if (collection.slug !== targetCollection) {\n return collection\n }\n\n collectionTouched = true\n\n if (enableLogging) {\n console.log(`Theme Management Plugin: enhancing collection \"${collection.slug}\"`)\n }\n\n const existingFields = Array.isArray(collection.fields) ? collection.fields : []\n\n const fields = injectThemeTab(existingFields, themeTab, enableLogging)\n\n const admin = {\n ...collection.admin,\n ...createPreviewAdminConfig(normalizedLivePreview, enableLogging),\n }\n\n return {\n ...collection,\n fields,\n admin,\n }\n })\n\n if (!collectionTouched) {\n if (enableLogging) {\n console.warn(\n `Theme Management Plugin: collection \"${targetCollection}\" was not found, leaving config untouched.`,\n )\n }\n return configWithI18n\n }\n\n const currentEndpoints = ensureEndpointsArray(configWithI18n.endpoints)\n const livePreviewEndpoint = createLivePreviewEndpoint({\n livePreview: normalizedLivePreview,\n enableLogging,\n })\n let endpoints = mergeEndpoint(currentEndpoints, livePreviewEndpoint)\n const cacheEndpoint = createCacheRevalidationEndpoint({\n cacheRevalidation: normalizedCacheRevalidation,\n enableLogging,\n })\n endpoints = mergeEndpoint(endpoints, cacheEndpoint)\n themeFontEndpoints.forEach((endpoint) => {\n endpoints = mergeEndpoint(endpoints, endpoint)\n })\n\n return {\n ...configWithI18n,\n endpoints,\n collections,\n }\n }\n}\n\ntype FetchOptionsInput = string | FetchThemeConfigurationOptions\n\nexport const fetchThemeConfiguration = async (\n options?: FetchOptionsInput,\n): Promise<SiteThemeConfiguration | null> => {\n const normalizedOptions = typeof options === 'string' ? { tenantSlug: options } : (options ?? {})\n\n const {\n tenantSlug,\n collectionSlug = 'site-settings', // Can be overridden to 'appearance-settings' if using standalone\n depth,\n locale,\n draft,\n queryParams = {},\n useGlobal = false, // Set to true if using standalone global instead of collection\n signal,\n } = normalizedOptions\n\n try {\n if (useGlobal) {\n // Fetch from global endpoint\n const params = new URLSearchParams()\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n // For globals, keep tenant param for backwards compatibility, and also add where[...] filter\n if (tenantSlug) {\n params.set('tenant', tenantSlug)\n params.set('where[tenant][equals]', String(tenantSlug))\n }\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value === undefined) return\n params.set(key, String(value))\n })\n\n const queryString = params.toString()\n const url = `/api/globals/${collectionSlug}${queryString ? `?${queryString}` : ''}`\n\n const response = await fetch(url, { signal })\n if (!response.ok) {\n throw new Error(`Failed to fetch theme global (status ${response.status})`)\n }\n\n const data = (await response.json()) as {\n themeConfiguration?: SiteThemeConfiguration\n }\n\n return data?.themeConfiguration ?? null\n } else {\n // Fetch from collection endpoint (legacy/default behavior)\n const params = new URLSearchParams({ limit: '1' })\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n // For collections, use a where[tenant][equals] filter so Payload's find endpoint applies tenant scoping\n if (tenantSlug) params.set('where[tenant][equals]', String(tenantSlug))\n if (locale) params.set('locale', locale)\n if (draft) params.set('draft', 'true')\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value === undefined) return\n params.set(key, String(value))\n })\n\n const url = `/api/${collectionSlug}?${params.toString()}`\n\n const response = await fetch(url, { signal })\n if (!response.ok) {\n throw new Error(`Failed to fetch theme configuration (status ${response.status})`)\n }\n\n const data = (await response.json()) as {\n docs?: Array<{ themeConfiguration?: SiteThemeConfiguration }>\n }\n\n const doc = data.docs?.[0]\n\n return doc?.themeConfiguration ?? null\n }\n } catch (error) {\n console.warn('Failed to fetch theme configuration:', error)\n return null\n }\n}\n\nexport const getThemePreset = (themeName: string): ThemePreset | null => {\n return allThemePresets.find((preset) => preset.name === themeName) || null\n}\n\nexport const getAvailableThemePresets = (): ThemePreset[] => {\n return allThemePresets\n}\n\nexport { defaultThemePresets, allThemePresets } from './presets.js'\nexport type { ThemePreset, ThemeTypographyPreset } from './presets.js'\nexport type { ThemeTab } from './fields/themeConfigurationField.js'\nexport {\n extendedThemePresets,\n allExtendedThemePresets,\n extendedThemeToCSSVariables,\n} from './extended-presets.js'\nexport type { ExtendedThemePreset, ShadcnColorTokens } from './extended-presets.js'\nexport {\n applyExtendedTheme,\n generateExtendedThemeCSS,\n resetExtendedTheme,\n getExtendedThemeTokens,\n createUseExtendedTheme,\n getTailwindVarReferences,\n} from './utils/extendedThemeHelpers.js'\nexport type {\n ThemeManagementPluginOptions,\n ThemeManagementCacheRevalidationOptions,\n FetchThemeConfigurationOptions,\n ThemeManagementLivePreviewOptions,\n ThemeManagementLivePreviewUrlArgs,\n PluginLogger,\n} from './types.js'\nexport type {\n SiteThemeConfiguration,\n ThemeColorOverride,\n ThemeTypographyOverride,\n ThemeCustomization,\n ThemeVisualEffects,\n ThemeComponentStyles,\n} from './payload-types.js'\nexport {\n DEFAULT_THEME_CONFIGURATION,\n resolveThemeConfiguration,\n} from './utils/resolveThemeConfiguration.js'\nexport type {\n ResolvedThemeConfiguration,\n ResolvedVisualEffects,\n ResolvedComponentStyles,\n} from './utils/resolveThemeConfiguration.js'\nexport { allStylePresets, stylePresetCategories } from './style-presets.js'\nexport type { StylePreset } from './style-presets.js'\nexport { generateThemeColorsCss, hexToHsl } from './utils/themeColors.js'\nexport { generateThemeCSS, getThemeStyles } from './utils/themeUtils.js'\nexport { getThemeHtmlAttributes } from './utils/themeHtmlAttributes.js'\nexport {\n FONT_CATALOG,\n buildThemeFontsHref,\n getFontCatalogEntry,\n} from './constants/themeFonts.js'\nexport type { FontCatalogEntry, ThemeFontLoading } from './constants/themeFonts.js'\nexport { themeFontEndpoints } from './endpoints/themeFonts.js'\n\n// Dynamic theme CSS generation\nexport {\n generateThemeCSS as generatePresetCSS,\n generateAllThemesCSS,\n} from './utils/generateThemeCSS.js'\nexport { getThemeDynamicCSS, getAllDynamicThemesCSS } from './utils/themeCSS.js'\n\nexport type { Mode, ThemeDefaults } from './providers/Theme/types.js'\nexport { ThemeProvider, useTheme } from './providers/Theme/index.js'\n\n// Font loading utilities for Next.js integration\nexport {\n getFontLoaderCode,\n getThemeFontFamilies,\n ThemeFontProvider,\n useThemeFonts,\n FONT_IMPORT_MAP,\n} from './providers/font-loader.js'\n\n// Note: Do NOT re-export client components from the root entry to avoid\n// server-side evaluation during `payload generate:importmap`.\n// If needed, import directly from subpath: `@kilivi/payloadcms-theme-management/fields/ThemeLivePreview`\n\nexport const ThemeManagementPlugin = themeManagementPlugin\n/** @deprecated use {@link themeManagementPlugin} */\nexport const themeConfigurationPlugin = themeManagementPlugin\n\n// Export plugin translations for consumers to merge into their payload translations\nexport {\n translations,\n getTranslations,\n registerTranslations,\n availableLanguages,\n THEME_MANAGEMENT_I18N_NAMESPACE,\n} from './translations.js'\nexport type { PluginTranslations, Language, DeepPartial } from './translations.js'\n\n// Native Payload i18n helpers (theme-management namespace)\nexport {\n mergeThemeManagementI18n,\n getThemeManagementI18nTranslations,\n} from './i18n.js'\nexport type {\n ThemeManagementI18nOptions,\n ThemeManagementI18nTranslations,\n} from './i18n.js'\n\nexport default themeManagementPlugin\n"],"names":["themeFontEndpoints","DEFAULT_LIVE_PREVIEW_BREAKPOINTS","createThemeConfigurationField","allThemePresets","mergeThemeManagementI18n","getTranslations","translations","THEME_FIELD_NAME","removeExistingThemeField","fields","filter","field","candidate","name","findTabsField","type","removeExistingThemeTab","tabs","knownLabels","Object","values","map","t","tabLabel","tab","labelValues","label","matchesKnown","some","v","includes","injectThemeTab","themeTab","enableLogging","sanitizedFields","tabsField","console","warn","newTabsField","sanitizedTabs","updatedTabs","log","updatedTabsField","ensureCollectionsArray","collections","Array","isArray","ensureEndpointsArray","endpoints","normalizeLivePreviewOptions","livePreview","enabled","injectRoute","routePath","pageCollection","pageSlug","fallbackToFirstPage","tenantField","tenantQueryParam","breakpoints","undefined","raw","normalizeRoutePath","url","dedupeStrings","Set","value","trim","length","path","startsWith","normalizeCacheRevalidationOptions","args","cacheRevalidation","standaloneCollectionSlug","useStandaloneCollection","tags","paths","defaultTag","secret","asRecord","pickString","extractTenantValue","tenantRecord","id","slug","tenant","resolveTenantSlug","req","data","fromData","query","URLSearchParams","get","queryRecord","fromQuery","tenantSlug","tenantId","userRecord","user","fromUser","headers","Headers","headerRecord","buildDefaultPreviewPath","normalizedSlug","basePath","separator","encodeURIComponent","resolveLivePreviewUrl","tenantWhere","equals","homeWhere","and","preferredPageResponse","payload","find","collection","where","depth","draft","limit","overrideAccess","pagination","page","docs","fallbackResponse","pageRecord","resolvedPageSlug","error","logger","createPreviewAdminConfig","normalizedLivePreview","preview","options","readSecretFromRequest","requestRecord","headersValue","fromHeaders","requestWithJson","body","json","bodyRecord","fromBody","executeThemeRevalidation","revalidatePath","revalidateTag","forEach","tag","info","join","readQueryStringFromRequest","paramName","reqRecord","queryValue","rawValue","urlValue","originalUrl","URL","searchParams","createLivePreviewEndpoint","method","handler","previewSecret","process","env","PREVIEW_SECRET","PAYLOAD_PREVIEW_SECRET","providedSecret","jsonResponse","destination","status","Location","createCacheRevalidationEndpoint","result","ok","revalidated","mergeEndpoint","endpoint","record","withoutExisting","candidateRecord","toLowerCase","Response","themeManagementPlugin","config","targetCollection","standaloneCollectionLabel","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","customThemeConfigurationFields","customThemeConfigurationSections","includeBrandIdentity","enableAdvancedFeatures","i18n","normalizedCacheRevalidation","configWithI18n","useThemePreviewField","tabFields","beforeChangeHook","themeConfiguration","theme","themeName","selectedPreset","p","lightMode","darkMode","isLightModeEmpty","background","isDarkModeEmpty","standaloneGlobal","admin","group","access","accessObj","read","create","update","delete","hooks","beforeChange","afterChange","doc","context","disableRevalidate","globals","existingIndex","findIndex","g","currentEndpoints","livePreviewEndpoint","cacheEndpoint","collectionTouched","existingFields","fetchThemeConfiguration","normalizedOptions","collectionSlug","locale","queryParams","useGlobal","signal","params","set","String","entries","key","queryString","toString","response","fetch","Error","getThemePreset","preset","getAvailableThemePresets","defaultThemePresets","extendedThemePresets","allExtendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","allStylePresets","stylePresetCategories","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","FONT_CATALOG","buildThemeFontsHref","getFontCatalogEntry","generatePresetCSS","generateAllThemesCSS","getThemeDynamicCSS","getAllDynamicThemesCSS","ThemeProvider","useTheme","getFontLoaderCode","getThemeFontFamilies","ThemeFontProvider","useThemeFonts","FONT_IMPORT_MAP","ThemeManagementPlugin","themeConfigurationPlugin","registerTranslations","availableLanguages","THEME_MANAGEMENT_I18N_NAMESPACE","getThemeManagementI18nTranslations"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Class names that define every `--font-*` variable; put them on <html>. */
2
+ export declare const themeFontVariables: string;
3
+ //# sourceMappingURL=next-fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-fonts.d.ts","sourceRoot":"","sources":["../src/next-fonts.ts"],"names":[],"mappings":"AAyFA,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,QAiCnB,CAAA"}
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Theme fonts via next/font — the Next.js best practice, opt-in.
3
+ *
4
+ * Every font an editor can pick in Appearance Settings (FONT_CATALOG) declared
5
+ * once with `next/font/google`: the files are downloaded at build time and
6
+ * served from your own domain with metric-matched fallbacks (no layout shift),
7
+ * and the visitor's browser never contacts Google.
8
+ *
9
+ * - `preload: false` — the tenant picks the font at runtime, so nothing is
10
+ * preloaded; the browser downloads only the face the page actually uses.
11
+ * - Each `variable` matches the `--font-*` name in FONT_CATALOG, and the theme
12
+ * CSS reads `var(--font-lora, "Lora")`, so these copies win automatically.
13
+ *
14
+ * Usage (app/layout.tsx):
15
+ *
16
+ * import { themeFontVariables } from '@kilivi/payloadcms-theme-management/next-fonts'
17
+ * <html className={themeFontVariables}>
18
+ * <head><ServerThemeInjector themeConfiguration={…} fontLoading="none" /></head>
19
+ *
20
+ * Without this module the plugin still serves the fonts from your own domain
21
+ * through its `/api/theme-fonts` endpoints (the default, no setup needed).
22
+ */ import { Archivo, Archivo_Black, Bebas_Neue, Cormorant_Garamond, Crimson_Pro, DM_Sans, DM_Serif_Display, Fraunces, IBM_Plex_Mono, Inter, JetBrains_Mono, Lato, Libre_Baskerville, Lora, Manrope, Merriweather, Montserrat, Nunito, Open_Sans, Outfit, Playfair_Display, Plus_Jakarta_Sans, Poppins, Raleway, Roboto, Source_Sans_3, Space_Grotesk, Space_Mono, Syne, Work_Sans } from 'next/font/google';
23
+ // Variable fonts: one file covers every weight.
24
+ const inter = Inter({
25
+ subsets: [
26
+ 'latin',
27
+ 'latin-ext'
28
+ ],
29
+ variable: '--font-inter',
30
+ display: 'swap',
31
+ preload: false
32
+ });
33
+ const roboto = Roboto({
34
+ subsets: [
35
+ 'latin',
36
+ 'latin-ext'
37
+ ],
38
+ variable: '--font-roboto',
39
+ display: 'swap',
40
+ preload: false
41
+ });
42
+ const openSans = Open_Sans({
43
+ subsets: [
44
+ 'latin',
45
+ 'latin-ext'
46
+ ],
47
+ variable: '--font-open-sans',
48
+ display: 'swap',
49
+ preload: false
50
+ });
51
+ const montserrat = Montserrat({
52
+ subsets: [
53
+ 'latin',
54
+ 'latin-ext'
55
+ ],
56
+ variable: '--font-montserrat',
57
+ display: 'swap',
58
+ preload: false
59
+ });
60
+ const raleway = Raleway({
61
+ subsets: [
62
+ 'latin',
63
+ 'latin-ext'
64
+ ],
65
+ variable: '--font-raleway',
66
+ display: 'swap',
67
+ preload: false
68
+ });
69
+ const dmSans = DM_Sans({
70
+ subsets: [
71
+ 'latin',
72
+ 'latin-ext'
73
+ ],
74
+ variable: '--font-dm-sans',
75
+ display: 'swap',
76
+ preload: false
77
+ });
78
+ const nunito = Nunito({
79
+ subsets: [
80
+ 'latin',
81
+ 'latin-ext'
82
+ ],
83
+ variable: '--font-nunito',
84
+ display: 'swap',
85
+ preload: false
86
+ });
87
+ const plusJakarta = Plus_Jakarta_Sans({
88
+ subsets: [
89
+ 'latin',
90
+ 'latin-ext'
91
+ ],
92
+ variable: '--font-plus-jakarta',
93
+ display: 'swap',
94
+ preload: false
95
+ });
96
+ const manrope = Manrope({
97
+ subsets: [
98
+ 'latin',
99
+ 'latin-ext'
100
+ ],
101
+ variable: '--font-manrope',
102
+ display: 'swap',
103
+ preload: false
104
+ });
105
+ const spaceGrotesk = Space_Grotesk({
106
+ subsets: [
107
+ 'latin',
108
+ 'latin-ext'
109
+ ],
110
+ variable: '--font-space-grotesk',
111
+ display: 'swap',
112
+ preload: false
113
+ });
114
+ const sourceSans = Source_Sans_3({
115
+ subsets: [
116
+ 'latin',
117
+ 'latin-ext'
118
+ ],
119
+ variable: '--font-source-sans',
120
+ display: 'swap',
121
+ preload: false
122
+ });
123
+ const workSans = Work_Sans({
124
+ subsets: [
125
+ 'latin',
126
+ 'latin-ext'
127
+ ],
128
+ variable: '--font-work-sans',
129
+ display: 'swap',
130
+ preload: false
131
+ });
132
+ const archivo = Archivo({
133
+ subsets: [
134
+ 'latin',
135
+ 'latin-ext'
136
+ ],
137
+ variable: '--font-archivo',
138
+ display: 'swap',
139
+ preload: false
140
+ });
141
+ const outfit = Outfit({
142
+ subsets: [
143
+ 'latin',
144
+ 'latin-ext'
145
+ ],
146
+ variable: '--font-outfit',
147
+ display: 'swap',
148
+ preload: false
149
+ });
150
+ const playfair = Playfair_Display({
151
+ subsets: [
152
+ 'latin',
153
+ 'latin-ext'
154
+ ],
155
+ variable: '--font-playfair',
156
+ display: 'swap',
157
+ preload: false
158
+ });
159
+ const merriweather = Merriweather({
160
+ subsets: [
161
+ 'latin',
162
+ 'latin-ext'
163
+ ],
164
+ variable: '--font-merriweather',
165
+ display: 'swap',
166
+ preload: false
167
+ });
168
+ const lora = Lora({
169
+ subsets: [
170
+ 'latin',
171
+ 'latin-ext'
172
+ ],
173
+ variable: '--font-lora',
174
+ display: 'swap',
175
+ preload: false
176
+ });
177
+ const cormorant = Cormorant_Garamond({
178
+ subsets: [
179
+ 'latin',
180
+ 'latin-ext'
181
+ ],
182
+ variable: '--font-cormorant',
183
+ display: 'swap',
184
+ preload: false
185
+ });
186
+ const crimson = Crimson_Pro({
187
+ subsets: [
188
+ 'latin',
189
+ 'latin-ext'
190
+ ],
191
+ variable: '--font-crimson',
192
+ display: 'swap',
193
+ preload: false
194
+ });
195
+ const fraunces = Fraunces({
196
+ subsets: [
197
+ 'latin',
198
+ 'latin-ext'
199
+ ],
200
+ variable: '--font-fraunces',
201
+ display: 'swap',
202
+ preload: false
203
+ });
204
+ const syne = Syne({
205
+ subsets: [
206
+ 'latin',
207
+ 'latin-ext'
208
+ ],
209
+ variable: '--font-syne',
210
+ display: 'swap',
211
+ preload: false
212
+ });
213
+ const jetbrains = JetBrains_Mono({
214
+ subsets: [
215
+ 'latin',
216
+ 'latin-ext'
217
+ ],
218
+ variable: '--font-jetbrains-mono',
219
+ display: 'swap',
220
+ preload: false
221
+ });
222
+ // Static fonts: weights must be listed.
223
+ const lato = Lato({
224
+ subsets: [
225
+ 'latin',
226
+ 'latin-ext'
227
+ ],
228
+ weight: [
229
+ '300',
230
+ '400',
231
+ '700',
232
+ '900'
233
+ ],
234
+ variable: '--font-lato',
235
+ display: 'swap',
236
+ preload: false
237
+ });
238
+ const poppins = Poppins({
239
+ subsets: [
240
+ 'latin',
241
+ 'latin-ext'
242
+ ],
243
+ weight: [
244
+ '300',
245
+ '400',
246
+ '500',
247
+ '600',
248
+ '700',
249
+ '800'
250
+ ],
251
+ variable: '--font-poppins',
252
+ display: 'swap',
253
+ preload: false
254
+ });
255
+ const libreBaskerville = Libre_Baskerville({
256
+ subsets: [
257
+ 'latin',
258
+ 'latin-ext'
259
+ ],
260
+ weight: [
261
+ '400',
262
+ '700'
263
+ ],
264
+ variable: '--font-libre-baskerville',
265
+ display: 'swap',
266
+ preload: false
267
+ });
268
+ const dmSerif = DM_Serif_Display({
269
+ subsets: [
270
+ 'latin',
271
+ 'latin-ext'
272
+ ],
273
+ weight: '400',
274
+ variable: '--font-dm-serif',
275
+ display: 'swap',
276
+ preload: false
277
+ });
278
+ const bebas = Bebas_Neue({
279
+ subsets: [
280
+ 'latin',
281
+ 'latin-ext'
282
+ ],
283
+ weight: '400',
284
+ variable: '--font-bebas',
285
+ display: 'swap',
286
+ preload: false
287
+ });
288
+ const archivoBlack = Archivo_Black({
289
+ subsets: [
290
+ 'latin',
291
+ 'latin-ext'
292
+ ],
293
+ weight: '400',
294
+ variable: '--font-archivo-black',
295
+ display: 'swap',
296
+ preload: false
297
+ });
298
+ const spaceMono = Space_Mono({
299
+ subsets: [
300
+ 'latin',
301
+ 'latin-ext'
302
+ ],
303
+ weight: [
304
+ '400',
305
+ '700'
306
+ ],
307
+ variable: '--font-space-mono',
308
+ display: 'swap',
309
+ preload: false
310
+ });
311
+ const ibmPlexMono = IBM_Plex_Mono({
312
+ subsets: [
313
+ 'latin',
314
+ 'latin-ext'
315
+ ],
316
+ weight: [
317
+ '300',
318
+ '400',
319
+ '500',
320
+ '600',
321
+ '700'
322
+ ],
323
+ variable: '--font-ibm-plex-mono',
324
+ display: 'swap',
325
+ preload: false
326
+ });
327
+ /** Class names that define every `--font-*` variable; put them on <html>. */ export const themeFontVariables = [
328
+ inter,
329
+ roboto,
330
+ openSans,
331
+ lato,
332
+ montserrat,
333
+ poppins,
334
+ raleway,
335
+ dmSans,
336
+ nunito,
337
+ plusJakarta,
338
+ manrope,
339
+ spaceGrotesk,
340
+ sourceSans,
341
+ workSans,
342
+ archivo,
343
+ outfit,
344
+ playfair,
345
+ merriweather,
346
+ lora,
347
+ cormorant,
348
+ crimson,
349
+ fraunces,
350
+ libreBaskerville,
351
+ dmSerif,
352
+ bebas,
353
+ archivoBlack,
354
+ syne,
355
+ spaceMono,
356
+ ibmPlexMono,
357
+ jetbrains
358
+ ].map((font)=>font.variable).join(' ');
359
+
360
+ //# sourceMappingURL=next-fonts.js.map