@kilivi/payloadcms-theme-management 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +97 -97
  2. package/dist/components/ServerThemeInjector.d.ts +1 -1
  3. package/dist/components/ServerThemeInjector.d.ts.map +1 -1
  4. package/dist/components/{ServerThemeInjector.jsx → ServerThemeInjector.js} +50 -37
  5. package/dist/components/ServerThemeInjector.js.map +1 -0
  6. package/dist/components/ThemePreview.js +318 -0
  7. package/dist/components/ThemePreview.js.map +1 -0
  8. package/dist/components/typographyPreviewUtils.js +12 -17
  9. package/dist/components/typographyPreviewUtils.js.map +1 -1
  10. package/dist/constants/themeFonts.js +94 -24
  11. package/dist/constants/themeFonts.js.map +1 -1
  12. package/dist/fields/ColorPickerField.js +332 -0
  13. package/dist/fields/ColorPickerField.js.map +1 -0
  14. package/dist/fields/RadiusField.js +174 -0
  15. package/dist/fields/RadiusField.js.map +1 -0
  16. package/dist/fields/ThemeColorPickerField.css +138 -138
  17. package/dist/fields/ThemeColorPickerField.js +163 -0
  18. package/dist/fields/ThemeColorPickerField.js.map +1 -0
  19. package/dist/fields/ThemePreviewField.js +558 -0
  20. package/dist/fields/ThemePreviewField.js.map +1 -0
  21. package/dist/fields/ThemeTokenSelectField.js +209 -0
  22. package/dist/fields/ThemeTokenSelectField.js.map +1 -0
  23. package/dist/fields/colorModeFields.js +167 -73
  24. package/dist/fields/colorModeFields.js.map +1 -1
  25. package/dist/fields/themeConfigurationField.d.ts +1 -1
  26. package/dist/fields/themeConfigurationField.d.ts.map +1 -1
  27. package/dist/fields/themeConfigurationField.js +227 -134
  28. package/dist/fields/themeConfigurationField.js.map +1 -1
  29. package/dist/index.d.ts +17 -16
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +52 -52
  32. package/dist/index.js.map +1 -1
  33. package/dist/payload-types.js +5 -5
  34. package/dist/payload-types.js.map +1 -1
  35. package/dist/plugin.d.ts +1 -2
  36. package/dist/plugin.d.ts.map +1 -1
  37. package/dist/plugin.js +2 -1
  38. package/dist/plugin.js.map +1 -1
  39. package/dist/presets.js +66 -65
  40. package/dist/presets.js.map +1 -1
  41. package/dist/providers/Theme/index.d.ts +1 -1
  42. package/dist/providers/Theme/index.d.ts.map +1 -1
  43. package/dist/providers/Theme/{index.jsx → index.js} +61 -31
  44. package/dist/providers/Theme/index.js.map +1 -0
  45. package/dist/providers/Theme/shared.d.ts +1 -1
  46. package/dist/providers/Theme/shared.d.ts.map +1 -1
  47. package/dist/providers/Theme/shared.js +34 -9
  48. package/dist/providers/Theme/shared.js.map +1 -1
  49. package/dist/providers/Theme/themeConfig.d.ts +1 -1
  50. package/dist/providers/Theme/themeConfig.d.ts.map +1 -1
  51. package/dist/providers/Theme/themeConfig.js +37 -36
  52. package/dist/providers/Theme/themeConfig.js.map +1 -1
  53. package/dist/providers/Theme/types.js +15 -13
  54. package/dist/providers/Theme/types.js.map +1 -1
  55. package/dist/server.d.ts +2 -2
  56. package/dist/server.d.ts.map +1 -1
  57. package/dist/server.js +3 -2
  58. package/dist/server.js.map +1 -1
  59. package/dist/src/--verbose/dist/fields/ThemeColorPickerField.scss +138 -0
  60. package/dist/src/dist/fields/ThemeColorPickerField.scss +138 -0
  61. package/dist/types.d.ts +2 -2
  62. package/dist/types.d.ts.map +1 -1
  63. package/dist/types.js +2 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/utils/resolveThemeConfiguration.d.ts +3 -3
  66. package/dist/utils/resolveThemeConfiguration.d.ts.map +1 -1
  67. package/dist/utils/resolveThemeConfiguration.js +53 -34
  68. package/dist/utils/resolveThemeConfiguration.js.map +1 -1
  69. package/dist/utils/themeAssets.d.ts +1 -1
  70. package/dist/utils/themeAssets.d.ts.map +1 -1
  71. package/dist/utils/themeAssets.js +4 -4
  72. package/dist/utils/themeAssets.js.map +1 -1
  73. package/dist/utils/themeColors.js +95 -41
  74. package/dist/utils/themeColors.js.map +1 -1
  75. package/dist/utils/themeUtils.d.ts +2 -2
  76. package/dist/utils/themeUtils.d.ts.map +1 -1
  77. package/dist/utils/themeUtils.js +38 -53
  78. package/dist/utils/themeUtils.js.map +1 -1
  79. package/package.json +13 -5
  80. package/dist/components/ServerThemeInjector.jsx.map +0 -1
  81. package/dist/components/ThemePreview.jsx +0 -231
  82. package/dist/components/ThemePreview.jsx.map +0 -1
  83. package/dist/fields/ColorPickerField.jsx +0 -205
  84. package/dist/fields/ColorPickerField.jsx.map +0 -1
  85. package/dist/fields/RadiusField.jsx +0 -123
  86. package/dist/fields/RadiusField.jsx.map +0 -1
  87. package/dist/fields/ThemeColorPickerField.jsx +0 -110
  88. package/dist/fields/ThemeColorPickerField.jsx.map +0 -1
  89. package/dist/fields/ThemePreviewField.jsx +0 -420
  90. package/dist/fields/ThemePreviewField.jsx.map +0 -1
  91. package/dist/fields/ThemeTokenSelectField.jsx +0 -151
  92. package/dist/fields/ThemeTokenSelectField.jsx.map +0 -1
  93. package/dist/providers/Theme/index.jsx.map +0 -1
@@ -0,0 +1,163 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useField, useFormFields } from '@payloadcms/ui';
4
+ import { useEffect, useMemo, useState } from 'react';
5
+ import './ThemeColorPickerField.css';
6
+ function resolveLocalizedValue(value, fallback) {
7
+ if (typeof value === 'string') {
8
+ return value;
9
+ }
10
+ if (typeof value === 'object' && value !== null) {
11
+ const localized = value;
12
+ const resolved = localized.en ?? localized.cs ?? localized[''];
13
+ if (typeof resolved === 'string') {
14
+ return resolved;
15
+ }
16
+ }
17
+ return fallback;
18
+ }
19
+ const ThemeColorPickerField = ({ field, path })=>{
20
+ const { value, setValue } = useField({
21
+ path
22
+ });
23
+ const [localValue, setLocalValue] = useState(value || '');
24
+ const allFields = useFormFields(([fields])=>fields);
25
+ const mode = path.includes('lightMode') ? 'lightMode' : 'darkMode';
26
+ const modePrefix = `themeConfiguration.${mode}`;
27
+ useEffect(()=>{
28
+ setLocalValue(value || '');
29
+ }, [
30
+ value
31
+ ]);
32
+ const colorValues = useMemo(()=>{
33
+ if (!allFields) {
34
+ return {};
35
+ }
36
+ const names = [
37
+ 'background',
38
+ 'foreground',
39
+ 'card',
40
+ 'cardForeground',
41
+ 'popover',
42
+ 'popoverForeground',
43
+ 'primary',
44
+ 'primaryForeground',
45
+ 'secondary',
46
+ 'secondaryForeground',
47
+ 'muted',
48
+ 'mutedForeground',
49
+ 'accent',
50
+ 'accentForeground',
51
+ 'destructive',
52
+ 'destructiveForeground',
53
+ 'border',
54
+ 'input',
55
+ 'ring'
56
+ ];
57
+ return names.reduce((accumulator, name)=>{
58
+ const fieldState = allFields[`${modePrefix}.${name}`];
59
+ const parsedValue = typeof fieldState?.value === 'string' ? fieldState.value : undefined;
60
+ accumulator[name] = parsedValue ?? '';
61
+ return accumulator;
62
+ }, {});
63
+ }, [
64
+ allFields,
65
+ modePrefix
66
+ ]);
67
+ function handleChange(nextValue) {
68
+ setLocalValue(nextValue);
69
+ setValue(nextValue);
70
+ }
71
+ const fieldName = path.split('.').pop() || '';
72
+ const label = resolveLocalizedValue(field.label, fieldName);
73
+ const description = resolveLocalizedValue(field.admin?.description, '');
74
+ return /*#__PURE__*/ _jsxs("div", {
75
+ className: "theme-color-picker-field",
76
+ children: [
77
+ /*#__PURE__*/ _jsxs("div", {
78
+ className: "field-header",
79
+ children: [
80
+ /*#__PURE__*/ _jsx("label", {
81
+ className: "field-label",
82
+ children: label
83
+ }),
84
+ description && /*#__PURE__*/ _jsx("div", {
85
+ className: "field-description",
86
+ children: description
87
+ })
88
+ ]
89
+ }),
90
+ /*#__PURE__*/ _jsxs("div", {
91
+ className: "color-picker-container",
92
+ children: [
93
+ /*#__PURE__*/ _jsxs("div", {
94
+ className: "color-input-wrapper",
95
+ children: [
96
+ /*#__PURE__*/ _jsx("input", {
97
+ type: "color",
98
+ value: localValue || '#000000',
99
+ onChange: (event)=>handleChange(event.target.value),
100
+ className: "color-input"
101
+ }),
102
+ /*#__PURE__*/ _jsx("input", {
103
+ type: "text",
104
+ value: localValue || '',
105
+ onChange: (event)=>handleChange(event.target.value),
106
+ placeholder: "#000000",
107
+ className: "text-input",
108
+ pattern: "^#[0-9A-Fa-f]{6}$"
109
+ })
110
+ ]
111
+ }),
112
+ /*#__PURE__*/ _jsx("div", {
113
+ className: "color-preview",
114
+ style: {
115
+ backgroundColor: localValue || '#000000'
116
+ },
117
+ children: /*#__PURE__*/ _jsx("span", {
118
+ className: "preview-label",
119
+ children: localValue || 'Not set'
120
+ })
121
+ })
122
+ ]
123
+ }),
124
+ (fieldName === 'primary' || fieldName === 'background') && /*#__PURE__*/ _jsx("div", {
125
+ className: "mini-preview",
126
+ style: {
127
+ backgroundColor: colorValues.background || '#ffffff',
128
+ color: colorValues.foreground || '#000000',
129
+ borderColor: colorValues.border || '#e2e8f0'
130
+ },
131
+ children: /*#__PURE__*/ _jsxs("div", {
132
+ className: "preview-card",
133
+ style: {
134
+ backgroundColor: colorValues.card || '#ffffff',
135
+ color: colorValues.cardForeground || '#000000',
136
+ borderColor: colorValues.border || '#e2e8f0'
137
+ },
138
+ children: [
139
+ /*#__PURE__*/ _jsx("button", {
140
+ className: "preview-button",
141
+ style: {
142
+ backgroundColor: colorValues.primary || '#0070f3',
143
+ color: colorValues.primaryForeground || '#ffffff'
144
+ },
145
+ children: "Primary Button"
146
+ }),
147
+ /*#__PURE__*/ _jsx("button", {
148
+ className: "preview-button secondary",
149
+ style: {
150
+ backgroundColor: colorValues.secondary || '#f1f5f9',
151
+ color: colorValues.secondaryForeground || '#0f172a'
152
+ },
153
+ children: "Secondary"
154
+ })
155
+ ]
156
+ })
157
+ })
158
+ ]
159
+ });
160
+ };
161
+ export default ThemeColorPickerField;
162
+
163
+ //# sourceMappingURL=ThemeColorPickerField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/fields/ThemeColorPickerField.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useField, useFormFields } from '@payloadcms/ui'\r\nimport type { TextFieldClientComponent } from 'payload'\r\nimport { useEffect, useMemo, useState } from 'react'\r\nimport './ThemeColorPickerField.css'\r\n\r\nfunction resolveLocalizedValue(value: unknown, fallback: string) {\r\n if (typeof value === 'string') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n const localized = value as Record<string, unknown>\r\n const resolved = localized.en ?? localized.cs ?? localized['']\r\n if (typeof resolved === 'string') {\r\n return resolved\r\n }\r\n }\r\n\r\n return fallback\r\n}\r\n\r\nconst ThemeColorPickerField: TextFieldClientComponent = ({ field, path }) => {\r\n const { value, setValue } = useField<string>({ path })\r\n const [localValue, setLocalValue] = useState(value || '')\r\n const allFields = useFormFields(([fields]) => fields)\r\n\r\n const mode = path.includes('lightMode') ? 'lightMode' : 'darkMode'\r\n const modePrefix = `themeConfiguration.${mode}`\r\n\r\n useEffect(() => {\r\n setLocalValue(value || '')\r\n }, [value])\r\n\r\n const colorValues = useMemo(() => {\r\n if (!allFields) {\r\n return {}\r\n }\r\n\r\n const names = [\r\n 'background',\r\n 'foreground',\r\n 'card',\r\n 'cardForeground',\r\n 'popover',\r\n 'popoverForeground',\r\n 'primary',\r\n 'primaryForeground',\r\n 'secondary',\r\n 'secondaryForeground',\r\n 'muted',\r\n 'mutedForeground',\r\n 'accent',\r\n 'accentForeground',\r\n 'destructive',\r\n 'destructiveForeground',\r\n 'border',\r\n 'input',\r\n 'ring',\r\n ]\r\n\r\n return names.reduce<Record<string, string>>((accumulator, name) => {\r\n const fieldState = allFields[`${modePrefix}.${name}`]\r\n const parsedValue = typeof fieldState?.value === 'string' ? fieldState.value : undefined\r\n accumulator[name] = parsedValue ?? ''\r\n return accumulator\r\n }, {})\r\n }, [allFields, modePrefix])\r\n\r\n function handleChange(nextValue: string) {\r\n setLocalValue(nextValue)\r\n setValue(nextValue)\r\n }\r\n\r\n const fieldName = path.split('.').pop() || ''\r\n const label = resolveLocalizedValue(field.label, fieldName)\r\n const description = resolveLocalizedValue(field.admin?.description, '')\r\n\r\n return (\r\n <div className=\"theme-color-picker-field\">\r\n <div className=\"field-header\">\r\n <label className=\"field-label\">{label}</label>\r\n {description && <div className=\"field-description\">{description}</div>}\r\n </div>\r\n\r\n <div className=\"color-picker-container\">\r\n <div className=\"color-input-wrapper\">\r\n <input\r\n type=\"color\"\r\n value={localValue || '#000000'}\r\n onChange={(event) => handleChange(event.target.value)}\r\n className=\"color-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n value={localValue || ''}\r\n onChange={(event) => handleChange(event.target.value)}\r\n placeholder=\"#000000\"\r\n className=\"text-input\"\r\n pattern=\"^#[0-9A-Fa-f]{6}$\"\r\n />\r\n </div>\r\n\r\n <div className=\"color-preview\" style={{ backgroundColor: localValue || '#000000' }}>\r\n <span className=\"preview-label\">{localValue || 'Not set'}</span>\r\n </div>\r\n </div>\r\n\r\n {(fieldName === 'primary' || fieldName === 'background') && (\r\n <div\r\n className=\"mini-preview\"\r\n style={{\r\n backgroundColor: colorValues.background || '#ffffff',\r\n color: colorValues.foreground || '#000000',\r\n borderColor: colorValues.border || '#e2e8f0',\r\n }}\r\n >\r\n <div\r\n className=\"preview-card\"\r\n style={{\r\n backgroundColor: colorValues.card || '#ffffff',\r\n color: colorValues.cardForeground || '#000000',\r\n borderColor: colorValues.border || '#e2e8f0',\r\n }}\r\n >\r\n <button\r\n className=\"preview-button\"\r\n style={{\r\n backgroundColor: colorValues.primary || '#0070f3',\r\n color: colorValues.primaryForeground || '#ffffff',\r\n }}\r\n >\r\n Primary Button\r\n </button>\r\n <button\r\n className=\"preview-button secondary\"\r\n style={{\r\n backgroundColor: colorValues.secondary || '#f1f5f9',\r\n color: colorValues.secondaryForeground || '#0f172a',\r\n }}\r\n >\r\n Secondary\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default ThemeColorPickerField\r\n"],"names":["useField","useFormFields","useEffect","useMemo","useState","resolveLocalizedValue","value","fallback","localized","resolved","en","cs","ThemeColorPickerField","field","path","setValue","localValue","setLocalValue","allFields","fields","mode","includes","modePrefix","colorValues","names","reduce","accumulator","name","fieldState","parsedValue","undefined","handleChange","nextValue","fieldName","split","pop","label","description","admin","div","className","input","type","onChange","event","target","placeholder","pattern","style","backgroundColor","span","background","color","foreground","borderColor","border","card","cardForeground","button","primary","primaryForeground","secondary","secondaryForeground"],"mappings":"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"}