@kilivi/payloadcms-theme-management 0.1.6 → 0.1.8
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/dist/components/ServerThemeInjector.d.ts +1 -1
- package/dist/components/ServerThemeInjector.d.ts.map +1 -1
- package/dist/components/{ServerThemeInjector.jsx → ServerThemeInjector.js} +47 -34
- package/dist/components/ServerThemeInjector.js.map +1 -0
- package/dist/components/ThemePreview.js +318 -0
- package/dist/components/ThemePreview.js.map +1 -0
- package/dist/components/typographyPreviewUtils.js +12 -17
- package/dist/components/typographyPreviewUtils.js.map +1 -1
- package/dist/constants/themeFonts.js +94 -24
- package/dist/constants/themeFonts.js.map +1 -1
- package/dist/fields/ColorPickerField.js +332 -0
- package/dist/fields/ColorPickerField.js.map +1 -0
- package/dist/fields/RadiusField.js +174 -0
- package/dist/fields/RadiusField.js.map +1 -0
- package/dist/fields/ThemeColorPickerField.js +163 -0
- package/dist/fields/ThemeColorPickerField.js.map +1 -0
- package/dist/fields/ThemePreviewField.js +558 -0
- package/dist/fields/ThemePreviewField.js.map +1 -0
- package/dist/fields/ThemeTokenSelectField.js +209 -0
- package/dist/fields/ThemeTokenSelectField.js.map +1 -0
- package/dist/fields/colorModeFields.js +167 -73
- package/dist/fields/colorModeFields.js.map +1 -1
- package/dist/fields/themeConfigurationField.d.ts +1 -1
- package/dist/fields/themeConfigurationField.d.ts.map +1 -1
- package/dist/fields/themeConfigurationField.js +224 -131
- package/dist/fields/themeConfigurationField.js.map +1 -1
- package/dist/index.d.ts +17 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -52
- package/dist/index.js.map +1 -1
- package/dist/payload-types.js +2 -2
- package/dist/payload-types.js.map +1 -1
- package/dist/plugin.d.ts +1 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +2 -1
- package/dist/plugin.js.map +1 -1
- package/dist/presets.js +66 -65
- package/dist/presets.js.map +1 -1
- package/dist/providers/Theme/index.d.ts +1 -1
- package/dist/providers/Theme/index.d.ts.map +1 -1
- package/dist/providers/Theme/{index.jsx → index.js} +61 -31
- package/dist/providers/Theme/index.js.map +1 -0
- package/dist/providers/Theme/shared.d.ts +1 -1
- package/dist/providers/Theme/shared.d.ts.map +1 -1
- package/dist/providers/Theme/shared.js +34 -9
- package/dist/providers/Theme/shared.js.map +1 -1
- package/dist/providers/Theme/themeConfig.d.ts +1 -1
- package/dist/providers/Theme/themeConfig.d.ts.map +1 -1
- package/dist/providers/Theme/themeConfig.js +37 -36
- package/dist/providers/Theme/themeConfig.js.map +1 -1
- package/dist/providers/Theme/types.js +15 -13
- package/dist/providers/Theme/types.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -2
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/resolveThemeConfiguration.d.ts +3 -3
- package/dist/utils/resolveThemeConfiguration.d.ts.map +1 -1
- package/dist/utils/resolveThemeConfiguration.js +53 -34
- package/dist/utils/resolveThemeConfiguration.js.map +1 -1
- package/dist/utils/themeAssets.d.ts +1 -1
- package/dist/utils/themeAssets.d.ts.map +1 -1
- package/dist/utils/themeAssets.js +4 -4
- package/dist/utils/themeAssets.js.map +1 -1
- package/dist/utils/themeColors.js +95 -41
- package/dist/utils/themeColors.js.map +1 -1
- package/dist/utils/themeUtils.d.ts +2 -2
- package/dist/utils/themeUtils.d.ts.map +1 -1
- package/dist/utils/themeUtils.js +32 -47
- package/dist/utils/themeUtils.js.map +1 -1
- package/package.json +13 -5
- package/dist/components/ServerThemeInjector.jsx.map +0 -1
- package/dist/components/ThemePreview.jsx +0 -231
- package/dist/components/ThemePreview.jsx.map +0 -1
- package/dist/fields/ColorPickerField.jsx +0 -205
- package/dist/fields/ColorPickerField.jsx.map +0 -1
- package/dist/fields/RadiusField.jsx +0 -123
- package/dist/fields/RadiusField.jsx.map +0 -1
- package/dist/fields/ThemeColorPickerField.jsx +0 -110
- package/dist/fields/ThemeColorPickerField.jsx.map +0 -1
- package/dist/fields/ThemePreviewField.jsx +0 -420
- package/dist/fields/ThemePreviewField.jsx.map +0 -1
- package/dist/fields/ThemeTokenSelectField.jsx +0 -151
- package/dist/fields/ThemeTokenSelectField.jsx.map +0 -1
- package/dist/providers/Theme/index.jsx.map +0 -1
|
@@ -1,34 +1,103 @@
|
|
|
1
1
|
// Theme font constants for the plugin
|
|
2
2
|
export const BODY_FONT_OPTIONS = [
|
|
3
|
-
{
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
{
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
{
|
|
4
|
+
label: 'System',
|
|
5
|
+
value: 'system-ui'
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
label: 'Inter',
|
|
9
|
+
value: 'Inter'
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
label: 'Roboto',
|
|
13
|
+
value: 'Roboto'
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
label: 'Open Sans',
|
|
17
|
+
value: 'Open Sans'
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
label: 'Lato',
|
|
21
|
+
value: 'Lato'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
label: 'Montserrat',
|
|
25
|
+
value: 'Montserrat'
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
label: 'Poppins',
|
|
29
|
+
value: 'Poppins'
|
|
30
|
+
}
|
|
10
31
|
];
|
|
11
32
|
export const HEADING_FONT_OPTIONS = [
|
|
12
|
-
{
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
{
|
|
17
|
-
|
|
33
|
+
{
|
|
34
|
+
label: 'System',
|
|
35
|
+
value: 'system-ui'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
label: 'Inter',
|
|
39
|
+
value: 'Inter'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
label: 'Playfair Display',
|
|
43
|
+
value: 'Playfair Display'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: 'Merriweather',
|
|
47
|
+
value: 'Merriweather'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
label: 'Montserrat',
|
|
51
|
+
value: 'Montserrat'
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
label: 'Raleway',
|
|
55
|
+
value: 'Raleway'
|
|
56
|
+
}
|
|
18
57
|
];
|
|
19
58
|
export const BASE_FONT_SIZE_OPTIONS = [
|
|
20
|
-
{
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{
|
|
59
|
+
{
|
|
60
|
+
label: '14px',
|
|
61
|
+
value: '14'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
label: '15px',
|
|
65
|
+
value: '15'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
label: '16px',
|
|
69
|
+
value: '16'
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
label: '17px',
|
|
73
|
+
value: '17'
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
label: '18px',
|
|
77
|
+
value: '18'
|
|
78
|
+
}
|
|
25
79
|
];
|
|
26
80
|
export const LINE_HEIGHT_OPTIONS = [
|
|
27
|
-
{
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{
|
|
81
|
+
{
|
|
82
|
+
label: '1.4',
|
|
83
|
+
value: '1.4'
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: '1.5',
|
|
87
|
+
value: '1.5'
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
label: '1.6',
|
|
91
|
+
value: '1.6'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
label: '1.7',
|
|
95
|
+
value: '1.7'
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
label: '1.8',
|
|
99
|
+
value: '1.8'
|
|
100
|
+
}
|
|
32
101
|
];
|
|
33
102
|
export const FONT_VALUE_TO_CSS = {
|
|
34
103
|
'system-ui': 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
|
|
@@ -40,6 +109,7 @@ export const FONT_VALUE_TO_CSS = {
|
|
|
40
109
|
'Poppins': '"Poppins", sans-serif',
|
|
41
110
|
'Playfair Display': '"Playfair Display", serif',
|
|
42
111
|
'Merriweather': '"Merriweather", serif',
|
|
43
|
-
'Raleway': '"Raleway", sans-serif'
|
|
112
|
+
'Raleway': '"Raleway", sans-serif'
|
|
44
113
|
};
|
|
114
|
+
|
|
45
115
|
//# sourceMappingURL=themeFonts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/constants/themeFonts.ts"],"sourcesContent":["// Theme font constants for the plugin\nexport const BODY_FONT_OPTIONS = [\n { label: 'System', value: 'system-ui' },\n { label: 'Inter', value: 'Inter' },\n { label: 'Roboto', value: 'Roboto' },\n { label: 'Open Sans', value: 'Open Sans' },\n { label: 'Lato', value: 'Lato' },\n { label: 'Montserrat', value: 'Montserrat' },\n { label: 'Poppins', value: 'Poppins' },\n] as const;\n\nexport const HEADING_FONT_OPTIONS = [\n { label: 'System', value: 'system-ui' },\n { label: 'Inter', value: 'Inter' },\n { label: 'Playfair Display', value: 'Playfair Display' },\n { label: 'Merriweather', value: 'Merriweather' },\n { label: 'Montserrat', value: 'Montserrat' },\n { label: 'Raleway', value: 'Raleway' },\n] as const;\n\nexport const BASE_FONT_SIZE_OPTIONS = [\n { label: '14px', value: '14' },\n { label: '15px', value: '15' },\n { label: '16px', value: '16' },\n { label: '17px', value: '17' },\n { label: '18px', value: '18' },\n] as const;\n\nexport const LINE_HEIGHT_OPTIONS = [\n { label: '1.4', value: '1.4' },\n { label: '1.5', value: '1.5' },\n { label: '1.6', value: '1.6' },\n { label: '1.7', value: '1.7' },\n { label: '1.8', value: '1.8' },\n] as const;\n\nexport const FONT_VALUE_TO_CSS: Record<string, string> = {\n 'system-ui': 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n 'Inter': '\"Inter\", sans-serif',\n 'Roboto': '\"Roboto\", sans-serif',\n 'Open Sans': '\"Open Sans\", sans-serif',\n 'Lato': '\"Lato\", sans-serif',\n 'Montserrat': '\"Montserrat\", sans-serif',\n 'Poppins': '\"Poppins\", sans-serif',\n 'Playfair Display': '\"Playfair Display\", serif',\n 'Merriweather': '\"Merriweather\", serif',\n 'Raleway': '\"Raleway\", sans-serif',\n};\n"],"names":["BODY_FONT_OPTIONS","label","value","HEADING_FONT_OPTIONS","BASE_FONT_SIZE_OPTIONS","LINE_HEIGHT_OPTIONS","FONT_VALUE_TO_CSS"],"mappings":"AAAA,sCAAsC;AACtC,OAAO,MAAMA,oBAAoB;IAC/B;QAAEC,OAAO;QAAUC,OAAO;IAAY;IACtC;QAAED,OAAO;QAASC,OAAO;IAAQ;IACjC;QAAED,OAAO;QAAUC,OAAO;IAAS;IACnC;QAAED,OAAO;QAAaC,OAAO;IAAY;IACzC;QAAED,OAAO;QAAQC,OAAO;IAAO;IAC/B;QAAED,OAAO;QAAcC,OAAO;IAAa;IAC3C;QAAED,OAAO;QAAWC,OAAO;IAAU;CACtC,CAAU;AAEX,OAAO,MAAMC,uBAAuB;IAClC;QAAEF,OAAO;QAAUC,OAAO;IAAY;IACtC;QAAED,OAAO;QAASC,OAAO;IAAQ;IACjC;QAAED,OAAO;QAAoBC,OAAO;IAAmB;IACvD;QAAED,OAAO;QAAgBC,OAAO;IAAe;IAC/C;QAAED,OAAO;QAAcC,OAAO;IAAa;IAC3C;QAAED,OAAO;QAAWC,OAAO;IAAU;CACtC,CAAU;AAEX,OAAO,MAAME,yBAAyB;IACpC;QAAEH,OAAO;QAAQC,OAAO;IAAK;IAC7B;QAAED,OAAO;QAAQC,OAAO;IAAK;IAC7B;QAAED,OAAO;QAAQC,OAAO;IAAK;IAC7B;QAAED,OAAO;QAAQC,OAAO;IAAK;IAC7B;QAAED,OAAO;QAAQC,OAAO;IAAK;CAC9B,CAAU;AAEX,OAAO,MAAMG,sBAAsB;IACjC;QAAEJ,OAAO;QAAOC,OAAO;IAAM;IAC7B;QAAED,OAAO;QAAOC,OAAO;IAAM;IAC7B;QAAED,OAAO;QAAOC,OAAO;IAAM;IAC7B;QAAED,OAAO;QAAOC,OAAO;IAAM;IAC7B;QAAED,OAAO;QAAOC,OAAO;IAAM;CAC9B,CAAU;AAEX,OAAO,MAAMI,oBAA4C;IACvD,aAAa;IACb,SAAS;IACT,UAAU;IACV,aAAa;IACb,QAAQ;IACR,cAAc;IACd,WAAW;IACX,oBAAoB;IACpB,gBAAgB;IAChB,WAAW;AACb,EAAE"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useField } from '@payloadcms/ui';
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
5
|
+
const colorPresets = {
|
|
6
|
+
'Theme Colors': [
|
|
7
|
+
'#3b82f6',
|
|
8
|
+
'#1e40af',
|
|
9
|
+
'#b45309',
|
|
10
|
+
'#78716c',
|
|
11
|
+
'#8b5cf6',
|
|
12
|
+
'#f97316'
|
|
13
|
+
],
|
|
14
|
+
'Common Colors': [
|
|
15
|
+
'#ef4444',
|
|
16
|
+
'#10b981',
|
|
17
|
+
'#f59e0b',
|
|
18
|
+
'#06b6d4',
|
|
19
|
+
'#ec4899',
|
|
20
|
+
'#6b7280'
|
|
21
|
+
],
|
|
22
|
+
'Neutral Tones': [
|
|
23
|
+
'#000000',
|
|
24
|
+
'#1f2937',
|
|
25
|
+
'#6b7280',
|
|
26
|
+
'#d1d5db',
|
|
27
|
+
'#f3f4f6',
|
|
28
|
+
'#ffffff'
|
|
29
|
+
]
|
|
30
|
+
};
|
|
31
|
+
function resolveLocalizedValue(value) {
|
|
32
|
+
if (typeof value === 'string') {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
if (typeof value === 'object' && value !== null) {
|
|
36
|
+
const localized = value;
|
|
37
|
+
const fallback = localized.en ?? localized.cs ?? localized[''];
|
|
38
|
+
return typeof fallback === 'string' ? fallback : '';
|
|
39
|
+
}
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
export default function ColorPickerField(props) {
|
|
43
|
+
const { field, path } = props;
|
|
44
|
+
const { value = '#000000', setValue } = useField({
|
|
45
|
+
path
|
|
46
|
+
});
|
|
47
|
+
const [isPickerOpen, setIsPickerOpen] = useState(false);
|
|
48
|
+
const pickerRef = useRef(null);
|
|
49
|
+
const fieldLabel = resolveLocalizedValue(field.label);
|
|
50
|
+
const fieldDescription = resolveLocalizedValue(field.admin?.description);
|
|
51
|
+
const placeholder = resolveLocalizedValue(field.admin?.placeholder) || 'e.g., #3b82f6, hsl(...)';
|
|
52
|
+
const handleColorChange = useCallback((color)=>{
|
|
53
|
+
setValue(color);
|
|
54
|
+
}, [
|
|
55
|
+
setValue
|
|
56
|
+
]);
|
|
57
|
+
const handleInputChange = useCallback((event)=>{
|
|
58
|
+
handleColorChange(event.target.value);
|
|
59
|
+
}, [
|
|
60
|
+
handleColorChange
|
|
61
|
+
]);
|
|
62
|
+
const togglePicker = useCallback(()=>{
|
|
63
|
+
setIsPickerOpen((previous)=>!previous);
|
|
64
|
+
}, []);
|
|
65
|
+
useEffect(()=>{
|
|
66
|
+
if (!isPickerOpen) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
function handleClickOutside(event) {
|
|
70
|
+
if (!pickerRef.current) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!pickerRef.current.contains(event.target)) {
|
|
74
|
+
setIsPickerOpen(false);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
78
|
+
return ()=>{
|
|
79
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
80
|
+
};
|
|
81
|
+
}, [
|
|
82
|
+
isPickerOpen
|
|
83
|
+
]);
|
|
84
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
85
|
+
className: "field-type color-picker-field",
|
|
86
|
+
style: {
|
|
87
|
+
position: 'relative'
|
|
88
|
+
},
|
|
89
|
+
children: [
|
|
90
|
+
fieldLabel && /*#__PURE__*/ _jsxs("label", {
|
|
91
|
+
htmlFor: path,
|
|
92
|
+
className: "field-label",
|
|
93
|
+
style: {
|
|
94
|
+
display: 'block',
|
|
95
|
+
marginBottom: '8px',
|
|
96
|
+
fontSize: '13px',
|
|
97
|
+
fontWeight: 600
|
|
98
|
+
},
|
|
99
|
+
children: [
|
|
100
|
+
fieldLabel,
|
|
101
|
+
field.required && /*#__PURE__*/ _jsx("span", {
|
|
102
|
+
className: "required",
|
|
103
|
+
style: {
|
|
104
|
+
color: 'var(--theme-error-500)',
|
|
105
|
+
marginLeft: '4px'
|
|
106
|
+
},
|
|
107
|
+
children: "*"
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
}),
|
|
111
|
+
fieldDescription && /*#__PURE__*/ _jsx("div", {
|
|
112
|
+
className: "field-description",
|
|
113
|
+
style: {
|
|
114
|
+
marginBottom: '8px',
|
|
115
|
+
fontSize: '13px',
|
|
116
|
+
color: 'var(--theme-elevation-500)',
|
|
117
|
+
lineHeight: 1.5
|
|
118
|
+
},
|
|
119
|
+
children: fieldDescription
|
|
120
|
+
}),
|
|
121
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
122
|
+
className: "color-picker-input-group",
|
|
123
|
+
style: {
|
|
124
|
+
display: 'flex',
|
|
125
|
+
alignItems: 'center',
|
|
126
|
+
gap: '8px'
|
|
127
|
+
},
|
|
128
|
+
children: [
|
|
129
|
+
/*#__PURE__*/ _jsx("button", {
|
|
130
|
+
type: "button",
|
|
131
|
+
onClick: togglePicker,
|
|
132
|
+
className: "color-preview-button",
|
|
133
|
+
style: {
|
|
134
|
+
width: '40px',
|
|
135
|
+
height: '40px',
|
|
136
|
+
borderRadius: '6px',
|
|
137
|
+
border: '2px solid #e5e7eb',
|
|
138
|
+
backgroundColor: value || '#ffffff',
|
|
139
|
+
cursor: 'pointer',
|
|
140
|
+
position: 'relative',
|
|
141
|
+
display: 'flex',
|
|
142
|
+
alignItems: 'center',
|
|
143
|
+
justifyContent: 'center'
|
|
144
|
+
},
|
|
145
|
+
title: value ? `Current color: ${value}` : 'Select a color',
|
|
146
|
+
children: !value && /*#__PURE__*/ _jsx("span", {
|
|
147
|
+
style: {
|
|
148
|
+
fontSize: '20px',
|
|
149
|
+
color: '#9ca3af'
|
|
150
|
+
},
|
|
151
|
+
children: "?"
|
|
152
|
+
})
|
|
153
|
+
}),
|
|
154
|
+
/*#__PURE__*/ _jsx("input", {
|
|
155
|
+
id: path,
|
|
156
|
+
type: "text",
|
|
157
|
+
value: value || '',
|
|
158
|
+
onChange: handleInputChange,
|
|
159
|
+
placeholder: placeholder,
|
|
160
|
+
style: {
|
|
161
|
+
flex: 1,
|
|
162
|
+
padding: '8px 12px',
|
|
163
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
164
|
+
borderRadius: '6px',
|
|
165
|
+
fontSize: '14px',
|
|
166
|
+
fontFamily: 'monospace',
|
|
167
|
+
backgroundColor: 'var(--theme-elevation-0)',
|
|
168
|
+
color: 'var(--theme-elevation-1000)'
|
|
169
|
+
}
|
|
170
|
+
}),
|
|
171
|
+
/*#__PURE__*/ _jsx("input", {
|
|
172
|
+
type: "color",
|
|
173
|
+
value: value?.startsWith('#') ? value : '#3b82f6',
|
|
174
|
+
onChange: handleInputChange,
|
|
175
|
+
title: "Pick a color",
|
|
176
|
+
style: {
|
|
177
|
+
width: '40px',
|
|
178
|
+
height: '40px',
|
|
179
|
+
border: 'none',
|
|
180
|
+
borderRadius: '6px',
|
|
181
|
+
cursor: 'pointer'
|
|
182
|
+
}
|
|
183
|
+
})
|
|
184
|
+
]
|
|
185
|
+
}),
|
|
186
|
+
isPickerOpen && /*#__PURE__*/ _jsxs("div", {
|
|
187
|
+
ref: pickerRef,
|
|
188
|
+
className: "color-presets",
|
|
189
|
+
style: {
|
|
190
|
+
position: 'absolute',
|
|
191
|
+
top: '100%',
|
|
192
|
+
left: 0,
|
|
193
|
+
right: 0,
|
|
194
|
+
zIndex: 1000,
|
|
195
|
+
marginTop: '4px',
|
|
196
|
+
padding: '16px',
|
|
197
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
198
|
+
borderRadius: '8px',
|
|
199
|
+
backgroundColor: 'var(--theme-elevation-0)',
|
|
200
|
+
boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
|
|
201
|
+
maxHeight: '300px',
|
|
202
|
+
overflowY: 'auto'
|
|
203
|
+
},
|
|
204
|
+
children: [
|
|
205
|
+
/*#__PURE__*/ _jsx("div", {
|
|
206
|
+
style: {
|
|
207
|
+
marginBottom: '16px',
|
|
208
|
+
fontSize: '14px',
|
|
209
|
+
fontWeight: 600,
|
|
210
|
+
color: 'var(--theme-elevation-800)'
|
|
211
|
+
},
|
|
212
|
+
children: "🎨 Professional Color Picker"
|
|
213
|
+
}),
|
|
214
|
+
Object.entries(colorPresets).map(([groupName, colors])=>/*#__PURE__*/ _jsxs("div", {
|
|
215
|
+
style: {
|
|
216
|
+
marginBottom: '16px'
|
|
217
|
+
},
|
|
218
|
+
children: [
|
|
219
|
+
/*#__PURE__*/ _jsx("div", {
|
|
220
|
+
style: {
|
|
221
|
+
marginBottom: '8px',
|
|
222
|
+
fontSize: '12px',
|
|
223
|
+
fontWeight: 500,
|
|
224
|
+
color: 'var(--theme-elevation-600)',
|
|
225
|
+
textTransform: 'uppercase',
|
|
226
|
+
letterSpacing: '0.05em'
|
|
227
|
+
},
|
|
228
|
+
children: groupName
|
|
229
|
+
}),
|
|
230
|
+
/*#__PURE__*/ _jsx("div", {
|
|
231
|
+
style: {
|
|
232
|
+
display: 'grid',
|
|
233
|
+
gridTemplateColumns: 'repeat(6, 1fr)',
|
|
234
|
+
gap: '6px'
|
|
235
|
+
},
|
|
236
|
+
children: colors.map((color)=>/*#__PURE__*/ _jsx("button", {
|
|
237
|
+
type: "button",
|
|
238
|
+
onClick: ()=>handleColorChange(color),
|
|
239
|
+
style: {
|
|
240
|
+
width: '36px',
|
|
241
|
+
height: '36px',
|
|
242
|
+
borderRadius: '6px',
|
|
243
|
+
border: value === color ? '3px solid var(--theme-primary-500)' : '1px solid var(--theme-elevation-150)',
|
|
244
|
+
backgroundColor: color,
|
|
245
|
+
cursor: 'pointer',
|
|
246
|
+
transition: 'all 0.2s ease',
|
|
247
|
+
position: 'relative',
|
|
248
|
+
overflow: 'hidden',
|
|
249
|
+
boxShadow: value === color ? '0 0 0 2px var(--theme-primary-200)' : '0 1px 3px rgba(0, 0, 0, 0.1)'
|
|
250
|
+
},
|
|
251
|
+
title: `${color} - Click to select`,
|
|
252
|
+
onMouseEnter: (event)=>{
|
|
253
|
+
event.currentTarget.style.transform = 'scale(1.1)';
|
|
254
|
+
},
|
|
255
|
+
onMouseLeave: (event)=>{
|
|
256
|
+
event.currentTarget.style.transform = 'scale(1)';
|
|
257
|
+
},
|
|
258
|
+
children: color === '#ffffff' && /*#__PURE__*/ _jsx("div", {
|
|
259
|
+
style: {
|
|
260
|
+
position: 'absolute',
|
|
261
|
+
inset: 0,
|
|
262
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
263
|
+
borderRadius: 'inherit'
|
|
264
|
+
}
|
|
265
|
+
})
|
|
266
|
+
}, color))
|
|
267
|
+
})
|
|
268
|
+
]
|
|
269
|
+
}, groupName)),
|
|
270
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
271
|
+
style: {
|
|
272
|
+
marginTop: '16px',
|
|
273
|
+
paddingTop: '16px',
|
|
274
|
+
borderTop: '1px solid var(--theme-elevation-100)'
|
|
275
|
+
},
|
|
276
|
+
children: [
|
|
277
|
+
/*#__PURE__*/ _jsx("div", {
|
|
278
|
+
style: {
|
|
279
|
+
marginBottom: '8px',
|
|
280
|
+
fontSize: '12px',
|
|
281
|
+
fontWeight: 500,
|
|
282
|
+
color: 'var(--theme-elevation-600)'
|
|
283
|
+
},
|
|
284
|
+
children: "CUSTOM COLOR"
|
|
285
|
+
}),
|
|
286
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
287
|
+
style: {
|
|
288
|
+
display: 'flex',
|
|
289
|
+
gap: '8px',
|
|
290
|
+
alignItems: 'center'
|
|
291
|
+
},
|
|
292
|
+
children: [
|
|
293
|
+
/*#__PURE__*/ _jsx("input", {
|
|
294
|
+
type: "color",
|
|
295
|
+
value: value?.startsWith('#') ? value : '#3b82f6',
|
|
296
|
+
onChange: handleInputChange,
|
|
297
|
+
style: {
|
|
298
|
+
width: '36px',
|
|
299
|
+
height: '36px',
|
|
300
|
+
border: 'none',
|
|
301
|
+
borderRadius: '6px',
|
|
302
|
+
cursor: 'pointer'
|
|
303
|
+
}
|
|
304
|
+
}),
|
|
305
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
306
|
+
style: {
|
|
307
|
+
fontSize: '11px',
|
|
308
|
+
color: '#9ca3af',
|
|
309
|
+
lineHeight: 1.3
|
|
310
|
+
},
|
|
311
|
+
children: [
|
|
312
|
+
/*#__PURE__*/ _jsx("div", {
|
|
313
|
+
children: /*#__PURE__*/ _jsx("strong", {
|
|
314
|
+
children: "Formats:"
|
|
315
|
+
})
|
|
316
|
+
}),
|
|
317
|
+
/*#__PURE__*/ _jsx("div", {
|
|
318
|
+
children: "Hex, RGB, HSL, CSS vars"
|
|
319
|
+
})
|
|
320
|
+
]
|
|
321
|
+
})
|
|
322
|
+
]
|
|
323
|
+
})
|
|
324
|
+
]
|
|
325
|
+
})
|
|
326
|
+
]
|
|
327
|
+
})
|
|
328
|
+
]
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
//# sourceMappingURL=ColorPickerField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fields/ColorPickerField.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport type { TextFieldClientProps } from 'payload'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nconst colorPresets: Record<string, string[]> = {\n 'Theme Colors': ['#3b82f6', '#1e40af', '#b45309', '#78716c', '#8b5cf6', '#f97316'],\n 'Common Colors': ['#ef4444', '#10b981', '#f59e0b', '#06b6d4', '#ec4899', '#6b7280'],\n 'Neutral Tones': ['#000000', '#1f2937', '#6b7280', '#d1d5db', '#f3f4f6', '#ffffff'],\n}\n\nfunction resolveLocalizedValue(value: unknown): string {\n if (typeof value === 'string') {\n return value\n }\n\n if (typeof value === 'object' && value !== null) {\n const localized = value as Record<string, unknown>\n const fallback = localized.en ?? localized.cs ?? localized['']\n return typeof fallback === 'string' ? fallback : ''\n }\n\n return ''\n}\n\nexport default function ColorPickerField(props: TextFieldClientProps) {\n const { field, path } = props\n const { value = '#000000', setValue } = useField<string>({ path })\n const [isPickerOpen, setIsPickerOpen] = useState(false)\n const pickerRef = useRef<HTMLDivElement>(null)\n\n const fieldLabel = resolveLocalizedValue(field.label)\n const fieldDescription = resolveLocalizedValue(field.admin?.description)\n const placeholder = resolveLocalizedValue(field.admin?.placeholder) || 'e.g., #3b82f6, hsl(...)'\n\n const handleColorChange = useCallback(\n (color: string) => {\n setValue(color)\n },\n [setValue],\n )\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n handleColorChange(event.target.value)\n },\n [handleColorChange],\n )\n\n const togglePicker = useCallback(() => {\n setIsPickerOpen((previous) => !previous)\n }, [])\n\n useEffect(() => {\n if (!isPickerOpen) {\n return\n }\n\n function handleClickOutside(event: MouseEvent) {\n if (!pickerRef.current) {\n return\n }\n\n if (!pickerRef.current.contains(event.target as Node)) {\n setIsPickerOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isPickerOpen])\n\n return (\n <div className=\"field-type color-picker-field\" style={{ position: 'relative' }}>\n {fieldLabel && (\n <label\n htmlFor={path}\n className=\"field-label\"\n style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600 }}\n >\n {fieldLabel}\n {field.required && (\n <span\n className=\"required\"\n style={{ color: 'var(--theme-error-500)', marginLeft: '4px' }}\n >\n *\n </span>\n )}\n </label>\n )}\n\n {fieldDescription && (\n <div\n className=\"field-description\"\n style={{\n marginBottom: '8px',\n fontSize: '13px',\n color: 'var(--theme-elevation-500)',\n lineHeight: 1.5,\n }}\n >\n {fieldDescription}\n </div>\n )}\n\n <div\n className=\"color-picker-input-group\"\n style={{ display: 'flex', alignItems: 'center', gap: '8px' }}\n >\n <button\n type=\"button\"\n onClick={togglePicker}\n className=\"color-preview-button\"\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '6px',\n border: '2px solid #e5e7eb',\n backgroundColor: value || '#ffffff',\n cursor: 'pointer',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n title={value ? `Current color: ${value}` : 'Select a color'}\n >\n {!value && <span style={{ fontSize: '20px', color: '#9ca3af' }}>?</span>}\n </button>\n\n <input\n id={path}\n type=\"text\"\n value={value || ''}\n onChange={handleInputChange}\n placeholder={placeholder}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '6px',\n fontSize: '14px',\n fontFamily: 'monospace',\n backgroundColor: 'var(--theme-elevation-0)',\n color: 'var(--theme-elevation-1000)',\n }}\n />\n\n <input\n type=\"color\"\n value={value?.startsWith('#') ? value : '#3b82f6'}\n onChange={handleInputChange}\n title=\"Pick a color\"\n style={{\n width: '40px',\n height: '40px',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n />\n </div>\n\n {isPickerOpen && (\n <div\n ref={pickerRef}\n className=\"color-presets\"\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n zIndex: 1000,\n marginTop: '4px',\n padding: '16px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '8px',\n backgroundColor: 'var(--theme-elevation-0)',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n maxHeight: '300px',\n overflowY: 'auto',\n }}\n >\n <div\n style={{\n marginBottom: '16px',\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--theme-elevation-800)',\n }}\n >\n 🎨 Professional Color Picker\n </div>\n\n {Object.entries(colorPresets).map(([groupName, colors]) => (\n <div key={groupName} style={{ marginBottom: '16px' }}>\n <div\n style={{\n marginBottom: '8px',\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--theme-elevation-600)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n {groupName}\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(6, 1fr)', gap: '6px' }}>\n {colors.map((color) => (\n <button\n key={color}\n type=\"button\"\n onClick={() => handleColorChange(color)}\n style={{\n width: '36px',\n height: '36px',\n borderRadius: '6px',\n border:\n value === color\n ? '3px solid var(--theme-primary-500)'\n : '1px solid var(--theme-elevation-150)',\n backgroundColor: color,\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n position: 'relative',\n overflow: 'hidden',\n boxShadow:\n value === color\n ? '0 0 0 2px var(--theme-primary-200)'\n : '0 1px 3px rgba(0, 0, 0, 0.1)',\n }}\n title={`${color} - Click to select`}\n onMouseEnter={(event) => {\n event.currentTarget.style.transform = 'scale(1.1)'\n }}\n onMouseLeave={(event) => {\n event.currentTarget.style.transform = 'scale(1)'\n }}\n >\n {color === '#ffffff' && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'inherit',\n }}\n />\n )}\n </button>\n ))}\n </div>\n </div>\n ))}\n\n <div\n style={{\n marginTop: '16px',\n paddingTop: '16px',\n borderTop: '1px solid var(--theme-elevation-100)',\n }}\n >\n <div\n style={{\n marginBottom: '8px',\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--theme-elevation-600)',\n }}\n >\n CUSTOM COLOR\n </div>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <input\n type=\"color\"\n value={value?.startsWith('#') ? value : '#3b82f6'}\n onChange={handleInputChange}\n style={{\n width: '36px',\n height: '36px',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n />\n <div style={{ fontSize: '11px', color: '#9ca3af', lineHeight: 1.3 }}>\n <div>\n <strong>Formats:</strong>\n </div>\n <div>Hex, RGB, HSL, CSS vars</div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],"names":["useField","useCallback","useEffect","useRef","useState","colorPresets","resolveLocalizedValue","value","localized","fallback","en","cs","ColorPickerField","props","field","path","setValue","isPickerOpen","setIsPickerOpen","pickerRef","fieldLabel","label","fieldDescription","admin","description","placeholder","handleColorChange","color","handleInputChange","event","target","togglePicker","previous","handleClickOutside","current","contains","document","addEventListener","removeEventListener","div","className","style","position","htmlFor","display","marginBottom","fontSize","fontWeight","required","span","marginLeft","lineHeight","alignItems","gap","button","type","onClick","width","height","borderRadius","border","backgroundColor","cursor","justifyContent","title","input","id","onChange","flex","padding","fontFamily","startsWith","ref","top","left","right","zIndex","marginTop","boxShadow","maxHeight","overflowY","Object","entries","map","groupName","colors","textTransform","letterSpacing","gridTemplateColumns","transition","overflow","onMouseEnter","currentTarget","transform","onMouseLeave","inset","paddingTop","borderTop","strong"],"mappings":"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"}
|