@kilivi/payloadcms-theme-management 0.2.16 → 0.2.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAuF9F,eAAO,MAAM,qBAAqB,GAAI,UAAS,4BAAiC,KAAG,MAwFlF,CAAA;AAED,KAAK,iBAAiB,GAAG,MAAM,GAAG,8BAA8B,CAAA;AAEhE,eAAO,MAAM,uBAAuB,GAClC,UAAU,iBAAiB,KAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA2CvC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,KAAG,WAAW,GAAG,IAEhE,CAAA;AAED,eAAO,MAAM,wBAAwB,QAAO,WAAW,EAEtD,CAAA;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,4BAA4B,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,YAAY,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AACtF,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,eAAO,MAAM,qBAAqB,aA5La,4BAA4B,KAAQ,MA4LzB,CAAA;AAC1D,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,aA9LU,4BAA4B,KAAQ,MA8LtB,CAAA;AAE7D,eAAe,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAuF9F,eAAO,MAAM,qBAAqB,GAAI,UAAS,4BAAiC,KAAG,MAyFlF,CAAA;AAED,KAAK,iBAAiB,GAAG,MAAM,GAAG,8BAA8B,CAAA;AAEhE,eAAO,MAAM,uBAAuB,GAClC,UAAU,iBAAiB,KAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA2CvC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,KAAG,WAAW,GAAG,IAEhE,CAAA;AAED,eAAO,MAAM,wBAAwB,QAAO,WAAW,EAEtD,CAAA;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,4BAA4B,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,YAAY,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AACtF,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,eAAO,MAAM,qBAAqB,aA7La,4BAA4B,KAAQ,MA6LzB,CAAA;AAC1D,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,aA/LU,4BAA4B,KAAQ,MA+LtB,CAAA;AAE7D,eAAe,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -96,6 +96,7 @@ export const themeManagementPlugin = (options = {})=>{
96
96
  return config;
97
97
  }
98
98
  // Add custom admin view for theme preview
99
+ // Uses ThemePreviewLoader to avoid CSS import issues during generate:importmap
99
100
  const admin = {
100
101
  ...config.admin,
101
102
  components: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, Plugin } from 'payload'\nimport { createThemeConfigurationField } from './fields/themeConfigurationField.js'\nimport type { SiteThemeConfiguration } from './payload-types.js'\nimport type { ThemePreset } from './presets.js'\nimport { defaultThemePresets } from './presets.js'\nimport type { FetchThemeConfigurationOptions, ThemeManagementPluginOptions } from './types.js'\n\nconst THEME_TAB_NAME = 'themeConfiguration'\n\ninterface TabConfig {\n name: string\n label: { en: string; cs: string }\n description?: { en: string; cs: string }\n fields: Field[]\n}\n\n/**\n * Remove existing theme tab from tabs field\n */\nconst removeExistingThemeTab = (tabs: TabConfig[]): TabConfig[] =>\n tabs.filter((tab) => tab?.name !== THEME_TAB_NAME)\n\n/**\n * Add theme configuration tab to existing tabs field or create fields array\n */\nconst upsertThemeTab = (\n fields: Field[] | undefined,\n themeTabConfig: TabConfig,\n enableLogging: boolean,\n): Field[] => {\n const existingFields = fields ?? []\n\n // Find existing tabs field\n const tabsFieldIndex = existingFields.findIndex(\n (field) => 'type' in field && field.type === 'tabs',\n )\n\n if (tabsFieldIndex === -1) {\n // No tabs field exists - add theme configuration as group field instead\n if (enableLogging) {\n console.log(\n '🎨 Theme Management Plugin: No tabs field found, adding theme configuration as group field',\n )\n }\n\n return [\n ...existingFields,\n {\n name: THEME_TAB_NAME,\n type: 'group',\n label: themeTabConfig.label,\n admin: {\n description: themeTabConfig.description,\n },\n fields: themeTabConfig.fields,\n },\n ]\n }\n\n // Tabs field exists - inject our tab into it\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: Adding theme configuration tab to existing tabs')\n }\n\n const tabsField = existingFields[tabsFieldIndex]\n\n if (!('tabs' in tabsField)) {\n console.warn('🎨 Theme Management Plugin: Found tabs field but it has no tabs property')\n return existingFields\n }\n\n const existingTabs = (tabsField.tabs as TabConfig[]) || []\n\n // Remove existing theme tab if present\n const sanitizedTabs = removeExistingThemeTab(existingTabs)\n\n // Create new tabs field with our tab added\n const updatedTabsField = {\n ...tabsField,\n tabs: [...sanitizedTabs, themeTabConfig],\n }\n\n // Return fields array with updated tabs field\n const newFields = [...existingFields]\n newFields[tabsFieldIndex] = updatedTabsField\n\n return newFields\n}\n\nconst ensureCollectionsArray = (collections: Config['collections']): CollectionConfig[] =>\n Array.isArray(collections) ? collections : []\n\nexport const themeManagementPlugin = (options: ThemeManagementPluginOptions = {}): Plugin => {\n return (config: Config): Config => {\n const {\n enabled = true,\n targetCollection = 'site-settings',\n themePresets = defaultThemePresets,\n defaultTheme = 'cool',\n includeColorModeToggle = true,\n includeCustomCSS = true,\n includeBrandIdentity = false,\n enableAdvancedFeatures = true,\n enableLogging = false,\n } = options\n\n if (!enabled) {\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: disabled via options, skipping.')\n }\n return config\n }\n\n const themeTabConfig = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\n })\n\n let collectionTouched = false\n\n const collections = ensureCollectionsArray(config.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 = upsertThemeTab(existingFields, themeTabConfig, enableLogging)\n\n return {\n ...collection,\n fields,\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 config\n }\n\n // Add custom admin view for theme preview\n const admin = {\n ...config.admin,\n components: {\n ...config.admin?.components,\n views: {\n ...config.admin?.components?.views,\n themePreview: {\n Component: '@kilivi/payloadcms-theme-management/views/ThemePreviewView#default',\n path: '/theme-preview' as `/${string}`,\n exact: true,\n meta: {\n title: 'Theme Preview',\n description: 'Real-time preview of your theme configuration',\n },\n },\n },\n },\n }\n\n return {\n ...config,\n collections,\n admin,\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',\n depth,\n locale,\n draft,\n queryParams = {},\n } = normalizedOptions\n\n const params = new URLSearchParams({ limit: '1' })\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n if (tenantSlug) params.set('tenant', 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 try {\n const response = await fetch(url)\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 } 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 defaultThemePresets.find((preset) => preset.name === themeName) || null\n}\n\nexport const getAvailableThemePresets = (): ThemePreset[] => {\n return defaultThemePresets\n}\n\nexport { defaultThemePresets } from './presets.js'\nexport type { ThemePreset, ThemeTypographyPreset } from './presets.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 { ThemeManagementPluginOptions, FetchThemeConfigurationOptions } from './types.js'\nexport {\n DEFAULT_THEME_CONFIGURATION,\n resolveThemeConfiguration,\n} from './utils/resolveThemeConfiguration.js'\nexport type { ResolvedThemeConfiguration } from './utils/resolveThemeConfiguration.js'\nexport { generateThemeColorsCss, hexToHsl } from './utils/themeColors.js'\nexport { generateThemeCSS, getThemeStyles } from './utils/themeUtils.js'\nexport { getThemeHtmlAttributes } from './utils/themeHtmlAttributes.js'\n\nexport type { Mode, ThemeDefaults } from './providers/Theme/types.js'\nexport { ThemeProvider } 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// Components\nexport { ThemeLivePreview } from './fields/ThemeLivePreview.js'\n\nexport const ThemeManagementPlugin = themeManagementPlugin\n/** @deprecated use {@link themeManagementPlugin} */\nexport const themeConfigurationPlugin = themeManagementPlugin\n\nexport default themeManagementPlugin\n"],"names":["createThemeConfigurationField","defaultThemePresets","THEME_TAB_NAME","removeExistingThemeTab","tabs","filter","tab","name","upsertThemeTab","fields","themeTabConfig","enableLogging","existingFields","tabsFieldIndex","findIndex","field","type","console","log","label","admin","description","tabsField","warn","existingTabs","sanitizedTabs","updatedTabsField","newFields","ensureCollectionsArray","collections","Array","isArray","themeManagementPlugin","options","config","enabled","targetCollection","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","includeBrandIdentity","enableAdvancedFeatures","collectionTouched","map","collection","slug","components","views","themePreview","Component","path","exact","meta","title","fetchThemeConfiguration","normalizedOptions","tenantSlug","collectionSlug","depth","locale","draft","queryParams","params","URLSearchParams","limit","set","String","Object","entries","forEach","key","value","undefined","url","toString","response","fetch","ok","Error","status","data","json","doc","docs","themeConfiguration","error","getThemePreset","themeName","find","preset","getAvailableThemePresets","extendedThemePresets","allExtendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","ThemeProvider","getFontLoaderCode","getThemeFontFamilies","ThemeFontProvider","useThemeFonts","FONT_IMPORT_MAP","ThemeLivePreview","ThemeManagementPlugin","themeConfigurationPlugin"],"mappings":"AACA,SAASA,6BAA6B,QAAQ,sCAAqC;AAGnF,SAASC,mBAAmB,QAAQ,eAAc;AAGlD,MAAMC,iBAAiB;AASvB;;CAEC,GACD,MAAMC,yBAAyB,CAACC,OAC9BA,KAAKC,MAAM,CAAC,CAACC,MAAQA,KAAKC,SAASL;AAErC;;CAEC,GACD,MAAMM,iBAAiB,CACrBC,QACAC,gBACAC;IAEA,MAAMC,iBAAiBH,UAAU,EAAE;IAEnC,2BAA2B;IAC3B,MAAMI,iBAAiBD,eAAeE,SAAS,CAC7C,CAACC,QAAU,UAAUA,SAASA,MAAMC,IAAI,KAAK;IAG/C,IAAIH,mBAAmB,CAAC,GAAG;QACzB,wEAAwE;QACxE,IAAIF,eAAe;YACjBM,QAAQC,GAAG,CACT;QAEJ;QAEA,OAAO;eACFN;YACH;gBACEL,MAAML;gBACNc,MAAM;gBACNG,OAAOT,eAAeS,KAAK;gBAC3BC,OAAO;oBACLC,aAAaX,eAAeW,WAAW;gBACzC;gBACAZ,QAAQC,eAAeD,MAAM;YAC/B;SACD;IACH;IAEA,6CAA6C;IAC7C,IAAIE,eAAe;QACjBM,QAAQC,GAAG,CAAC;IACd;IAEA,MAAMI,YAAYV,cAAc,CAACC,eAAe;IAEhD,IAAI,CAAE,CAAA,UAAUS,SAAQ,GAAI;QAC1BL,QAAQM,IAAI,CAAC;QACb,OAAOX;IACT;IAEA,MAAMY,eAAe,AAACF,UAAUlB,IAAI,IAAoB,EAAE;IAE1D,uCAAuC;IACvC,MAAMqB,gBAAgBtB,uBAAuBqB;IAE7C,2CAA2C;IAC3C,MAAME,mBAAmB;QACvB,GAAGJ,SAAS;QACZlB,MAAM;eAAIqB;YAAef;SAAe;IAC1C;IAEA,8CAA8C;IAC9C,MAAMiB,YAAY;WAAIf;KAAe;IACrCe,SAAS,CAACd,eAAe,GAAGa;IAE5B,OAAOC;AACT;AAEA,MAAMC,yBAAyB,CAACC,cAC9BC,MAAMC,OAAO,CAACF,eAAeA,cAAc,EAAE;AAE/C,OAAO,MAAMG,wBAAwB,CAACC,UAAwC,CAAC,CAAC;IAC9E,OAAO,CAACC;QACN,MAAM,EACJC,UAAU,IAAI,EACdC,mBAAmB,eAAe,EAClCC,eAAepC,mBAAmB,EAClCqC,eAAe,MAAM,EACrBC,yBAAyB,IAAI,EAC7BC,mBAAmB,IAAI,EACvBC,uBAAuB,KAAK,EAC5BC,yBAAyB,IAAI,EAC7B/B,gBAAgB,KAAK,EACtB,GAAGsB;QAEJ,IAAI,CAACE,SAAS;YACZ,IAAIxB,eAAe;gBACjBM,QAAQC,GAAG,CAAC;YACd;YACA,OAAOgB;QACT;QAEA,MAAMxB,iBAAiBV,8BAA8B;YACnDqC;YACAC;YACAC;YACAC;YACAC,sBAAsBA,wBAAwB;YAC9CC;QACF;QAEA,IAAIC,oBAAoB;QAExB,MAAMd,cAAcD,uBAAuBM,OAAOL,WAAW,EAAEe,GAAG,CAAC,CAACC;YAClE,IAAIA,WAAWC,IAAI,KAAKV,kBAAkB;gBACxC,OAAOS;YACT;YAEAF,oBAAoB;YAEpB,IAAIhC,eAAe;gBACjBM,QAAQC,GAAG,CAAC,CAAC,kDAAkD,EAAE2B,WAAWC,IAAI,CAAC,CAAC,CAAC;YACrF;YAEA,MAAMlC,iBAAiBkB,MAAMC,OAAO,CAACc,WAAWpC,MAAM,IAAIoC,WAAWpC,MAAM,GAAG,EAAE;YAEhF,MAAMA,SAASD,eAAeI,gBAAgBF,gBAAgBC;YAE9D,OAAO;gBACL,GAAGkC,UAAU;gBACbpC;YACF;QACF;QAEA,IAAI,CAACkC,mBAAmB;YACtB,IAAIhC,eAAe;gBACjBM,QAAQM,IAAI,CACV,CAAC,wCAAwC,EAAEa,iBAAiB,0CAA0C,CAAC;YAE3G;YACA,OAAOF;QACT;QAEA,0CAA0C;QAC1C,MAAMd,QAAQ;YACZ,GAAGc,OAAOd,KAAK;YACf2B,YAAY;gBACV,GAAGb,OAAOd,KAAK,EAAE2B,UAAU;gBAC3BC,OAAO;oBACL,GAAGd,OAAOd,KAAK,EAAE2B,YAAYC,KAAK;oBAClCC,cAAc;wBACZC,WAAW;wBACXC,MAAM;wBACNC,OAAO;wBACPC,MAAM;4BACJC,OAAO;4BACPjC,aAAa;wBACf;oBACF;gBACF;YACF;QACF;QAEA,OAAO;YACL,GAAGa,MAAM;YACTL;YACAT;QACF;IACF;AACF,EAAC;AAID,OAAO,MAAMmC,0BAA0B,OACrCtB;IAEA,MAAMuB,oBAAoB,OAAOvB,YAAY,WAAW;QAAEwB,YAAYxB;IAAQ,IAAKA,WAAW,CAAC;IAE/F,MAAM,EACJwB,UAAU,EACVC,iBAAiB,eAAe,EAChCC,KAAK,EACLC,MAAM,EACNC,KAAK,EACLC,cAAc,CAAC,CAAC,EACjB,GAAGN;IAEJ,MAAMO,SAAS,IAAIC,gBAAgB;QAAEC,OAAO;IAAI;IAEhD,IAAI,OAAON,UAAU,UAAUI,OAAOG,GAAG,CAAC,SAASC,OAAOR;IAC1D,IAAIF,YAAYM,OAAOG,GAAG,CAAC,UAAUT;IACrC,IAAIG,QAAQG,OAAOG,GAAG,CAAC,UAAUN;IACjC,IAAIC,OAAOE,OAAOG,GAAG,CAAC,SAAS;IAE/BE,OAAOC,OAAO,CAACP,aAAaQ,OAAO,CAAC,CAAC,CAACC,KAAKC,MAAM;QAC/C,IAAIA,UAAUC,WAAW;QACzBV,OAAOG,GAAG,CAACK,KAAKJ,OAAOK;IACzB;IAEA,MAAME,MAAM,CAAC,KAAK,EAAEhB,eAAe,CAAC,EAAEK,OAAOY,QAAQ,IAAI;IAEzD,IAAI;QACF,MAAMC,WAAW,MAAMC,MAAMH;QAC7B,IAAI,CAACE,SAASE,EAAE,EAAE;YAChB,MAAM,IAAIC,MAAM,CAAC,4CAA4C,EAAEH,SAASI,MAAM,CAAC,CAAC,CAAC;QACnF;QAEA,MAAMC,OAAQ,MAAML,SAASM,IAAI;QAIjC,MAAMC,MAAMF,KAAKG,IAAI,EAAE,CAAC,EAAE;QAE1B,OAAOD,KAAKE,sBAAsB;IACpC,EAAE,OAAOC,OAAO;QACdrE,QAAQM,IAAI,CAAC,wCAAwC+D;QACrD,OAAO;IACT;AACF,EAAC;AAED,OAAO,MAAMC,iBAAiB,CAACC;IAC7B,OAAOvF,oBAAoBwF,IAAI,CAAC,CAACC,SAAWA,OAAOnF,IAAI,KAAKiF,cAAc;AAC5E,EAAC;AAED,OAAO,MAAMG,2BAA2B;IACtC,OAAO1F;AACT,EAAC;AAED,SAASA,mBAAmB,QAAQ,eAAc;AAElD,SACE2F,oBAAoB,EACpBC,uBAAuB,EACvBC,2BAA2B,QACtB,wBAAuB;AAE9B,SACEC,kBAAkB,EAClBC,wBAAwB,EACxBC,kBAAkB,EAClBC,sBAAsB,EACtBC,sBAAsB,EACtBC,wBAAwB,QACnB,kCAAiC;AAExC,SACEC,2BAA2B,EAC3BC,yBAAyB,QACpB,uCAAsC;AAE7C,SAASC,sBAAsB,EAAEC,QAAQ,QAAQ,yBAAwB;AACzE,SAASC,gBAAgB,EAAEC,cAAc,QAAQ,wBAAuB;AACxE,SAASC,sBAAsB,QAAQ,iCAAgC;AAGvE,SAASC,aAAa,QAAQ,6BAA4B;AAE1D,iDAAiD;AACjD,SACEC,iBAAiB,EACjBC,oBAAoB,EACpBC,iBAAiB,EACjBC,aAAa,EACbC,eAAe,QACV,6BAA4B;AAEnC,aAAa;AACb,SAASC,gBAAgB,QAAQ,+BAA8B;AAE/D,OAAO,MAAMC,wBAAwBnF,sBAAqB;AAC1D,kDAAkD,GAClD,OAAO,MAAMoF,2BAA2BpF,sBAAqB;AAE7D,eAAeA,sBAAqB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, Plugin } from 'payload'\nimport { createThemeConfigurationField } from './fields/themeConfigurationField.js'\nimport type { SiteThemeConfiguration } from './payload-types.js'\nimport type { ThemePreset } from './presets.js'\nimport { defaultThemePresets } from './presets.js'\nimport type { FetchThemeConfigurationOptions, ThemeManagementPluginOptions } from './types.js'\n\nconst THEME_TAB_NAME = 'themeConfiguration'\n\ninterface TabConfig {\n name: string\n label: { en: string; cs: string }\n description?: { en: string; cs: string }\n fields: Field[]\n}\n\n/**\n * Remove existing theme tab from tabs field\n */\nconst removeExistingThemeTab = (tabs: TabConfig[]): TabConfig[] =>\n tabs.filter((tab) => tab?.name !== THEME_TAB_NAME)\n\n/**\n * Add theme configuration tab to existing tabs field or create fields array\n */\nconst upsertThemeTab = (\n fields: Field[] | undefined,\n themeTabConfig: TabConfig,\n enableLogging: boolean,\n): Field[] => {\n const existingFields = fields ?? []\n\n // Find existing tabs field\n const tabsFieldIndex = existingFields.findIndex(\n (field) => 'type' in field && field.type === 'tabs',\n )\n\n if (tabsFieldIndex === -1) {\n // No tabs field exists - add theme configuration as group field instead\n if (enableLogging) {\n console.log(\n '🎨 Theme Management Plugin: No tabs field found, adding theme configuration as group field',\n )\n }\n\n return [\n ...existingFields,\n {\n name: THEME_TAB_NAME,\n type: 'group',\n label: themeTabConfig.label,\n admin: {\n description: themeTabConfig.description,\n },\n fields: themeTabConfig.fields,\n },\n ]\n }\n\n // Tabs field exists - inject our tab into it\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: Adding theme configuration tab to existing tabs')\n }\n\n const tabsField = existingFields[tabsFieldIndex]\n\n if (!('tabs' in tabsField)) {\n console.warn('🎨 Theme Management Plugin: Found tabs field but it has no tabs property')\n return existingFields\n }\n\n const existingTabs = (tabsField.tabs as TabConfig[]) || []\n\n // Remove existing theme tab if present\n const sanitizedTabs = removeExistingThemeTab(existingTabs)\n\n // Create new tabs field with our tab added\n const updatedTabsField = {\n ...tabsField,\n tabs: [...sanitizedTabs, themeTabConfig],\n }\n\n // Return fields array with updated tabs field\n const newFields = [...existingFields]\n newFields[tabsFieldIndex] = updatedTabsField\n\n return newFields\n}\n\nconst ensureCollectionsArray = (collections: Config['collections']): CollectionConfig[] =>\n Array.isArray(collections) ? collections : []\n\nexport const themeManagementPlugin = (options: ThemeManagementPluginOptions = {}): Plugin => {\n return (config: Config): Config => {\n const {\n enabled = true,\n targetCollection = 'site-settings',\n themePresets = defaultThemePresets,\n defaultTheme = 'cool',\n includeColorModeToggle = true,\n includeCustomCSS = true,\n includeBrandIdentity = false,\n enableAdvancedFeatures = true,\n enableLogging = false,\n } = options\n\n if (!enabled) {\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: disabled via options, skipping.')\n }\n return config\n }\n\n const themeTabConfig = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\n })\n\n let collectionTouched = false\n\n const collections = ensureCollectionsArray(config.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 = upsertThemeTab(existingFields, themeTabConfig, enableLogging)\n\n return {\n ...collection,\n fields,\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 config\n }\n\n // Add custom admin view for theme preview\n // Uses ThemePreviewLoader to avoid CSS import issues during generate:importmap\n const admin = {\n ...config.admin,\n components: {\n ...config.admin?.components,\n views: {\n ...config.admin?.components?.views,\n themePreview: {\n Component: '@kilivi/payloadcms-theme-management/views/ThemePreviewView#default',\n path: '/theme-preview' as `/${string}`,\n exact: true,\n meta: {\n title: 'Theme Preview',\n description: 'Real-time preview of your theme configuration',\n },\n },\n },\n },\n }\n\n return {\n ...config,\n collections,\n admin,\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',\n depth,\n locale,\n draft,\n queryParams = {},\n } = normalizedOptions\n\n const params = new URLSearchParams({ limit: '1' })\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n if (tenantSlug) params.set('tenant', 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 try {\n const response = await fetch(url)\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 } 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 defaultThemePresets.find((preset) => preset.name === themeName) || null\n}\n\nexport const getAvailableThemePresets = (): ThemePreset[] => {\n return defaultThemePresets\n}\n\nexport { defaultThemePresets } from './presets.js'\nexport type { ThemePreset, ThemeTypographyPreset } from './presets.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 { ThemeManagementPluginOptions, FetchThemeConfigurationOptions } from './types.js'\nexport {\n DEFAULT_THEME_CONFIGURATION,\n resolveThemeConfiguration,\n} from './utils/resolveThemeConfiguration.js'\nexport type { ResolvedThemeConfiguration } from './utils/resolveThemeConfiguration.js'\nexport { generateThemeColorsCss, hexToHsl } from './utils/themeColors.js'\nexport { generateThemeCSS, getThemeStyles } from './utils/themeUtils.js'\nexport { getThemeHtmlAttributes } from './utils/themeHtmlAttributes.js'\n\nexport type { Mode, ThemeDefaults } from './providers/Theme/types.js'\nexport { ThemeProvider } 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// Components\nexport { ThemeLivePreview } from './fields/ThemeLivePreview.js'\n\nexport const ThemeManagementPlugin = themeManagementPlugin\n/** @deprecated use {@link themeManagementPlugin} */\nexport const themeConfigurationPlugin = themeManagementPlugin\n\nexport default themeManagementPlugin\n"],"names":["createThemeConfigurationField","defaultThemePresets","THEME_TAB_NAME","removeExistingThemeTab","tabs","filter","tab","name","upsertThemeTab","fields","themeTabConfig","enableLogging","existingFields","tabsFieldIndex","findIndex","field","type","console","log","label","admin","description","tabsField","warn","existingTabs","sanitizedTabs","updatedTabsField","newFields","ensureCollectionsArray","collections","Array","isArray","themeManagementPlugin","options","config","enabled","targetCollection","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","includeBrandIdentity","enableAdvancedFeatures","collectionTouched","map","collection","slug","components","views","themePreview","Component","path","exact","meta","title","fetchThemeConfiguration","normalizedOptions","tenantSlug","collectionSlug","depth","locale","draft","queryParams","params","URLSearchParams","limit","set","String","Object","entries","forEach","key","value","undefined","url","toString","response","fetch","ok","Error","status","data","json","doc","docs","themeConfiguration","error","getThemePreset","themeName","find","preset","getAvailableThemePresets","extendedThemePresets","allExtendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","ThemeProvider","getFontLoaderCode","getThemeFontFamilies","ThemeFontProvider","useThemeFonts","FONT_IMPORT_MAP","ThemeLivePreview","ThemeManagementPlugin","themeConfigurationPlugin"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Theme Preview Loader - Client Component
3
+ * Dynamically loads the ThemeLivePreview component to avoid CSS issues during generate:importmap
4
+ */
5
+ import React from 'react';
6
+ export declare function ThemePreviewLoader(): React.JSX.Element;
7
+ //# sourceMappingURL=ThemePreviewLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemePreviewLoader.d.ts","sourceRoot":"","sources":["../../src/views/ThemePreviewLoader.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,wBAAgB,kBAAkB,sBAiCjC"}
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * Theme Preview Loader - Client Component
5
+ * Dynamically loads the ThemeLivePreview component to avoid CSS issues during generate:importmap
6
+ */ import React, { useEffect, useState } from 'react';
7
+ export function ThemePreviewLoader() {
8
+ const [PreviewComponent, setPreviewComponent] = useState(null);
9
+ const [error, setError] = useState(null);
10
+ useEffect(()=>{
11
+ // Dynamically import the preview component only in browser
12
+ import('../fields/ThemeLivePreview.js').then((mod)=>{
13
+ setPreviewComponent(()=>mod.ThemeLivePreview);
14
+ }).catch((err)=>{
15
+ console.error('Failed to load theme preview:', err);
16
+ setError('Failed to load theme preview component');
17
+ });
18
+ }, []);
19
+ if (error) {
20
+ return /*#__PURE__*/ _jsx("div", {
21
+ style: {
22
+ padding: '2rem',
23
+ color: 'var(--theme-error)'
24
+ },
25
+ children: /*#__PURE__*/ _jsx("p", {
26
+ children: error
27
+ })
28
+ });
29
+ }
30
+ if (!PreviewComponent) {
31
+ return /*#__PURE__*/ _jsx("div", {
32
+ style: {
33
+ padding: '2rem'
34
+ },
35
+ children: /*#__PURE__*/ _jsx("p", {
36
+ children: "Loading theme preview..."
37
+ })
38
+ });
39
+ }
40
+ return /*#__PURE__*/ _jsx(PreviewComponent, {});
41
+ }
42
+
43
+ //# sourceMappingURL=ThemePreviewLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/views/ThemePreviewLoader.tsx"],"sourcesContent":["'use client'\n\n/**\n * Theme Preview Loader - Client Component\n * Dynamically loads the ThemeLivePreview component to avoid CSS issues during generate:importmap\n */\nimport React, { useEffect, useState } from 'react'\n\nexport function ThemePreviewLoader() {\n const [PreviewComponent, setPreviewComponent] = useState<React.ComponentType | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n // Dynamically import the preview component only in browser\n import('../fields/ThemeLivePreview.js')\n .then((mod) => {\n setPreviewComponent(() => mod.ThemeLivePreview)\n })\n .catch((err) => {\n console.error('Failed to load theme preview:', err)\n setError('Failed to load theme preview component')\n })\n }, [])\n\n if (error) {\n return (\n <div style={{ padding: '2rem', color: 'var(--theme-error)' }}>\n <p>{error}</p>\n </div>\n )\n }\n\n if (!PreviewComponent) {\n return (\n <div style={{ padding: '2rem' }}>\n <p>Loading theme preview...</p>\n </div>\n )\n }\n\n return <PreviewComponent />\n}\n"],"names":["React","useEffect","useState","ThemePreviewLoader","PreviewComponent","setPreviewComponent","error","setError","then","mod","ThemeLivePreview","catch","err","console","div","style","padding","color","p"],"mappings":"AAAA;;AAEA;;;CAGC,GACD,OAAOA,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,OAAO,SAASC;IACd,MAAM,CAACC,kBAAkBC,oBAAoB,GAAGH,SAAqC;IACrF,MAAM,CAACI,OAAOC,SAAS,GAAGL,SAAwB;IAElDD,UAAU;QACR,2DAA2D;QAC3D,MAAM,CAAC,iCACJO,IAAI,CAAC,CAACC;YACLJ,oBAAoB,IAAMI,IAAIC,gBAAgB;QAChD,GACCC,KAAK,CAAC,CAACC;YACNC,QAAQP,KAAK,CAAC,iCAAiCM;YAC/CL,SAAS;QACX;IACJ,GAAG,EAAE;IAEL,IAAID,OAAO;QACT,qBACE,KAACQ;YAAIC,OAAO;gBAAEC,SAAS;gBAAQC,OAAO;YAAqB;sBACzD,cAAA,KAACC;0BAAGZ;;;IAGV;IAEA,IAAI,CAACF,kBAAkB;QACrB,qBACE,KAACU;YAAIC,OAAO;gBAAEC,SAAS;YAAO;sBAC5B,cAAA,KAACE;0BAAE;;;IAGT;IAEA,qBAAO,KAACd;AACV"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Theme Preview View - Server Component
3
3
  * Custom admin view for live theme preview
4
+ *
5
+ * Uses ThemePreviewLoader which dynamically imports client components
6
+ * This prevents CSS imports from breaking generate:importmap
4
7
  */
5
8
  import React from 'react';
6
9
  export default function ThemePreviewView(): Promise<React.JSX.Element>;
@@ -1 +1 @@
1
- {"version":3,"file":"ThemePreviewView.d.ts","sourceRoot":"","sources":["../../src/views/ThemePreviewView.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,wBAA8B,gBAAgB,+BAe7C"}
1
+ {"version":3,"file":"ThemePreviewView.d.ts","sourceRoot":"","sources":["../../src/views/ThemePreviewView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,wBAA8B,gBAAgB,+BAe7C"}
@@ -1,10 +1,13 @@
1
1
  /**
2
2
  * Theme Preview View - Server Component
3
3
  * Custom admin view for live theme preview
4
+ *
5
+ * Uses ThemePreviewLoader which dynamically imports client components
6
+ * This prevents CSS imports from breaking generate:importmap
4
7
  */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
8
  import { Gutter } from '@payloadcms/ui';
6
9
  import React from 'react';
7
- import { ThemeLivePreviewClient } from './ThemePreviewViewClient.js';
10
+ import { ThemePreviewLoader } from './ThemePreviewLoader.js';
8
11
  export default async function ThemePreviewView() {
9
12
  return /*#__PURE__*/ _jsx("div", {
10
13
  className: "payload-admin-view",
@@ -30,7 +33,7 @@ export default async function ThemePreviewView() {
30
33
  })
31
34
  ]
32
35
  }),
33
- /*#__PURE__*/ _jsx(ThemeLivePreviewClient, {})
36
+ /*#__PURE__*/ _jsx(ThemePreviewLoader, {})
34
37
  ]
35
38
  })
36
39
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/views/ThemePreviewView.tsx"],"sourcesContent":["/**\n * Theme Preview View - Server Component\n * Custom admin view for live theme preview\n */\n\nimport { Gutter } from '@payloadcms/ui'\nimport React from 'react'\nimport { ThemeLivePreviewClient } from './ThemePreviewViewClient.js'\n\nexport default async function ThemePreviewView() {\n return (\n <div className=\"payload-admin-view\">\n <Gutter>\n <div style={{ marginBottom: '2rem' }}>\n <h1 style={{ marginBottom: '0.5rem' }}>🎨 Theme Preview</h1>\n <p style={{ color: 'var(--theme-elevation-500)', margin: 0 }}>\n Real-time preview of your theme configuration. Changes are reflected instantly as you\n edit theme settings.\n </p>\n </div>\n <ThemeLivePreviewClient />\n </Gutter>\n </div>\n )\n}\n"],"names":["Gutter","React","ThemeLivePreviewClient","ThemePreviewView","div","className","style","marginBottom","h1","p","color","margin"],"mappings":"AAAA;;;CAGC;AAED,SAASA,MAAM,QAAQ,iBAAgB;AACvC,OAAOC,WAAW,QAAO;AACzB,SAASC,sBAAsB,QAAQ,8BAA6B;AAEpE,eAAe,eAAeC;IAC5B,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,MAACL;;8BACC,MAACI;oBAAIE,OAAO;wBAAEC,cAAc;oBAAO;;sCACjC,KAACC;4BAAGF,OAAO;gCAAEC,cAAc;4BAAS;sCAAG;;sCACvC,KAACE;4BAAEH,OAAO;gCAAEI,OAAO;gCAA8BC,QAAQ;4BAAE;sCAAG;;;;8BAKhE,KAACT;;;;AAIT"}
1
+ {"version":3,"sources":["../../src/views/ThemePreviewView.tsx"],"sourcesContent":["/**\n * Theme Preview View - Server Component\n * Custom admin view for live theme preview\n *\n * Uses ThemePreviewLoader which dynamically imports client components\n * This prevents CSS imports from breaking generate:importmap\n */\n\nimport { Gutter } from '@payloadcms/ui'\nimport React from 'react'\nimport { ThemePreviewLoader } from './ThemePreviewLoader.js'\n\nexport default async function ThemePreviewView() {\n return (\n <div className=\"payload-admin-view\">\n <Gutter>\n <div style={{ marginBottom: '2rem' }}>\n <h1 style={{ marginBottom: '0.5rem' }}>🎨 Theme Preview</h1>\n <p style={{ color: 'var(--theme-elevation-500)', margin: 0 }}>\n Real-time preview of your theme configuration. Changes are reflected instantly as you\n edit theme settings.\n </p>\n </div>\n <ThemePreviewLoader />\n </Gutter>\n </div>\n )\n}\n"],"names":["Gutter","React","ThemePreviewLoader","ThemePreviewView","div","className","style","marginBottom","h1","p","color","margin"],"mappings":"AAAA;;;;;;CAMC;AAED,SAASA,MAAM,QAAQ,iBAAgB;AACvC,OAAOC,WAAW,QAAO;AACzB,SAASC,kBAAkB,QAAQ,0BAAyB;AAE5D,eAAe,eAAeC;IAC5B,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,MAACL;;8BACC,MAACI;oBAAIE,OAAO;wBAAEC,cAAc;oBAAO;;sCACjC,KAACC;4BAAGF,OAAO;gCAAEC,cAAc;4BAAS;sCAAG;;sCACvC,KAACE;4BAAEH,OAAO;gCAAEI,OAAO;gCAA8BC,QAAQ;4BAAE;sCAAG;;;;8BAKhE,KAACT;;;;AAIT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kilivi/payloadcms-theme-management",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "description": "Theme configuration plugin for Payload CMS v3",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",