@kilivi/payloadcms-theme-management 1.0.2 → 1.0.3

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 (38) hide show
  1. package/dist/components/ThemePreview.d.ts.map +1 -1
  2. package/dist/components/ThemePreview.js +14 -11
  3. package/dist/components/ThemePreview.js.map +1 -1
  4. package/dist/constants/themeFonts.d.ts +68 -17
  5. package/dist/constants/themeFonts.d.ts.map +1 -1
  6. package/dist/constants/themeFonts.js +68 -17
  7. package/dist/constants/themeFonts.js.map +1 -1
  8. package/dist/fields/FontSelectField.d.ts.map +1 -1
  9. package/dist/fields/FontSelectField.js +15 -6
  10. package/dist/fields/FontSelectField.js.map +1 -1
  11. package/dist/fields/ThemePreviewField.d.ts.map +1 -1
  12. package/dist/fields/ThemePreviewField.js +33 -28
  13. package/dist/fields/ThemePreviewField.js.map +1 -1
  14. package/dist/fields/ThemeTokenSelectField.d.ts.map +1 -1
  15. package/dist/fields/ThemeTokenSelectField.js +0 -1
  16. package/dist/fields/ThemeTokenSelectField.js.map +1 -1
  17. package/dist/globals/ThemeSettings/FontPicker/FontPreview.d.ts.map +1 -1
  18. package/dist/globals/ThemeSettings/FontPicker/FontPreview.js +7 -4
  19. package/dist/globals/ThemeSettings/FontPicker/FontPreview.js.map +1 -1
  20. package/dist/globals/ThemeSettings/config.d.ts.map +1 -1
  21. package/dist/globals/ThemeSettings/config.js +32 -8
  22. package/dist/globals/ThemeSettings/config.js.map +1 -1
  23. package/dist/index.d.ts +1 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +29 -12
  26. package/dist/index.js.map +1 -1
  27. package/dist/translations.d.ts +49 -0
  28. package/dist/translations.d.ts.map +1 -0
  29. package/dist/translations.js +121 -0
  30. package/dist/translations.js.map +1 -0
  31. package/dist/utilities/getThemeSettings.d.ts.map +1 -1
  32. package/dist/utilities/getThemeSettings.js +8 -2
  33. package/dist/utilities/getThemeSettings.js.map +1 -1
  34. package/dist/utils/getAdminLanguage.d.ts +2 -0
  35. package/dist/utils/getAdminLanguage.d.ts.map +1 -0
  36. package/dist/utils/getAdminLanguage.js +21 -0
  37. package/dist/utils/getAdminLanguage.js.map +1 -0
  38. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/globals/ThemeSettings/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,YA+G3B,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/globals/ThemeSettings/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,YAqH3B,CAAA"}
@@ -6,9 +6,15 @@
6
6
  * - Google Fonts API key (optional, for extended font library)
7
7
  */ export const ThemeSettings = {
8
8
  slug: 'themeSettings',
9
- label: 'Theme Settings',
9
+ label: {
10
+ en: 'Theme Settings',
11
+ cs: 'Nastavení témat'
12
+ },
10
13
  admin: {
11
- group: 'Settings'
14
+ group: {
15
+ en: 'Settings',
16
+ cs: 'Nastavení'
17
+ }
12
18
  },
13
19
  access: {
14
20
  read: ()=>true,
@@ -22,15 +28,24 @@
22
28
  type: 'tabs',
23
29
  tabs: [
24
30
  {
25
- label: 'Typography',
31
+ label: {
32
+ en: 'Typography',
33
+ cs: 'Typografie'
34
+ },
26
35
  fields: [
27
36
  {
28
37
  name: 'activeFont',
29
38
  type: 'text',
30
- label: 'Active Font Family',
39
+ label: {
40
+ en: 'Active Font Family',
41
+ cs: 'Aktivní rodina písem'
42
+ },
31
43
  defaultValue: 'Inter',
32
44
  admin: {
33
- description: 'The currently active font family for your website',
45
+ description: {
46
+ en: 'The currently active font family for your website',
47
+ cs: 'Aktuální rodina písem pro váš web'
48
+ },
34
49
  components: {
35
50
  Field: '@kilivi/payloadcms-theme-management/globals/ThemeSettings/FontPicker'
36
51
  }
@@ -39,9 +54,15 @@
39
54
  {
40
55
  name: 'googleFontsApiKey',
41
56
  type: 'text',
42
- label: 'Google Fonts API Key',
57
+ label: {
58
+ en: 'Google Fonts API Key',
59
+ cs: 'Google Fonts API klíč'
60
+ },
43
61
  admin: {
44
- description: "Optional: Add your Google Fonts API key to access the full library of 1400+ fonts. Without this, you'll have access to 35 popular fonts.",
62
+ description: {
63
+ en: "Optional: Add your Google Fonts API key to access the full library of 1400+ fonts. Without this, you'll have access to 35 popular fonts.",
64
+ cs: 'Volitelné: přidejte svůj Google Fonts API klíč pro přístup k plné knihovně 1400+ písem. Bez něj máte k dispozici 35 populárních písem.'
65
+ },
45
66
  placeholder: 'AIzaSy...'
46
67
  }
47
68
  },
@@ -150,7 +171,10 @@
150
171
  ]
151
172
  },
152
173
  {
153
- label: 'Font Loading',
174
+ label: {
175
+ en: 'Font Loading',
176
+ cs: 'Načítání písem'
177
+ },
154
178
  fields: [
155
179
  {
156
180
  type: 'ui',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/globals/ThemeSettings/config.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\n/**\n * ThemeSettings Global Configuration\n *\n * This global stores theme-related settings including:\n * - Active font family (selected via FontPicker)\n * - Google Fonts API key (optional, for extended font library)\n */\nexport const ThemeSettings: GlobalConfig = {\n slug: 'themeSettings',\n label: 'Theme Settings',\n admin: {\n group: 'Settings',\n },\n access: {\n read: () => true,\n update: ({ req }) => {\n // Only admins can update theme settings\n return req.user?.roles?.includes('admin') || false\n },\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Typography',\n fields: [\n {\n name: 'activeFont',\n type: 'text',\n label: 'Active Font Family',\n defaultValue: 'Inter',\n admin: {\n description: 'The currently active font family for your website',\n components: {\n Field: '@kilivi/payloadcms-theme-management/globals/ThemeSettings/FontPicker',\n },\n },\n },\n {\n name: 'googleFontsApiKey',\n type: 'text',\n label: 'Google Fonts API Key',\n admin: {\n description:\n \"Optional: Add your Google Fonts API key to access the full library of 1400+ fonts. Without this, you'll have access to 35 popular fonts.\",\n placeholder: 'AIzaSy...',\n },\n },\n {\n type: 'row',\n fields: [\n {\n name: 'fontWeightHeading',\n type: 'select',\n label: 'Heading Font Weight',\n defaultValue: '700',\n options: [\n { label: '100 - Thin', value: '100' },\n { label: '200 - Extra Light', value: '200' },\n { label: '300 - Light', value: '300' },\n { label: '400 - Regular', value: '400' },\n { label: '500 - Medium', value: '500' },\n { label: '600 - Semi Bold', value: '600' },\n { label: '700 - Bold', value: '700' },\n { label: '800 - Extra Bold', value: '800' },\n { label: '900 - Black', value: '900' },\n ],\n },\n {\n name: 'fontWeightBody',\n type: 'select',\n label: 'Body Font Weight',\n defaultValue: '400',\n options: [\n { label: '100 - Thin', value: '100' },\n { label: '200 - Extra Light', value: '200' },\n { label: '300 - Light', value: '300' },\n { label: '400 - Regular', value: '400' },\n { label: '500 - Medium', value: '500' },\n { label: '600 - Semi Bold', value: '600' },\n { label: '700 - Bold', value: '700' },\n { label: '800 - Extra Bold', value: '800' },\n { label: '900 - Black', value: '900' },\n ],\n },\n ],\n },\n {\n type: 'ui',\n name: 'typographyInfo',\n admin: {\n components: {\n Field:\n '@kilivi/payloadcms-theme-management/globals/ThemeSettings/fields/TypographyInfoField',\n },\n },\n },\n ],\n },\n {\n label: 'Font Loading',\n fields: [\n {\n type: 'ui',\n name: 'fontLoadingGuide',\n admin: {\n components: {\n Field:\n '@kilivi/payloadcms-theme-management/globals/ThemeSettings/fields/FontLoadingGuideField',\n },\n },\n },\n ],\n },\n ],\n },\n ],\n}\n"],"names":["ThemeSettings","slug","label","admin","group","access","read","update","req","user","roles","includes","fields","type","tabs","name","defaultValue","description","components","Field","placeholder","options","value"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,MAAMA,gBAA8B;IACzCC,MAAM;IACNC,OAAO;IACPC,OAAO;QACLC,OAAO;IACT;IACAC,QAAQ;QACNC,MAAM,IAAM;QACZC,QAAQ,CAAC,EAAEC,GAAG,EAAE;YACd,wCAAwC;YACxC,OAAOA,IAAIC,IAAI,EAAEC,OAAOC,SAAS,YAAY;QAC/C;IACF;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;gBACJ;oBACEZ,OAAO;oBACPU,QAAQ;wBACN;4BACEG,MAAM;4BACNF,MAAM;4BACNX,OAAO;4BACPc,cAAc;4BACdb,OAAO;gCACLc,aAAa;gCACbC,YAAY;oCACVC,OAAO;gCACT;4BACF;wBACF;wBACA;4BACEJ,MAAM;4BACNF,MAAM;4BACNX,OAAO;4BACPC,OAAO;gCACLc,aACE;gCACFG,aAAa;4BACf;wBACF;wBACA;4BACEP,MAAM;4BACND,QAAQ;gCACN;oCACEG,MAAM;oCACNF,MAAM;oCACNX,OAAO;oCACPc,cAAc;oCACdK,SAAS;wCACP;4CAAEnB,OAAO;4CAAcoB,OAAO;wCAAM;wCACpC;4CAAEpB,OAAO;4CAAqBoB,OAAO;wCAAM;wCAC3C;4CAAEpB,OAAO;4CAAeoB,OAAO;wCAAM;wCACrC;4CAAEpB,OAAO;4CAAiBoB,OAAO;wCAAM;wCACvC;4CAAEpB,OAAO;4CAAgBoB,OAAO;wCAAM;wCACtC;4CAAEpB,OAAO;4CAAmBoB,OAAO;wCAAM;wCACzC;4CAAEpB,OAAO;4CAAcoB,OAAO;wCAAM;wCACpC;4CAAEpB,OAAO;4CAAoBoB,OAAO;wCAAM;wCAC1C;4CAAEpB,OAAO;4CAAeoB,OAAO;wCAAM;qCACtC;gCACH;gCACA;oCACEP,MAAM;oCACNF,MAAM;oCACNX,OAAO;oCACPc,cAAc;oCACdK,SAAS;wCACP;4CAAEnB,OAAO;4CAAcoB,OAAO;wCAAM;wCACpC;4CAAEpB,OAAO;4CAAqBoB,OAAO;wCAAM;wCAC3C;4CAAEpB,OAAO;4CAAeoB,OAAO;wCAAM;wCACrC;4CAAEpB,OAAO;4CAAiBoB,OAAO;wCAAM;wCACvC;4CAAEpB,OAAO;4CAAgBoB,OAAO;wCAAM;wCACtC;4CAAEpB,OAAO;4CAAmBoB,OAAO;wCAAM;wCACzC;4CAAEpB,OAAO;4CAAcoB,OAAO;wCAAM;wCACpC;4CAAEpB,OAAO;4CAAoBoB,OAAO;wCAAM;wCAC1C;4CAAEpB,OAAO;4CAAeoB,OAAO;wCAAM;qCACtC;gCACH;6BACD;wBACH;wBACA;4BACET,MAAM;4BACNE,MAAM;4BACNZ,OAAO;gCACLe,YAAY;oCACVC,OACE;gCACJ;4BACF;wBACF;qBACD;gBACH;gBACA;oBACEjB,OAAO;oBACPU,QAAQ;wBACN;4BACEC,MAAM;4BACNE,MAAM;4BACNZ,OAAO;gCACLe,YAAY;oCACVC,OACE;gCACJ;4BACF;wBACF;qBACD;gBACH;aACD;QACH;KACD;AACH,EAAC"}
1
+ {"version":3,"sources":["../../../src/globals/ThemeSettings/config.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\n/**\n * ThemeSettings Global Configuration\n *\n * This global stores theme-related settings including:\n * - Active font family (selected via FontPicker)\n * - Google Fonts API key (optional, for extended font library)\n */\nexport const ThemeSettings: GlobalConfig = {\n slug: 'themeSettings',\n label: { en: 'Theme Settings', cs: 'Nastavení témat' },\n admin: {\n group: { en: 'Settings', cs: 'Nastavení' },\n },\n access: {\n read: () => true,\n update: ({ req }) => {\n // Only admins can update theme settings\n return req.user?.roles?.includes('admin') || false\n },\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: { en: 'Typography', cs: 'Typografie' },\n fields: [\n {\n name: 'activeFont',\n type: 'text',\n label: { en: 'Active Font Family', cs: 'Aktivní rodina písem' },\n defaultValue: 'Inter',\n admin: {\n description: {\n en: 'The currently active font family for your website',\n cs: 'Aktuální rodina písem pro váš web',\n },\n components: {\n Field: '@kilivi/payloadcms-theme-management/globals/ThemeSettings/FontPicker',\n },\n },\n },\n {\n name: 'googleFontsApiKey',\n type: 'text',\n label: { en: 'Google Fonts API Key', cs: 'Google Fonts API klíč' },\n admin: {\n description: {\n en: \"Optional: Add your Google Fonts API key to access the full library of 1400+ fonts. Without this, you'll have access to 35 popular fonts.\",\n cs: 'Volitelné: přidejte svůj Google Fonts API klíč pro přístup k plné knihovně 1400+ písem. Bez něj máte k dispozici 35 populárních písem.',\n },\n placeholder: 'AIzaSy...',\n },\n },\n\n {\n type: 'row',\n fields: [\n {\n name: 'fontWeightHeading',\n type: 'select',\n label: 'Heading Font Weight',\n defaultValue: '700',\n options: [\n { label: '100 - Thin', value: '100' },\n { label: '200 - Extra Light', value: '200' },\n { label: '300 - Light', value: '300' },\n { label: '400 - Regular', value: '400' },\n { label: '500 - Medium', value: '500' },\n { label: '600 - Semi Bold', value: '600' },\n { label: '700 - Bold', value: '700' },\n { label: '800 - Extra Bold', value: '800' },\n { label: '900 - Black', value: '900' },\n ],\n },\n {\n name: 'fontWeightBody',\n type: 'select',\n label: 'Body Font Weight',\n defaultValue: '400',\n options: [\n { label: '100 - Thin', value: '100' },\n { label: '200 - Extra Light', value: '200' },\n { label: '300 - Light', value: '300' },\n { label: '400 - Regular', value: '400' },\n { label: '500 - Medium', value: '500' },\n { label: '600 - Semi Bold', value: '600' },\n { label: '700 - Bold', value: '700' },\n { label: '800 - Extra Bold', value: '800' },\n { label: '900 - Black', value: '900' },\n ],\n },\n ],\n },\n {\n type: 'ui',\n name: 'typographyInfo',\n admin: {\n components: {\n Field:\n '@kilivi/payloadcms-theme-management/globals/ThemeSettings/fields/TypographyInfoField',\n },\n },\n },\n ],\n },\n {\n label: { en: 'Font Loading', cs: 'Načítání písem' },\n fields: [\n {\n type: 'ui',\n name: 'fontLoadingGuide',\n admin: {\n components: {\n Field:\n '@kilivi/payloadcms-theme-management/globals/ThemeSettings/fields/FontLoadingGuideField',\n },\n },\n },\n ],\n },\n ],\n },\n ],\n}\n"],"names":["ThemeSettings","slug","label","en","cs","admin","group","access","read","update","req","user","roles","includes","fields","type","tabs","name","defaultValue","description","components","Field","placeholder","options","value"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,MAAMA,gBAA8B;IACzCC,MAAM;IACNC,OAAO;QAAEC,IAAI;QAAkBC,IAAI;IAAkB;IACrDC,OAAO;QACLC,OAAO;YAAEH,IAAI;YAAYC,IAAI;QAAY;IAC3C;IACAG,QAAQ;QACNC,MAAM,IAAM;QACZC,QAAQ,CAAC,EAAEC,GAAG,EAAE;YACd,wCAAwC;YACxC,OAAOA,IAAIC,IAAI,EAAEC,OAAOC,SAAS,YAAY;QAC/C;IACF;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;gBACJ;oBACEd,OAAO;wBAAEC,IAAI;wBAAcC,IAAI;oBAAa;oBAC5CU,QAAQ;wBACN;4BACEG,MAAM;4BACNF,MAAM;4BACNb,OAAO;gCAAEC,IAAI;gCAAsBC,IAAI;4BAAuB;4BAC9Dc,cAAc;4BACdb,OAAO;gCACLc,aAAa;oCACXhB,IAAI;oCACJC,IAAI;gCACN;gCACAgB,YAAY;oCACVC,OAAO;gCACT;4BACF;wBACF;wBACA;4BACEJ,MAAM;4BACNF,MAAM;4BACNb,OAAO;gCAAEC,IAAI;gCAAwBC,IAAI;4BAAwB;4BACjEC,OAAO;gCACLc,aAAa;oCACXhB,IAAI;oCACJC,IAAI;gCACN;gCACAkB,aAAa;4BACf;wBACF;wBAEA;4BACEP,MAAM;4BACND,QAAQ;gCACN;oCACEG,MAAM;oCACNF,MAAM;oCACNb,OAAO;oCACPgB,cAAc;oCACdK,SAAS;wCACP;4CAAErB,OAAO;4CAAcsB,OAAO;wCAAM;wCACpC;4CAAEtB,OAAO;4CAAqBsB,OAAO;wCAAM;wCAC3C;4CAAEtB,OAAO;4CAAesB,OAAO;wCAAM;wCACrC;4CAAEtB,OAAO;4CAAiBsB,OAAO;wCAAM;wCACvC;4CAAEtB,OAAO;4CAAgBsB,OAAO;wCAAM;wCACtC;4CAAEtB,OAAO;4CAAmBsB,OAAO;wCAAM;wCACzC;4CAAEtB,OAAO;4CAAcsB,OAAO;wCAAM;wCACpC;4CAAEtB,OAAO;4CAAoBsB,OAAO;wCAAM;wCAC1C;4CAAEtB,OAAO;4CAAesB,OAAO;wCAAM;qCACtC;gCACH;gCACA;oCACEP,MAAM;oCACNF,MAAM;oCACNb,OAAO;oCACPgB,cAAc;oCACdK,SAAS;wCACP;4CAAErB,OAAO;4CAAcsB,OAAO;wCAAM;wCACpC;4CAAEtB,OAAO;4CAAqBsB,OAAO;wCAAM;wCAC3C;4CAAEtB,OAAO;4CAAesB,OAAO;wCAAM;wCACrC;4CAAEtB,OAAO;4CAAiBsB,OAAO;wCAAM;wCACvC;4CAAEtB,OAAO;4CAAgBsB,OAAO;wCAAM;wCACtC;4CAAEtB,OAAO;4CAAmBsB,OAAO;wCAAM;wCACzC;4CAAEtB,OAAO;4CAAcsB,OAAO;wCAAM;wCACpC;4CAAEtB,OAAO;4CAAoBsB,OAAO;wCAAM;wCAC1C;4CAAEtB,OAAO;4CAAesB,OAAO;wCAAM;qCACtC;gCACH;6BACD;wBACH;wBACA;4BACET,MAAM;4BACNE,MAAM;4BACNZ,OAAO;gCACLe,YAAY;oCACVC,OACE;gCACJ;4BACF;wBACF;qBACD;gBACH;gBACA;oBACEnB,OAAO;wBAAEC,IAAI;wBAAgBC,IAAI;oBAAiB;oBAClDU,QAAQ;wBACN;4BACEC,MAAM;4BACNE,MAAM;4BACNZ,OAAO;gCACLe,YAAY;oCACVC,OACE;gCACJ;4BACF;wBACF;qBACD;gBACH;aACD;QACH;KACD;AACH,EAAC"}
package/dist/index.d.ts CHANGED
@@ -27,5 +27,6 @@ export { getFontLoaderCode, getThemeFontFamilies, ThemeFontProvider, useThemeFon
27
27
  export declare const ThemeManagementPlugin: (options?: ThemeManagementPluginOptions) => Plugin;
28
28
  /** @deprecated use {@link themeManagementPlugin} */
29
29
  export declare const themeConfigurationPlugin: (options?: ThemeManagementPluginOptions) => Plugin;
30
+ export { translations, getTranslations, registerTranslations, availableLanguages, } from './translations.js';
30
31
  export default themeManagementPlugin;
31
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmC,MAAM,EAAa,MAAM,SAAS,CAAA;AAGjF,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;AA6F9F,eAAO,MAAM,qBAAqB,GAAI,UAAS,4BAAiC,KAAG,MA6JlF,CAAA;AAED,KAAK,iBAAiB,GAAG,MAAM,GAAG,8BAA8B,CAAA;AAEhE,eAAO,MAAM,uBAAuB,GAClC,UAAU,iBAAiB,KAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA0EvC,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,eAAe,EAAE,MAAM,cAAc,CAAA;AACnE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtE,YAAY,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAA;AACnE,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;AAGvE,OAAO,EACL,gBAAgB,IAAI,iBAAiB,EACrC,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAEhF,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;AAMnC,eAAO,MAAM,qBAAqB,aAzSa,4BAA4B,KAAQ,MAySzB,CAAA;AAC1D,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,aA3SU,4BAA4B,KAAQ,MA2StB,CAAA;AAE7D,eAAe,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiD,MAAM,EAAa,MAAM,SAAS,CAAA;AAG/F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAqG9F,eAAO,MAAM,qBAAqB,GAAI,UAAS,4BAAiC,KAAG,MA4KlF,CAAA;AAED,KAAK,iBAAiB,GAAG,MAAM,GAAG,8BAA8B,CAAA;AAEhE,eAAO,MAAM,uBAAuB,GAClC,UAAU,iBAAiB,KAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA0EvC,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,eAAe,EAAE,MAAM,cAAc,CAAA;AACnE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtE,YAAY,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAA;AACnE,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;AAGvE,OAAO,EACL,gBAAgB,IAAI,iBAAiB,EACrC,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAEhF,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;AAMnC,eAAO,MAAM,qBAAqB,aAxTa,4BAA4B,KAAQ,MAwTzB,CAAA;AAC1D,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,aA1TU,4BAA4B,KAAQ,MA0TtB,CAAA;AAG7D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAE1B,eAAe,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { createThemeConfigurationField } from './fields/themeConfigurationField.js';
2
2
  import { allThemePresets } from './presets.js';
3
+ import { getTranslations, translations } from './translations.js';
3
4
  const THEME_FIELD_NAME = 'themeConfiguration';
4
5
  /**
5
6
  * Removes existing theme configuration from a group field (legacy)
@@ -20,9 +21,20 @@ const THEME_FIELD_NAME = 'themeConfiguration';
20
21
  /**
21
22
  * Removes existing Appearance Settings tab if it exists
22
23
  */ const removeExistingThemeTab = (tabs)=>{
24
+ const knownLabels = Object.values(translations).map((t)=>t.tabLabel);
23
25
  return tabs.filter((tab)=>{
24
- const labelEn = typeof tab.label === 'object' && tab.label !== null ? tab.label.en : tab.label;
25
- return labelEn !== '🎨 Appearance Settings' && labelEn !== 'Appearance Settings';
26
+ // Normalize label to string (support localized object or plain string)
27
+ let labelValues = [];
28
+ if (typeof tab.label === 'object' && tab.label !== null) {
29
+ labelValues = Object.values(tab.label);
30
+ } else if (typeof tab.label === 'string') {
31
+ labelValues = [
32
+ tab.label
33
+ ];
34
+ }
35
+ // If any of the label values match a known plugin tab label, remove it
36
+ const matchesKnown = labelValues.some((v)=>knownLabels.includes(v));
37
+ return !matchesKnown;
26
38
  });
27
39
  };
28
40
  /**
@@ -69,7 +81,8 @@ const THEME_FIELD_NAME = 'themeConfiguration';
69
81
  const ensureCollectionsArray = (collections)=>Array.isArray(collections) ? collections : [];
70
82
  export const themeManagementPlugin = (options = {})=>{
71
83
  return (config)=>{
72
- const { enabled = true, targetCollection = 'site-settings', useStandaloneCollection = false, standaloneCollectionSlug = 'appearance-settings', standaloneCollectionLabel = 'Appearance Settings', themePresets = allThemePresets, defaultTheme = 'cool', includeColorModeToggle = true, includeCustomCSS = true, includeBrandIdentity = false, enableAdvancedFeatures = true, enableLogging = false } = options;
84
+ const { enabled = true, targetCollection = 'site-settings', useStandaloneCollection = false, standaloneCollectionSlug = 'appearance-settings', // Allow either string or localized object; default comes from plugin translations
85
+ standaloneCollectionLabel = getTranslations().standaloneCollectionLabel, themePresets = allThemePresets, defaultTheme = 'cool', includeColorModeToggle = true, includeCustomCSS = true, includeBrandIdentity = false, enableAdvancedFeatures = true, enableLogging = false } = options;
73
86
  if (!enabled) {
74
87
  if (enableLogging) {
75
88
  console.log('🎨 Theme Management Plugin: disabled via options, skipping.');
@@ -91,9 +104,7 @@ export const themeManagementPlugin = (options = {})=>{
91
104
  }
92
105
  // Extract the fields from the tab directly (no wrapping in group)
93
106
  const tabFields = themeTab.fields ?? [];
94
- /**
95
- * Hook to auto-populate lightMode and darkMode colors when theme changes
96
- */ const beforeChangeHook = async (args)=>{
107
+ const beforeChangeHook = async (args)=>{
97
108
  const { data } = args;
98
109
  // If theme is being changed, auto-populate color modes
99
110
  if (data?.themeConfiguration?.theme) {
@@ -130,12 +141,16 @@ export const themeManagementPlugin = (options = {})=>{
130
141
  admin: {
131
142
  group: 'Settings'
132
143
  },
133
- access: {
134
- read: ()=>true,
135
- create: ({ req })=>!!req?.user,
136
- update: ({ req })=>!!req?.user,
137
- delete: ({ req })=>!!req?.user
138
- },
144
+ // Provide a broad access object but cast to GlobalConfig['access'] to satisfy types
145
+ access: (()=>{
146
+ const accessObj = {
147
+ read: ()=>true,
148
+ create: ({ req })=>!!req?.user,
149
+ update: ({ req })=>!!req?.user,
150
+ delete: ({ req })=>!!req?.user
151
+ };
152
+ return accessObj;
153
+ })(),
139
154
  fields: tabFields,
140
155
  hooks: {
141
156
  beforeChange: [
@@ -265,6 +280,8 @@ export { getFontLoaderCode, getThemeFontFamilies, ThemeFontProvider, useThemeFon
265
280
  // If needed, import directly from subpath: `@kilivi/payloadcms-theme-management/fields/ThemeLivePreview`
266
281
  export const ThemeManagementPlugin = themeManagementPlugin;
267
282
  /** @deprecated use {@link themeManagementPlugin} */ export const themeConfigurationPlugin = themeManagementPlugin;
283
+ // Export plugin translations for consumers to merge into their payload translations
284
+ export { translations, getTranslations, registerTranslations, availableLanguages } from './translations.js';
268
285
  export default themeManagementPlugin;
269
286
 
270
287
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, Plugin, TabsField } from 'payload'\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 type { FetchThemeConfigurationOptions, ThemeManagementPluginOptions } 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 return tabs.filter((tab) => {\n const labelEn =\n typeof tab.label === 'object' && tab.label !== null\n ? (tab.label as { en?: string }).en\n : tab.label\n return labelEn !== '🎨 Appearance Settings' && labelEn !== 'Appearance Settings'\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(\n '🎨 Theme Management Plugin: No tabs field found. Creating a new tabs structure.',\n )\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\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 standaloneCollectionLabel = 'Appearance Settings',\n themePresets = allThemePresets,\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 themeTab = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\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 const beforeChangeHook = async (args: any) => {\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: any = {\n slug: standaloneCollectionSlug,\n label: standaloneCollectionLabel,\n admin: {\n group: 'Settings',\n },\n access: {\n read: () => true,\n create: ({ req }: { req?: any }) => !!req?.user,\n update: ({ req }: { req?: any }) => !!req?.user,\n delete: ({ req }: { req?: any }) => !!req?.user,\n },\n fields: tabFields,\n hooks: {\n beforeChange: [beforeChangeHook],\n },\n }\n\n const globals = Array.isArray(config.globals) ? config.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 config\n }\n\n return {\n ...config,\n globals: [...globals, standaloneGlobal],\n }\n }\n\n // Otherwise, add as tab to existing collection\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 = injectThemeTab(existingFields, themeTab, 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 return {\n ...config,\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 } = 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 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 queryString = params.toString()\n const url = `/api/globals/${collectionSlug}${queryString ? `?${queryString}` : ''}`\n\n const response = await fetch(url)\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 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 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 }\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 { 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\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 } 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\nexport default themeManagementPlugin\n"],"names":["createThemeConfigurationField","allThemePresets","THEME_FIELD_NAME","removeExistingThemeField","fields","filter","field","candidate","name","findTabsField","type","removeExistingThemeTab","tabs","tab","labelEn","label","en","injectThemeTab","themeTab","enableLogging","sanitizedFields","tabsField","console","warn","newTabsField","sanitizedTabs","updatedTabs","log","updatedTabsField","map","ensureCollectionsArray","collections","Array","isArray","themeManagementPlugin","options","config","enabled","targetCollection","useStandaloneCollection","standaloneCollectionSlug","standaloneCollectionLabel","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","includeBrandIdentity","enableAdvancedFeatures","tabFields","beforeChangeHook","args","data","themeConfiguration","theme","themeName","selectedPreset","find","p","lightMode","darkMode","isLightModeEmpty","background","isDarkModeEmpty","standaloneGlobal","slug","admin","group","access","read","create","req","user","update","delete","hooks","beforeChange","globals","existingIndex","findIndex","g","collectionTouched","collection","existingFields","fetchThemeConfiguration","normalizedOptions","tenantSlug","collectionSlug","depth","locale","draft","queryParams","useGlobal","params","URLSearchParams","set","String","Object","entries","forEach","key","value","undefined","queryString","toString","url","response","fetch","ok","Error","status","json","limit","doc","docs","error","getThemePreset","preset","getAvailableThemePresets","defaultThemePresets","extendedThemePresets","allExtendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","generatePresetCSS","generateAllThemesCSS","getThemeDynamicCSS","getAllDynamicThemesCSS","ThemeProvider","getFontLoaderCode","getThemeFontFamilies","ThemeFontProvider","useThemeFonts","FONT_IMPORT_MAP","ThemeManagementPlugin","themeConfigurationPlugin"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, GlobalConfig, Plugin, TabsField } from 'payload'\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 { getTranslations, translations } from './translations.js'\nimport type { FetchThemeConfigurationOptions, ThemeManagementPluginOptions } 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(\n '🎨 Theme Management Plugin: No tabs field found. Creating a new tabs structure.',\n )\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\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 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 themeTab = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\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 },\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 },\n }\n\n const globals = Array.isArray(config.globals) ? config.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 config\n }\n\n return {\n ...config,\n globals: [...globals, standaloneGlobal],\n }\n }\n\n // Otherwise, add as tab to existing collection\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 = injectThemeTab(existingFields, themeTab, 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 return {\n ...config,\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 } = 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 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 queryString = params.toString()\n const url = `/api/globals/${collectionSlug}${queryString ? `?${queryString}` : ''}`\n\n const response = await fetch(url)\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 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 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 }\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 { 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\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 } 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} from './translations.js'\n\nexport default themeManagementPlugin\n"],"names":["createThemeConfigurationField","allThemePresets","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","themeManagementPlugin","options","config","enabled","targetCollection","useStandaloneCollection","standaloneCollectionSlug","standaloneCollectionLabel","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","includeBrandIdentity","enableAdvancedFeatures","tabFields","beforeChangeHook","args","data","themeConfiguration","theme","themeName","selectedPreset","find","p","lightMode","darkMode","isLightModeEmpty","background","isDarkModeEmpty","standaloneGlobal","slug","admin","group","access","accessObj","read","create","req","user","update","delete","hooks","beforeChange","globals","existingIndex","findIndex","g","collectionTouched","collection","existingFields","fetchThemeConfiguration","normalizedOptions","tenantSlug","collectionSlug","depth","locale","draft","queryParams","useGlobal","params","URLSearchParams","set","String","entries","forEach","key","value","undefined","queryString","toString","url","response","fetch","ok","Error","status","json","limit","doc","docs","error","getThemePreset","preset","getAvailableThemePresets","defaultThemePresets","extendedThemePresets","allExtendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","generatePresetCSS","generateAllThemesCSS","getThemeDynamicCSS","getAllDynamicThemesCSS","ThemeProvider","getFontLoaderCode","getThemeFontFamilies","ThemeFontProvider","useThemeFonts","FONT_IMPORT_MAP","ThemeManagementPlugin","themeConfigurationPlugin","registerTranslations","availableLanguages"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export type Language = string;
2
+ export interface PluginTranslations {
3
+ tabLabel: string;
4
+ standaloneCollectionLabel: string;
5
+ livePreview: {
6
+ smallTitle: string;
7
+ largeTitle: string;
8
+ };
9
+ ui: {
10
+ primaryAction: string;
11
+ secondaryAction: string;
12
+ lightMode: string;
13
+ darkMode: string;
14
+ selectFontPlaceholder: string;
15
+ usePreset: string;
16
+ specifyCustom: string;
17
+ sampleSentence: string;
18
+ };
19
+ colors: {
20
+ primary: string;
21
+ secondary: string;
22
+ accent: string;
23
+ background: string;
24
+ foreground: string;
25
+ muted: string;
26
+ card: string;
27
+ popover: string;
28
+ };
29
+ preview: {
30
+ siteTitle: string;
31
+ nav: {
32
+ home: string;
33
+ about: string;
34
+ services: string;
35
+ contact: string;
36
+ };
37
+ welcomeTitle: string;
38
+ welcomeCopy: string;
39
+ sampleCardTitle: string;
40
+ customPalette: string;
41
+ footer: string;
42
+ };
43
+ }
44
+ declare const translations: Record<Language, PluginTranslations>;
45
+ export declare function getTranslations(lang?: Language): PluginTranslations;
46
+ export declare function registerTranslations(newTranslations: Record<Language, Partial<PluginTranslations>>): void;
47
+ export declare function availableLanguages(): string[];
48
+ export { translations };
49
+ //# sourceMappingURL=translations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAE7B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,yBAAyB,EAAE,MAAM,CAAA;IACjC,WAAW,EAAE;QACX,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,EAAE,EAAE;QACF,aAAa,EAAE,MAAM,CAAA;QACrB,eAAe,EAAE,MAAM,CAAA;QACvB,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,qBAAqB,EAAE,MAAM,CAAA;QAC7B,SAAS,EAAE,MAAM,CAAA;QACjB,aAAa,EAAE,MAAM,CAAA;QACrB,cAAc,EAAE,MAAM,CAAA;KACvB,CAAA;IACD,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAA;QACjB,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAA;YACZ,KAAK,EAAE,MAAM,CAAA;YACb,QAAQ,EAAE,MAAM,CAAA;YAChB,OAAO,EAAE,MAAM,CAAA;SAChB,CAAA;QACD,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,aAAa,EAAE,MAAM,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAGD,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAuFtD,CAAA;AAoBD,wBAAgB,eAAe,CAAC,IAAI,GAAE,QAAe,GAAG,kBAAkB,CAMzE;AAED,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,QAS/D;AAED,wBAAgB,kBAAkB,aAEjC;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,121 @@
1
+ // Mutable translations object to allow runtime registration/extension
2
+ const translations = {
3
+ en: {
4
+ tabLabel: '🎨 Appearance Settings',
5
+ standaloneCollectionLabel: 'Appearance Settings',
6
+ livePreview: {
7
+ smallTitle: '🎨 Live Preview',
8
+ largeTitle: '🎨 Live Theme Preview'
9
+ },
10
+ ui: {
11
+ primaryAction: 'Primary Action',
12
+ secondaryAction: 'Secondary',
13
+ lightMode: 'Light Mode',
14
+ darkMode: 'Dark Mode',
15
+ selectFontPlaceholder: 'Select font...',
16
+ usePreset: 'Use theme preset font',
17
+ specifyCustom: 'Specify custom font below',
18
+ sampleSentence: 'The quick brown fox jumps over the lazy dog'
19
+ },
20
+ colors: {
21
+ primary: 'Primary',
22
+ secondary: 'Secondary',
23
+ accent: 'Accent',
24
+ background: 'Background',
25
+ foreground: 'Foreground',
26
+ muted: 'Muted',
27
+ card: 'Card',
28
+ popover: 'Popover'
29
+ },
30
+ preview: {
31
+ siteTitle: 'Your Website',
32
+ nav: {
33
+ home: 'Home',
34
+ about: 'About',
35
+ services: 'Services',
36
+ contact: 'Contact'
37
+ },
38
+ welcomeTitle: 'Welcome to Your Site',
39
+ welcomeCopy: 'This is how your content will look with the selected theme. The colors and styling will be applied across your entire website.',
40
+ sampleCardTitle: 'Sample Card',
41
+ customPalette: 'Custom palette',
42
+ footer: '© 2025 Your Website. Powered by PayloadCMS.'
43
+ }
44
+ },
45
+ cs: {
46
+ tabLabel: '🎨 Nastavení vzhledu',
47
+ standaloneCollectionLabel: 'Nastavení vzhledu',
48
+ livePreview: {
49
+ smallTitle: '🎨 Náhled',
50
+ largeTitle: '🎨 Náhled motivu'
51
+ },
52
+ ui: {
53
+ primaryAction: 'Primární akce',
54
+ secondaryAction: 'Sekundární',
55
+ lightMode: 'Světlý režim',
56
+ darkMode: 'Tmavý režim',
57
+ selectFontPlaceholder: 'Vyberte písmo...',
58
+ usePreset: 'Použít písmo motivu',
59
+ specifyCustom: 'Zadejte vlastní písmo níže',
60
+ sampleSentence: 'Rychlá hnědá liška přeskočila líného psa'
61
+ },
62
+ colors: {
63
+ primary: 'Primární',
64
+ secondary: 'Sekundární',
65
+ accent: 'Akcent',
66
+ background: 'Pozadí',
67
+ foreground: 'Popředí',
68
+ muted: 'Ztlumený',
69
+ card: 'Karta',
70
+ popover: 'Popover'
71
+ },
72
+ preview: {
73
+ siteTitle: 'Váš web',
74
+ nav: {
75
+ home: 'Domů',
76
+ about: 'O nás',
77
+ services: 'Služby',
78
+ contact: 'Kontakt'
79
+ },
80
+ welcomeTitle: 'Vítejte na svém webu',
81
+ welcomeCopy: 'Takto bude vypadat váš obsah s vybraným motivem. Barvy a stylování budou aplikovány na celý web.',
82
+ sampleCardTitle: 'Ukázková karta',
83
+ customPalette: 'Vlastní paleta',
84
+ footer: '© 2025 Váš web. Poháněno PayloadCMS.'
85
+ }
86
+ }
87
+ };
88
+ function deepMerge(base, partial) {
89
+ const out = {
90
+ ...base
91
+ };
92
+ for (const key of Object.keys(partial)){
93
+ const val = partial[key];
94
+ if (val && typeof val === 'object' && !Array.isArray(val)) {
95
+ const baseVal = base[key];
96
+ out[key] = deepMerge(baseVal ?? {}, val);
97
+ } else {
98
+ out[key] = val;
99
+ }
100
+ }
101
+ return out;
102
+ }
103
+ export function getTranslations(lang = 'en') {
104
+ // Always merge with English defaults so missing keys fall back
105
+ const en = translations['en'];
106
+ if (!lang || lang === 'en') return en;
107
+ const localized = translations[lang] || {};
108
+ return deepMerge(en, localized);
109
+ }
110
+ export function registerTranslations(newTranslations) {
111
+ for (const lang of Object.keys(newTranslations)){
112
+ const existing = translations[lang] || {};
113
+ translations[lang] = deepMerge(existing, newTranslations[lang]);
114
+ }
115
+ }
116
+ export function availableLanguages() {
117
+ return Object.keys(translations);
118
+ }
119
+ export { translations };
120
+
121
+ //# sourceMappingURL=translations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/translations.ts"],"sourcesContent":["export type Language = string\n\nexport interface PluginTranslations {\n tabLabel: string\n standaloneCollectionLabel: string\n livePreview: {\n smallTitle: string\n largeTitle: string\n }\n ui: {\n primaryAction: string\n secondaryAction: string\n lightMode: string\n darkMode: string\n selectFontPlaceholder: string\n usePreset: string\n specifyCustom: string\n sampleSentence: string\n }\n colors: {\n primary: string\n secondary: string\n accent: string\n background: string\n foreground: string\n muted: string\n card: string\n popover: string\n }\n preview: {\n siteTitle: string\n nav: {\n home: string\n about: string\n services: string\n contact: string\n }\n welcomeTitle: string\n welcomeCopy: string\n sampleCardTitle: string\n customPalette: string\n footer: string\n }\n}\n\n// Mutable translations object to allow runtime registration/extension\nconst translations: Record<Language, PluginTranslations> = {\n en: {\n tabLabel: '🎨 Appearance Settings',\n standaloneCollectionLabel: 'Appearance Settings',\n livePreview: {\n smallTitle: '🎨 Live Preview',\n largeTitle: '🎨 Live Theme Preview',\n },\n ui: {\n primaryAction: 'Primary Action',\n secondaryAction: 'Secondary',\n lightMode: 'Light Mode',\n darkMode: 'Dark Mode',\n selectFontPlaceholder: 'Select font...',\n usePreset: 'Use theme preset font',\n specifyCustom: 'Specify custom font below',\n sampleSentence: 'The quick brown fox jumps over the lazy dog',\n },\n colors: {\n primary: 'Primary',\n secondary: 'Secondary',\n accent: 'Accent',\n background: 'Background',\n foreground: 'Foreground',\n muted: 'Muted',\n card: 'Card',\n popover: 'Popover',\n },\n preview: {\n siteTitle: 'Your Website',\n nav: {\n home: 'Home',\n about: 'About',\n services: 'Services',\n contact: 'Contact',\n },\n welcomeTitle: 'Welcome to Your Site',\n welcomeCopy:\n 'This is how your content will look with the selected theme. The colors and styling will be applied across your entire website.',\n sampleCardTitle: 'Sample Card',\n customPalette: 'Custom palette',\n footer: '© 2025 Your Website. Powered by PayloadCMS.',\n },\n },\n cs: {\n tabLabel: '🎨 Nastavení vzhledu',\n standaloneCollectionLabel: 'Nastavení vzhledu',\n livePreview: {\n smallTitle: '🎨 Náhled',\n largeTitle: '🎨 Náhled motivu',\n },\n ui: {\n primaryAction: 'Primární akce',\n secondaryAction: 'Sekundární',\n lightMode: 'Světlý režim',\n darkMode: 'Tmavý režim',\n selectFontPlaceholder: 'Vyberte písmo...',\n usePreset: 'Použít písmo motivu',\n specifyCustom: 'Zadejte vlastní písmo níže',\n sampleSentence: 'Rychlá hnědá liška přeskočila líného psa',\n },\n colors: {\n primary: 'Primární',\n secondary: 'Sekundární',\n accent: 'Akcent',\n background: 'Pozadí',\n foreground: 'Popředí',\n muted: 'Ztlumený',\n card: 'Karta',\n popover: 'Popover',\n },\n preview: {\n siteTitle: 'Váš web',\n nav: {\n home: 'Domů',\n about: 'O nás',\n services: 'Služby',\n contact: 'Kontakt',\n },\n welcomeTitle: 'Vítejte na svém webu',\n welcomeCopy:\n 'Takto bude vypadat váš obsah s vybraným motivem. Barvy a stylování budou aplikovány na celý web.',\n sampleCardTitle: 'Ukázková karta',\n customPalette: 'Vlastní paleta',\n footer: '© 2025 Váš web. Poháněno PayloadCMS.',\n },\n },\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]\n}\n\nfunction deepMerge<T extends object>(base: T, partial: DeepPartial<T>): T {\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) }\n for (const key of Object.keys(partial)) {\n const val = (partial as Record<string, unknown>)[key]\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n const baseVal = (base as Record<string, unknown>)[key] as Record<string, unknown> | undefined\n out[key] = deepMerge(baseVal ?? {}, val as DeepPartial<Record<string, unknown>>) as unknown\n } else {\n out[key] = val\n }\n }\n return out as T\n}\n\nexport function getTranslations(lang: Language = 'en'): PluginTranslations {\n // Always merge with English defaults so missing keys fall back\n const en = translations['en']\n if (!lang || lang === 'en') return en\n const localized = (translations[lang] as Partial<PluginTranslations>) || {}\n return deepMerge(en, localized as DeepPartial<PluginTranslations>)\n}\n\nexport function registerTranslations(\n newTranslations: Record<Language, Partial<PluginTranslations>>,\n) {\n for (const lang of Object.keys(newTranslations)) {\n const existing = (translations[lang] as PluginTranslations) || ({} as PluginTranslations)\n translations[lang] = deepMerge(\n existing,\n newTranslations[lang] as DeepPartial<PluginTranslations>,\n )\n }\n}\n\nexport function availableLanguages() {\n return Object.keys(translations)\n}\n\nexport { translations }\n"],"names":["translations","en","tabLabel","standaloneCollectionLabel","livePreview","smallTitle","largeTitle","ui","primaryAction","secondaryAction","lightMode","darkMode","selectFontPlaceholder","usePreset","specifyCustom","sampleSentence","colors","primary","secondary","accent","background","foreground","muted","card","popover","preview","siteTitle","nav","home","about","services","contact","welcomeTitle","welcomeCopy","sampleCardTitle","customPalette","footer","cs","deepMerge","base","partial","out","key","Object","keys","val","Array","isArray","baseVal","getTranslations","lang","localized","registerTranslations","newTranslations","existing","availableLanguages"],"mappings":"AA6CA,sEAAsE;AACtE,MAAMA,eAAqD;IACzDC,IAAI;QACFC,UAAU;QACVC,2BAA2B;QAC3BC,aAAa;YACXC,YAAY;YACZC,YAAY;QACd;QACAC,IAAI;YACFC,eAAe;YACfC,iBAAiB;YACjBC,WAAW;YACXC,UAAU;YACVC,uBAAuB;YACvBC,WAAW;YACXC,eAAe;YACfC,gBAAgB;QAClB;QACAC,QAAQ;YACNC,SAAS;YACTC,WAAW;YACXC,QAAQ;YACRC,YAAY;YACZC,YAAY;YACZC,OAAO;YACPC,MAAM;YACNC,SAAS;QACX;QACAC,SAAS;YACPC,WAAW;YACXC,KAAK;gBACHC,MAAM;gBACNC,OAAO;gBACPC,UAAU;gBACVC,SAAS;YACX;YACAC,cAAc;YACdC,aACE;YACFC,iBAAiB;YACjBC,eAAe;YACfC,QAAQ;QACV;IACF;IACAC,IAAI;QACFnC,UAAU;QACVC,2BAA2B;QAC3BC,aAAa;YACXC,YAAY;YACZC,YAAY;QACd;QACAC,IAAI;YACFC,eAAe;YACfC,iBAAiB;YACjBC,WAAW;YACXC,UAAU;YACVC,uBAAuB;YACvBC,WAAW;YACXC,eAAe;YACfC,gBAAgB;QAClB;QACAC,QAAQ;YACNC,SAAS;YACTC,WAAW;YACXC,QAAQ;YACRC,YAAY;YACZC,YAAY;YACZC,OAAO;YACPC,MAAM;YACNC,SAAS;QACX;QACAC,SAAS;YACPC,WAAW;YACXC,KAAK;gBACHC,MAAM;gBACNC,OAAO;gBACPC,UAAU;gBACVC,SAAS;YACX;YACAC,cAAc;YACdC,aACE;YACFC,iBAAiB;YACjBC,eAAe;YACfC,QAAQ;QACV;IACF;AACF;AAMA,SAASE,UAA4BC,IAAO,EAAEC,OAAuB;IACnE,MAAMC,MAA+B;QAAE,GAAIF,IAAI;IAA6B;IAC5E,KAAK,MAAMG,OAAOC,OAAOC,IAAI,CAACJ,SAAU;QACtC,MAAMK,MAAM,AAACL,OAAmC,CAACE,IAAI;QACrD,IAAIG,OAAO,OAAOA,QAAQ,YAAY,CAACC,MAAMC,OAAO,CAACF,MAAM;YACzD,MAAMG,UAAU,AAACT,IAAgC,CAACG,IAAI;YACtDD,GAAG,CAACC,IAAI,GAAGJ,UAAUU,WAAW,CAAC,GAAGH;QACtC,OAAO;YACLJ,GAAG,CAACC,IAAI,GAAGG;QACb;IACF;IACA,OAAOJ;AACT;AAEA,OAAO,SAASQ,gBAAgBC,OAAiB,IAAI;IACnD,+DAA+D;IAC/D,MAAMjD,KAAKD,YAAY,CAAC,KAAK;IAC7B,IAAI,CAACkD,QAAQA,SAAS,MAAM,OAAOjD;IACnC,MAAMkD,YAAY,AAACnD,YAAY,CAACkD,KAAK,IAAoC,CAAC;IAC1E,OAAOZ,UAAUrC,IAAIkD;AACvB;AAEA,OAAO,SAASC,qBACdC,eAA8D;IAE9D,KAAK,MAAMH,QAAQP,OAAOC,IAAI,CAACS,iBAAkB;QAC/C,MAAMC,WAAW,AAACtD,YAAY,CAACkD,KAAK,IAA4B,CAAC;QACjElD,YAAY,CAACkD,KAAK,GAAGZ,UACnBgB,UACAD,eAAe,CAACH,KAAK;IAEzB;AACF;AAEA,OAAO,SAASK;IACd,OAAOZ,OAAOC,IAAI,CAAC5C;AACrB;AAEA,SAASA,YAAY,GAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"getThemeSettings.d.ts","sourceRoot":"","sources":["../../src/utilities/getThemeSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA2B3F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAmB,GAAG,MAAM,CAI/F;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,0GASrB,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,IAAI,eAAe,CAEnF"}
1
+ {"version":3,"file":"getThemeSettings.d.ts","sourceRoot":"","sources":["../../src/utilities/getThemeSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiC3F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAmB,GAAG,MAAM,CAI/F;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,0GASrB,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,IAAI,eAAe,CAEnF"}
@@ -10,8 +10,14 @@
10
10
  if (!payload) {
11
11
  // If no payload instance provided, try to get it from the global scope
12
12
  // This is useful in server components where payload might be available globally
13
- if (typeof window === 'undefined' && global.payload) {
14
- payload = global.payload;
13
+ if (typeof window === 'undefined') {
14
+ const g = global;
15
+ if (g.payload) {
16
+ payload = g.payload;
17
+ } else {
18
+ console.warn('getThemeSettings: No payload instance available');
19
+ return null;
20
+ }
15
21
  } else {
16
22
  console.warn('getThemeSettings: No payload instance available');
17
23
  return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getThemeSettings.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nexport interface ThemeSettingsData {\n activeFont: string\n googleFontsApiKey?: string\n fontWeightHeading: string\n fontWeightBody: string\n}\n\n/**\n * Get theme settings from Payload CMS\n *\n * This helper fetches the ThemeSettings global and returns\n * the typography configuration.\n *\n * @param payload - Payload instance\n * @returns Theme settings data\n */\nexport async function getThemeSettings(payload?: Payload): Promise<ThemeSettingsData | null> {\n if (!payload) {\n // If no payload instance provided, try to get it from the global scope\n // This is useful in server components where payload might be available globally\n if (typeof window === 'undefined' && (global as any).payload) {\n payload = (global as any).payload\n } else {\n console.warn('getThemeSettings: No payload instance available')\n return null\n }\n }\n\n try {\n const themeSettings = await payload!.findGlobal({\n slug: 'themeSettings',\n })\n\n return {\n activeFont: themeSettings.activeFont || 'Inter',\n googleFontsApiKey: themeSettings.googleFontsApiKey,\n fontWeightHeading: themeSettings.fontWeightHeading || '700',\n fontWeightBody: themeSettings.fontWeightBody || '400',\n }\n } catch (error) {\n console.error('Error fetching theme settings:', error)\n return null\n }\n}\n\n/**\n * Generate Google Fonts CSS URL\n *\n * @param fontFamily - Font family name\n * @param weights - Array of font weights\n * @returns Google Fonts CSS URL\n */\nexport function getGoogleFontUrl(fontFamily: string, weights: string[] = ['400', '700']): string {\n const family = fontFamily.replace(/\\s+/g, '+')\n const weightsStr = weights.join(';')\n return `https://fonts.googleapis.com/css2?family=${family}:wght@${weightsStr}&display=swap`\n}\n\n/**\n * Check if a font is pre-imported via next/font/google\n *\n * These fonts are optimized and don't require runtime loading\n */\nexport const PRE_IMPORTED_FONTS = [\n 'Inter',\n 'Nunito',\n 'Montserrat',\n 'Manrope',\n 'Mulish',\n 'Barlow',\n 'Raleway',\n 'Playfair Display',\n] as const\n\nexport type PreImportedFont = (typeof PRE_IMPORTED_FONTS)[number]\n\nexport function isPreImportedFont(fontFamily: string): fontFamily is PreImportedFont {\n return (PRE_IMPORTED_FONTS as readonly string[]).includes(fontFamily)\n}\n"],"names":["getThemeSettings","payload","window","global","console","warn","themeSettings","findGlobal","slug","activeFont","googleFontsApiKey","fontWeightHeading","fontWeightBody","error","getGoogleFontUrl","fontFamily","weights","family","replace","weightsStr","join","PRE_IMPORTED_FONTS","isPreImportedFont","includes"],"mappings":"AASA;;;;;;;;CAQC,GACD,OAAO,eAAeA,iBAAiBC,OAAiB;IACtD,IAAI,CAACA,SAAS;QACZ,uEAAuE;QACvE,gFAAgF;QAChF,IAAI,OAAOC,WAAW,eAAe,AAACC,OAAeF,OAAO,EAAE;YAC5DA,UAAU,AAACE,OAAeF,OAAO;QACnC,OAAO;YACLG,QAAQC,IAAI,CAAC;YACb,OAAO;QACT;IACF;IAEA,IAAI;QACF,MAAMC,gBAAgB,MAAML,QAASM,UAAU,CAAC;YAC9CC,MAAM;QACR;QAEA,OAAO;YACLC,YAAYH,cAAcG,UAAU,IAAI;YACxCC,mBAAmBJ,cAAcI,iBAAiB;YAClDC,mBAAmBL,cAAcK,iBAAiB,IAAI;YACtDC,gBAAgBN,cAAcM,cAAc,IAAI;QAClD;IACF,EAAE,OAAOC,OAAO;QACdT,QAAQS,KAAK,CAAC,kCAAkCA;QAChD,OAAO;IACT;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,iBAAiBC,UAAkB,EAAEC,UAAoB;IAAC;IAAO;CAAM;IACrF,MAAMC,SAASF,WAAWG,OAAO,CAAC,QAAQ;IAC1C,MAAMC,aAAaH,QAAQI,IAAI,CAAC;IAChC,OAAO,CAAC,yCAAyC,EAAEH,OAAO,MAAM,EAAEE,WAAW,aAAa,CAAC;AAC7F;AAEA;;;;CAIC,GACD,OAAO,MAAME,qBAAqB;IAChC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAS;AAIV,OAAO,SAASC,kBAAkBP,UAAkB;IAClD,OAAO,AAACM,mBAAyCE,QAAQ,CAACR;AAC5D"}
1
+ {"version":3,"sources":["../../src/utilities/getThemeSettings.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nexport interface ThemeSettingsData {\n activeFont: string\n googleFontsApiKey?: string\n fontWeightHeading: string\n fontWeightBody: string\n}\n\n/**\n * Get theme settings from Payload CMS\n *\n * This helper fetches the ThemeSettings global and returns\n * the typography configuration.\n *\n * @param payload - Payload instance\n * @returns Theme settings data\n */\nexport async function getThemeSettings(payload?: Payload): Promise<ThemeSettingsData | null> {\n if (!payload) {\n // If no payload instance provided, try to get it from the global scope\n // This is useful in server components where payload might be available globally\n if (typeof window === 'undefined') {\n const g = global as unknown as { payload?: Payload }\n if (g.payload) {\n payload = g.payload\n } else {\n console.warn('getThemeSettings: No payload instance available')\n return null\n }\n } else {\n console.warn('getThemeSettings: No payload instance available')\n return null\n }\n }\n\n try {\n const themeSettings = await payload!.findGlobal({\n slug: 'themeSettings',\n })\n\n return {\n activeFont: themeSettings.activeFont || 'Inter',\n googleFontsApiKey: themeSettings.googleFontsApiKey,\n fontWeightHeading: themeSettings.fontWeightHeading || '700',\n fontWeightBody: themeSettings.fontWeightBody || '400',\n }\n } catch (error) {\n console.error('Error fetching theme settings:', error)\n return null\n }\n}\n\n/**\n * Generate Google Fonts CSS URL\n *\n * @param fontFamily - Font family name\n * @param weights - Array of font weights\n * @returns Google Fonts CSS URL\n */\nexport function getGoogleFontUrl(fontFamily: string, weights: string[] = ['400', '700']): string {\n const family = fontFamily.replace(/\\s+/g, '+')\n const weightsStr = weights.join(';')\n return `https://fonts.googleapis.com/css2?family=${family}:wght@${weightsStr}&display=swap`\n}\n\n/**\n * Check if a font is pre-imported via next/font/google\n *\n * These fonts are optimized and don't require runtime loading\n */\nexport const PRE_IMPORTED_FONTS = [\n 'Inter',\n 'Nunito',\n 'Montserrat',\n 'Manrope',\n 'Mulish',\n 'Barlow',\n 'Raleway',\n 'Playfair Display',\n] as const\n\nexport type PreImportedFont = (typeof PRE_IMPORTED_FONTS)[number]\n\nexport function isPreImportedFont(fontFamily: string): fontFamily is PreImportedFont {\n return (PRE_IMPORTED_FONTS as readonly string[]).includes(fontFamily)\n}\n"],"names":["getThemeSettings","payload","window","g","global","console","warn","themeSettings","findGlobal","slug","activeFont","googleFontsApiKey","fontWeightHeading","fontWeightBody","error","getGoogleFontUrl","fontFamily","weights","family","replace","weightsStr","join","PRE_IMPORTED_FONTS","isPreImportedFont","includes"],"mappings":"AASA;;;;;;;;CAQC,GACD,OAAO,eAAeA,iBAAiBC,OAAiB;IACtD,IAAI,CAACA,SAAS;QACZ,uEAAuE;QACvE,gFAAgF;QAChF,IAAI,OAAOC,WAAW,aAAa;YACjC,MAAMC,IAAIC;YACV,IAAID,EAAEF,OAAO,EAAE;gBACbA,UAAUE,EAAEF,OAAO;YACrB,OAAO;gBACLI,QAAQC,IAAI,CAAC;gBACb,OAAO;YACT;QACF,OAAO;YACLD,QAAQC,IAAI,CAAC;YACb,OAAO;QACT;IACF;IAEA,IAAI;QACF,MAAMC,gBAAgB,MAAMN,QAASO,UAAU,CAAC;YAC9CC,MAAM;QACR;QAEA,OAAO;YACLC,YAAYH,cAAcG,UAAU,IAAI;YACxCC,mBAAmBJ,cAAcI,iBAAiB;YAClDC,mBAAmBL,cAAcK,iBAAiB,IAAI;YACtDC,gBAAgBN,cAAcM,cAAc,IAAI;QAClD;IACF,EAAE,OAAOC,OAAO;QACdT,QAAQS,KAAK,CAAC,kCAAkCA;QAChD,OAAO;IACT;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,iBAAiBC,UAAkB,EAAEC,UAAoB;IAAC;IAAO;CAAM;IACrF,MAAMC,SAASF,WAAWG,OAAO,CAAC,QAAQ;IAC1C,MAAMC,aAAaH,QAAQI,IAAI,CAAC;IAChC,OAAO,CAAC,yCAAyC,EAAEH,OAAO,MAAM,EAAEE,WAAW,aAAa,CAAC;AAC7F;AAEA;;;;CAIC,GACD,OAAO,MAAME,qBAAqB;IAChC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAS;AAIV,OAAO,SAASC,kBAAkBP,UAAkB;IAClD,OAAO,AAACM,mBAAyCE,QAAQ,CAACR;AAC5D"}
@@ -0,0 +1,2 @@
1
+ export declare function getAdminLanguage(): string;
2
+ //# sourceMappingURL=getAdminLanguage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAdminLanguage.d.ts","sourceRoot":"","sources":["../../src/utils/getAdminLanguage.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,IAAI,MAAM,CAyBzC"}
@@ -0,0 +1,21 @@
1
+ export function getAdminLanguage() {
2
+ // Prefer explicit lang attribute on document root (admin UI typically sets it)
3
+ if (typeof document !== 'undefined') {
4
+ const htmlLang = document.documentElement?.lang;
5
+ if (htmlLang && htmlLang.length >= 2) return htmlLang.split('-')[0];
6
+ }
7
+ // Fallback to navigator.language if available
8
+ if (typeof navigator !== 'undefined') {
9
+ if ('language' in navigator && typeof navigator.language === 'string' && navigator.language.length >= 2) {
10
+ return navigator.language.split('-')[0];
11
+ }
12
+ const maybeUserLang = navigator;
13
+ if (typeof maybeUserLang.userLanguage === 'string' && maybeUserLang.userLanguage.length >= 2) {
14
+ return maybeUserLang.userLanguage.split('-')[0];
15
+ }
16
+ }
17
+ // Default to English
18
+ return 'en';
19
+ }
20
+
21
+ //# sourceMappingURL=getAdminLanguage.js.map