@kilivi/payloadcms-theme-management 1.0.2 → 1.0.4
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.
- package/README.md +4 -0
- package/dist/components/ThemePreview.d.ts.map +1 -1
- package/dist/components/ThemePreview.js +15 -12
- package/dist/components/ThemePreview.js.map +1 -1
- package/dist/constants/themeFonts.d.ts +68 -17
- package/dist/constants/themeFonts.d.ts.map +1 -1
- package/dist/constants/themeFonts.js +68 -17
- package/dist/constants/themeFonts.js.map +1 -1
- package/dist/fields/FontSelectField.d.ts.map +1 -1
- package/dist/fields/FontSelectField.js +44 -7
- package/dist/fields/FontSelectField.js.map +1 -1
- package/dist/fields/ThemePreviewField.d.ts.map +1 -1
- package/dist/fields/ThemePreviewField.js +35 -29
- package/dist/fields/ThemePreviewField.js.map +1 -1
- package/dist/fields/ThemeTokenSelectField.d.ts.map +1 -1
- package/dist/fields/ThemeTokenSelectField.js +0 -1
- package/dist/fields/ThemeTokenSelectField.js.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/FontPreview.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/FontPreview.js +7 -4
- package/dist/globals/ThemeSettings/FontPicker/FontPreview.js.map +1 -1
- package/dist/globals/ThemeSettings/config.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/config.js +32 -8
- package/dist/globals/ThemeSettings/config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/font-loader.d.ts +1 -1
- package/dist/providers/font-loader.d.ts.map +1 -1
- package/dist/providers/font-loader.js.map +1 -1
- package/dist/translations.d.ts +49 -0
- package/dist/translations.d.ts.map +1 -0
- package/dist/translations.js +121 -0
- package/dist/translations.js.map +1 -0
- package/dist/types/jest-axe.d.js +2 -0
- package/dist/types/jest-axe.d.js.map +1 -0
- package/dist/types/payload-ui.d.js +2 -0
- package/dist/types/payload-ui.d.js.map +1 -0
- package/dist/utilities/getThemeSettings.d.ts.map +1 -1
- package/dist/utilities/getThemeSettings.js +8 -2
- package/dist/utilities/getThemeSettings.js.map +1 -1
- package/dist/utils/getAdminLanguage.d.ts +2 -0
- package/dist/utils/getAdminLanguage.d.ts.map +1 -0
- package/dist/utils/getAdminLanguage.js +21 -0
- package/dist/utils/getAdminLanguage.js.map +1 -0
- package/package.json +22 -4
|
@@ -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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/types/jest-axe.d.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/types/payload-ui.d.ts"],"names":[],"mappings":""}
|
|
@@ -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,
|
|
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'
|
|
14
|
-
|
|
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'
|
|
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 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/getAdminLanguage.ts"],"sourcesContent":["export function getAdminLanguage(): string {\n // Prefer explicit lang attribute on document root (admin UI typically sets it)\n if (typeof document !== 'undefined') {\n const htmlLang = document.documentElement?.lang\n if (htmlLang && htmlLang.length >= 2) return htmlLang.split('-')[0]\n }\n\n // Fallback to navigator.language if available\n if (typeof navigator !== 'undefined') {\n if (\n 'language' in navigator &&\n typeof navigator.language === 'string' &&\n navigator.language.length >= 2\n ) {\n return navigator.language.split('-')[0]\n }\n\n const maybeUserLang = navigator as unknown as { userLanguage?: string }\n if (typeof maybeUserLang.userLanguage === 'string' && maybeUserLang.userLanguage.length >= 2) {\n return maybeUserLang.userLanguage.split('-')[0]\n }\n }\n\n // Default to English\n return 'en'\n}\n"],"names":["getAdminLanguage","document","htmlLang","documentElement","lang","length","split","navigator","language","maybeUserLang","userLanguage"],"mappings":"AAAA,OAAO,SAASA;IACd,+EAA+E;IAC/E,IAAI,OAAOC,aAAa,aAAa;QACnC,MAAMC,WAAWD,SAASE,eAAe,EAAEC;QAC3C,IAAIF,YAAYA,SAASG,MAAM,IAAI,GAAG,OAAOH,SAASI,KAAK,CAAC,IAAI,CAAC,EAAE;IACrE;IAEA,8CAA8C;IAC9C,IAAI,OAAOC,cAAc,aAAa;QACpC,IACE,cAAcA,aACd,OAAOA,UAAUC,QAAQ,KAAK,YAC9BD,UAAUC,QAAQ,CAACH,MAAM,IAAI,GAC7B;YACA,OAAOE,UAAUC,QAAQ,CAACF,KAAK,CAAC,IAAI,CAAC,EAAE;QACzC;QAEA,MAAMG,gBAAgBF;QACtB,IAAI,OAAOE,cAAcC,YAAY,KAAK,YAAYD,cAAcC,YAAY,CAACL,MAAM,IAAI,GAAG;YAC5F,OAAOI,cAAcC,YAAY,CAACJ,KAAK,CAAC,IAAI,CAAC,EAAE;QACjD;IACF;IAEA,qBAAqB;IACrB,OAAO;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kilivi/payloadcms-theme-management",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Theme configuration plugin for Payload CMS v3 with 60+ professional themes and standalone collection support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -52,6 +52,18 @@
|
|
|
52
52
|
],
|
|
53
53
|
"author": "Kilián Vít",
|
|
54
54
|
"license": "MIT",
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "https://github.com/your-org/payload-plugins.git",
|
|
58
|
+
"directory": "packages/theme-management"
|
|
59
|
+
},
|
|
60
|
+
"bugs": {
|
|
61
|
+
"url": "https://github.com/your-org/payload-plugins/issues"
|
|
62
|
+
},
|
|
63
|
+
"homepage": "https://github.com/your-org/payload-plugins/packages/theme-management#readme",
|
|
64
|
+
"engines": {
|
|
65
|
+
"node": ">=18.20.0"
|
|
66
|
+
},
|
|
55
67
|
"peerDependencies": {
|
|
56
68
|
"payload": "^3.0.0",
|
|
57
69
|
"@payloadcms/ui": "^3.0.0",
|
|
@@ -69,7 +81,7 @@
|
|
|
69
81
|
"@testing-library/user-event": "^14.5.2",
|
|
70
82
|
"@types/jest": "^30.0.0",
|
|
71
83
|
"@types/node": "^22.0.0",
|
|
72
|
-
"@types/react": "^
|
|
84
|
+
"@types/react": "^19.2.1",
|
|
73
85
|
"@vitejs/plugin-react": "^5.0.4",
|
|
74
86
|
"@vitest/browser": "^3.2.4",
|
|
75
87
|
"@vitest/ui": "^3.2.4",
|
|
@@ -89,7 +101,12 @@
|
|
|
89
101
|
"typescript": "^5.5.3",
|
|
90
102
|
"vite-plugin-commonjs": "^0.10.4",
|
|
91
103
|
"vite-plugin-static-copy": "^3.1.3",
|
|
92
|
-
"vitest": "^3.2.4"
|
|
104
|
+
"vitest": "^3.2.4",
|
|
105
|
+
"standard-version": "^9.5.0",
|
|
106
|
+
"@commitlint/cli": "^20.2.0",
|
|
107
|
+
"@commitlint/config-conventional": "^20.2.0",
|
|
108
|
+
"husky": "^9.1.7",
|
|
109
|
+
"jest-axe": "^10.0.0"
|
|
93
110
|
},
|
|
94
111
|
"publishConfig": {
|
|
95
112
|
"access": "public"
|
|
@@ -116,6 +133,7 @@
|
|
|
116
133
|
"test:coverage:jest": "jest --coverage",
|
|
117
134
|
"test:e2e": "playwright test",
|
|
118
135
|
"lint": "eslint src",
|
|
119
|
-
"lint:fix": "eslint --fix --ext .ts,.tsx src"
|
|
136
|
+
"lint:fix": "eslint --fix --ext .ts,.tsx src",
|
|
137
|
+
"release": "standard-version"
|
|
120
138
|
}
|
|
121
139
|
}
|