@kilivi/payloadcms-theme-management 0.1.19 → 0.2.2
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 +21 -1
- package/dist/fields/extendedThemeFields.d.ts +26 -0
- package/dist/fields/extendedThemeFields.d.ts.map +1 -0
- package/dist/fields/extendedThemeFields.js +290 -0
- package/dist/fields/extendedThemeFields.js.map +1 -0
- package/dist/fields/themeConfigurationField.d.ts +14 -3
- package/dist/fields/themeConfigurationField.d.ts.map +1 -1
- package/dist/fields/themeConfigurationField.js +36 -10
- package/dist/fields/themeConfigurationField.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +53 -13
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -2,13 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
A comprehensive theme management plugin for Payload CMS v3 that provides powerful theming capabilities with SSR support, preventing FOUC (Flash of Unstyled Content).
|
|
4
4
|
|
|
5
|
+
## 🎉 Version 0.2.0 - New Features!
|
|
6
|
+
|
|
7
|
+
- **✅ Tabs Structure** - Plugin now creates a "Nastavení vzhledu" (Appearance Settings) tab
|
|
8
|
+
- **✅ Extended Theme Support** - OKLCH color format with 19+ semantic tokens
|
|
9
|
+
- **✅ shadcn/ui Compatible** - Works with https://ui.shadcn.com/themes
|
|
10
|
+
- **✅ TweakCN Compatible** - Works with https://tweakcn.com/editor/theme
|
|
11
|
+
- **✅ Chart Colors** - 5 customizable colors for data visualization
|
|
12
|
+
|
|
5
13
|
## Features
|
|
6
14
|
|
|
7
15
|
- 🎨 **Multiple Theme Presets** - Cool, Brutal, Neon, Solar, and more
|
|
8
|
-
- 🎨 **
|
|
16
|
+
- 🎨 **Extended Themes** - OKLCH-based themes with full shadcn/ui token support
|
|
17
|
+
- 🎨 **Custom Color Palette** - Full HSL color customization (19+ semantic tokens)
|
|
9
18
|
- 🔤 **Typography Control** - Google Fonts integration for headings, body, and code
|
|
10
19
|
- 📐 **Border Radius Presets** - Sharp, Rounded, or Pill styles
|
|
11
20
|
- 🌓 **Dark Mode Support** - Built-in light/dark/system mode toggle
|
|
21
|
+
- 📊 **Chart Colors** - Data visualization color palette
|
|
12
22
|
- 🚀 **SSR Theme Injection** - Zero FOUC with server-side rendering
|
|
13
23
|
- ⚡ **Performance Optimized** - Critical CSS inlining, preload links
|
|
14
24
|
- 🎯 **Type Safe** - Full TypeScript support
|
|
@@ -371,6 +381,16 @@ Contributions are welcome! Please:
|
|
|
371
381
|
4. Add tests if applicable
|
|
372
382
|
5. Submit a pull request
|
|
373
383
|
|
|
384
|
+
## Troubleshooting
|
|
385
|
+
|
|
386
|
+
### Common Issues
|
|
387
|
+
|
|
388
|
+
**Error: "right-hand side of 'in' should be an object, got undefined"**
|
|
389
|
+
|
|
390
|
+
This is a known Payload CMS issue related to user preferences. See [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) for solutions.
|
|
391
|
+
|
|
392
|
+
**Quick Fix:** Go to `/admin/account` and click "Reset Preferences" at the bottom of the page.
|
|
393
|
+
|
|
374
394
|
## License
|
|
375
395
|
|
|
376
396
|
Apache-2.0
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Field } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Extended Theme Color Fields for Light Mode
|
|
4
|
+
*/
|
|
5
|
+
export declare const extendedLightModeFields: Field[];
|
|
6
|
+
/**
|
|
7
|
+
* Chart color fields (for data visualization)
|
|
8
|
+
*/
|
|
9
|
+
export declare const chartColorFields: Field[];
|
|
10
|
+
/**
|
|
11
|
+
* Extended Theme Selection Field
|
|
12
|
+
*/
|
|
13
|
+
export declare const extendedThemeSelectionField: Field;
|
|
14
|
+
/**
|
|
15
|
+
* Extended Light Mode Configuration
|
|
16
|
+
*/
|
|
17
|
+
export declare const extendedLightModeField: Field;
|
|
18
|
+
/**
|
|
19
|
+
* Extended Dark Mode Configuration
|
|
20
|
+
*/
|
|
21
|
+
export declare const extendedDarkModeField: Field;
|
|
22
|
+
/**
|
|
23
|
+
* Chart Colors Configuration
|
|
24
|
+
*/
|
|
25
|
+
export declare const chartColorsField: Field;
|
|
26
|
+
//# sourceMappingURL=extendedThemeFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extendedThemeFields.d.ts","sourceRoot":"","sources":["../../src/fields/extendedThemeFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAoCpC;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,KAAK,EAgG1C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,EA0BnC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,KAezC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAoBpC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAoBnC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAoB9B,CAAA"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { extendedThemePresets } from '../extended-presets.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extended Theme Configuration Fields
|
|
4
|
+
* Provides advanced color token configuration using OKLCH format
|
|
5
|
+
* Compatible with shadcn/ui and TweakCN theme editors
|
|
6
|
+
*/ const extendedThemeOptions = Object.values(extendedThemePresets).map((preset)=>({
|
|
7
|
+
label: preset.label,
|
|
8
|
+
value: preset.value
|
|
9
|
+
}));
|
|
10
|
+
/**
|
|
11
|
+
* Creates OKLCH color input field
|
|
12
|
+
*/ function createOKLCHColorField(name, label, description) {
|
|
13
|
+
return {
|
|
14
|
+
name,
|
|
15
|
+
type: 'text',
|
|
16
|
+
label,
|
|
17
|
+
admin: {
|
|
18
|
+
description,
|
|
19
|
+
placeholder: 'oklch(0.5 0.2 250)',
|
|
20
|
+
components: {
|
|
21
|
+
Field: '@kilivi/payloadcms-theme-management/fields/ThemeColorPickerField'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Extended Theme Color Fields for Light Mode
|
|
28
|
+
*/ export const extendedLightModeFields = [
|
|
29
|
+
createOKLCHColorField('background', {
|
|
30
|
+
en: 'Background',
|
|
31
|
+
cs: 'Pozadí'
|
|
32
|
+
}, {
|
|
33
|
+
en: 'Main background color',
|
|
34
|
+
cs: 'Hlavní barva pozadí'
|
|
35
|
+
}),
|
|
36
|
+
createOKLCHColorField('foreground', {
|
|
37
|
+
en: 'Foreground',
|
|
38
|
+
cs: 'Popředí'
|
|
39
|
+
}, {
|
|
40
|
+
en: 'Main text color',
|
|
41
|
+
cs: 'Hlavní barva textu'
|
|
42
|
+
}),
|
|
43
|
+
createOKLCHColorField('card', {
|
|
44
|
+
en: 'Card',
|
|
45
|
+
cs: 'Karta'
|
|
46
|
+
}, {
|
|
47
|
+
en: 'Card background',
|
|
48
|
+
cs: 'Pozadí karty'
|
|
49
|
+
}),
|
|
50
|
+
createOKLCHColorField('cardForeground', {
|
|
51
|
+
en: 'Card Foreground',
|
|
52
|
+
cs: 'Popředí karty'
|
|
53
|
+
}, {
|
|
54
|
+
en: 'Card text color',
|
|
55
|
+
cs: 'Barva textu karty'
|
|
56
|
+
}),
|
|
57
|
+
createOKLCHColorField('popover', {
|
|
58
|
+
en: 'Popover',
|
|
59
|
+
cs: 'Vyskakovací okno'
|
|
60
|
+
}, {
|
|
61
|
+
en: 'Popover background',
|
|
62
|
+
cs: 'Pozadí vyskakovacího okna'
|
|
63
|
+
}),
|
|
64
|
+
createOKLCHColorField('popoverForeground', {
|
|
65
|
+
en: 'Popover Foreground',
|
|
66
|
+
cs: 'Popředí vyskakovacího okna'
|
|
67
|
+
}, {
|
|
68
|
+
en: 'Popover text color',
|
|
69
|
+
cs: 'Barva textu vyskakovacího okna'
|
|
70
|
+
}),
|
|
71
|
+
createOKLCHColorField('primary', {
|
|
72
|
+
en: 'Primary',
|
|
73
|
+
cs: 'Primární'
|
|
74
|
+
}, {
|
|
75
|
+
en: 'Primary brand color',
|
|
76
|
+
cs: 'Primární značková barva'
|
|
77
|
+
}),
|
|
78
|
+
createOKLCHColorField('primaryForeground', {
|
|
79
|
+
en: 'Primary Foreground',
|
|
80
|
+
cs: 'Popředí primární'
|
|
81
|
+
}, {
|
|
82
|
+
en: 'Text on primary color',
|
|
83
|
+
cs: 'Text na primární barvě'
|
|
84
|
+
}),
|
|
85
|
+
createOKLCHColorField('secondary', {
|
|
86
|
+
en: 'Secondary',
|
|
87
|
+
cs: 'Sekundární'
|
|
88
|
+
}, {
|
|
89
|
+
en: 'Secondary accent color',
|
|
90
|
+
cs: 'Sekundární akcentová barva'
|
|
91
|
+
}),
|
|
92
|
+
createOKLCHColorField('secondaryForeground', {
|
|
93
|
+
en: 'Secondary Foreground',
|
|
94
|
+
cs: 'Popředí sekundární'
|
|
95
|
+
}, {
|
|
96
|
+
en: 'Text on secondary color',
|
|
97
|
+
cs: 'Text na sekundární barvě'
|
|
98
|
+
}),
|
|
99
|
+
createOKLCHColorField('muted', {
|
|
100
|
+
en: 'Muted',
|
|
101
|
+
cs: 'Tlumená'
|
|
102
|
+
}, {
|
|
103
|
+
en: 'Muted background color',
|
|
104
|
+
cs: 'Tlumená barva pozadí'
|
|
105
|
+
}),
|
|
106
|
+
createOKLCHColorField('mutedForeground', {
|
|
107
|
+
en: 'Muted Foreground',
|
|
108
|
+
cs: 'Popředí tlumené'
|
|
109
|
+
}, {
|
|
110
|
+
en: 'Muted text color',
|
|
111
|
+
cs: 'Tlumená barva textu'
|
|
112
|
+
}),
|
|
113
|
+
createOKLCHColorField('accent', {
|
|
114
|
+
en: 'Accent',
|
|
115
|
+
cs: 'Akcentová'
|
|
116
|
+
}, {
|
|
117
|
+
en: 'Accent color',
|
|
118
|
+
cs: 'Akcentová barva'
|
|
119
|
+
}),
|
|
120
|
+
createOKLCHColorField('accentForeground', {
|
|
121
|
+
en: 'Accent Foreground',
|
|
122
|
+
cs: 'Popředí akcentové'
|
|
123
|
+
}, {
|
|
124
|
+
en: 'Text on accent color',
|
|
125
|
+
cs: 'Text na akcentové barvě'
|
|
126
|
+
}),
|
|
127
|
+
createOKLCHColorField('destructive', {
|
|
128
|
+
en: 'Destructive',
|
|
129
|
+
cs: 'Destruktivní'
|
|
130
|
+
}, {
|
|
131
|
+
en: 'Error/danger color',
|
|
132
|
+
cs: 'Barva chyby/nebezpečí'
|
|
133
|
+
}),
|
|
134
|
+
createOKLCHColorField('destructiveForeground', {
|
|
135
|
+
en: 'Destructive Foreground',
|
|
136
|
+
cs: 'Popředí destruktivní'
|
|
137
|
+
}, {
|
|
138
|
+
en: 'Text on destructive color',
|
|
139
|
+
cs: 'Text na destruktivní barvě'
|
|
140
|
+
}),
|
|
141
|
+
createOKLCHColorField('border', {
|
|
142
|
+
en: 'Border',
|
|
143
|
+
cs: 'Okraj'
|
|
144
|
+
}, {
|
|
145
|
+
en: 'Border color',
|
|
146
|
+
cs: 'Barva okraje'
|
|
147
|
+
}),
|
|
148
|
+
createOKLCHColorField('input', {
|
|
149
|
+
en: 'Input',
|
|
150
|
+
cs: 'Vstup'
|
|
151
|
+
}, {
|
|
152
|
+
en: 'Input border color',
|
|
153
|
+
cs: 'Barva okraje vstupu'
|
|
154
|
+
}),
|
|
155
|
+
createOKLCHColorField('ring', {
|
|
156
|
+
en: 'Ring',
|
|
157
|
+
cs: 'Zvýraznění'
|
|
158
|
+
}, {
|
|
159
|
+
en: 'Focus ring color',
|
|
160
|
+
cs: 'Barva zvýraznění focus'
|
|
161
|
+
})
|
|
162
|
+
];
|
|
163
|
+
/**
|
|
164
|
+
* Chart color fields (for data visualization)
|
|
165
|
+
*/ export const chartColorFields = [
|
|
166
|
+
createOKLCHColorField('chart1', {
|
|
167
|
+
en: 'Chart Color 1',
|
|
168
|
+
cs: 'Barva grafu 1'
|
|
169
|
+
}, {
|
|
170
|
+
en: 'First chart color',
|
|
171
|
+
cs: 'První barva grafu'
|
|
172
|
+
}),
|
|
173
|
+
createOKLCHColorField('chart2', {
|
|
174
|
+
en: 'Chart Color 2',
|
|
175
|
+
cs: 'Barva grafu 2'
|
|
176
|
+
}, {
|
|
177
|
+
en: 'Second chart color',
|
|
178
|
+
cs: 'Druhá barva grafu'
|
|
179
|
+
}),
|
|
180
|
+
createOKLCHColorField('chart3', {
|
|
181
|
+
en: 'Chart Color 3',
|
|
182
|
+
cs: 'Barva grafu 3'
|
|
183
|
+
}, {
|
|
184
|
+
en: 'Third chart color',
|
|
185
|
+
cs: 'Třetí barva grafu'
|
|
186
|
+
}),
|
|
187
|
+
createOKLCHColorField('chart4', {
|
|
188
|
+
en: 'Chart Color 4',
|
|
189
|
+
cs: 'Barva grafu 4'
|
|
190
|
+
}, {
|
|
191
|
+
en: 'Fourth chart color',
|
|
192
|
+
cs: 'Čtvrtá barva grafu'
|
|
193
|
+
}),
|
|
194
|
+
createOKLCHColorField('chart5', {
|
|
195
|
+
en: 'Chart Color 5',
|
|
196
|
+
cs: 'Barva grafu 5'
|
|
197
|
+
}, {
|
|
198
|
+
en: 'Fifth chart color',
|
|
199
|
+
cs: 'Pátá barva grafu'
|
|
200
|
+
})
|
|
201
|
+
];
|
|
202
|
+
/**
|
|
203
|
+
* Extended Theme Selection Field
|
|
204
|
+
*/ export const extendedThemeSelectionField = {
|
|
205
|
+
name: 'extendedTheme',
|
|
206
|
+
type: 'select',
|
|
207
|
+
label: {
|
|
208
|
+
en: '🎨 Extended Theme',
|
|
209
|
+
cs: '🎨 Rozšířené téma'
|
|
210
|
+
},
|
|
211
|
+
defaultValue: 'cool-extended',
|
|
212
|
+
options: extendedThemeOptions,
|
|
213
|
+
admin: {
|
|
214
|
+
description: {
|
|
215
|
+
en: 'Select an extended theme with full OKLCH color support. Compatible with shadcn/ui.',
|
|
216
|
+
cs: 'Vyberte rozšířené téma s plnou podporou OKLCH barev. Kompatibilní s shadcn/ui.'
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Extended Light Mode Configuration
|
|
222
|
+
*/ export const extendedLightModeField = {
|
|
223
|
+
type: 'collapsible',
|
|
224
|
+
label: {
|
|
225
|
+
en: '☀️ Extended Light Mode',
|
|
226
|
+
cs: '☀️ Rozšířený světlý režim'
|
|
227
|
+
},
|
|
228
|
+
admin: {
|
|
229
|
+
initCollapsed: true,
|
|
230
|
+
description: {
|
|
231
|
+
en: 'Advanced color configuration for light mode using OKLCH format',
|
|
232
|
+
cs: 'Pokročilá konfigurace barev pro světlý režim pomocí formátu OKLCH'
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
fields: [
|
|
236
|
+
{
|
|
237
|
+
name: 'extendedLightMode',
|
|
238
|
+
type: 'group',
|
|
239
|
+
fields: extendedLightModeFields
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
};
|
|
243
|
+
/**
|
|
244
|
+
* Extended Dark Mode Configuration
|
|
245
|
+
*/ export const extendedDarkModeField = {
|
|
246
|
+
type: 'collapsible',
|
|
247
|
+
label: {
|
|
248
|
+
en: '🌙 Extended Dark Mode',
|
|
249
|
+
cs: '🌙 Rozšířený tmavý režim'
|
|
250
|
+
},
|
|
251
|
+
admin: {
|
|
252
|
+
initCollapsed: true,
|
|
253
|
+
description: {
|
|
254
|
+
en: 'Advanced color configuration for dark mode using OKLCH format',
|
|
255
|
+
cs: 'Pokročilá konfigurace barev pro tmavý režim pomocí formátu OKLCH'
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
fields: [
|
|
259
|
+
{
|
|
260
|
+
name: 'extendedDarkMode',
|
|
261
|
+
type: 'group',
|
|
262
|
+
fields: extendedLightModeFields
|
|
263
|
+
}
|
|
264
|
+
]
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Chart Colors Configuration
|
|
268
|
+
*/ export const chartColorsField = {
|
|
269
|
+
type: 'collapsible',
|
|
270
|
+
label: {
|
|
271
|
+
en: '📊 Chart Colors',
|
|
272
|
+
cs: '📊 Barvy grafů'
|
|
273
|
+
},
|
|
274
|
+
admin: {
|
|
275
|
+
initCollapsed: true,
|
|
276
|
+
description: {
|
|
277
|
+
en: 'Configure colors for data visualization and charts',
|
|
278
|
+
cs: 'Nakonfigurujte barvy pro vizualizaci dat a grafy'
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
fields: [
|
|
282
|
+
{
|
|
283
|
+
name: 'chartColors',
|
|
284
|
+
type: 'group',
|
|
285
|
+
fields: chartColorFields
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
//# sourceMappingURL=extendedThemeFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fields/extendedThemeFields.ts"],"sourcesContent":["import type { Field } from 'payload'\nimport { extendedThemePresets } from '../extended-presets.js'\n\n/**\n * Extended Theme Configuration Fields\n * Provides advanced color token configuration using OKLCH format\n * Compatible with shadcn/ui and TweakCN theme editors\n */\n\nconst extendedThemeOptions = Object.values(extendedThemePresets).map((preset) => ({\n label: preset.label,\n value: preset.value,\n}))\n\n/**\n * Creates OKLCH color input field\n */\nfunction createOKLCHColorField(\n name: string,\n label: { en: string; cs: string },\n description?: { en: string; cs: string },\n): Field {\n return {\n name,\n type: 'text',\n label,\n admin: {\n description,\n placeholder: 'oklch(0.5 0.2 250)',\n components: {\n Field: '@kilivi/payloadcms-theme-management/fields/ThemeColorPickerField',\n },\n },\n }\n}\n\n/**\n * Extended Theme Color Fields for Light Mode\n */\nexport const extendedLightModeFields: Field[] = [\n createOKLCHColorField(\n 'background',\n { en: 'Background', cs: 'Pozadí' },\n { en: 'Main background color', cs: 'Hlavní barva pozadí' },\n ),\n createOKLCHColorField(\n 'foreground',\n { en: 'Foreground', cs: 'Popředí' },\n { en: 'Main text color', cs: 'Hlavní barva textu' },\n ),\n createOKLCHColorField(\n 'card',\n { en: 'Card', cs: 'Karta' },\n { en: 'Card background', cs: 'Pozadí karty' },\n ),\n createOKLCHColorField(\n 'cardForeground',\n { en: 'Card Foreground', cs: 'Popředí karty' },\n { en: 'Card text color', cs: 'Barva textu karty' },\n ),\n createOKLCHColorField(\n 'popover',\n { en: 'Popover', cs: 'Vyskakovací okno' },\n { en: 'Popover background', cs: 'Pozadí vyskakovacího okna' },\n ),\n createOKLCHColorField(\n 'popoverForeground',\n { en: 'Popover Foreground', cs: 'Popředí vyskakovacího okna' },\n { en: 'Popover text color', cs: 'Barva textu vyskakovacího okna' },\n ),\n createOKLCHColorField(\n 'primary',\n { en: 'Primary', cs: 'Primární' },\n { en: 'Primary brand color', cs: 'Primární značková barva' },\n ),\n createOKLCHColorField(\n 'primaryForeground',\n { en: 'Primary Foreground', cs: 'Popředí primární' },\n { en: 'Text on primary color', cs: 'Text na primární barvě' },\n ),\n createOKLCHColorField(\n 'secondary',\n { en: 'Secondary', cs: 'Sekundární' },\n { en: 'Secondary accent color', cs: 'Sekundární akcentová barva' },\n ),\n createOKLCHColorField(\n 'secondaryForeground',\n { en: 'Secondary Foreground', cs: 'Popředí sekundární' },\n { en: 'Text on secondary color', cs: 'Text na sekundární barvě' },\n ),\n createOKLCHColorField(\n 'muted',\n { en: 'Muted', cs: 'Tlumená' },\n { en: 'Muted background color', cs: 'Tlumená barva pozadí' },\n ),\n createOKLCHColorField(\n 'mutedForeground',\n { en: 'Muted Foreground', cs: 'Popředí tlumené' },\n { en: 'Muted text color', cs: 'Tlumená barva textu' },\n ),\n createOKLCHColorField(\n 'accent',\n { en: 'Accent', cs: 'Akcentová' },\n { en: 'Accent color', cs: 'Akcentová barva' },\n ),\n createOKLCHColorField(\n 'accentForeground',\n { en: 'Accent Foreground', cs: 'Popředí akcentové' },\n { en: 'Text on accent color', cs: 'Text na akcentové barvě' },\n ),\n createOKLCHColorField(\n 'destructive',\n { en: 'Destructive', cs: 'Destruktivní' },\n { en: 'Error/danger color', cs: 'Barva chyby/nebezpečí' },\n ),\n createOKLCHColorField(\n 'destructiveForeground',\n { en: 'Destructive Foreground', cs: 'Popředí destruktivní' },\n { en: 'Text on destructive color', cs: 'Text na destruktivní barvě' },\n ),\n createOKLCHColorField(\n 'border',\n { en: 'Border', cs: 'Okraj' },\n { en: 'Border color', cs: 'Barva okraje' },\n ),\n createOKLCHColorField(\n 'input',\n { en: 'Input', cs: 'Vstup' },\n { en: 'Input border color', cs: 'Barva okraje vstupu' },\n ),\n createOKLCHColorField(\n 'ring',\n { en: 'Ring', cs: 'Zvýraznění' },\n { en: 'Focus ring color', cs: 'Barva zvýraznění focus' },\n ),\n]\n\n/**\n * Chart color fields (for data visualization)\n */\nexport const chartColorFields: Field[] = [\n createOKLCHColorField(\n 'chart1',\n { en: 'Chart Color 1', cs: 'Barva grafu 1' },\n { en: 'First chart color', cs: 'První barva grafu' },\n ),\n createOKLCHColorField(\n 'chart2',\n { en: 'Chart Color 2', cs: 'Barva grafu 2' },\n { en: 'Second chart color', cs: 'Druhá barva grafu' },\n ),\n createOKLCHColorField(\n 'chart3',\n { en: 'Chart Color 3', cs: 'Barva grafu 3' },\n { en: 'Third chart color', cs: 'Třetí barva grafu' },\n ),\n createOKLCHColorField(\n 'chart4',\n { en: 'Chart Color 4', cs: 'Barva grafu 4' },\n { en: 'Fourth chart color', cs: 'Čtvrtá barva grafu' },\n ),\n createOKLCHColorField(\n 'chart5',\n { en: 'Chart Color 5', cs: 'Barva grafu 5' },\n { en: 'Fifth chart color', cs: 'Pátá barva grafu' },\n ),\n]\n\n/**\n * Extended Theme Selection Field\n */\nexport const extendedThemeSelectionField: Field = {\n name: 'extendedTheme',\n type: 'select',\n label: {\n en: '🎨 Extended Theme',\n cs: '🎨 Rozšířené téma',\n },\n defaultValue: 'cool-extended',\n options: extendedThemeOptions,\n admin: {\n description: {\n en: 'Select an extended theme with full OKLCH color support. Compatible with shadcn/ui.',\n cs: 'Vyberte rozšířené téma s plnou podporou OKLCH barev. Kompatibilní s shadcn/ui.',\n },\n },\n}\n\n/**\n * Extended Light Mode Configuration\n */\nexport const extendedLightModeField: Field = {\n type: 'collapsible',\n label: {\n en: '☀️ Extended Light Mode',\n cs: '☀️ Rozšířený světlý režim',\n },\n admin: {\n initCollapsed: true,\n description: {\n en: 'Advanced color configuration for light mode using OKLCH format',\n cs: 'Pokročilá konfigurace barev pro světlý režim pomocí formátu OKLCH',\n },\n },\n fields: [\n {\n name: 'extendedLightMode',\n type: 'group',\n fields: extendedLightModeFields,\n },\n ],\n}\n\n/**\n * Extended Dark Mode Configuration\n */\nexport const extendedDarkModeField: Field = {\n type: 'collapsible',\n label: {\n en: '🌙 Extended Dark Mode',\n cs: '🌙 Rozšířený tmavý režim',\n },\n admin: {\n initCollapsed: true,\n description: {\n en: 'Advanced color configuration for dark mode using OKLCH format',\n cs: 'Pokročilá konfigurace barev pro tmavý režim pomocí formátu OKLCH',\n },\n },\n fields: [\n {\n name: 'extendedDarkMode',\n type: 'group',\n fields: extendedLightModeFields, // Same structure, different values\n },\n ],\n}\n\n/**\n * Chart Colors Configuration\n */\nexport const chartColorsField: Field = {\n type: 'collapsible',\n label: {\n en: '📊 Chart Colors',\n cs: '📊 Barvy grafů',\n },\n admin: {\n initCollapsed: true,\n description: {\n en: 'Configure colors for data visualization and charts',\n cs: 'Nakonfigurujte barvy pro vizualizaci dat a grafy',\n },\n },\n fields: [\n {\n name: 'chartColors',\n type: 'group',\n fields: chartColorFields,\n },\n ],\n}\n"],"names":["extendedThemePresets","extendedThemeOptions","Object","values","map","preset","label","value","createOKLCHColorField","name","description","type","admin","placeholder","components","Field","extendedLightModeFields","en","cs","chartColorFields","extendedThemeSelectionField","defaultValue","options","extendedLightModeField","initCollapsed","fields","extendedDarkModeField","chartColorsField"],"mappings":"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AME,8BAAqC;IAChDX,MAAM;IACNE,MAAM;IACNL,OAAO;QACLW,IAAI;QACJC,IAAI;IACN;IACAG,cAAc;IACdC,SAASrB;IACTW,OAAO;QACLF,aAAa;YACXO,IAAI;YACJC,IAAI;QACN;IACF;AACF,EAAC;AAED;;CAEC,GACD,OAAO,MAAMK,yBAAgC;IAC3CZ,MAAM;IACNL,OAAO;QACLW,IAAI;QACJC,IAAI;IACN;IACAN,OAAO;QACLY,eAAe;QACfd,aAAa;YACXO,IAAI;YACJC,IAAI;QACN;IACF;IACAO,QAAQ;QACN;YACEhB,MAAM;YACNE,MAAM;YACNc,QAAQT;QACV;KACD;AACH,EAAC;AAED;;CAEC,GACD,OAAO,MAAMU,wBAA+B;IAC1Cf,MAAM;IACNL,OAAO;QACLW,IAAI;QACJC,IAAI;IACN;IACAN,OAAO;QACLY,eAAe;QACfd,aAAa;YACXO,IAAI;YACJC,IAAI;QACN;IACF;IACAO,QAAQ;QACN;YACEhB,MAAM;YACNE,MAAM;YACNc,QAAQT;QACV;KACD;AACH,EAAC;AAED;;CAEC,GACD,OAAO,MAAMW,mBAA0B;IACrChB,MAAM;IACNL,OAAO;QACLW,IAAI;QACJC,IAAI;IACN;IACAN,OAAO;QACLY,eAAe;QACfd,aAAa;YACXO,IAAI;YACJC,IAAI;QACN;IACF;IACAO,QAAQ;QACN;YACEhB,MAAM;YACNE,MAAM;YACNc,QAAQN;QACV;KACD;AACH,EAAC"}
|
|
@@ -9,9 +9,20 @@ interface ThemeConfigurationFieldOptions {
|
|
|
9
9
|
enableAdvancedFeatures?: boolean;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Theme Configuration
|
|
13
|
-
*
|
|
12
|
+
* Theme Configuration Tab Configuration
|
|
13
|
+
* Returns tab config that can be injected into existing tabs field
|
|
14
14
|
*/
|
|
15
|
-
export declare function createThemeConfigurationField(options: ThemeConfigurationFieldOptions):
|
|
15
|
+
export declare function createThemeConfigurationField(options: ThemeConfigurationFieldOptions): {
|
|
16
|
+
name: string;
|
|
17
|
+
label: {
|
|
18
|
+
en: string;
|
|
19
|
+
cs: string;
|
|
20
|
+
};
|
|
21
|
+
description: {
|
|
22
|
+
en: string;
|
|
23
|
+
cs: string;
|
|
24
|
+
};
|
|
25
|
+
fields: Field[];
|
|
26
|
+
};
|
|
16
27
|
export {};
|
|
17
28
|
//# sourceMappingURL=themeConfigurationField.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themeConfigurationField.d.ts","sourceRoot":"","sources":["../../src/fields/themeConfigurationField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAOpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"themeConfigurationField.d.ts","sourceRoot":"","sources":["../../src/fields/themeConfigurationField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAOpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAS9C,UAAU,8BAA8B;IACtC,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,sBAAsB,EAAE,OAAO,CAAA;IAC/B,gBAAgB,EAAE,OAAO,CAAA;IACzB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,8BAA8B,GACtC;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,CAsaA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BASE_FONT_SIZE_OPTIONS, BODY_FONT_OPTIONS, HEADING_FONT_OPTIONS, LINE_HEIGHT_OPTIONS } from '../constants/themeFonts.js';
|
|
2
2
|
import { darkModeField, lightModeField } from './colorModeFields.js';
|
|
3
|
+
import { extendedThemeSelectionField, extendedLightModeField, extendedDarkModeField, chartColorsField } from './extendedThemeFields.js';
|
|
3
4
|
/**
|
|
4
|
-
* Theme Configuration
|
|
5
|
-
*
|
|
5
|
+
* Theme Configuration Tab Configuration
|
|
6
|
+
* Returns tab config that can be injected into existing tabs field
|
|
6
7
|
*/ export function createThemeConfigurationField(options) {
|
|
7
8
|
const { themePresets, defaultTheme, includeColorModeToggle, includeCustomCSS, enableAdvancedFeatures = true } = options;
|
|
8
9
|
const themeOptions = themePresets.map((preset)=>{
|
|
@@ -33,8 +34,31 @@ import { darkModeField, lightModeField } from './colorModeFields.js';
|
|
|
33
34
|
Field: '@kilivi/payloadcms-theme-management/fields/ThemePreviewField'
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
}
|
|
37
|
+
},
|
|
38
|
+
extendedThemeSelectionField
|
|
37
39
|
];
|
|
40
|
+
// Extended Theme Configuration (OKLCH colors, shadcn/ui compatible)
|
|
41
|
+
if (enableAdvancedFeatures) {
|
|
42
|
+
fields.push({
|
|
43
|
+
type: 'collapsible',
|
|
44
|
+
label: {
|
|
45
|
+
en: '🎨 Extended Theme Configuration',
|
|
46
|
+
cs: '🎨 Rozšířená konfigurace tématu'
|
|
47
|
+
},
|
|
48
|
+
admin: {
|
|
49
|
+
initCollapsed: true,
|
|
50
|
+
description: {
|
|
51
|
+
en: 'Advanced color configuration using OKLCH format. Compatible with shadcn/ui and TweakCN.',
|
|
52
|
+
cs: 'Pokročilá konfigurace barev pomocí formátu OKLCH. Kompatibilní s shadcn/ui a TweakCN.'
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
fields: [
|
|
56
|
+
extendedLightModeField,
|
|
57
|
+
extendedDarkModeField,
|
|
58
|
+
chartColorsField
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
38
62
|
// Color Mode Settings
|
|
39
63
|
if (includeColorModeToggle) {
|
|
40
64
|
fields.push({
|
|
@@ -465,15 +489,17 @@ import { darkModeField, lightModeField } from './colorModeFields.js';
|
|
|
465
489
|
fields: advancedFields
|
|
466
490
|
});
|
|
467
491
|
}
|
|
492
|
+
// Return just the tab configuration, not the full tabs field
|
|
493
|
+
// The plugin will inject this into existing tabs or create a group field
|
|
468
494
|
return {
|
|
469
495
|
name: 'themeConfiguration',
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
496
|
+
label: {
|
|
497
|
+
en: '🎨 Appearance Settings',
|
|
498
|
+
cs: '🎨 Nastavení vzhledu'
|
|
499
|
+
},
|
|
500
|
+
description: {
|
|
501
|
+
en: 'Configure website appearance and styling',
|
|
502
|
+
cs: 'Nakonfigurujte vzhled a stylování webu'
|
|
477
503
|
},
|
|
478
504
|
fields
|
|
479
505
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/themeConfigurationField.ts"],"sourcesContent":["import type { Field } from 'payload'\nimport {\n BASE_FONT_SIZE_OPTIONS,\n BODY_FONT_OPTIONS,\n HEADING_FONT_OPTIONS,\n LINE_HEIGHT_OPTIONS,\n} from '../constants/themeFonts.js'\nimport type { ThemePreset } from '../index.js'\nimport { darkModeField, lightModeField } from './colorModeFields.js'\n\ninterface ThemeConfigurationFieldOptions {\n themePresets: ThemePreset[]\n defaultTheme: string\n includeColorModeToggle: boolean\n includeCustomCSS: boolean\n includeBrandIdentity: boolean\n enableAdvancedFeatures?: boolean\n}\n\n/**\n * Theme Configuration Field with Theme Selection as default value setter\n * Theme Selection populates lightMode/darkMode colors automatically\n */\nexport function createThemeConfigurationField(options: ThemeConfigurationFieldOptions): Field {\n const {\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n enableAdvancedFeatures = true,\n } = options\n\n const themeOptions = themePresets.map((preset) => {\n const previewColor = preset.preview?.colors.primary\n const label = previewColor ? `${preset.label} • ${previewColor}` : preset.label\n return {\n label,\n value: preset.name,\n }\n })\n\n const fields: Field[] = [\n {\n name: 'theme',\n type: 'select',\n required: true,\n defaultValue: defaultTheme,\n options: themeOptions,\n label: {\n en: '🎨 Theme Selection',\n cs: '🎨 Výběr tématu',\n },\n admin: {\n description: {\n en: 'Select a theme to auto-populate color values. You can customize colors after selection.',\n cs: 'Vyberte téma pro automatické předvyplnění barev. Po výběru můžete barvy upravit.',\n },\n components: {\n Field: '@kilivi/payloadcms-theme-management/fields/ThemePreviewField',\n },\n },\n },\n ]\n\n // Color Mode Settings\n if (includeColorModeToggle) {\n fields.push({\n type: 'collapsible',\n label: {\n en: '🌗 Color Mode Settings',\n cs: '🌗 Nastavení barevného režimu',\n },\n admin: {\n initCollapsed: false,\n description: {\n en: 'Configure light and dark mode colors. Changes here override theme selection.',\n cs: 'Nakonfigurujte barvy světlého a tmavého režimu. Změny zde přepíší výběr tématu.',\n },\n },\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'colorMode',\n type: 'select',\n label: {\n en: 'Default Color Mode',\n cs: 'Výchozí barevný režim',\n },\n defaultValue: 'auto',\n options: [\n {\n label: {\n en: 'Auto (System)',\n cs: 'Automaticky (Systém)',\n },\n value: 'auto',\n },\n {\n label: { en: 'Light', cs: 'Světlý' },\n value: 'light',\n },\n {\n label: { en: 'Dark', cs: 'Tmavý' },\n value: 'dark',\n },\n ],\n admin: {\n description: {\n en: 'Default color mode for visitors',\n cs: 'Výchozí barevný režim pro návštěvníky',\n },\n width: '50%',\n },\n },\n {\n name: 'allowColorModeToggle',\n type: 'checkbox',\n label: {\n en: 'Enable Mode Toggle',\n cs: 'Povolit přepínač režimu',\n },\n defaultValue: true,\n admin: {\n description: {\n en: 'Let visitors switch modes',\n cs: 'Umožnit návštěvníkům přepínat režimy',\n },\n width: '50%',\n },\n },\n ],\n },\n lightModeField,\n darkModeField,\n ],\n })\n }\n\n fields.push({\n type: 'collapsible',\n label: {\n en: '🅰️ Typography',\n cs: '🅰️ Typografie',\n },\n admin: {\n initCollapsed: true,\n description: {\n en: 'Choose font families and base typography settings. Leave fields on \"Use preset\" to inherit the theme defaults.',\n cs: 'Zvolte rodiny písem a základní typografické nastavení. Hodnota \"Použít výchozí\" zachová nastavení motivu.',\n },\n },\n fields: [\n {\n name: 'typography',\n type: 'group',\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'bodyFont',\n type: 'select',\n label: {\n en: 'Body font',\n cs: 'Písmo pro text',\n },\n defaultValue: 'preset',\n options: BODY_FONT_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n {\n name: 'headingFont',\n type: 'select',\n label: {\n en: 'Heading font',\n cs: 'Písmo pro nadpisy',\n },\n defaultValue: 'preset',\n options: HEADING_FONT_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n ],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'bodyFontCustom',\n type: 'text',\n label: {\n en: 'Custom body font stack',\n cs: 'Vlastní písmo pro text',\n },\n admin: {\n width: '50%',\n placeholder: '\"IBM Plex Sans\", sans-serif',\n description: {\n en: 'Provide full CSS font-family stack when using a custom font.',\n cs: 'Při volbě vlastního písma zadejte celý CSS zápis font-family.',\n },\n condition: (_, siblingData) => siblingData?.bodyFont === 'custom',\n },\n },\n {\n name: 'headingFontCustom',\n type: 'text',\n label: {\n en: 'Custom heading font stack',\n cs: 'Vlastní písmo pro nadpisy',\n },\n admin: {\n width: '50%',\n placeholder: '\"Cormorant Garamond\", serif',\n description: {\n en: 'Provide full CSS font-family stack when using a custom heading font.',\n cs: 'Při volbě vlastního nadpisového písma zadejte celý CSS zápis font-family.',\n },\n condition: (_, siblingData) => siblingData?.headingFont === 'custom',\n },\n },\n ],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'baseFontSize',\n type: 'select',\n label: {\n en: 'Base font size',\n cs: 'Základní velikost písma',\n },\n defaultValue: 'preset',\n options: BASE_FONT_SIZE_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n {\n name: 'lineHeight',\n type: 'select',\n label: {\n en: 'Line height',\n cs: 'Řádkování',\n },\n defaultValue: 'preset',\n options: LINE_HEIGHT_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n ],\n },\n ],\n },\n ],\n })\n\n // Design Customization\n fields.push({\n type: 'collapsible',\n label: {\n en: '✨ Design Customization',\n cs: '✨ Přizpůsobení designu',\n },\n admin: {\n initCollapsed: true,\n },\n fields: [\n {\n name: 'borderRadius',\n type: 'select',\n label: {\n en: 'Border Radius',\n cs: 'Zaoblení rohů',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'None', cs: 'Žádné' }, value: 'none' },\n { label: { en: 'Small', cs: 'Malé' }, value: 'small' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'Large', cs: 'Velké' }, value: 'large' },\n { label: { en: 'Full', cs: 'Plné' }, value: 'xl' },\n ],\n admin: {\n components: {\n Field: '@kilivi/payloadcms-theme-management/fields/RadiusField',\n },\n width: '33%',\n },\n },\n {\n name: 'fontScale',\n type: 'select',\n label: {\n en: 'Font Scale',\n cs: 'Velikost písma',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'Small', cs: 'Malé' }, value: 'small' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'Large', cs: 'Velké' }, value: 'large' },\n ],\n admin: {\n width: '33%',\n },\n },\n {\n name: 'spacing',\n type: 'select',\n label: {\n en: 'Spacing',\n cs: 'Mezery',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'Compact', cs: 'Kompaktní' }, value: 'compact' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'Spacious', cs: 'Prostorné' }, value: 'spacious' },\n ],\n admin: {\n width: '34%',\n },\n },\n ],\n })\n\n // Advanced Settings\n if (enableAdvancedFeatures) {\n const advancedFields: Field[] = [\n {\n name: 'animationLevel',\n type: 'select',\n label: {\n en: 'Animation Level',\n cs: 'Úroveň animací',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'None', cs: 'Žádné' }, value: 'none' },\n { label: { en: 'Reduced', cs: 'Snížené' }, value: 'reduced' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'High', cs: 'Vysoké' }, value: 'high' },\n ],\n admin: {\n description: {\n en: 'Control website animations and transitions',\n cs: 'Kontrola animací a přechodů na webu',\n },\n width: '50%',\n },\n },\n ]\n\n if (includeCustomCSS) {\n advancedFields.push({\n name: 'customCSS',\n type: 'code',\n label: {\n en: 'Custom CSS',\n cs: 'Vlastní CSS',\n },\n admin: {\n language: 'css',\n description: {\n en: 'Add custom CSS to override default styles',\n cs: 'Přidejte vlastní CSS pro přepsání výchozích stylů',\n },\n // placeholder:\n // ':root {\\n --primary: #your-color;\\n --border-radius: 8px;\\n --font-family: \"Your Font\";\\n}\\n\\n.custom-class {\\n /* Your custom styles */\\n}',\n // rows: 8,\n },\n })\n }\n\n fields.push({\n type: 'collapsible',\n label: {\n en: '⚙️ Advanced Settings',\n cs: '⚙️ Pokročilé nastavení',\n },\n admin: {\n initCollapsed: true,\n },\n fields: advancedFields,\n })\n }\n\n return {\n name: 'themeConfiguration',\n type: 'group',\n label: false,\n admin: {\n description: {\n en: 'Configure website appearance and styling',\n cs: 'Nakonfigurujte vzhled a stylování webu',\n },\n },\n fields,\n }\n}\n"],"names":["BASE_FONT_SIZE_OPTIONS","BODY_FONT_OPTIONS","HEADING_FONT_OPTIONS","LINE_HEIGHT_OPTIONS","darkModeField","lightModeField","createThemeConfigurationField","options","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","enableAdvancedFeatures","themeOptions","map","preset","previewColor","preview","colors","primary","label","value","name","fields","type","required","defaultValue","en","cs","admin","description","components","Field","push","initCollapsed","width","option","placeholder","condition","_","siblingData","bodyFont","headingFont","advancedFields","language"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/fields/themeConfigurationField.ts"],"sourcesContent":["import type { Field } from 'payload'\nimport {\n BASE_FONT_SIZE_OPTIONS,\n BODY_FONT_OPTIONS,\n HEADING_FONT_OPTIONS,\n LINE_HEIGHT_OPTIONS,\n} from '../constants/themeFonts.js'\nimport type { ThemePreset } from '../index.js'\nimport { darkModeField, lightModeField } from './colorModeFields.js'\nimport {\n extendedThemeSelectionField,\n extendedLightModeField,\n extendedDarkModeField,\n chartColorsField,\n} from './extendedThemeFields.js'\n\ninterface ThemeConfigurationFieldOptions {\n themePresets: ThemePreset[]\n defaultTheme: string\n includeColorModeToggle: boolean\n includeCustomCSS: boolean\n includeBrandIdentity: boolean\n enableAdvancedFeatures?: boolean\n}\n\n/**\n * Theme Configuration Tab Configuration\n * Returns tab config that can be injected into existing tabs field\n */\nexport function createThemeConfigurationField(\n options: ThemeConfigurationFieldOptions,\n): {\n name: string\n label: { en: string; cs: string }\n description: { en: string; cs: string }\n fields: Field[]\n} {\n const {\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n enableAdvancedFeatures = true,\n } = options\n\n const themeOptions = themePresets.map((preset) => {\n const previewColor = preset.preview?.colors.primary\n const label = previewColor ? `${preset.label} • ${previewColor}` : preset.label\n return {\n label,\n value: preset.name,\n }\n })\n\n const fields: Field[] = [\n {\n name: 'theme',\n type: 'select',\n required: true,\n defaultValue: defaultTheme,\n options: themeOptions,\n label: {\n en: '🎨 Theme Selection',\n cs: '🎨 Výběr tématu',\n },\n admin: {\n description: {\n en: 'Select a theme to auto-populate color values. You can customize colors after selection.',\n cs: 'Vyberte téma pro automatické předvyplnění barev. Po výběru můžete barvy upravit.',\n },\n components: {\n Field: '@kilivi/payloadcms-theme-management/fields/ThemePreviewField',\n },\n },\n },\n extendedThemeSelectionField,\n ]\n\n // Extended Theme Configuration (OKLCH colors, shadcn/ui compatible)\n if (enableAdvancedFeatures) {\n fields.push({\n type: 'collapsible',\n label: {\n en: '🎨 Extended Theme Configuration',\n cs: '🎨 Rozšířená konfigurace tématu',\n },\n admin: {\n initCollapsed: true,\n description: {\n en: 'Advanced color configuration using OKLCH format. Compatible with shadcn/ui and TweakCN.',\n cs: 'Pokročilá konfigurace barev pomocí formátu OKLCH. Kompatibilní s shadcn/ui a TweakCN.',\n },\n },\n fields: [\n extendedLightModeField,\n extendedDarkModeField,\n chartColorsField,\n ],\n })\n }\n\n // Color Mode Settings\n if (includeColorModeToggle) {\n fields.push({\n type: 'collapsible',\n label: {\n en: '🌗 Color Mode Settings',\n cs: '🌗 Nastavení barevného režimu',\n },\n admin: {\n initCollapsed: false,\n description: {\n en: 'Configure light and dark mode colors. Changes here override theme selection.',\n cs: 'Nakonfigurujte barvy světlého a tmavého režimu. Změny zde přepíší výběr tématu.',\n },\n },\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'colorMode',\n type: 'select',\n label: {\n en: 'Default Color Mode',\n cs: 'Výchozí barevný režim',\n },\n defaultValue: 'auto',\n options: [\n {\n label: {\n en: 'Auto (System)',\n cs: 'Automaticky (Systém)',\n },\n value: 'auto',\n },\n {\n label: { en: 'Light', cs: 'Světlý' },\n value: 'light',\n },\n {\n label: { en: 'Dark', cs: 'Tmavý' },\n value: 'dark',\n },\n ],\n admin: {\n description: {\n en: 'Default color mode for visitors',\n cs: 'Výchozí barevný režim pro návštěvníky',\n },\n width: '50%',\n },\n },\n {\n name: 'allowColorModeToggle',\n type: 'checkbox',\n label: {\n en: 'Enable Mode Toggle',\n cs: 'Povolit přepínač režimu',\n },\n defaultValue: true,\n admin: {\n description: {\n en: 'Let visitors switch modes',\n cs: 'Umožnit návštěvníkům přepínat režimy',\n },\n width: '50%',\n },\n },\n ],\n },\n lightModeField,\n darkModeField,\n ],\n })\n }\n\n fields.push({\n type: 'collapsible',\n label: {\n en: '🅰️ Typography',\n cs: '🅰️ Typografie',\n },\n admin: {\n initCollapsed: true,\n description: {\n en: 'Choose font families and base typography settings. Leave fields on \"Use preset\" to inherit the theme defaults.',\n cs: 'Zvolte rodiny písem a základní typografické nastavení. Hodnota \"Použít výchozí\" zachová nastavení motivu.',\n },\n },\n fields: [\n {\n name: 'typography',\n type: 'group',\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'bodyFont',\n type: 'select',\n label: {\n en: 'Body font',\n cs: 'Písmo pro text',\n },\n defaultValue: 'preset',\n options: BODY_FONT_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n {\n name: 'headingFont',\n type: 'select',\n label: {\n en: 'Heading font',\n cs: 'Písmo pro nadpisy',\n },\n defaultValue: 'preset',\n options: HEADING_FONT_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n ],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'bodyFontCustom',\n type: 'text',\n label: {\n en: 'Custom body font stack',\n cs: 'Vlastní písmo pro text',\n },\n admin: {\n width: '50%',\n placeholder: '\"IBM Plex Sans\", sans-serif',\n description: {\n en: 'Provide full CSS font-family stack when using a custom font.',\n cs: 'Při volbě vlastního písma zadejte celý CSS zápis font-family.',\n },\n condition: (_, siblingData) => siblingData?.bodyFont === 'custom',\n },\n },\n {\n name: 'headingFontCustom',\n type: 'text',\n label: {\n en: 'Custom heading font stack',\n cs: 'Vlastní písmo pro nadpisy',\n },\n admin: {\n width: '50%',\n placeholder: '\"Cormorant Garamond\", serif',\n description: {\n en: 'Provide full CSS font-family stack when using a custom heading font.',\n cs: 'Při volbě vlastního nadpisového písma zadejte celý CSS zápis font-family.',\n },\n condition: (_, siblingData) => siblingData?.headingFont === 'custom',\n },\n },\n ],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'baseFontSize',\n type: 'select',\n label: {\n en: 'Base font size',\n cs: 'Základní velikost písma',\n },\n defaultValue: 'preset',\n options: BASE_FONT_SIZE_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n {\n name: 'lineHeight',\n type: 'select',\n label: {\n en: 'Line height',\n cs: 'Řádkování',\n },\n defaultValue: 'preset',\n options: LINE_HEIGHT_OPTIONS.map((option) => ({\n label: option.label,\n value: option.value,\n })),\n admin: {\n width: '50%',\n },\n },\n ],\n },\n ],\n },\n ],\n })\n\n // Design Customization\n fields.push({\n type: 'collapsible',\n label: {\n en: '✨ Design Customization',\n cs: '✨ Přizpůsobení designu',\n },\n admin: {\n initCollapsed: true,\n },\n fields: [\n {\n name: 'borderRadius',\n type: 'select',\n label: {\n en: 'Border Radius',\n cs: 'Zaoblení rohů',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'None', cs: 'Žádné' }, value: 'none' },\n { label: { en: 'Small', cs: 'Malé' }, value: 'small' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'Large', cs: 'Velké' }, value: 'large' },\n { label: { en: 'Full', cs: 'Plné' }, value: 'xl' },\n ],\n admin: {\n components: {\n Field: '@kilivi/payloadcms-theme-management/fields/RadiusField',\n },\n width: '33%',\n },\n },\n {\n name: 'fontScale',\n type: 'select',\n label: {\n en: 'Font Scale',\n cs: 'Velikost písma',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'Small', cs: 'Malé' }, value: 'small' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'Large', cs: 'Velké' }, value: 'large' },\n ],\n admin: {\n width: '33%',\n },\n },\n {\n name: 'spacing',\n type: 'select',\n label: {\n en: 'Spacing',\n cs: 'Mezery',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'Compact', cs: 'Kompaktní' }, value: 'compact' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'Spacious', cs: 'Prostorné' }, value: 'spacious' },\n ],\n admin: {\n width: '34%',\n },\n },\n ],\n })\n\n // Advanced Settings\n if (enableAdvancedFeatures) {\n const advancedFields: Field[] = [\n {\n name: 'animationLevel',\n type: 'select',\n label: {\n en: 'Animation Level',\n cs: 'Úroveň animací',\n },\n defaultValue: 'medium',\n options: [\n { label: { en: 'None', cs: 'Žádné' }, value: 'none' },\n { label: { en: 'Reduced', cs: 'Snížené' }, value: 'reduced' },\n { label: { en: 'Medium', cs: 'Střední' }, value: 'medium' },\n { label: { en: 'High', cs: 'Vysoké' }, value: 'high' },\n ],\n admin: {\n description: {\n en: 'Control website animations and transitions',\n cs: 'Kontrola animací a přechodů na webu',\n },\n width: '50%',\n },\n },\n ]\n\n if (includeCustomCSS) {\n advancedFields.push({\n name: 'customCSS',\n type: 'code',\n label: {\n en: 'Custom CSS',\n cs: 'Vlastní CSS',\n },\n admin: {\n language: 'css',\n description: {\n en: 'Add custom CSS to override default styles',\n cs: 'Přidejte vlastní CSS pro přepsání výchozích stylů',\n },\n // placeholder:\n // ':root {\\n --primary: #your-color;\\n --border-radius: 8px;\\n --font-family: \"Your Font\";\\n}\\n\\n.custom-class {\\n /* Your custom styles */\\n}',\n // rows: 8,\n },\n })\n }\n\n fields.push({\n type: 'collapsible',\n label: {\n en: '⚙️ Advanced Settings',\n cs: '⚙️ Pokročilé nastavení',\n },\n admin: {\n initCollapsed: true,\n },\n fields: advancedFields,\n })\n }\n\n // Return just the tab configuration, not the full tabs field\n // The plugin will inject this into existing tabs or create a group field\n return {\n name: 'themeConfiguration',\n label: {\n en: '🎨 Appearance Settings',\n cs: '🎨 Nastavení vzhledu',\n },\n description: {\n en: 'Configure website appearance and styling',\n cs: 'Nakonfigurujte vzhled a stylování webu',\n },\n fields,\n }\n}\n"],"names":["BASE_FONT_SIZE_OPTIONS","BODY_FONT_OPTIONS","HEADING_FONT_OPTIONS","LINE_HEIGHT_OPTIONS","darkModeField","lightModeField","extendedThemeSelectionField","extendedLightModeField","extendedDarkModeField","chartColorsField","createThemeConfigurationField","options","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","enableAdvancedFeatures","themeOptions","map","preset","previewColor","preview","colors","primary","label","value","name","fields","type","required","defaultValue","en","cs","admin","description","components","Field","push","initCollapsed","width","option","placeholder","condition","_","siblingData","bodyFont","headingFont","advancedFields","language"],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC7B,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmC,MAAM,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC7B,MAAM,YAAY,CAAA;AAyFnB,eAAO,MAAM,qBAAqB,GAAI,UAAS,4BAAiC,KAAG,MAqElF,CAAA;AAED,KAAK,iBAAiB,GAAG,MAAM,GAAG,8BAA8B,CAAA;AAEhE,eAAO,MAAM,uBAAuB,GAClC,UAAU,iBAAiB,KAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA8CvC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,KAAG,WAAW,GAAG,IAEhE,CAAA;AAED,eAAO,MAAM,wBAAwB,QAAO,WAAW,EAEtD,CAAA;AAID,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EACL,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,4BAA4B,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,YAAY,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AACtF,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,eAAO,MAAM,qBAAqB,aAjKa,4BAA4B,KAAQ,MAiKzB,CAAA;AAC1D,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,aAnKU,4BAA4B,KAAQ,MAmKtB,CAAA;AAE7D,eAAe,qBAAqB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,59 @@
|
|
|
1
1
|
import { createThemeConfigurationField } from './fields/themeConfigurationField.js';
|
|
2
2
|
import { defaultThemePresets } from './presets.js';
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
const THEME_TAB_NAME = 'themeConfiguration';
|
|
4
|
+
/**
|
|
5
|
+
* Remove existing theme tab from tabs field
|
|
6
|
+
*/ const removeExistingThemeTab = (tabs)=>tabs.filter((tab)=>tab?.name !== THEME_TAB_NAME);
|
|
7
|
+
/**
|
|
8
|
+
* Add theme configuration tab to existing tabs field or create fields array
|
|
9
|
+
*/ const upsertThemeTab = (fields, themeTabConfig, enableLogging)=>{
|
|
10
|
+
const existingFields = fields ?? [];
|
|
11
|
+
// Find existing tabs field
|
|
12
|
+
const tabsFieldIndex = existingFields.findIndex((field)=>'type' in field && field.type === 'tabs');
|
|
13
|
+
if (tabsFieldIndex === -1) {
|
|
14
|
+
// No tabs field exists - add theme configuration as group field instead
|
|
15
|
+
if (enableLogging) {
|
|
16
|
+
console.log('🎨 Theme Management Plugin: No tabs field found, adding theme configuration as group field');
|
|
17
|
+
}
|
|
18
|
+
return [
|
|
19
|
+
...existingFields,
|
|
20
|
+
{
|
|
21
|
+
name: THEME_TAB_NAME,
|
|
22
|
+
type: 'group',
|
|
23
|
+
label: themeTabConfig.label,
|
|
24
|
+
admin: {
|
|
25
|
+
description: themeTabConfig.description
|
|
26
|
+
},
|
|
27
|
+
fields: themeTabConfig.fields
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
// Tabs field exists - inject our tab into it
|
|
10
32
|
if (enableLogging) {
|
|
11
|
-
console.log('🎨 Theme Management Plugin:
|
|
33
|
+
console.log('🎨 Theme Management Plugin: Adding theme configuration tab to existing tabs');
|
|
34
|
+
}
|
|
35
|
+
const tabsField = existingFields[tabsFieldIndex];
|
|
36
|
+
if (!('tabs' in tabsField)) {
|
|
37
|
+
console.warn('🎨 Theme Management Plugin: Found tabs field but it has no tabs property');
|
|
38
|
+
return existingFields;
|
|
12
39
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
40
|
+
const existingTabs = tabsField.tabs || [];
|
|
41
|
+
// Remove existing theme tab if present
|
|
42
|
+
const sanitizedTabs = removeExistingThemeTab(existingTabs);
|
|
43
|
+
// Create new tabs field with our tab added
|
|
44
|
+
const updatedTabsField = {
|
|
45
|
+
...tabsField,
|
|
46
|
+
tabs: [
|
|
47
|
+
...sanitizedTabs,
|
|
48
|
+
themeTabConfig
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
// Return fields array with updated tabs field
|
|
52
|
+
const newFields = [
|
|
53
|
+
...existingFields
|
|
16
54
|
];
|
|
55
|
+
newFields[tabsFieldIndex] = updatedTabsField;
|
|
56
|
+
return newFields;
|
|
17
57
|
};
|
|
18
58
|
const ensureCollectionsArray = (collections)=>Array.isArray(collections) ? collections : [];
|
|
19
59
|
export const themeManagementPlugin = (options = {})=>{
|
|
@@ -25,7 +65,7 @@ export const themeManagementPlugin = (options = {})=>{
|
|
|
25
65
|
}
|
|
26
66
|
return config;
|
|
27
67
|
}
|
|
28
|
-
const
|
|
68
|
+
const themeTabConfig = createThemeConfigurationField({
|
|
29
69
|
themePresets,
|
|
30
70
|
defaultTheme,
|
|
31
71
|
includeColorModeToggle,
|
|
@@ -43,7 +83,7 @@ export const themeManagementPlugin = (options = {})=>{
|
|
|
43
83
|
console.log(`🎨 Theme Management Plugin: enhancing collection "${collection.slug}"`);
|
|
44
84
|
}
|
|
45
85
|
const existingFields = Array.isArray(collection.fields) ? collection.fields : [];
|
|
46
|
-
const fields =
|
|
86
|
+
const fields = upsertThemeTab(existingFields, themeTabConfig, enableLogging);
|
|
47
87
|
return {
|
|
48
88
|
...collection,
|
|
49
89
|
fields
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, Plugin } from 'payload'\nimport { createThemeConfigurationField } from './fields/themeConfigurationField.js'\nimport type { SiteThemeConfiguration } from './payload-types.js'\nimport type { ThemePreset } from './presets.js'\nimport { defaultThemePresets } from './presets.js'\nimport type {\n FetchThemeConfigurationOptions,\n ThemeManagementPluginOptions,\n} from './types.js'\n\nconst THEME_FIELD_NAME = 'themeConfiguration'\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\nconst upsertThemeField = (\n fields: Field[] | undefined,\n themeField: Field,\n enableLogging: boolean,\n): Field[] => {\n const sanitized = removeExistingThemeField(fields ?? [])\n\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: injecting theme configuration field')\n }\n\n return [...sanitized, themeField]\n}\n\nconst ensureCollectionsArray = (collections: Config['collections']): CollectionConfig[] =>\n Array.isArray(collections) ? collections : []\n\nexport const themeManagementPlugin = (options: ThemeManagementPluginOptions = {}): Plugin => {\n return (config: Config): Config => {\n const {\n enabled = true,\n targetCollection = 'site-settings',\n themePresets = defaultThemePresets,\n defaultTheme = 'cool',\n includeColorModeToggle = true,\n includeCustomCSS = true,\n includeBrandIdentity = false,\n enableAdvancedFeatures = true,\n enableLogging = false,\n } = options\n\n if (!enabled) {\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: disabled via options, skipping.')\n }\n return config\n }\n\n const themeField = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\n })\n\n let collectionTouched = false\n\n const collections = ensureCollectionsArray(config.collections).map((collection) => {\n if (collection.slug !== targetCollection) {\n return collection\n }\n\n collectionTouched = true\n\n if (enableLogging) {\n console.log(\n `🎨 Theme Management Plugin: enhancing collection \"${collection.slug}\"`,\n )\n }\n\n const existingFields = Array.isArray(collection.fields) ? collection.fields : []\n\n const fields = upsertThemeField(existingFields, themeField, 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 =\n typeof options === 'string'\n ? { tenantSlug: options }\n : options ?? {}\n\n const {\n tenantSlug,\n collectionSlug = 'site-settings',\n depth,\n locale,\n draft,\n queryParams = {},\n } = normalizedOptions\n\n const params = new URLSearchParams({ limit: '1' })\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n if (tenantSlug) params.set('tenant', tenantSlug)\n if (locale) params.set('locale', locale)\n if (draft) params.set('draft', 'true')\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value === undefined) return\n params.set(key, String(value))\n })\n\n const url = `/api/${collectionSlug}?${params.toString()}`\n\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch theme configuration (status ${response.status})`)\n }\n\n const data = (await response.json()) as {\n docs?: Array<{ themeConfiguration?: SiteThemeConfiguration }>\n }\n\n const doc = data.docs?.[0]\n\n return doc?.themeConfiguration ?? null\n } catch (error) {\n console.warn('Failed to fetch theme configuration:', error)\n return null\n }\n}\n\nexport const getThemePreset = (themeName: string): ThemePreset | null => {\n return defaultThemePresets.find((preset) => preset.name === themeName) || null\n}\n\nexport const getAvailableThemePresets = (): ThemePreset[] => {\n return defaultThemePresets\n}\n\n\n\nexport { defaultThemePresets } from './presets.js'\nexport type { ThemePreset, ThemeTypographyPreset } from './presets.js'\nexport { \n extendedThemePresets,\n extendedThemeToCSSVariables,\n} from './extended-presets.js'\nexport type { ExtendedThemePreset, ShadcnColorTokens } from './extended-presets.js'\nexport {\n applyExtendedTheme,\n generateExtendedThemeCSS,\n resetExtendedTheme,\n getExtendedThemeTokens,\n createUseExtendedTheme,\n getTailwindVarReferences,\n} from './utils/extendedThemeHelpers.js'\nexport type { ThemeManagementPluginOptions, FetchThemeConfigurationOptions } from './types.js'\nexport {\n DEFAULT_THEME_CONFIGURATION,\n resolveThemeConfiguration,\n} from './utils/resolveThemeConfiguration.js'\nexport type { ResolvedThemeConfiguration } from './utils/resolveThemeConfiguration.js'\nexport { generateThemeColorsCss, hexToHsl } from './utils/themeColors.js'\nexport { generateThemeCSS, getThemeStyles } from './utils/themeUtils.js'\nexport { getThemeHtmlAttributes } from './utils/themeHtmlAttributes.js'\n\nexport type { Mode, ThemeDefaults } from './providers/Theme/types.js'\nexport { ThemeProvider } from './providers/Theme/index.js'\n\nexport const ThemeManagementPlugin = themeManagementPlugin\n/** @deprecated use {@link themeManagementPlugin} */\nexport const themeConfigurationPlugin = themeManagementPlugin\n\nexport default themeManagementPlugin"],"names":["createThemeConfigurationField","defaultThemePresets","THEME_FIELD_NAME","removeExistingThemeField","fields","filter","field","candidate","name","upsertThemeField","themeField","enableLogging","sanitized","console","log","ensureCollectionsArray","collections","Array","isArray","themeManagementPlugin","options","config","enabled","targetCollection","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","includeBrandIdentity","enableAdvancedFeatures","collectionTouched","map","collection","slug","existingFields","warn","fetchThemeConfiguration","normalizedOptions","tenantSlug","collectionSlug","depth","locale","draft","queryParams","params","URLSearchParams","limit","set","String","Object","entries","forEach","key","value","undefined","url","toString","response","fetch","ok","Error","status","data","json","doc","docs","themeConfiguration","error","getThemePreset","themeName","find","preset","getAvailableThemePresets","extendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","ThemeProvider","ThemeManagementPlugin","themeConfigurationPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, Field, Plugin } from 'payload'\nimport { createThemeConfigurationField } from './fields/themeConfigurationField.js'\nimport type { SiteThemeConfiguration } from './payload-types.js'\nimport type { ThemePreset } from './presets.js'\nimport { defaultThemePresets } from './presets.js'\nimport type {\n FetchThemeConfigurationOptions,\n ThemeManagementPluginOptions,\n} from './types.js'\n\nconst THEME_TAB_NAME = 'themeConfiguration'\n\ninterface TabConfig {\n name: string\n label: { en: string; cs: string }\n description?: { en: string; cs: string }\n fields: Field[]\n}\n\n/**\n * Remove existing theme tab from tabs field\n */\nconst removeExistingThemeTab = (tabs: TabConfig[]): TabConfig[] =>\n tabs.filter((tab) => tab?.name !== THEME_TAB_NAME)\n\n/**\n * Add theme configuration tab to existing tabs field or create fields array\n */\nconst upsertThemeTab = (\n fields: Field[] | undefined,\n themeTabConfig: TabConfig,\n enableLogging: boolean,\n): Field[] => {\n const existingFields = fields ?? []\n\n // Find existing tabs field\n const tabsFieldIndex = existingFields.findIndex(\n (field) => 'type' in field && field.type === 'tabs',\n )\n\n if (tabsFieldIndex === -1) {\n // No tabs field exists - add theme configuration as group field instead\n if (enableLogging) {\n console.log(\n '🎨 Theme Management Plugin: No tabs field found, adding theme configuration as group field',\n )\n }\n\n return [\n ...existingFields,\n {\n name: THEME_TAB_NAME,\n type: 'group',\n label: themeTabConfig.label,\n admin: {\n description: themeTabConfig.description,\n },\n fields: themeTabConfig.fields,\n },\n ]\n }\n\n // Tabs field exists - inject our tab into it\n if (enableLogging) {\n console.log(\n '🎨 Theme Management Plugin: Adding theme configuration tab to existing tabs',\n )\n }\n\n const tabsField = existingFields[tabsFieldIndex]\n \n if (!('tabs' in tabsField)) {\n console.warn('🎨 Theme Management Plugin: Found tabs field but it has no tabs property')\n return existingFields\n }\n\n const existingTabs = (tabsField.tabs as TabConfig[]) || []\n\n // Remove existing theme tab if present\n const sanitizedTabs = removeExistingThemeTab(existingTabs)\n\n // Create new tabs field with our tab added\n const updatedTabsField = {\n ...tabsField,\n tabs: [...sanitizedTabs, themeTabConfig],\n }\n\n // Return fields array with updated tabs field\n const newFields = [...existingFields]\n newFields[tabsFieldIndex] = updatedTabsField\n\n return newFields\n}\n\nconst ensureCollectionsArray = (collections: Config['collections']): CollectionConfig[] =>\n Array.isArray(collections) ? collections : []\n\nexport const themeManagementPlugin = (options: ThemeManagementPluginOptions = {}): Plugin => {\n return (config: Config): Config => {\n const {\n enabled = true,\n targetCollection = 'site-settings',\n themePresets = defaultThemePresets,\n defaultTheme = 'cool',\n includeColorModeToggle = true,\n includeCustomCSS = true,\n includeBrandIdentity = false,\n enableAdvancedFeatures = true,\n enableLogging = false,\n } = options\n\n if (!enabled) {\n if (enableLogging) {\n console.log('🎨 Theme Management Plugin: disabled via options, skipping.')\n }\n return config\n }\n\n const themeTabConfig = createThemeConfigurationField({\n themePresets,\n defaultTheme,\n includeColorModeToggle,\n includeCustomCSS,\n includeBrandIdentity: includeBrandIdentity ?? false,\n enableAdvancedFeatures,\n })\n\n let collectionTouched = false\n\n const collections = ensureCollectionsArray(config.collections).map((collection) => {\n if (collection.slug !== targetCollection) {\n return collection\n }\n\n collectionTouched = true\n\n if (enableLogging) {\n console.log(\n `🎨 Theme Management Plugin: enhancing collection \"${collection.slug}\"`,\n )\n }\n\n const existingFields = Array.isArray(collection.fields) ? collection.fields : []\n\n const fields = upsertThemeTab(existingFields, themeTabConfig, enableLogging)\n\n return {\n ...collection,\n fields,\n }\n })\n\n if (!collectionTouched) {\n if (enableLogging) {\n console.warn(\n `🎨 Theme Management Plugin: collection \"${targetCollection}\" was not found, leaving config untouched.`,\n )\n }\n return config\n }\n\n 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 =\n typeof options === 'string'\n ? { tenantSlug: options }\n : options ?? {}\n\n const {\n tenantSlug,\n collectionSlug = 'site-settings',\n depth,\n locale,\n draft,\n queryParams = {},\n } = normalizedOptions\n\n const params = new URLSearchParams({ limit: '1' })\n\n if (typeof depth === 'number') params.set('depth', String(depth))\n if (tenantSlug) params.set('tenant', tenantSlug)\n if (locale) params.set('locale', locale)\n if (draft) params.set('draft', 'true')\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value === undefined) return\n params.set(key, String(value))\n })\n\n const url = `/api/${collectionSlug}?${params.toString()}`\n\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch theme configuration (status ${response.status})`)\n }\n\n const data = (await response.json()) as {\n docs?: Array<{ themeConfiguration?: SiteThemeConfiguration }>\n }\n\n const doc = data.docs?.[0]\n\n return doc?.themeConfiguration ?? null\n } catch (error) {\n console.warn('Failed to fetch theme configuration:', error)\n return null\n }\n}\n\nexport const getThemePreset = (themeName: string): ThemePreset | null => {\n return defaultThemePresets.find((preset) => preset.name === themeName) || null\n}\n\nexport const getAvailableThemePresets = (): ThemePreset[] => {\n return defaultThemePresets\n}\n\n\n\nexport { defaultThemePresets } from './presets.js'\nexport type { ThemePreset, ThemeTypographyPreset } from './presets.js'\nexport { \n extendedThemePresets,\n extendedThemeToCSSVariables,\n} from './extended-presets.js'\nexport type { ExtendedThemePreset, ShadcnColorTokens } from './extended-presets.js'\nexport {\n applyExtendedTheme,\n generateExtendedThemeCSS,\n resetExtendedTheme,\n getExtendedThemeTokens,\n createUseExtendedTheme,\n getTailwindVarReferences,\n} from './utils/extendedThemeHelpers.js'\nexport type { ThemeManagementPluginOptions, FetchThemeConfigurationOptions } from './types.js'\nexport {\n DEFAULT_THEME_CONFIGURATION,\n resolveThemeConfiguration,\n} from './utils/resolveThemeConfiguration.js'\nexport type { ResolvedThemeConfiguration } from './utils/resolveThemeConfiguration.js'\nexport { generateThemeColorsCss, hexToHsl } from './utils/themeColors.js'\nexport { generateThemeCSS, getThemeStyles } from './utils/themeUtils.js'\nexport { getThemeHtmlAttributes } from './utils/themeHtmlAttributes.js'\n\nexport type { Mode, ThemeDefaults } from './providers/Theme/types.js'\nexport { ThemeProvider } from './providers/Theme/index.js'\n\nexport const ThemeManagementPlugin = themeManagementPlugin\n/** @deprecated use {@link themeManagementPlugin} */\nexport const themeConfigurationPlugin = themeManagementPlugin\n\nexport default themeManagementPlugin"],"names":["createThemeConfigurationField","defaultThemePresets","THEME_TAB_NAME","removeExistingThemeTab","tabs","filter","tab","name","upsertThemeTab","fields","themeTabConfig","enableLogging","existingFields","tabsFieldIndex","findIndex","field","type","console","log","label","admin","description","tabsField","warn","existingTabs","sanitizedTabs","updatedTabsField","newFields","ensureCollectionsArray","collections","Array","isArray","themeManagementPlugin","options","config","enabled","targetCollection","themePresets","defaultTheme","includeColorModeToggle","includeCustomCSS","includeBrandIdentity","enableAdvancedFeatures","collectionTouched","map","collection","slug","fetchThemeConfiguration","normalizedOptions","tenantSlug","collectionSlug","depth","locale","draft","queryParams","params","URLSearchParams","limit","set","String","Object","entries","forEach","key","value","undefined","url","toString","response","fetch","ok","Error","status","data","json","doc","docs","themeConfiguration","error","getThemePreset","themeName","find","preset","getAvailableThemePresets","extendedThemePresets","extendedThemeToCSSVariables","applyExtendedTheme","generateExtendedThemeCSS","resetExtendedTheme","getExtendedThemeTokens","createUseExtendedTheme","getTailwindVarReferences","DEFAULT_THEME_CONFIGURATION","resolveThemeConfiguration","generateThemeColorsCss","hexToHsl","generateThemeCSS","getThemeStyles","getThemeHtmlAttributes","ThemeProvider","ThemeManagementPlugin","themeConfigurationPlugin"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kilivi/payloadcms-theme-management",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Theme configuration plugin for Payload CMS v3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -58,12 +58,17 @@
|
|
|
58
58
|
"@payloadcms/richtext-lexical": "^3.0.0",
|
|
59
59
|
"@swc/cli": "^0.1.65",
|
|
60
60
|
"@swc/core": "^1.6.3",
|
|
61
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
62
|
+
"@testing-library/react": "^16.3.0",
|
|
63
|
+
"@types/jest": "^30.0.0",
|
|
61
64
|
"@types/react": "^18.3.12",
|
|
62
65
|
"copyfiles": "^2.4.1",
|
|
66
|
+
"jest": "^30.2.0",
|
|
63
67
|
"payload": "^3.58.0",
|
|
64
68
|
"react": "^19.0.0",
|
|
65
69
|
"react-dom": "^19.0.0",
|
|
66
70
|
"rimraf": "^5.0.5",
|
|
71
|
+
"ts-jest": "^29.4.4",
|
|
67
72
|
"typescript": "^5.5.3"
|
|
68
73
|
},
|
|
69
74
|
"publishConfig": {
|
|
@@ -78,6 +83,9 @@
|
|
|
78
83
|
"dev": "swc src -d dist --config-file .swcrc --watch",
|
|
79
84
|
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
80
85
|
"copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
|
|
86
|
+
"test": "jest",
|
|
87
|
+
"test:watch": "jest --watch",
|
|
88
|
+
"test:coverage": "jest --coverage",
|
|
81
89
|
"lint": "eslint src",
|
|
82
90
|
"lint:fix": "eslint --fix --ext .ts,.tsx src"
|
|
83
91
|
}
|