@webiny/lexical-editor-actions 6.4.5 → 6.6.0-alpha.0
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.
|
@@ -1,110 +1,16 @@
|
|
|
1
1
|
import react, { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
-
import styled from "@emotion/styled";
|
|
3
|
-
import { css } from "@emotion/css";
|
|
4
2
|
import { ChromePicker } from "react-color";
|
|
5
3
|
import { Tooltip } from "@webiny/admin-ui";
|
|
6
4
|
import { ReactComponent } from "./round-color_lens-24px.js";
|
|
7
5
|
import { useRichTextEditor } from "@webiny/lexical-editor";
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
padding: 15,
|
|
15
|
-
backgroundColor: "#fff"
|
|
16
|
-
});
|
|
17
|
-
const ColorBox = styled("div")({
|
|
18
|
-
cursor: "pointer",
|
|
19
|
-
width: 40,
|
|
20
|
-
height: 40,
|
|
21
|
-
borderRadius: "50%",
|
|
22
|
-
margin: 5,
|
|
23
|
-
border: "1px solid var(--mdc-theme-on-background)",
|
|
24
|
-
padding: 3,
|
|
25
|
-
boxSizing: "content-box"
|
|
26
|
-
});
|
|
27
|
-
const Color = styled("button")({
|
|
28
|
-
cursor: "pointer",
|
|
29
|
-
width: 40,
|
|
30
|
-
height: 40,
|
|
31
|
-
transition: "transform 0.1s, border 0.2s",
|
|
32
|
-
borderColor: "transparent",
|
|
33
|
-
display: "flex",
|
|
34
|
-
alignItems: "center",
|
|
35
|
-
borderRadius: "50%",
|
|
36
|
-
"&::after": {
|
|
37
|
-
transition: "opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1)",
|
|
38
|
-
content: '""',
|
|
39
|
-
position: "absolute",
|
|
40
|
-
top: 0,
|
|
41
|
-
left: 0,
|
|
42
|
-
width: "100%",
|
|
43
|
-
height: "100%",
|
|
44
|
-
zIndex: -1,
|
|
45
|
-
opacity: 0
|
|
46
|
-
},
|
|
47
|
-
"&:hover": {
|
|
48
|
-
transform: "scale(1.1)",
|
|
49
|
-
boxShadow: "0 0.25rem 0.125rem 0 rgba(0,0,0,0.05)",
|
|
50
|
-
"&::after": {
|
|
51
|
-
opacity: 1
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
const iconPaletteStyle = css({
|
|
56
|
-
height: 20,
|
|
57
|
-
width: "100%",
|
|
58
|
-
marginTop: 1,
|
|
59
|
-
color: "var(--mdc-theme-secondary)"
|
|
60
|
-
});
|
|
61
|
-
const COLORS = {
|
|
62
|
-
lightGray: "hsla(0, 0%, 97%, 1)",
|
|
63
|
-
gray: "hsla(300, 2%, 92%, 1)",
|
|
64
|
-
darkGray: "hsla(0, 0%, 70%, 1)",
|
|
65
|
-
darkestGray: "hsla(0, 0%, 20%, 1)",
|
|
66
|
-
black: "hsla(208, 100%, 5%, 1)"
|
|
67
|
-
};
|
|
68
|
-
const styles = {
|
|
69
|
-
selectedColor: css({
|
|
70
|
-
boxShadow: "inset 0px 0px 0px 10px var(--mdc-theme-secondary)",
|
|
71
|
-
button: {
|
|
72
|
-
border: "5px solid var(--mdc-theme-surface)"
|
|
73
|
-
}
|
|
74
|
-
}),
|
|
75
|
-
button: css({
|
|
76
|
-
cursor: "pointer",
|
|
77
|
-
height: 30,
|
|
78
|
-
boxSizing: "border-box",
|
|
79
|
-
"&:hover:not(:disabled)": {
|
|
80
|
-
backgroundColor: COLORS.gray
|
|
81
|
-
},
|
|
82
|
-
"&:focus:not(:disabled)": {
|
|
83
|
-
outline: "none"
|
|
84
|
-
},
|
|
85
|
-
"&:disabled": {
|
|
86
|
-
opacity: 0.5,
|
|
87
|
-
cursor: "not-allowed"
|
|
88
|
-
},
|
|
89
|
-
"& svg": {
|
|
90
|
-
width: 16,
|
|
91
|
-
height: 16
|
|
92
|
-
}
|
|
93
|
-
}),
|
|
94
|
-
color: css({
|
|
95
|
-
width: "40px",
|
|
96
|
-
height: "100%"
|
|
97
|
-
})
|
|
98
|
-
};
|
|
99
|
-
const chromePickerStyle = css({
|
|
100
|
-
boxShadow: "none !important",
|
|
101
|
-
marginTop: "15px",
|
|
102
|
-
marginLeft: "-15px",
|
|
103
|
-
width: "240px !important"
|
|
104
|
-
});
|
|
6
|
+
const colorPickerClass = "relative flex flex-wrap justify-start w-[240px] p-[15px] bg-white";
|
|
7
|
+
const colorBoxClass = "cursor-pointer w-10 h-10 rounded-full m-[5px] border border-solid border-[color:var(--mdc-theme-on-background)] p-[3px] box-content";
|
|
8
|
+
const selectedColorClass = "shadow-[inset_0px_0px_0px_10px_var(--mdc-theme-secondary)] [&_button]:border-[5px] [&_button]:border-solid [&_button]:border-[color:var(--mdc-theme-surface)]";
|
|
9
|
+
const colorButtonClass = "cursor-pointer w-10 h-10 flex items-center rounded-full border-transparent [transition:transform_0.1s,_border_0.2s] after:content-[''] after:absolute after:top-0 after:left-0 after:w-full after:h-full after:-z-10 after:opacity-0 after:[transition:opacity_0.5s_cubic-bezier(0.165,0.84,0.44,1)] hover:scale-110 hover:shadow-[0_0.25rem_0.125rem_0_rgba(0,0,0,0.05)] hover:after:opacity-100";
|
|
10
|
+
const iconPaletteClass = "h-5 w-full mt-px text-[color:var(--mdc-theme-secondary)]";
|
|
11
|
+
const chromePickerClass = "w-[270px]! m-[15px_-15px_-15px_-15px]";
|
|
105
12
|
const showPickerStyle = {
|
|
106
|
-
display: "block"
|
|
107
|
-
width: "100%"
|
|
13
|
+
display: "block"
|
|
108
14
|
};
|
|
109
15
|
const hidePickerStyle = {
|
|
110
16
|
display: "none"
|
|
@@ -148,13 +54,16 @@ const LexicalColorPicker = ({ value, onChange, onChangeComplete, allowCustomColo
|
|
|
148
54
|
themeColors,
|
|
149
55
|
value
|
|
150
56
|
]);
|
|
151
|
-
return /*#__PURE__*/ react.createElement(
|
|
57
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
58
|
+
className: colorPickerClass
|
|
59
|
+
}, themeColors.map((color)=>/*#__PURE__*/ react.createElement("div", {
|
|
152
60
|
key: color.id,
|
|
153
|
-
className: color.id === value ?
|
|
61
|
+
className: color.id === value ? `${colorBoxClass} ${selectedColorClass}` : colorBoxClass
|
|
154
62
|
}, /*#__PURE__*/ react.createElement(Tooltip, {
|
|
155
63
|
content: /*#__PURE__*/ react.createElement("span", null, color.label),
|
|
156
64
|
side: "bottom",
|
|
157
|
-
trigger: /*#__PURE__*/ react.createElement(
|
|
65
|
+
trigger: /*#__PURE__*/ react.createElement("button", {
|
|
66
|
+
className: colorButtonClass,
|
|
158
67
|
style: {
|
|
159
68
|
backgroundColor: color.value
|
|
160
69
|
},
|
|
@@ -162,23 +71,24 @@ const LexicalColorPicker = ({ value, onChange, onChangeComplete, allowCustomColo
|
|
|
162
71
|
onChangeComplete(color.value, color.id);
|
|
163
72
|
}
|
|
164
73
|
})
|
|
165
|
-
}))), allowCustomColor ? /*#__PURE__*/ react.createElement(
|
|
166
|
-
className: value && !isThemeColor ?
|
|
74
|
+
}))), allowCustomColor ? /*#__PURE__*/ react.createElement("div", {
|
|
75
|
+
className: value && !isThemeColor ? `${colorBoxClass} ${selectedColorClass}` : colorBoxClass
|
|
167
76
|
}, /*#__PURE__*/ react.createElement(Tooltip, {
|
|
168
77
|
content: /*#__PURE__*/ react.createElement("span", null, "Color picker"),
|
|
169
78
|
side: "bottom",
|
|
170
|
-
trigger: /*#__PURE__*/ react.createElement(
|
|
79
|
+
trigger: /*#__PURE__*/ react.createElement("button", {
|
|
80
|
+
className: colorButtonClass,
|
|
171
81
|
style: {
|
|
172
82
|
backgroundColor: isThemeColor ? "#fff" : value
|
|
173
83
|
},
|
|
174
84
|
onClick: togglePicker
|
|
175
85
|
}, /*#__PURE__*/ react.createElement(ReactComponent, {
|
|
176
|
-
className:
|
|
86
|
+
className: iconPaletteClass
|
|
177
87
|
}))
|
|
178
88
|
})) : null, /*#__PURE__*/ react.createElement("div", {
|
|
179
89
|
style: showPicker ? showPickerStyle : hidePickerStyle
|
|
180
90
|
}, /*#__PURE__*/ react.createElement(ChromePicker, {
|
|
181
|
-
className:
|
|
91
|
+
className: chromePickerClass,
|
|
182
92
|
color: actualSelectedColor,
|
|
183
93
|
disableAlpha: true,
|
|
184
94
|
onChange: onColorChange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/LexicalColorPicker/LexicalColorPicker.js","sources":["../../../src/components/LexicalColorPicker/LexicalColorPicker.tsx"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/css\";\nimport type { ColorResult, RGBColor } from \"react-color\";\nimport { ChromePicker } from \"react-color\";\nimport { Tooltip } from \"@webiny/admin-ui\";\n\n// Icons\nimport { ReactComponent as IconPalette } from \"./round-color_lens-24px.svg\";\nimport { useRichTextEditor } from \"@webiny/lexical-editor\";\n\nconst ColorPickerStyle = styled(\"div\")({\n position: \"relative\",\n display: \"flex\",\n flexWrap: \"wrap\",\n justifyContent: \"flex-start\",\n width: 240,\n padding: 15,\n backgroundColor: \"#fff\"\n});\n\nconst ColorBox = styled(\"div\")({\n cursor: \"pointer\",\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n margin: 5,\n border: \"1px solid var(--mdc-theme-on-background)\",\n padding: 3,\n boxSizing: \"content-box\"\n});\n\nconst Color = styled(\"button\")({\n cursor: \"pointer\",\n width: 40,\n height: 40,\n transition: \"transform 0.1s, border 0.2s\",\n borderColor: \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n borderRadius: \"50%\",\n \"&::after\": {\n transition: \"opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1)\",\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n zIndex: -1,\n opacity: 0\n },\n \"&:hover\": {\n transform: \"scale(1.1)\",\n boxShadow: \"0 0.25rem 0.125rem 0 rgba(0,0,0,0.05)\",\n \"&::after\": {\n opacity: 1\n }\n }\n});\n\nconst iconPaletteStyle = css({\n height: 20,\n width: \"100%\",\n marginTop: 1,\n color: \"var(--mdc-theme-secondary)\"\n});\n\nconst COLORS = {\n lightGray: \"hsla(0, 0%, 97%, 1)\",\n gray: \"hsla(300, 2%, 92%, 1)\",\n darkGray: \"hsla(0, 0%, 70%, 1)\",\n darkestGray: \"hsla(0, 0%, 20%, 1)\",\n black: \"hsla(208, 100%, 5%, 1)\"\n};\n\nconst styles = {\n selectedColor: css({\n boxShadow: \"inset 0px 0px 0px 10px var(--mdc-theme-secondary)\",\n button: {\n border: \"5px solid var(--mdc-theme-surface)\"\n }\n }),\n button: css({\n cursor: \"pointer\",\n height: 30,\n boxSizing: \"border-box\",\n \"&:hover:not(:disabled)\": { backgroundColor: COLORS.gray },\n \"&:focus:not(:disabled)\": {\n outline: \"none\"\n },\n \"&:disabled\": {\n opacity: 0.5,\n cursor: \"not-allowed\"\n },\n \"& svg\": {\n width: 16,\n height: 16\n }\n }),\n color: css({\n width: \"40px\",\n height: \"100%\"\n })\n};\n\nconst chromePickerStyle = css({\n boxShadow: \"none !important\",\n marginTop: \"15px\",\n marginLeft: \"-15px\",\n width: \"240px !important\"\n});\n\ninterface LexicalColorPickerProps {\n value: string;\n onChange?: (color: string) => void;\n onChangeComplete: (color: string, name?: string) => void;\n handlerClassName?: string;\n allowCustomColor?: boolean;\n}\n\nconst showPickerStyle = { display: \"block\", width: \"100%\" };\nconst hidePickerStyle = { display: \"none\" };\n\nexport const LexicalColorPicker = ({\n value,\n onChange,\n onChangeComplete,\n allowCustomColor\n}: LexicalColorPickerProps) => {\n const [showPicker, setShowPicker] = useState(false);\n // Either a custom color or a color coming from the theme object.\n const [actualSelectedColor, setActualSelectedColor] = useState(value || \"#fff\");\n const [isThemeColor, setIsThemeColor] = useState(false);\n\n useEffect(() => {\n if (value) {\n setActualSelectedColor(value);\n }\n }, [value]);\n\n const getColorValue = useCallback((rgb: RGBColor, alpha?: number) => {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha ?? rgb.a})`;\n }, []);\n\n const onColorChange = useCallback(\n (color: Pick<ColorResult, \"rgb\">, event: React.SyntheticEvent) => {\n event.preventDefault();\n // controls of the picker are updated as user moves the mouse\n const customColor = getColorValue(color.rgb, color.rgb.a === 0 ? 1 : color.rgb.a);\n setActualSelectedColor(customColor);\n if (typeof onChange === \"function\") {\n onChange(customColor);\n }\n },\n [onChange]\n );\n\n const onColorChangeComplete = useCallback(\n ({ rgb }: Pick<ColorResult, \"rgb\">, event: React.SyntheticEvent) => {\n event.preventDefault();\n const color = getColorValue(rgb, rgb.a === 0 ? 1 : rgb.a);\n setActualSelectedColor(color);\n onChangeComplete(color);\n },\n [onChangeComplete]\n );\n\n const togglePicker = useCallback((e: SyntheticEvent) => {\n e.stopPropagation();\n setShowPicker(state => !state);\n }, []);\n\n const { theme } = useRichTextEditor();\n\n const themeColors = useMemo(() => theme?.colors ?? [], []);\n\n useEffect(() => {\n const isThemeColor = themeColors.some(color => color.id === value);\n setIsThemeColor(isThemeColor);\n }, [themeColors, value]);\n\n return (\n <ColorPickerStyle>\n {themeColors.map(color => {\n return (\n <ColorBox\n key={color.id}\n className={color.id === value ? styles.selectedColor : \"\"}\n >\n <Tooltip\n content={<span>{color.label}</span>}\n side=\"bottom\"\n trigger={\n <Color\n style={{ backgroundColor: color.value }}\n onClick={() => {\n onChangeComplete(color.value, color.id);\n }}\n />\n }\n />\n </ColorBox>\n );\n })}\n\n {allowCustomColor ? (\n <ColorBox className={value && !isThemeColor ? styles.selectedColor : \"\"}>\n <Tooltip\n content={<span>Color picker</span>}\n side=\"bottom\"\n trigger={\n <Color\n style={{ backgroundColor: isThemeColor ? \"#fff\" : value }}\n onClick={togglePicker}\n >\n <IconPalette className={iconPaletteStyle} />\n </Color>\n }\n />\n </ColorBox>\n ) : null}\n\n <div style={showPicker ? showPickerStyle : hidePickerStyle}>\n <ChromePicker\n className={chromePickerStyle}\n color={actualSelectedColor}\n disableAlpha={true}\n onChange={onColorChange}\n onChangeComplete={onColorChangeComplete}\n />\n </div>\n </ColorPickerStyle>\n );\n};\n"],"names":["ColorPickerStyle","styled","ColorBox","Color","iconPaletteStyle","css","COLORS","styles","chromePickerStyle","showPickerStyle","hidePickerStyle","LexicalColorPicker","value","onChange","onChangeComplete","allowCustomColor","showPicker","setShowPicker","useState","actualSelectedColor","setActualSelectedColor","isThemeColor","setIsThemeColor","useEffect","getColorValue","useCallback","rgb","alpha","onColorChange","color","event","customColor","onColorChangeComplete","togglePicker","e","state","theme","useRichTextEditor","themeColors","useMemo","Tooltip","IconPalette","ChromePicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components/LexicalColorPicker/LexicalColorPicker.js","sources":["../../../src/components/LexicalColorPicker/LexicalColorPicker.tsx"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { ColorResult, RGBColor } from \"react-color\";\nimport { ChromePicker } from \"react-color\";\nimport { Tooltip } from \"@webiny/admin-ui\";\n\n// Icons\nimport { ReactComponent as IconPalette } from \"./round-color_lens-24px.svg\";\nimport { useRichTextEditor } from \"@webiny/lexical-editor\";\n\nconst colorPickerClass = \"relative flex flex-wrap justify-start w-[240px] p-[15px] bg-white\";\n\nconst colorBoxClass =\n \"cursor-pointer w-10 h-10 rounded-full m-[5px] border border-solid border-[color:var(--mdc-theme-on-background)] p-[3px] box-content\";\n\nconst selectedColorClass =\n \"shadow-[inset_0px_0px_0px_10px_var(--mdc-theme-secondary)] [&_button]:border-[5px] [&_button]:border-solid [&_button]:border-[color:var(--mdc-theme-surface)]\";\n\nconst colorButtonClass =\n \"cursor-pointer w-10 h-10 flex items-center rounded-full border-transparent [transition:transform_0.1s,_border_0.2s] \" +\n \"after:content-[''] after:absolute after:top-0 after:left-0 after:w-full after:h-full after:-z-10 after:opacity-0 after:[transition:opacity_0.5s_cubic-bezier(0.165,0.84,0.44,1)] \" +\n \"hover:scale-110 hover:shadow-[0_0.25rem_0.125rem_0_rgba(0,0,0,0.05)] hover:after:opacity-100\";\n\nconst iconPaletteClass = \"h-5 w-full mt-px text-[color:var(--mdc-theme-secondary)]\";\n\nconst chromePickerClass = \"w-[270px]! m-[15px_-15px_-15px_-15px]\";\n\ninterface LexicalColorPickerProps {\n value: string;\n onChange?: (color: string) => void;\n onChangeComplete: (color: string, name?: string) => void;\n handlerClassName?: string;\n allowCustomColor?: boolean;\n}\n\nconst showPickerStyle = { display: \"block\" };\nconst hidePickerStyle = { display: \"none\" };\n\nexport const LexicalColorPicker = ({\n value,\n onChange,\n onChangeComplete,\n allowCustomColor\n}: LexicalColorPickerProps) => {\n const [showPicker, setShowPicker] = useState(false);\n // Either a custom color or a color coming from the theme object.\n const [actualSelectedColor, setActualSelectedColor] = useState(value || \"#fff\");\n const [isThemeColor, setIsThemeColor] = useState(false);\n\n useEffect(() => {\n if (value) {\n setActualSelectedColor(value);\n }\n }, [value]);\n\n const getColorValue = useCallback((rgb: RGBColor, alpha?: number) => {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha ?? rgb.a})`;\n }, []);\n\n const onColorChange = useCallback(\n (color: Pick<ColorResult, \"rgb\">, event: React.SyntheticEvent) => {\n event.preventDefault();\n // controls of the picker are updated as user moves the mouse\n const customColor = getColorValue(color.rgb, color.rgb.a === 0 ? 1 : color.rgb.a);\n setActualSelectedColor(customColor);\n if (typeof onChange === \"function\") {\n onChange(customColor);\n }\n },\n [onChange]\n );\n\n const onColorChangeComplete = useCallback(\n ({ rgb }: Pick<ColorResult, \"rgb\">, event: React.SyntheticEvent) => {\n event.preventDefault();\n const color = getColorValue(rgb, rgb.a === 0 ? 1 : rgb.a);\n setActualSelectedColor(color);\n onChangeComplete(color);\n },\n [onChangeComplete]\n );\n\n const togglePicker = useCallback((e: SyntheticEvent) => {\n e.stopPropagation();\n setShowPicker(state => !state);\n }, []);\n\n const { theme } = useRichTextEditor();\n\n const themeColors = useMemo(() => theme?.colors ?? [], []);\n\n useEffect(() => {\n const isThemeColor = themeColors.some(color => color.id === value);\n setIsThemeColor(isThemeColor);\n }, [themeColors, value]);\n\n return (\n <div className={colorPickerClass}>\n {themeColors.map(color => {\n return (\n <div\n key={color.id}\n className={\n color.id === value\n ? `${colorBoxClass} ${selectedColorClass}`\n : colorBoxClass\n }\n >\n <Tooltip\n content={<span>{color.label}</span>}\n side=\"bottom\"\n trigger={\n <button\n className={colorButtonClass}\n style={{ backgroundColor: color.value }}\n onClick={() => {\n onChangeComplete(color.value, color.id);\n }}\n />\n }\n />\n </div>\n );\n })}\n\n {allowCustomColor ? (\n <div\n className={\n value && !isThemeColor\n ? `${colorBoxClass} ${selectedColorClass}`\n : colorBoxClass\n }\n >\n <Tooltip\n content={<span>Color picker</span>}\n side=\"bottom\"\n trigger={\n <button\n className={colorButtonClass}\n style={{ backgroundColor: isThemeColor ? \"#fff\" : value }}\n onClick={togglePicker}\n >\n <IconPalette className={iconPaletteClass} />\n </button>\n }\n />\n </div>\n ) : null}\n\n <div style={showPicker ? showPickerStyle : hidePickerStyle}>\n <ChromePicker\n className={chromePickerClass}\n color={actualSelectedColor}\n disableAlpha={true}\n onChange={onColorChange}\n onChangeComplete={onColorChangeComplete}\n />\n </div>\n </div>\n );\n};\n"],"names":["colorPickerClass","colorBoxClass","selectedColorClass","colorButtonClass","iconPaletteClass","chromePickerClass","showPickerStyle","hidePickerStyle","LexicalColorPicker","value","onChange","onChangeComplete","allowCustomColor","showPicker","setShowPicker","useState","actualSelectedColor","setActualSelectedColor","isThemeColor","setIsThemeColor","useEffect","getColorValue","useCallback","rgb","alpha","onColorChange","color","event","customColor","onColorChangeComplete","togglePicker","e","state","theme","useRichTextEditor","themeColors","useMemo","Tooltip","IconPalette","ChromePicker"],"mappings":";;;;;AAUA,MAAMA,mBAAmB;AAEzB,MAAMC,gBACF;AAEJ,MAAMC,qBACF;AAEJ,MAAMC,mBACF;AAIJ,MAAMC,mBAAmB;AAEzB,MAAMC,oBAAoB;AAU1B,MAAMC,kBAAkB;IAAE,SAAS;AAAQ;AAC3C,MAAMC,kBAAkB;IAAE,SAAS;AAAO;AAEnC,MAAMC,qBAAqB,CAAC,EAC/BC,KAAK,EACLC,QAAQ,EACRC,gBAAgB,EAChBC,gBAAgB,EACM;IACtB,MAAM,CAACC,YAAYC,cAAc,GAAGC,SAAS;IAE7C,MAAM,CAACC,qBAAqBC,uBAAuB,GAAGF,SAASN,SAAS;IACxE,MAAM,CAACS,cAAcC,gBAAgB,GAAGJ,SAAS;IAEjDK,UAAU;QACN,IAAIX,OACAQ,uBAAuBR;IAE/B,GAAG;QAACA;KAAM;IAEV,MAAMY,gBAAgBC,YAAY,CAACC,KAAeC,QACvC,CAAC,KAAK,EAAED,IAAI,CAAC,CAAC,EAAE,EAAEA,IAAI,CAAC,CAAC,EAAE,EAAEA,IAAI,CAAC,CAAC,EAAE,EAAEC,SAASD,IAAI,CAAC,CAAC,CAAC,CAAC,EAC/D,EAAE;IAEL,MAAME,gBAAgBH,YAClB,CAACI,OAAiCC;QAC9BA,MAAM,cAAc;QAEpB,MAAMC,cAAcP,cAAcK,MAAM,GAAG,EAAEA,AAAgB,MAAhBA,MAAM,GAAG,CAAC,CAAC,GAAS,IAAIA,MAAM,GAAG,CAAC,CAAC;QAChFT,uBAAuBW;QACvB,IAAI,AAAoB,cAApB,OAAOlB,UACPA,SAASkB;IAEjB,GACA;QAAClB;KAAS;IAGd,MAAMmB,wBAAwBP,YAC1B,CAAC,EAAEC,GAAG,EAA4B,EAAEI;QAChCA,MAAM,cAAc;QACpB,MAAMD,QAAQL,cAAcE,KAAKA,AAAU,MAAVA,IAAI,CAAC,GAAS,IAAIA,IAAI,CAAC;QACxDN,uBAAuBS;QACvBf,iBAAiBe;IACrB,GACA;QAACf;KAAiB;IAGtB,MAAMmB,eAAeR,YAAY,CAACS;QAC9BA,EAAE,eAAe;QACjBjB,cAAckB,CAAAA,QAAS,CAACA;IAC5B,GAAG,EAAE;IAEL,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAElB,MAAMC,cAAcC,QAAQ,IAAMH,OAAO,UAAU,EAAE,EAAE,EAAE;IAEzDb,UAAU;QACN,MAAMF,eAAeiB,YAAY,IAAI,CAACT,CAAAA,QAASA,MAAM,EAAE,KAAKjB;QAC5DU,gBAAgBD;IACpB,GAAG;QAACiB;QAAa1B;KAAM;IAEvB,OAAO,WAAP,GACI,oBAAC;QAAI,WAAWT;OACXmC,YAAY,GAAG,CAACT,CAAAA,QACN,WAAP,GACI,oBAAC;YACG,KAAKA,MAAM,EAAE;YACb,WACIA,MAAM,EAAE,KAAKjB,QACP,GAAGR,cAAc,CAAC,EAAEC,oBAAoB,GACxCD;yBAGV,oBAACoC,SAAOA;YACJ,uBAAS,oBAAC,cAAMX,MAAM,KAAK;YAC3B,MAAK;YACL,uBACI,oBAAC;gBACG,WAAWvB;gBACX,OAAO;oBAAE,iBAAiBuB,MAAM,KAAK;gBAAC;gBACtC,SAAS;oBACLf,iBAAiBe,MAAM,KAAK,EAAEA,MAAM,EAAE;gBAC1C;;cAQvBd,mBAAmB,WAAnBA,GACG,oBAAC;QACG,WACIH,SAAS,CAACS,eACJ,GAAGjB,cAAc,CAAC,EAAEC,oBAAoB,GACxCD;qBAGV,oBAACoC,SAAOA;QACJ,uBAAS,oBAAC,cAAK;QACf,MAAK;QACL,uBACI,oBAAC;YACG,WAAWlC;YACX,OAAO;gBAAE,iBAAiBe,eAAe,SAAST;YAAM;YACxD,SAASqB;yBAET,oBAACQ,gBAAWA;YAAC,WAAWlC;;UAKxC,oBAEJ,oBAAC;QAAI,OAAOS,aAAaP,kBAAkBC;qBACvC,oBAACgC,cAAYA;QACT,WAAWlC;QACX,OAAOW;QACP,cAAc;QACd,UAAUS;QACV,kBAAkBI;;AAKtC"}
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import react from "react";
|
|
2
|
-
import { DropDown, useFontColorPicker
|
|
2
|
+
import { DropDown, useFontColorPicker } from "@webiny/lexical-editor";
|
|
3
3
|
import { LexicalColorPicker } from "./LexicalColorPicker/LexicalColorPicker.js";
|
|
4
|
-
|
|
5
|
-
const LexicalColorPickerDropdown = ({ allowCustomColor })=>{
|
|
4
|
+
const LexicalColorPickerDropdown = ({ allowCustomColor = false })=>{
|
|
6
5
|
const { value, applyColor } = useFontColorPicker();
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
return /*#__PURE__*/ react.createElement(
|
|
6
|
+
const wrapperStyle = {
|
|
7
|
+
display: "contents",
|
|
8
|
+
"--wby-font-color": value
|
|
9
|
+
};
|
|
10
|
+
return /*#__PURE__*/ react.createElement("span", {
|
|
11
|
+
style: wrapperStyle
|
|
12
|
+
}, /*#__PURE__*/ react.createElement(DropDown, {
|
|
12
13
|
buttonClassName: "toolbar-item color-picker",
|
|
13
14
|
buttonAriaLabel: "Formatting options for text color",
|
|
14
|
-
buttonIconClassName: "icon font-color "
|
|
15
|
+
buttonIconClassName: "icon font-color [border-bottom:3px_solid_var(--wby-font-color)]",
|
|
15
16
|
stopCloseOnClickSelf: true,
|
|
16
17
|
disabled: false,
|
|
17
18
|
showScroll: false
|
|
18
19
|
}, /*#__PURE__*/ react.createElement(LexicalColorPicker, {
|
|
19
20
|
value: value,
|
|
20
21
|
onChangeComplete: applyColor,
|
|
21
|
-
allowCustomColor: allowCustomColor
|
|
22
|
-
}));
|
|
22
|
+
allowCustomColor: allowCustomColor
|
|
23
|
+
})));
|
|
23
24
|
};
|
|
24
25
|
export { LexicalColorPickerDropdown };
|
|
25
26
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/LexicalColorPickerDropdown.js","sources":["../../src/components/LexicalColorPickerDropdown.tsx"],"sourcesContent":["import React from \"react\";\nimport { useFontColorPicker,
|
|
1
|
+
{"version":3,"file":"components/LexicalColorPickerDropdown.js","sources":["../../src/components/LexicalColorPickerDropdown.tsx"],"sourcesContent":["import React from \"react\";\nimport { useFontColorPicker, DropDown } from \"@webiny/lexical-editor\";\nimport { LexicalColorPicker } from \"~/components/LexicalColorPicker/LexicalColorPicker.js\";\n\nexport interface LexicalColorPickerDropdownProps {\n allowCustomColor?: boolean;\n}\n\nexport const LexicalColorPickerDropdown = ({\n allowCustomColor = false\n}: LexicalColorPickerDropdownProps) => {\n const { value, applyColor } = useFontColorPicker();\n\n // The current color is dynamic, so it's passed as a CSS custom property on a\n // `display: contents` wrapper (no layout box) and read by the icon's static class.\n const wrapperStyle = { display: \"contents\", \"--wby-font-color\": value } as React.CSSProperties;\n\n return (\n <span style={wrapperStyle}>\n <DropDown\n buttonClassName=\"toolbar-item color-picker\"\n buttonAriaLabel={\"Formatting options for text color\"}\n buttonIconClassName={\n \"icon font-color [border-bottom:3px_solid_var(--wby-font-color)]\"\n }\n stopCloseOnClickSelf={true}\n disabled={false}\n showScroll={false}\n >\n <LexicalColorPicker\n value={value}\n onChangeComplete={applyColor}\n allowCustomColor={allowCustomColor}\n />\n </DropDown>\n </span>\n );\n};\n"],"names":["LexicalColorPickerDropdown","allowCustomColor","value","applyColor","useFontColorPicker","wrapperStyle","DropDown","LexicalColorPicker"],"mappings":";;;AAQO,MAAMA,6BAA6B,CAAC,EACvCC,mBAAmB,KAAK,EACM;IAC9B,MAAM,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGC;IAI9B,MAAMC,eAAe;QAAE,SAAS;QAAY,oBAAoBH;IAAM;IAEtE,OAAO,WAAP,GACI,oBAAC;QAAK,OAAOG;qBACT,oBAACC,UAAQA;QACL,iBAAgB;QAChB,iBAAiB;QACjB,qBACI;QAEJ,sBAAsB;QACtB,UAAU;QACV,YAAY;qBAEZ,oBAACC,oBAAkBA;QACf,OAAOL;QACP,kBAAkBC;QAClB,kBAAkBF;;AAKtC"}
|
package/package.json
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/lexical-editor-actions",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.6.0-alpha.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
7
7
|
"./*": "./*"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@
|
|
11
|
-
"@
|
|
12
|
-
"@lexical
|
|
13
|
-
"@webiny/admin-ui": "6.4.5",
|
|
14
|
-
"@webiny/lexical-editor": "6.4.5",
|
|
10
|
+
"@lexical/selection": "0.48.0",
|
|
11
|
+
"@webiny/admin-ui": "6.6.0-alpha.0",
|
|
12
|
+
"@webiny/lexical-editor": "6.6.0-alpha.0",
|
|
15
13
|
"react": "18.3.1",
|
|
16
14
|
"react-color": "2.19.3",
|
|
17
15
|
"react-dom": "18.3.1"
|
|
18
16
|
},
|
|
19
17
|
"devDependencies": {
|
|
20
18
|
"@types/react-color": "3.0.13",
|
|
21
|
-
"@webiny/build-tools": "6.
|
|
19
|
+
"@webiny/build-tools": "6.6.0-alpha.0"
|
|
22
20
|
},
|
|
23
21
|
"publishConfig": {
|
|
24
22
|
"access": "public"
|