pentatrion-design 1.2.13 → 1.2.14
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/CHANGELOG.md +7 -0
- package/dist/components/fields/color/index.d.mts +10 -3
- package/dist/components/fields/color/index.d.mts.map +1 -1
- package/dist/components/fields/color/index.mjs +46 -17
- package/dist/components/fields/color/index.mjs.map +1 -1
- package/dist/components/fields/wysiwyg/index.d.mts.map +1 -1
- package/dist/components/fields/wysiwyg/index.mjs +1 -1
- package/dist/components/fields/wysiwyg/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/fields/color/ColorField.tsx +4 -28
- package/src/components/fields/color/ColorSwatchGrid.tsx +36 -0
- package/src/components/fields/color/index.ts +1 -0
- package/src/components/fields/wysiwyg/style.ts +18 -15
- package/src/tailwind/prose.css +2 -0
- package/src/tailwind/theme.css +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -15,11 +15,18 @@ interface ColorProps extends ComponentProps<"button"> {
|
|
|
15
15
|
declare function Color({ value, withRipple, color, label, showValue, className, ref, ...rest }: ColorProps): import("react").JSX.Element;
|
|
16
16
|
//#endregion
|
|
17
17
|
//#region src/components/fields/color/ColorField.d.ts
|
|
18
|
-
interface Props extends Omit<FieldProps, "errors" | "children" | "group"> {
|
|
18
|
+
interface Props$1 extends Omit<FieldProps, "errors" | "children" | "group"> {
|
|
19
19
|
name: FieldName<string | null | undefined>;
|
|
20
20
|
allowInherit?: boolean;
|
|
21
21
|
}
|
|
22
|
-
declare function ColorField({ name, id: forcedId, allowInherit, ...rest }: Props): import("react").JSX.Element;
|
|
22
|
+
declare function ColorField({ name, id: forcedId, allowInherit, ...rest }: Props$1): import("react").JSX.Element;
|
|
23
23
|
//#endregion
|
|
24
|
-
|
|
24
|
+
//#region src/components/fields/color/ColorSwatchGrid.d.ts
|
|
25
|
+
interface Props {
|
|
26
|
+
value: string | null;
|
|
27
|
+
onChange: (color: string) => void;
|
|
28
|
+
}
|
|
29
|
+
declare function ColorSwatchGrid({ value, onChange }: Props): import("react").JSX.Element;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { Color, ColorField, ColorSwatchGrid };
|
|
25
32
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/fields/color/Color.tsx","../../../../src/components/fields/color/ColorField.tsx"],"mappings":";;;;;UAKiB,mBAAmB;EAClC;EAEA;EACA,QAAQ;EACR;EACA;EACA;EACA,MAAM,UAAU;;iBAGF,QACd,OACA,YACA,OACA,OACA,WACA,WACA,QACG,QACF,6BAAU,IAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/fields/color/Color.tsx","../../../../src/components/fields/color/ColorField.tsx","../../../../src/components/fields/color/ColorSwatchGrid.tsx"],"mappings":";;;;;UAKiB,mBAAmB;EAClC;EAEA;EACA,QAAQ;EACR;EACA;EACA;EACA,MAAM,UAAU;;iBAGF,QACd,OACA,YACA,OACA,OACA,WACA,WACA,QACG,QACF,6BAAU,IAAA;;;UChBH,gBAAc,KAAK;EAC3B,MAAM;EACN;;iBAGc,aAAa,MAAM,IAAI,UAAU,iBAAyB,QAAQ,0BAAK,IAAA;;;UCX7E;EACR;EACA,WAAW;;iBAGG,kBAAkB,OAAO,YAAY,wBAAK,IAAA"}
|
|
@@ -130,6 +130,46 @@ const colorByGroups = Object.entries(rawColors).filter(([name, colorGroup]) => t
|
|
|
130
130
|
colors: Object.entries(colorGroup)
|
|
131
131
|
}));
|
|
132
132
|
//#endregion
|
|
133
|
+
//#region src/components/fields/color/ColorSwatchGrid.tsx
|
|
134
|
+
function ColorSwatchGrid(t0) {
|
|
135
|
+
const $ = c(5);
|
|
136
|
+
const { value, onChange } = t0;
|
|
137
|
+
let t1;
|
|
138
|
+
if ($[0] !== onChange || $[1] !== value) {
|
|
139
|
+
t1 = colorByGroups.map((t2) => {
|
|
140
|
+
const { name, colors } = t2;
|
|
141
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
|
|
142
|
+
className: "text-body-xs truncate",
|
|
143
|
+
children: name
|
|
144
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
145
|
+
className: "grid shadow",
|
|
146
|
+
children: colors.map((t3) => {
|
|
147
|
+
const [colorNumber, colorCode] = t3;
|
|
148
|
+
return /* @__PURE__ */ jsx("button", {
|
|
149
|
+
className: clsx("cursor-pointer", parseInt(colorNumber) > 600 ? "text-white" : "text-black", "hover:z-20 hover:scale-125 hover:rounded hover:shadow active:scale-125", value === colorCode && "outline-yellow-5 z-10 rounded outline-2"),
|
|
150
|
+
style: { backgroundColor: colorCode },
|
|
151
|
+
onClick: () => onChange(colorCode),
|
|
152
|
+
children: colorNumber
|
|
153
|
+
}, colorNumber);
|
|
154
|
+
})
|
|
155
|
+
})] }, name);
|
|
156
|
+
});
|
|
157
|
+
$[0] = onChange;
|
|
158
|
+
$[1] = value;
|
|
159
|
+
$[2] = t1;
|
|
160
|
+
} else t1 = $[2];
|
|
161
|
+
let t2;
|
|
162
|
+
if ($[3] !== t1) {
|
|
163
|
+
t2 = /* @__PURE__ */ jsx("div", {
|
|
164
|
+
className: "grid-cols-repeat-fill-50 grid gap-1 text-center text-sm p-2",
|
|
165
|
+
children: t1
|
|
166
|
+
});
|
|
167
|
+
$[3] = t1;
|
|
168
|
+
$[4] = t2;
|
|
169
|
+
} else t2 = $[4];
|
|
170
|
+
return t2;
|
|
171
|
+
}
|
|
172
|
+
//#endregion
|
|
133
173
|
//#region src/components/fields/color/ColorField.tsx
|
|
134
174
|
function ColorField({ name, id: forcedId, allowInherit = false, ...rest }) {
|
|
135
175
|
const translate = useTranslate();
|
|
@@ -146,7 +186,7 @@ function ColorField({ name, id: forcedId, allowInherit = false, ...rest }) {
|
|
|
146
186
|
setTempValue(null);
|
|
147
187
|
}
|
|
148
188
|
function handleSubmitInherit() {
|
|
149
|
-
control.change(
|
|
189
|
+
control.change(null);
|
|
150
190
|
setTempValue(null);
|
|
151
191
|
}
|
|
152
192
|
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
@@ -167,7 +207,7 @@ function ColorField({ name, id: forcedId, allowInherit = false, ...rest }) {
|
|
|
167
207
|
type: "button",
|
|
168
208
|
value: control.value,
|
|
169
209
|
onClick: () => setTempValue(control.value ?? ""),
|
|
170
|
-
label: control.value
|
|
210
|
+
label: control.value ? void 0 : translate?.("form.values.color.inherit")
|
|
171
211
|
})
|
|
172
212
|
}),
|
|
173
213
|
/* @__PURE__ */ jsx(Modal, {
|
|
@@ -181,20 +221,9 @@ function ColorField({ name, id: forcedId, allowInherit = false, ...rest }) {
|
|
|
181
221
|
/* @__PURE__ */ jsx(ModalDescription, {
|
|
182
222
|
className: "max-h-[calc(100lvh-6.5rem)]",
|
|
183
223
|
scrollable: true,
|
|
184
|
-
children: /* @__PURE__ */ jsx(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
className: "text-body-xs truncate",
|
|
188
|
-
children: name_0
|
|
189
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
190
|
-
className: "grid shadow",
|
|
191
|
-
children: colors.map(([colorNumber, colorCode]) => /* @__PURE__ */ jsx("button", {
|
|
192
|
-
className: clsx("cursor-pointer", parseInt(colorNumber) > 600 ? "text-white" : "text-black", "hover:z-20 hover:scale-125 hover:rounded hover:shadow active:scale-125", tempValue === colorCode && "outline-yellow-5 z-10 rounded outline-2"),
|
|
193
|
-
style: { backgroundColor: colorCode },
|
|
194
|
-
onClick: () => handleSelectAndSubmit(colorCode),
|
|
195
|
-
children: colorNumber
|
|
196
|
-
}, colorNumber))
|
|
197
|
-
})] }, name_0))
|
|
224
|
+
children: /* @__PURE__ */ jsx(ColorSwatchGrid, {
|
|
225
|
+
value: tempValue,
|
|
226
|
+
onChange: handleSelectAndSubmit
|
|
198
227
|
})
|
|
199
228
|
}),
|
|
200
229
|
/* @__PURE__ */ jsx(ModalFooter, {
|
|
@@ -232,6 +261,6 @@ function ColorField({ name, id: forcedId, allowInherit = false, ...rest }) {
|
|
|
232
261
|
] });
|
|
233
262
|
}
|
|
234
263
|
//#endregion
|
|
235
|
-
export { Color, ColorField };
|
|
264
|
+
export { Color, ColorField, ColorSwatchGrid };
|
|
236
265
|
|
|
237
266
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["ComponentProps","RefObject","useImperativeHandle","useRef","ThemeColor","clsx","useRipple","ColorProps","withRipple","value","color","label","showValue","className","ref","HTMLButtonElement","Color","t0","$","_c","rest","t1","t2","t3","undefined","valueToShow","buttonRef","t4","Symbol","for","current","ripples","t5","t6","t7","t8","backgroundColor","t9","t10","t11","t12","t13","rawColors","colorByGroups","Object","entries","filter","name","colorGroup","includes","map","colors","useField","useControl","FieldName","Field","FieldProps","Color","Modal","ModalContent","ModalDescription","ModalFooter","ModalHeader","useState","clsx","Button","colorByGroups","useTranslate","Props","Omit","name","allowInherit","ColorField","id","forcedId","rest","translate","field","control","defaultValue","tempValue","setTempValue","handleSelectAndSubmit","selectedValue","change","handleSubmit","handleSubmitInherit","register","errors","value","undefined","modalKeepOpen","map","colors","colorNumber","colorCode","parseInt","backgroundColor"],"sources":["../../../../src/components/fields/color/Color.tsx","../../../../src/lib/color.ts","../../../../src/components/fields/color/ColorField.tsx"],"sourcesContent":["import { ComponentProps, RefObject, useImperativeHandle, useRef } from \"react\";\nimport type { ThemeColor } from \"../../../types\";\nimport clsx from \"clsx\";\nimport { useRipple } from \"../../../hooks\";\n\nexport interface ColorProps extends ComponentProps<\"button\"> {\n withRipple?: boolean;\n\n value?: string;\n color?: ThemeColor;\n label?: string;\n showValue?: boolean;\n className?: string;\n ref?: RefObject<HTMLButtonElement>;\n}\n\nexport function Color({\n value,\n withRipple = true,\n color = \"yellow\",\n label,\n showValue = false,\n className,\n ref,\n ...rest\n}: ColorProps) {\n const valueToShow = label ?? (showValue ? value : null);\n\n const buttonRef = useRef<HTMLButtonElement>(null!);\n\n useImperativeHandle<HTMLButtonElement | null, HTMLButtonElement | null>(\n ref,\n () => buttonRef.current,\n );\n\n const ripples = useRipple(buttonRef);\n\n return (\n <button\n ref={buttonRef}\n data-color={color}\n className=\"p8n-input-text group relative flex h-8 cursor-pointer overflow-clip rounded-2xl p-1 -outline-offset-1 active:translate-y-px\"\n {...rest}\n >\n {withRipple && ripples}\n <span\n className={clsx(\n \"absolute inset-1 flex items-center justify-center rounded-2xl transition-transform group-hover:scale-150\",\n valueToShow === null && \"min-w-12\",\n className,\n )}\n style={{ backgroundColor: value }}\n ></span>\n <span\n className={clsx(\n \"relative flex h-full items-center justify-center px-2\",\n valueToShow === null && \"min-w-12\",\n className,\n )}\n >\n {valueToShow}\n </span>\n </button>\n );\n}\n","import rawColors from \"tailwindcss/colors\";\n\nexport const colorByGroups = Object.entries(rawColors)\n .filter(\n ([name, colorGroup]) =>\n // blueGray === slate\n // coolGray === gray\n // neutral === trueGray\n // stone === warmGray\n // ski === lightBlue\n typeof colorGroup !== \"string\" &&\n ![\"blueGray\", \"coolGray\", \"trueGray\", \"warmGray\", \"lightBlue\"].includes(name),\n )\n .map(([name, colorGroup]) => ({\n name,\n colors: Object.entries(colorGroup) as [string, string][],\n }));\n","import { useField, useControl, type FieldName } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport { Color } from \"./Color\";\nimport { Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader } from \"../../modal\";\nimport { useState } from \"react\";\nimport clsx from \"clsx\";\nimport { Button } from \"../../button/Button\";\nimport { colorByGroups } from \"../../../lib/color\";\nimport { useTranslate } from \"../../i18n\";\n\ninterface Props extends Omit<FieldProps, \"errors\" | \"children\" | \"group\"> {\n name: FieldName<string | null | undefined>;\n allowInherit?: boolean;\n}\n\nexport function ColorField({ name, id: forcedId, allowInherit = false, ...rest }: Props) {\n const translate = useTranslate();\n\n const field = useField(name);\n const id = forcedId ?? field.id;\n\n const control = useControl({\n defaultValue: field.defaultValue,\n });\n\n const [tempValue, setTempValue] = useState<null | string>(null);\n\n function handleSelectAndSubmit(selectedValue: string) {\n control.change(selectedValue);\n setTempValue(null);\n }\n\n function handleSubmit() {\n if (tempValue) {\n control.change(tempValue);\n }\n setTempValue(null);\n }\n\n function handleSubmitInherit() {\n control.change(\"inherit\");\n setTempValue(null);\n }\n\n return (\n <>\n <input\n hidden\n type=\"text\"\n name={field.name}\n autoComplete=\"off\"\n ref={control.register}\n defaultValue={field.defaultValue}\n />\n <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n <Color\n type=\"button\"\n value={control.value}\n onClick={() => setTempValue(control.value ?? \"\")}\n label={control.value === \"inherit\" ? translate?.(\"form.values.color.inherit\") : undefined}\n />\n </Field>\n <Modal\n open={tempValue !== null}\n /* There is not Modal trigger, onOpen is called only by\n * FloatingOverlay to close the modal */\n onOpen={(modalKeepOpen) => !modalKeepOpen && setTempValue(null)}\n >\n <ModalContent className=\"max-w-190 overflow-auto\" zClassName=\"z-modal-overlay\">\n <ModalHeader>{translate?.(\"form.label.pickYourColor\")}</ModalHeader>\n <ModalDescription className=\"max-h-[calc(100lvh-6.5rem)]\" scrollable={true}>\n <div className=\"grid-cols-repeat-fill-50 grid gap-1 text-center text-sm p-2\">\n {colorByGroups.map(({ name, colors }) => (\n <div key={name}>\n <div className=\"text-body-xs truncate\">{name}</div>\n <div className=\"grid shadow\">\n {colors.map(([colorNumber, colorCode]) => (\n <button\n key={colorNumber}\n className={clsx(\n \"cursor-pointer\",\n parseInt(colorNumber) > 600 ? \"text-white\" : \"text-black\",\n \"hover:z-20 hover:scale-125 hover:rounded hover:shadow active:scale-125\",\n tempValue === colorCode && \"outline-yellow-5 z-10 rounded outline-2\",\n )}\n style={{ backgroundColor: colorCode }}\n onClick={() => handleSelectAndSubmit(colorCode)}\n >\n {colorNumber}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n </ModalDescription>\n <ModalFooter className=\"mt-2\">\n <div className=\"flex justify-between\">\n <Button type=\"button\" variant=\"text\" color=\"gray\" onClick={() => setTempValue(null)}>\n {translate?.(\"button.cancel\")}\n </Button>\n {allowInherit && (\n <Button\n icon\n type=\"button\"\n variant=\"outlined\"\n color=\"gray\"\n onClick={handleSubmitInherit}\n >\n <i className=\"fe-settings\"></i>\n <span>{translate?.(\"form.values.color.inherit\")}</span>\n </Button>\n )}\n <Button type=\"button\" color=\"yellow\" onClick={handleSubmit}>\n {translate?.(\"button.validate\")}\n </Button>\n </div>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["ComponentProps","RefObject","useImperativeHandle","useRef","ThemeColor","clsx","useRipple","ColorProps","withRipple","value","color","label","showValue","className","ref","HTMLButtonElement","Color","t0","$","_c","rest","t1","t2","t3","undefined","valueToShow","buttonRef","t4","Symbol","for","current","ripples","t5","t6","t7","t8","backgroundColor","t9","t10","t11","t12","t13","rawColors","colorByGroups","Object","entries","filter","name","colorGroup","includes","map","colors","clsx","colorByGroups","Props","value","onChange","color","ColorSwatchGrid","t0","$","_c","t1","map","t2","name","colors","t3","colorNumber","colorCode","parseInt","backgroundColor","useField","useControl","FieldName","Field","FieldProps","Color","Modal","ModalContent","ModalDescription","ModalFooter","ModalHeader","useState","Button","ColorSwatchGrid","useTranslate","Props","Omit","name","allowInherit","ColorField","id","forcedId","rest","translate","field","control","defaultValue","tempValue","setTempValue","handleSelectAndSubmit","selectedValue","change","handleSubmit","handleSubmitInherit","register","errors","value","undefined","modalKeepOpen"],"sources":["../../../../src/components/fields/color/Color.tsx","../../../../src/lib/color.ts","../../../../src/components/fields/color/ColorSwatchGrid.tsx","../../../../src/components/fields/color/ColorField.tsx"],"sourcesContent":["import { ComponentProps, RefObject, useImperativeHandle, useRef } from \"react\";\nimport type { ThemeColor } from \"../../../types\";\nimport clsx from \"clsx\";\nimport { useRipple } from \"../../../hooks\";\n\nexport interface ColorProps extends ComponentProps<\"button\"> {\n withRipple?: boolean;\n\n value?: string;\n color?: ThemeColor;\n label?: string;\n showValue?: boolean;\n className?: string;\n ref?: RefObject<HTMLButtonElement>;\n}\n\nexport function Color({\n value,\n withRipple = true,\n color = \"yellow\",\n label,\n showValue = false,\n className,\n ref,\n ...rest\n}: ColorProps) {\n const valueToShow = label ?? (showValue ? value : null);\n\n const buttonRef = useRef<HTMLButtonElement>(null!);\n\n useImperativeHandle<HTMLButtonElement | null, HTMLButtonElement | null>(\n ref,\n () => buttonRef.current,\n );\n\n const ripples = useRipple(buttonRef);\n\n return (\n <button\n ref={buttonRef}\n data-color={color}\n className=\"p8n-input-text group relative flex h-8 cursor-pointer overflow-clip rounded-2xl p-1 -outline-offset-1 active:translate-y-px\"\n {...rest}\n >\n {withRipple && ripples}\n <span\n className={clsx(\n \"absolute inset-1 flex items-center justify-center rounded-2xl transition-transform group-hover:scale-150\",\n valueToShow === null && \"min-w-12\",\n className,\n )}\n style={{ backgroundColor: value }}\n ></span>\n <span\n className={clsx(\n \"relative flex h-full items-center justify-center px-2\",\n valueToShow === null && \"min-w-12\",\n className,\n )}\n >\n {valueToShow}\n </span>\n </button>\n );\n}\n","import rawColors from \"tailwindcss/colors\";\n\nexport const colorByGroups = Object.entries(rawColors)\n .filter(\n ([name, colorGroup]) =>\n // blueGray === slate\n // coolGray === gray\n // neutral === trueGray\n // stone === warmGray\n // ski === lightBlue\n typeof colorGroup !== \"string\" &&\n ![\"blueGray\", \"coolGray\", \"trueGray\", \"warmGray\", \"lightBlue\"].includes(name),\n )\n .map(([name, colorGroup]) => ({\n name,\n colors: Object.entries(colorGroup) as [string, string][],\n }));\n","import clsx from \"clsx\";\nimport { colorByGroups } from \"../../../lib/color\";\n\ninterface Props {\n value: string | null;\n onChange: (color: string) => void;\n}\n\nexport function ColorSwatchGrid({ value, onChange }: Props) {\n return (\n <div className=\"grid-cols-repeat-fill-50 grid gap-1 text-center text-sm p-2\">\n {colorByGroups.map(({ name, colors }) => (\n <div key={name}>\n <div className=\"text-body-xs truncate\">{name}</div>\n <div className=\"grid shadow\">\n {colors.map(([colorNumber, colorCode]) => (\n <button\n key={colorNumber}\n className={clsx(\n \"cursor-pointer\",\n parseInt(colorNumber) > 600 ? \"text-white\" : \"text-black\",\n \"hover:z-20 hover:scale-125 hover:rounded hover:shadow active:scale-125\",\n value === colorCode && \"outline-yellow-5 z-10 rounded outline-2\",\n )}\n style={{ backgroundColor: colorCode }}\n onClick={() => onChange(colorCode)}\n >\n {colorNumber}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useField, useControl, type FieldName } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport { Color } from \"./Color\";\nimport { Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader } from \"../../modal\";\nimport { useState } from \"react\";\nimport { Button } from \"../../button/Button\";\nimport { ColorSwatchGrid } from \"./ColorSwatchGrid\";\nimport { useTranslate } from \"../../i18n\";\n\ninterface Props extends Omit<FieldProps, \"errors\" | \"children\" | \"group\"> {\n name: FieldName<string | null | undefined>;\n allowInherit?: boolean;\n}\n\nexport function ColorField({ name, id: forcedId, allowInherit = false, ...rest }: Props) {\n const translate = useTranslate();\n\n const field = useField(name);\n const id = forcedId ?? field.id;\n\n const control = useControl({\n defaultValue: field.defaultValue,\n });\n\n const [tempValue, setTempValue] = useState<null | string>(null);\n\n function handleSelectAndSubmit(selectedValue: string) {\n control.change(selectedValue);\n setTempValue(null);\n }\n\n function handleSubmit() {\n if (tempValue) {\n control.change(tempValue);\n }\n setTempValue(null);\n }\n\n function handleSubmitInherit() {\n control.change(null);\n setTempValue(null);\n }\n\n return (\n <>\n <input\n hidden\n type=\"text\"\n name={field.name}\n autoComplete=\"off\"\n ref={control.register}\n defaultValue={field.defaultValue}\n />\n <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n <Color\n type=\"button\"\n value={control.value}\n onClick={() => setTempValue(control.value ?? \"\")}\n label={control.value ? undefined : translate?.(\"form.values.color.inherit\")}\n />\n </Field>\n <Modal\n open={tempValue !== null}\n /* There is not Modal trigger, onOpen is called only by\n * FloatingOverlay to close the modal */\n onOpen={(modalKeepOpen) => !modalKeepOpen && setTempValue(null)}\n >\n <ModalContent className=\"max-w-190 overflow-auto\" zClassName=\"z-modal-overlay\">\n <ModalHeader>{translate?.(\"form.label.pickYourColor\")}</ModalHeader>\n <ModalDescription className=\"max-h-[calc(100lvh-6.5rem)]\" scrollable={true}>\n <ColorSwatchGrid value={tempValue} onChange={handleSelectAndSubmit} />\n </ModalDescription>\n <ModalFooter className=\"mt-2\">\n <div className=\"flex justify-between\">\n <Button type=\"button\" variant=\"text\" color=\"gray\" onClick={() => setTempValue(null)}>\n {translate?.(\"button.cancel\")}\n </Button>\n {allowInherit && (\n <Button\n icon\n type=\"button\"\n variant=\"outlined\"\n color=\"gray\"\n onClick={handleSubmitInherit}\n >\n <i className=\"fe-settings\"></i>\n <span>{translate?.(\"form.values.color.inherit\")}</span>\n </Button>\n )}\n <Button type=\"button\" color=\"yellow\" onClick={handleSubmit}>\n {translate?.(\"button.validate\")}\n </Button>\n </div>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/fields/wysiwyg/style.ts","../../../../src/components/fields/wysiwyg/types.ts","../../../../src/components/fields/wysiwyg/Wysiwyg.tsx","../../../../src/components/fields/wysiwyg/WysiwygField.tsx","../../../../src/components/fields/wysiwyg/WysiwygReader.tsx","../../../../src/components/fields/wysiwyg/config/html.ts","../../../../src/components/fields/wysiwyg/config/state.ts","../../../../src/components/fields/wysiwyg/config/validation.ts","../../../../src/components/fields/wysiwyg/plugins/SubmitOnEnterPlugin.tsx"],"mappings":";;;;;;;cAGa,kBAAe;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/fields/wysiwyg/style.ts","../../../../src/components/fields/wysiwyg/types.ts","../../../../src/components/fields/wysiwyg/Wysiwyg.tsx","../../../../src/components/fields/wysiwyg/WysiwygField.tsx","../../../../src/components/fields/wysiwyg/WysiwygReader.tsx","../../../../src/components/fields/wysiwyg/config/html.ts","../../../../src/components/fields/wysiwyg/config/state.ts","../../../../src/components/fields/wysiwyg/config/validation.ts","../../../../src/components/fields/wysiwyg/plugins/SubmitOnEnterPlugin.tsx"],"mappings":";;;;;;;cAGa,kBAAe;;;6CAoB3B;KACW,sBAAsB,oBAAoB;cAEzC;cAGA;cAGA;EACX;EACA;;;;KC9BU;EACV;EACA,OAAO;;cAKI,eAAa,EAAA;;;GAKxB,EAAA,KAAA;iBAIc,kBAAkB,mBAAgB;iBA+BlC,sBAAsB;iBAYtB,oBAAoB,OAAO;;;UCpCjC;EACR;EACA;EACA;EACA,eAAe;EACf;EACA;EAEA;EAEA;;;;EAIA;EACA;;;;;EAKA,gBAAgB;EAChB,iBAAiB;EAEjB,MAAM,UAAU;EAChB;EACA,YAAY,OAAO;EACnB,WAAW;;UAQI;EACf,gBAAgB;EAChB,UAAU,cAAc;EACxB,gBAAgB;EAChB,WAAW,OAAO,uBAAuB;EACzC,QAAQ;;iBAGM,UACd,IACA,kBACA,iBACA,cACA,cACA,UACA,UACA,0BACA,0BACA,oBACA,KACA,eACA,gBACA,gBACA,UACA,YACC,0BAAK,IAAA;;;UC9EE,gBAAc,KAAK;EAC3B,MAAM,UAAU;EAChB,MAAM,UAAU;EAChB;EACA,gBAAgB;EAChB;EACA;EACA;EACA;;iBAGc,eACd,MACA,KACA,gBACA,eACA,0BACA,oBACA,UACA,UACA,IAAI,aACD,QACF,0BAAK,IAAA;;;UCxBE;EACR,OAAO;EACP;EACA;;iBAGc,gBAAgB,OAAO,cAAsB,aAAa,wBAAK,IAAA;;;;;;;iBCyB/D,YAAY,OAAO;;;iBCnCnB,aAAa,OAAO;;;iBCCpB,wBAAwB,iBAAiB,SAAS;iBAelD,oBAAoB,iBAAiB,SAAS;;;UCRpD;;;;;EAKR;;iBAGc,sBACd,4BACC"}
|
|
@@ -52,7 +52,7 @@ function focusNextElement() {
|
|
|
52
52
|
}
|
|
53
53
|
//#endregion
|
|
54
54
|
//#region src/components/fields/wysiwyg/style.ts
|
|
55
|
-
const toolbarVariants = cva("p-1 border-custom-2 border gap-1 bg-gray-0/40", {
|
|
55
|
+
const toolbarVariants = cva("p-1 border-custom-2 border gap-1 bg-gray-0/40 overflow-x-scroll", {
|
|
56
56
|
variants: {
|
|
57
57
|
sticky: {
|
|
58
58
|
mobileOnly: "max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["focusNextElement","focusableSelectors","focusableElements","Array","from","document","querySelectorAll","HTMLElement","join","filter","el","offsetParent","currentIndex","indexOf","activeElement","nextElement","focus","VariantProps","cva","toolbarVariants","variants","sticky","mobileOnly","allDevice","false","visible","always","custom","desktopOnly","defaultVariants","ToolbarVariantProps","defaultContentEditableStyle","chatContentEditableStyle","contentEditableStyles","normal","withoutToolbarOnMobile","ElementFormatType","ReactNode","createContext","useCallback","useContext","useMemo","useState","blockTypes","const","BlockType","elementFormats","initialToolbarState","canUndo","canRedo","isBold","isItalic","isUnderline","isLink","blockType","elementFormat","ToolbarState","ToolbarStateKey","ToolbarStateValue","Key","ContextShape","toolbarState","updateToolbarState","key","value","Context","undefined","ToolbarContext","t0","$","_c","children","setToolbarState","t1","Symbol","for","prev","t2","contextValue","t3","useToolbarState","context","Error","$isAtNodeEnd","ElementNode","RangeSelection","TextNode","getSelectedNode","selection","anchor","focus","anchorNode","getNode","focusNode","isBackward","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","HeadingTagType","$createHeadingNode","$createQuoteNode","$setBlocksType","LexicalEditor","$createParagraphNode","$getSelection","formatParagraph","editor","update","selection","formatHeading","blockType","headingSize","formatBulletList","dispatchCommand","undefined","formatCheckList","formatNumberedList","formatQuote","LexicalEditor","BlockType","DropdownMenu","DropdownMenuItem","Button","clsx","formatBulletList","formatHeading","formatParagraph","formatQuote","useTranslate","Props","blockType","editor","isFocusable","icons","bullet","check","h1","h2","h3","number","paragraph","quote","BlockFormatDropdown","t0","$","_c","t1","undefined","translate","t2","t3","t4","t5","Symbol","for","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","ElementFormatType","LexicalEditor","FORMAT_ELEMENT_COMMAND","DropdownMenu","DropdownMenuItem","Button","useTranslate","clsx","Props","editor","value","isFocusable","icons","left","center","right","justify","start","end","ElementFormatDropdown","t0","$","_c","t1","undefined","translate","t2","t3","t4","t5","Symbol","for","t6","t7","t8","t9","dispatchCommand","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","useLexicalComposerContext","$findMatchingParent","$getNearestNodeOfType","mergeRegister","clsx","$getSelection","$isElementNode","$isRangeSelection","$isRootOrShadowRoot","CAN_REDO_COMMAND","CAN_UNDO_COMMAND","COMMAND_PRIORITY_CRITICAL","FORMAT_TEXT_COMMAND","REDO_COMMAND","SELECTION_CHANGE_COMMAND","UNDO_COMMAND","INSERT_HORIZONTAL_RULE_COMMAND","ButtonProps","Button","Dispatch","useCallback","useEffect","useRef","useState","useTranslate","focusNextElement","ToolbarVariantProps","toolbarVariants","BlockType","blockTypes","useToolbarState","getSelectedNode","$isLinkNode","TOGGLE_LINK_COMMAND","$isListNode","ListNode","$isHeadingNode","BlockFormatDropdown","ElementFormatDropdown","Divider","$","_c","t0","Symbol","for","buttonBaseProps","label","selected","isFocusable","tabIndex","color","variant","icon","type","Props","className","setIsLinkEditMode","extendedToolbar","ToolbarPlugin","sticky","visible","editor","toolbarRef","setIsFocusable","translate","toolbarState","updateToolbarState","t1","selection","anchorNode","anchor","getNode","element","getKey","_temp","getTopLevelElementOrThrow","elementKey","elementDOM","getElementByKey","node","parent_0","getParent","isLink","parent","parentList","getListType","type_0","getTag","getType","includes","matchingParent","_temp2","getFormatType","hasFormat","$updateToolbar","t2","t3","registerUpdateListener","t4","editorState","read","registerCommand","_payload","_newEditor","console","error","payload","payload_0","dispatchCommand","insertLink","t5","t6","t7","_temp3","t8","t9","t10","t11","canUndo","t12","undefined","t13","t14","t15","t16","canRedo","t17","t18","t19","t20","t21","blockType","elementFormat","t22","isBold","t23","t24","t25","t26","isItalic","t27","t28","t29","t30","isUnderline","t31","t32","t33","t34","t35","t36","t37","t38","f","parentNode","isInline","e","useLexicalComposerContext","useEffect","useRef","debounce","WysiwygValue","Props","wait","onChange","value","LazyOnChangePlugin","editor","onChangeRef","current","notifyChange","state","getEditorState","toJSON","debouncedNotifyChange","unregister","registerUpdateListener","cancel","AutoLinkPlugin","createLinkMatcherWithRegExp","URL_REGEX","EMAIL_REGEX","MATCHERS","text","startsWith","CustomAutoLinkPlugin","$","_c","t0","Symbol","for","SUPPORTED_URL_PROTOCOLS","Set","sanitizeUrl","url","parsedUrl","URL","has","protocol","urlRegExp","RegExp","validateUrl","test","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPositionForLinkEditor","targetRect","DOMRect","floatingElem","HTMLElement","anchorElem","verticalGap","horizontalOffset","scrollerElem","parentElement","style","opacity","transform","floatingElemRect","getBoundingClientRect","anchorElementRect","editorScrollerRect","top","left","height","width","right","useLexicalComposerContext","$findMatchingParent","mergeRegister","BaseSelection","LexicalEditor","$getSelection","$isLineBreakNode","$isNodeSelection","$isRangeSelection","CLICK_COMMAND","COMMAND_PRIORITY_CRITICAL","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","Dispatch","useCallback","useEffect","useRef","useState","getSelectedNode","$createLinkNode","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","createPortal","Input","sanitizeUrl","setFloatingElemPositionForLinkEditor","Button","proseLinkVariant","Dialog","clsx","FloatingOverlay","preventDefault","event","React","KeyboardEvent","HTMLInputElement","MouseEvent","HTMLElement","FloatingLinkEditorProps","floatingPosition","editor","isLink","setIsLink","anchorElem","isLinkEditMode","setIsLinkEditMode","FloatingLinkEditor","t0","$","_c","t1","undefined","editorRef","inputRef","linkUrl","setLinkUrl","editedLinkUrl","setEditedLinkUrl","lastSelection","setLastSelection","t2","selection","node","linkParent","getURL","nodes","getNodes","length","node_0","parent","getParent","editorElem","current","nativeSelection","_window","activeElement","document","rootElement","getRootElement","isEditable","domRect","nodes_0","element","getElementByKey","getKey","getBoundingClientRect","contains","anchorNode","focusNode","parentElement","y","className","$updateLinkEditor","t3","t4","scrollerElem","update","getEditorState","read","window","addEventListener","removeEventListener","t5","t6","registerUpdateListener","t7","editorState","registerCommand","t8","t9","focus","t10","handleLinkSubmission","monitorInputInteraction","key","event_0","dispatchCommand","selection_0","parent_0","linkNode","rel","__rel","target","__target","title","__title","replace","t11","onClickOverlay","t12","e","value","event_1","body","t13","FloatingLinkEditorPluginProps","HTMLDivElement","FloatingLinkEditorPlugin","$updateToolbar","focusLinkNode","focusAutoLinkNode","badNode","filter","_temp","find","autoLinkNode","is","getIsUnlinked","node_1","_temp2","payload","node_2","linkNode_0","metaKey","ctrlKey","open","LinkPlugin","LexicalLinkPlugin","validateUrl","Props","hasLinkAttributes","CustomLinkPlugin","t0","$","_c","t1","undefined","t2","rel","target","t3","AutoLinkNode","LinkNode","ListItemNode","ListNode","HeadingNode","QuoteNode","DOMExportOutput","DOMExportOutputMap","Klass","LexicalEditor","LexicalNode","isHTMLElement","ParagraphNode","TextNode","removeStylesExportDOM","editor","target","output","exportDOM","element","el","querySelectorAll","removeAttribute","style","getAttribute","textAlign","match","trim","HTMLElement","exportMap","Map","DOMConversionMap","$isTextNode","TextNode","MIN_ALLOWED_FONT_SIZE","MAX_ALLOWED_FONT_SIZE","parseAllowedFontSize","input","match","n","Number","parseAllowedColor","test","getExtraStyles","element","HTMLElement","extraStyles","fontSize","style","backgroundColor","color","constructImportMap","importMap","tag","fn","Object","entries","importDOM","importNode","importer","conversion","output","forChild","undefined","after","node","child","parent","textNode","setStyle","getStyle","InitialConfigType","exportMap","constructImportMap","ParagraphNode","HeadingNode","QuoteNode","LinkNode","AutoLinkNode","ListItemNode","ListNode","HorizontalRuleNode","editorConfig","Pick","html","export","import","namespace","nodes","onError","error","LexicalEditor","SerializedEditorState","$getRoot","$insertNodes","$setSelection","createEditor","$generateHtmlFromNodes","$generateNodesFromDOM","editorConfig","importHtmlIntoEditor","initialHtml","undefined","editor","update","$loadFromHtml","htmlContent","parser","DOMParser","dom","parseFromString","nodes","root","getChildren","forEach","node","remove","stateToHtml","state","namespace","theme","html","onError","error","parsedState","parseEditorState","setEditorState","read","ReactNode","RefObject","useEffect","useImperativeHandle","useRef","useState","clsx","LexicalEditor","SerializedEditorState","$getRoot","InitialConfigType","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","EditorRefPlugin","HistoryPlugin","ListPlugin","HorizontalRulePlugin","ToolbarPlugin","LazyOnChangePlugin","CustomAutoLinkPlugin","FloatingLinkEditorPlugin","CustomLinkPlugin","editorConfig","$loadFromHtml","ToolbarVariantProps","contentEditableStyles","ToolbarContext","WysiwygValue","Props","id","extendedToolbar","floatingPosition","defaultValue","disabled","readOnly","proseCompact","contentEditableBaseStyle","contentEditableClassName","containerClassName","toolbarSticky","toolbarVisible","ref","WysiwygRef","debounceChange","onChange","value","children","readValue","editor","state","getEditorState","toJSON","getValue","setHtml","html","fireEvent","getState","setState","clear","Wysiwyg","t0","$","_c","t1","t2","t3","t4","t5","t6","t7","undefined","t8","editable","editorState","JSON","stringify","fullInitialConfig","editorRef","t10","t9","current","setEditable","floatingAnchorElem","setFloatingAnchorElem","isLinkEditMode","setIsLinkEditMode","t11","Symbol","for","floatingAnchorElem_0","onRef","t12","getEditor","Error","t13","notifyChange","editor_0","t14","editor_1","nextHtml","t15","editor_2","update","t16","fireEvent_0","editor_3","parsedEditorState","parseEditorState","setEditorState","t17","fireEvent_1","editor_4","_temp2","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","root","getChildren","forEach","_temp","node","remove","createEditor","SerializedEditorState","editorConfig","isPlausibleLexicalState","state","root","type","Array","isArray","children","isValidLexicalState","editor","onError","err","parseEditorState","SerializedEditorState","z","isPlausibleLexicalState","WysiwygValue","html","state","maxContentBytes","wysiwygSchema","object","optional","string","custom","check","refine","JSON","stringify","length","parseWysiwygValue","payload","Error","parse","sortKeysReplacer","_key","value","Array","isArray","Object","keys","Record","sort","reduce","sorted","key","serializeWysiwygValue","isWysiwygStateEmpty","root","children","useField","useControl","FieldName","Field","FieldProps","RefObject","ToolbarVariantProps","WysiwygRef","Wysiwyg","parseWysiwygValue","serializeWysiwygValue","WysiwygValue","Props","Omit","name","ref","debounceChange","toolbarSticky","contentEditableClassName","containerClassName","disabled","readOnly","WysiwygField","id","forcedId","rest","field","control","defaultValue","parse","payload","serialize","handleChange","value","change","register","errors","key","undefined","useMemo","clsx","stateToHtml","WysiwygValue","Props","value","proseCompact","className","WysiwygReader","t0","$","_c","t1","undefined","t2","html","state","t3","t4","t5","t6","__html","t7","SerializedEditorState","isStateEmpty","state","children","root","Array","every","node","length","useLexicalComposerContext","CAN_USE_BEFORE_INPUT","IS_APPLE_WEBKIT","IS_IOS","IS_SAFARI","$getSelection","$isRangeSelection","COMMAND_PRIORITY_CRITICAL","KEY_ENTER_COMMAND","useEffect","SubmitOnEnterPluginProps","submitOnShiftOrCtrlEnter","SubmitOnEnterPlugin","t0","$","_c","t1","undefined","editor","t2","t3","registerCommand","event","selection","preventDefault","shiftKey","ctrlKey","form","document","activeElement","closest","requestSubmit"],"sources":["../../../../src/components/fields/wysiwyg/utils/dom.ts","../../../../src/components/fields/wysiwyg/style.ts","../../../../src/components/fields/wysiwyg/ToolbarContext.tsx","../../../../src/components/fields/wysiwyg/utils/getSelectedNode.ts","../../../../src/components/fields/wysiwyg/utils/formatters.ts","../../../../src/components/fields/wysiwyg/components/BlockFormatDropdown.tsx","../../../../src/components/fields/wysiwyg/components/ElementFormatDropdown.tsx","../../../../src/components/fields/wysiwyg/plugins/ToolbarPlugin.tsx","../../../../src/components/fields/wysiwyg/plugins/LazyOnChangePlugin.tsx","../../../../src/components/fields/wysiwyg/plugins/AutoLinkPlugin.tsx","../../../../src/components/fields/wysiwyg/utils/url.ts","../../../../src/components/fields/wysiwyg/utils/setFloatingElemPositionForLinkEditor.ts","../../../../src/components/fields/wysiwyg/plugins/FloatingLinkEditorPlugin.tsx","../../../../src/components/fields/wysiwyg/plugins/LinkPlugin.tsx","../../../../src/components/fields/wysiwyg/parsers/exportMap.ts","../../../../src/components/fields/wysiwyg/parsers/importMap.ts","../../../../src/components/fields/wysiwyg/config/editor.ts","../../../../src/components/fields/wysiwyg/config/html.ts","../../../../src/components/fields/wysiwyg/Wysiwyg.tsx","../../../../src/components/fields/wysiwyg/config/validation.ts","../../../../src/components/fields/wysiwyg/types.ts","../../../../src/components/fields/wysiwyg/WysiwygField.tsx","../../../../src/components/fields/wysiwyg/WysiwygReader.tsx","../../../../src/components/fields/wysiwyg/config/state.ts","../../../../src/components/fields/wysiwyg/plugins/SubmitOnEnterPlugin.tsx"],"sourcesContent":["export function focusNextElement() {\n const focusableSelectors = [\n \"button:not([disabled])\",\n \"[href]\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n ];\n\n const focusableElements = Array.from(\n document.querySelectorAll<HTMLElement>(focusableSelectors.join(\",\")),\n ).filter((el) => el.offsetParent !== null);\n\n const currentIndex = focusableElements.indexOf(document.activeElement as HTMLElement);\n const nextElement = focusableElements[currentIndex + 1];\n\n if (nextElement) {\n nextElement.focus();\n }\n}\n","import type { VariantProps } from \"class-variance-authority\";\nimport { cva } from \"class-variance-authority\";\n\nexport const toolbarVariants = cva(\"p-1 border-custom-2 border gap-1 bg-gray-0/40\", {\n variants: {\n sticky: {\n mobileOnly: \"max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl\",\n allDevice: \"max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl\",\n false: \"\",\n },\n visible: {\n always: \"flex\",\n custom: \"\",\n desktopOnly: \"hidden lg:flex rounded-t-2xl\",\n },\n },\n defaultVariants: {\n sticky: \"mobileOnly\",\n visible: \"always\",\n },\n});\nexport type ToolbarVariantProps = VariantProps<typeof toolbarVariants>;\n\nexport const defaultContentEditableStyle =\n \"p8n-editor-input border-custom-2 rounded-b-2xl border border-t-0 p-2 -outline-offset-2\";\n\nexport const chatContentEditableStyle =\n \"p8n-editor-input border-custom-2 rounded-2xl border px-2 py-1 -outline-offset-2 lg:py-2 lg:border-t-0 lg:rounded-t-none\";\n\nexport const contentEditableStyles = {\n normal: \"p8n-editor-input border-custom-2 rounded-b-2xl border border-t-0 p-2 -outline-offset-2\",\n withoutToolbarOnMobile:\n \"p8n-editor-input border-custom-2 rounded-2xl border px-2 py-1 -outline-offset-2 lg:py-2 lg:border-t-0 lg:rounded-t-none\",\n};\n","import type { ElementFormatType } from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\nexport const blockTypes = [\n \"h1\",\n \"h2\",\n \"h3\",\n \"paragraph\",\n \"number\",\n \"bullet\",\n \"check\",\n \"quote\",\n] as const;\nexport type BlockType = (typeof blockTypes)[number];\n\nexport const elementFormats = [\"center\", \"end\", \"justify\", \"left\", \"right\", \"start\"];\n\nconst initialToolbarState = {\n canUndo: false,\n canRedo: false,\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isLink: false,\n blockType: \"paragraph\" as BlockType,\n elementFormat: \"left\" as ElementFormatType,\n};\n\ntype ToolbarState = typeof initialToolbarState;\ntype ToolbarStateKey = keyof ToolbarState;\ntype ToolbarStateValue<Key extends ToolbarStateKey> = ToolbarState[Key];\n\ntype ContextShape = {\n toolbarState: ToolbarState;\n updateToolbarState<Key extends ToolbarStateKey>(key: Key, value: ToolbarStateValue<Key>): void;\n};\n\nconst Context = createContext<ContextShape | undefined>(undefined);\n\nexport const ToolbarContext = ({ children }: { children: ReactNode }) => {\n const [toolbarState, setToolbarState] = useState(initialToolbarState);\n const updateToolbarState = useCallback(\n <Key extends ToolbarStateKey>(key: Key, value: ToolbarStateValue<Key>) => {\n setToolbarState((prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [],\n );\n\n const contextValue = useMemo(() => {\n return {\n toolbarState,\n updateToolbarState,\n };\n }, [toolbarState, updateToolbarState]);\n\n return <Context.Provider value={contextValue}>{children}</Context.Provider>;\n};\n\nexport const useToolbarState = () => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\"useToolbarState must be used within a ToolbarProvider\");\n }\n\n return context;\n};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport { $isAtNodeEnd } from \"@lexical/selection\";\nimport type { ElementNode, RangeSelection, TextNode } from \"lexical\";\n\nexport function getSelectedNode(selection: RangeSelection): TextNode | ElementNode {\n /**\n * in a selection of a text\n * ---------\n * ^ anchor ^\n * | focus (end)\n */\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (anchorNode === focusNode) {\n return anchorNode;\n }\n const isBackward = selection.isBackward();\n if (isBackward) {\n // @ts-ignore\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\n } else {\n // @ts-ignore\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\n }\n}\n","import {\n INSERT_CHECK_LIST_COMMAND,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n} from \"@lexical/list\";\nimport type { HeadingTagType } from \"@lexical/rich-text\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport type { LexicalEditor } from \"lexical\";\nimport { $createParagraphNode, $getSelection } from \"lexical\";\n\nexport const formatParagraph = (editor: LexicalEditor) => {\n editor.update(() => {\n const selection = $getSelection();\n $setBlocksType(selection, () => $createParagraphNode());\n });\n};\n\nexport const formatHeading = (\n editor: LexicalEditor,\n blockType: string,\n headingSize: HeadingTagType,\n) => {\n if (blockType !== headingSize) {\n editor.update(() => {\n const selection = $getSelection();\n $setBlocksType(selection, () => $createHeadingNode(headingSize));\n });\n }\n};\n\nexport const formatBulletList = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"bullet\") {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n } else {\n formatParagraph(editor);\n }\n};\n\nexport const formatCheckList = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"check\") {\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined);\n } else {\n formatParagraph(editor);\n }\n};\n\nexport const formatNumberedList = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"number\") {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n } else {\n formatParagraph(editor);\n }\n};\n\nexport const formatQuote = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"quote\") {\n editor.update(() => {\n const selection = $getSelection();\n $setBlocksType(selection, () => $createQuoteNode());\n });\n }\n};\n","import type { LexicalEditor } from \"lexical\";\nimport type { BlockType } from \"../ToolbarContext\";\nimport { DropdownMenu, DropdownMenuItem } from \"../../../dropdown-menu\";\nimport { Button } from \"../../../button\";\nimport clsx from \"clsx\";\nimport { formatBulletList, formatHeading, formatParagraph, formatQuote } from \"../utils/formatters\";\nimport { useTranslate } from \"../../../i18n\";\n\ninterface Props {\n blockType: BlockType;\n editor: LexicalEditor;\n isFocusable?: boolean;\n}\n\nconst icons: {\n [K in BlockType]: string;\n} = {\n bullet: \"fe-list-bullet\",\n check: \"fe-help\",\n h1: \"fe-h1\",\n h2: \"fe-h2\",\n h3: \"fe-h3\",\n number: \"fe-list-numbered\",\n paragraph: \"fe-paragraph\",\n quote: \"fe-quote\",\n};\n\nexport function BlockFormatDropdown({ blockType, editor, isFocusable = true }: Props) {\n const translate = useTranslate();\n\n return (\n <DropdownMenu\n data-testid=\"menubar-user-dropdown\"\n placement=\"bottom-start\"\n listClassName=\"flex flex-col gap-1\"\n trigger={\n <Button type=\"button\" variant=\"text\" icon color=\"gray\" tabIndex={isFocusable ? 0 : -1}>\n <i className={icons[blockType]}></i>\n <i className=\"fe-angle-down -ml-4\"></i>\n </Button>\n }\n >\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"paragraph\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatParagraph(editor)}\n >\n <i className={icons.paragraph}></i>\n {translate?.(\"wysiwyg.formats.paragraph\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"h1\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatHeading(editor, blockType, \"h1\")}\n >\n <i className={icons.h1}></i>\n {translate?.(\"wysiwyg.formats.h1\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"h2\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatHeading(editor, blockType, \"h2\")}\n >\n <i className={icons.h2}></i>\n {translate?.(\"wysiwyg.formats.h2\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"h3\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatHeading(editor, blockType, \"h3\")}\n >\n <i className={icons.h3}></i>\n {translate?.(\"wysiwyg.formats.h3\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"bullet\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatBulletList(editor, blockType)}\n >\n <i className={icons.bullet}></i>\n {translate?.(\"wysiwyg.formats.bullet\")}\n </DropdownMenuItem>\n {/* <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"number\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatNumberedList(editor, blockType)}\n >\n {translate?.(\"wysiwyg.formats.number\")}\n </DropdownMenuItem> */}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"quote\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatQuote(editor, blockType)}\n >\n <i className={icons.quote}></i>\n {translate?.(\"wysiwyg.formats.quote\")}\n </DropdownMenuItem>\n </DropdownMenu>\n );\n}\n","import type { ElementFormatType, LexicalEditor } from \"lexical\";\nimport { FORMAT_ELEMENT_COMMAND } from \"lexical\";\nimport { DropdownMenu, DropdownMenuItem } from \"../../../dropdown-menu\";\nimport { Button } from \"../../../button\";\nimport { useTranslate } from \"../../../i18n\";\nimport clsx from \"clsx\";\n\ninterface Props {\n editor: LexicalEditor;\n value: ElementFormatType;\n isFocusable?: boolean;\n}\n\nconst icons = {\n left: \"fe-align-left\",\n center: \"fe-align-center\",\n right: \"fe-align-right\",\n justify: \"fe-align-justify\",\n start: \"fe-align-left\",\n end: \"fe-align-right\",\n \"\": \"\",\n};\n\nexport function ElementFormatDropdown({ editor, value, isFocusable = true }: Props) {\n const translate = useTranslate();\n return (\n <DropdownMenu\n data-testid=\"menubar-user-dropdown\"\n placement=\"bottom-start\"\n className=\"min-w-36\"\n listClassName=\"flex flex-col gap-1\"\n trigger={\n <Button icon variant=\"text\" color=\"gray\" type=\"button\" tabIndex={isFocusable ? 0 : -1}>\n <i className={icons[value || \"left\"]}></i>\n <i className=\"fe-angle-down -ml-4\"></i>\n </Button>\n }\n >\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"left\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"left\");\n }}\n >\n <i className={icons.left}></i>\n {translate?.(\"wysiwyg.elementFormats.left\")}\n </DropdownMenuItem>{\" \"}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"center\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"center\");\n }}\n >\n <i className={icons.center}></i>\n {translate?.(\"wysiwyg.elementFormats.center\")}\n </DropdownMenuItem>{\" \"}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"right\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"right\");\n }}\n >\n <i className={icons.right}></i>\n {translate?.(\"wysiwyg.elementFormats.right\")}\n </DropdownMenuItem>{\" \"}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"justify\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"justify\");\n }}\n >\n <i className={icons.justify}></i>\n {translate?.(\"wysiwyg.elementFormats.justify\")}\n </DropdownMenuItem>\n </DropdownMenu>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, $getNearestNodeOfType, mergeRegister } from \"@lexical/utils\";\nimport clsx from \"clsx\";\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n $isRootOrShadowRoot,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n FORMAT_TEXT_COMMAND,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n UNDO_COMMAND,\n} from \"lexical\";\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\";\n\nimport type { ButtonProps } from \"../../../button\";\nimport { Button } from \"../../../button\";\nimport type { Dispatch } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslate } from \"../../../i18n\";\nimport { focusNextElement } from \"../utils/dom\";\nimport type { ToolbarVariantProps } from \"../style\";\nimport { toolbarVariants } from \"../style\";\nimport type { BlockType } from \"../ToolbarContext\";\nimport { blockTypes, useToolbarState } from \"../ToolbarContext\";\nimport { getSelectedNode } from \"../utils/getSelectedNode\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { $isListNode, ListNode } from \"@lexical/list\";\nimport { $isHeadingNode } from \"@lexical/rich-text\";\nimport { BlockFormatDropdown } from \"../components/BlockFormatDropdown\";\nimport { ElementFormatDropdown } from \"../components/ElementFormatDropdown\";\n\nfunction Divider() {\n return <div className=\"border-r-gray-2 my-1 border-r\" />;\n}\n\nconst buttonBaseProps: (\n label: string | undefined,\n selected: boolean,\n isFocusable: boolean,\n) => ButtonProps = (label, selected, isFocusable) => ({\n \"aria-label\": label,\n selected,\n tabIndex: isFocusable ? 0 : -1,\n color: \"gray\",\n variant: \"text\",\n icon: true,\n type: \"button\",\n});\n\ninterface Props extends ToolbarVariantProps {\n className?: string;\n setIsLinkEditMode: Dispatch<boolean>;\n extendedToolbar?: boolean;\n}\n\nexport function ToolbarPlugin({\n extendedToolbar,\n className,\n sticky,\n visible,\n setIsLinkEditMode,\n}: Props) {\n const [editor] = useLexicalComposerContext();\n const toolbarRef = useRef(null);\n\n const [isFocusable, setIsFocusable] = useState(false);\n const translate = useTranslate();\n\n const { toolbarState, updateToolbarState } = useToolbarState();\n\n const $updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n let element =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : $findMatchingParent(anchorNode, (e) => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n if (element === null) {\n element = anchorNode.getTopLevelElementOrThrow();\n }\n const elementKey = element.getKey();\n const elementDOM = editor.getElementByKey(elementKey);\n\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n const isLink = $isLinkNode(parent) || $isLinkNode(node);\n updateToolbarState(\"isLink\", isLink);\n\n if (elementDOM !== null) {\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const type = parentList ? parentList.getListType() : element.getListType();\n\n updateToolbarState(\"blockType\", type);\n } else {\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\n if (blockTypes.includes(type as BlockType)) {\n updateToolbarState(\"blockType\", type as BlockType);\n }\n }\n }\n\n let matchingParent;\n if ($isLinkNode(parent)) {\n // If node is a link, we need to fetch the parent paragraph node to set format\n matchingParent = $findMatchingParent(\n node,\n (parentNode) => $isElementNode(parentNode) && !parentNode.isInline(),\n );\n }\n\n updateToolbarState(\n \"elementFormat\",\n $isElementNode(matchingParent)\n ? matchingParent.getFormatType()\n : $isElementNode(node)\n ? node.getFormatType()\n : parent?.getFormatType() || \"left\",\n );\n\n updateToolbarState(\"isBold\", selection.hasFormat(\"bold\"));\n updateToolbarState(\"isItalic\", selection.hasFormat(\"italic\"));\n updateToolbarState(\"isUnderline\", selection.hasFormat(\"underline\"));\n }\n }, [editor, updateToolbarState]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, _newEditor) => {\n if (_newEditor !== editor) {\n console.error(\"_newEditor is different !!\");\n }\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n updateToolbarState(\"canUndo\", payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n updateToolbarState(\"canRedo\", payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n );\n }, [editor, $updateToolbar, updateToolbarState]);\n\n const insertLink = useCallback(() => {\n if (!toolbarState.isLink) {\n setIsLinkEditMode(true);\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, \"https://\");\n } else {\n setIsLinkEditMode(false);\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }, [toolbarState.isLink, setIsLinkEditMode, editor]);\n\n return (\n <div className={toolbarVariants({ sticky, visible, className })} ref={toolbarRef}>\n <button\n className={clsx(\n \"not-focus:hidden-focusable bg-gray-0/40 absolute top-1 right-1 z-20 inline-flex h-8 items-center rounded-2xl px-2 backdrop-blur-xs\",\n )}\n onClick={() => {\n setIsFocusable((f) => !f);\n focusNextElement();\n }}\n type=\"button\"\n >\n {translate?.(\n isFocusable ? \"wysiwyg.button.disableFocusable\" : \"wysiwyg.button.enableFocusable\",\n )}\n </button>\n <Button\n {...buttonBaseProps(translate?.(\"wysiwyg.button.undo\"), false, isFocusable)}\n disabled={!toolbarState.canUndo}\n onClick={() => void editor.dispatchCommand(UNDO_COMMAND, undefined)}\n >\n <i className=\"fe-ccw\"></i>\n </Button>\n <Button\n {...buttonBaseProps(translate?.(\"wysiwyg.button.redo\"), false, isFocusable)}\n disabled={!toolbarState.canRedo}\n onClick={() => void editor.dispatchCommand(REDO_COMMAND, undefined)}\n >\n <i className=\"fe-cw\"></i>\n </Button>\n <Divider />\n {extendedToolbar && (\n <>\n {blockTypes.includes(toolbarState.blockType) && (\n <BlockFormatDropdown\n isFocusable={isFocusable}\n blockType={toolbarState.blockType}\n editor={editor}\n />\n )}\n <ElementFormatDropdown\n isFocusable={isFocusable}\n value={toolbarState.elementFormat}\n editor={editor}\n />\n <Divider />\n </>\n )}\n\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatBold\"),\n toolbarState.isBold,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\n >\n <i className=\"fe-bold\"></i>\n </Button>\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatItalics\"),\n toolbarState.isItalic,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")}\n >\n <i className=\"fe-italic\"></i>\n </Button>\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatUnderline\"),\n toolbarState.isUnderline,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")}\n >\n <i className=\"fe-underline\"></i>\n </Button>\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatLink\"),\n toolbarState.isLink,\n isFocusable,\n )}\n onClick={insertLink}\n >\n <i className=\"fe-link\"></i>\n </Button>\n {extendedToolbar && (\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.horizontalRule\"),\n toolbarState.isLink,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)}\n >\n <i className=\"fe-horizontal-rule\"></i>\n </Button>\n )}\n </div>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect, useRef } from \"react\";\nimport debounce from \"lodash.debounce\";\nimport { WysiwygValue } from \"../types\";\n\ninterface Props {\n wait: number;\n onChange?: (value: WysiwygValue) => void;\n}\n\nexport function LazyOnChangePlugin({ wait, onChange }: Props) {\n const [editor] = useLexicalComposerContext();\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n useEffect(() => {\n function notifyChange() {\n onChangeRef.current?.({\n state: editor.getEditorState().toJSON(),\n });\n }\n\n const debouncedNotifyChange = debounce(notifyChange, wait);\n\n const unregister = editor.registerUpdateListener(() => {\n debouncedNotifyChange();\n });\n\n return () => {\n unregister();\n debouncedNotifyChange.cancel();\n };\n }, [editor, wait]);\n\n return null;\n}\n","import { AutoLinkPlugin, createLinkMatcherWithRegExp } from \"@lexical/react/LexicalAutoLinkPlugin\";\n\n/**\n * Original create an URL with http://mydomain.c\n * const URL_REGEX =\n * /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/;\n * const EMAIL_REGEX =\n * /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/;\n *\n * I'm aware that for tech users with an email in *.me this autolink doesn't trigger\n * but for the majority of users the first tld is 3 chars minimum and trigger an autolink after\n * 1 character can be disturbing\n */\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{3,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/;\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{3,}))/;\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith(\"http\") ? text : `https://${text}`;\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`;\n }),\n];\n\nexport function CustomAutoLinkPlugin() {\n return <AutoLinkPlugin matchers={MATCHERS} />;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst SUPPORTED_URL_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n}\n\n// Source: https://stackoverflow.com/a/8234912/2013580\nconst urlRegExp = new RegExp(\n /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[+~%/.\\w-_]*)?\\??(?:[-+=&;%@.\\w_]*)#?(?:[\\w]*))?)/,\n);\nexport function validateUrl(url: string): boolean {\n // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://.\n // Maybe show a dialog where they user can type the URL before inserting it.\n return url === \"https://\" || urlRegExp.test(url);\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nconst VERTICAL_GAP = 10;\nconst HORIZONTAL_OFFSET = 5;\n\nexport function setFloatingElemPositionForLinkEditor(\n targetRect: DOMRect | null,\n floatingElem: HTMLElement,\n anchorElem: HTMLElement,\n verticalGap: number = VERTICAL_GAP,\n horizontalOffset: number = HORIZONTAL_OFFSET,\n): void {\n const scrollerElem = anchorElem.parentElement;\n\n if (targetRect === null || !scrollerElem) {\n floatingElem.style.opacity = \"0\";\n floatingElem.style.transform = \"translate(-10000px, -10000px)\";\n return;\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect();\n const anchorElementRect = anchorElem.getBoundingClientRect();\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\n\n let top = targetRect.top - verticalGap;\n let left = targetRect.left - horizontalOffset;\n\n if (top < editorScrollerRect.top) {\n top += floatingElemRect.height + targetRect.height + verticalGap * 2;\n }\n\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\n }\n\n top -= anchorElementRect.top;\n left -= anchorElementRect.left;\n\n floatingElem.style.opacity = \"1\";\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport type { BaseSelection, LexicalEditor } from \"lexical\";\nimport {\n $getSelection,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from \"lexical\";\nimport type { Dispatch } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { getSelectedNode } from \"../utils/getSelectedNode\";\nimport { $createLinkNode, $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { createPortal } from \"react-dom\";\nimport { Input } from \"../../text\";\nimport { sanitizeUrl } from \"../utils/url\";\nimport { setFloatingElemPositionForLinkEditor } from \"../utils/setFloatingElemPositionForLinkEditor\";\nimport { Button } from \"../../../button\";\nimport { proseLinkVariant } from \"../../../href\";\nimport { Dialog } from \"../../../dialog\";\nimport clsx from \"clsx\";\nimport { FloatingOverlay } from \"@floating-ui/react\";\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault();\n}\n\ninterface FloatingLinkEditorProps {\n floatingPosition?: \"top\" | \"bottom\";\n editor: LexicalEditor;\n isLink: boolean;\n setIsLink: Dispatch<boolean>;\n anchorElem: HTMLElement;\n isLinkEditMode: boolean;\n setIsLinkEditMode: Dispatch<boolean>;\n}\nfunction FloatingLinkEditor({\n floatingPosition = \"bottom\",\n editor,\n isLink,\n setIsLink,\n anchorElem,\n isLinkEditMode,\n setIsLinkEditMode,\n}: FloatingLinkEditorProps) {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const [editedLinkUrl, setEditedLinkUrl] = useState(\"https://\");\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(null);\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n\n if (linkParent) {\n setLinkUrl(linkParent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkUrl(node.getURL());\n } else {\n setLinkUrl(\"\");\n }\n if (isLinkEditMode) {\n setEditedLinkUrl(linkUrl);\n }\n } else if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length > 0) {\n const node = nodes[0];\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkUrl(node.getURL());\n } else {\n setLinkUrl(\"\");\n }\n if (isLinkEditMode) {\n setEditedLinkUrl(linkUrl);\n }\n }\n }\n\n const editorElem = editorRef.current;\n const nativeSelection = getDOMSelection(editor._window);\n const activeElement = document.activeElement;\n\n if (editorElem === null) {\n return;\n }\n\n const rootElement = editor.getRootElement();\n\n if (selection !== null && rootElement !== null && editor.isEditable()) {\n let domRect: DOMRect | undefined;\n\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length > 0) {\n const element = editor.getElementByKey(nodes[0].getKey());\n if (element) {\n domRect = element.getBoundingClientRect();\n }\n }\n } else if (nativeSelection !== null && rootElement.contains(nativeSelection.anchorNode)) {\n domRect = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n }\n\n if (domRect) {\n if (floatingPosition === \"top\") {\n domRect.y -= 40;\n } else {\n domRect.y += 40;\n }\n setFloatingElemPositionForLinkEditor(domRect, editorElem, anchorElem);\n }\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== \"link-input\") {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem);\n }\n setLastSelection(null);\n setIsLinkEditMode(false);\n setLinkUrl(\"\");\n }\n\n return true;\n }, [anchorElem, editor, setIsLinkEditMode, isLinkEditMode, linkUrl, floatingPosition]);\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement;\n\n const update = () => {\n editor.getEditorState().read(() => {\n $updateLinkEditor();\n });\n };\n\n window.addEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.addEventListener(\"scroll\", update);\n }\n\n return () => {\n window.removeEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.removeEventListener(\"scroll\", update);\n }\n };\n }, [anchorElem.parentElement, editor, $updateLinkEditor]);\n\n // When toggle isLink\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH,\n ),\n );\n }, [editor, $updateLinkEditor, setIsLink, isLink]);\n\n // Init\n useEffect(() => {\n editor.getEditorState().read(() => {\n $updateLinkEditor();\n });\n }, [editor, $updateLinkEditor]);\n\n // When toggle Edit Mode, add focus to input\n useEffect(() => {\n if (isLinkEditMode && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isLinkEditMode, isLink]);\n\n // when editing and press Enter\n const monitorInputInteraction = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n handleLinkSubmission(event);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setIsLinkEditMode(false);\n }\n };\n\n // when editing and click Ok\n const handleLinkSubmission = (\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n ) => {\n event.preventDefault();\n if (lastSelection !== null) {\n if (linkUrl !== \"\") {\n editor.update(() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(editedLinkUrl));\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const parent = getSelectedNode(selection).getParent();\n if ($isAutoLinkNode(parent)) {\n const linkNode = $createLinkNode(parent.getURL(), {\n rel: parent.__rel,\n target: parent.__target,\n title: parent.__title,\n });\n parent.replace(linkNode, true);\n }\n }\n });\n }\n setEditedLinkUrl(\"https://\");\n setIsLinkEditMode(false);\n }\n };\n\n function onClickOverlay() {\n editor.update(() => {\n setIsLink(false);\n });\n }\n return (\n <div\n ref={editorRef}\n className=\"z-dialog absolute top-0 left-0 flex opacity-0 transition-opacity\"\n >\n {isLink ? (\n <>\n <Dialog color=\"yellow\" className=\"flex w-xs gap-1 p-1\">\n {isLinkEditMode ? (\n <>\n <Input\n className=\"flex-1\"\n ref={inputRef}\n value={editedLinkUrl}\n onChange={(e) => setEditedLinkUrl(e.target.value)}\n onKeyDown={monitorInputInteraction}\n />\n <Button\n icon\n variant=\"light\"\n color=\"green\"\n type=\"button\"\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={handleLinkSubmission}\n >\n <i className=\"fe-ok\"></i>\n </Button>\n <Button\n icon\n color=\"red\"\n variant=\"text\"\n type=\"button\"\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={() => void setIsLinkEditMode(false)}\n >\n <i className=\"fe-cancel\"></i>\n </Button>\n </>\n ) : (\n <div className=\"flex w-full items-center gap-1\">\n <span>URL:</span>\n <a\n className={clsx(proseLinkVariant, \"flex-1 items-center truncate\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={sanitizeUrl(linkUrl)}\n >\n {linkUrl}\n </a>\n <Button\n icon\n type=\"button\"\n variant=\"light\"\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={(event) => {\n event.preventDefault();\n setEditedLinkUrl(linkUrl);\n setIsLinkEditMode(true);\n }}\n >\n <i className=\"fe-pencil\"></i>\n </Button>\n <Button\n type=\"button\"\n color=\"red\"\n variant=\"light\"\n icon\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }}\n >\n <i className=\"fe-trash\"></i>\n </Button>\n </div>\n )}\n </Dialog>\n {createPortal(\n <FloatingOverlay\n className=\"z-[calc(var(--index-wysiwyg)-1)]\"\n onClick={onClickOverlay}\n lockScroll\n />,\n document.body,\n )}\n </>\n ) : null}\n </div>\n );\n}\n\ninterface FloatingLinkEditorPluginProps {\n floatingPosition?: \"top\" | \"bottom\";\n anchorElem: HTMLDivElement;\n isLinkEditMode: boolean;\n setIsLinkEditMode: Dispatch<boolean>;\n}\n\nexport function FloatingLinkEditorPlugin({\n floatingPosition,\n anchorElem,\n isLinkEditMode,\n setIsLinkEditMode,\n}: FloatingLinkEditorPluginProps) {\n const [editor] = useLexicalComposerContext();\n const [isLink, setIsLink] = useState(false);\n\n useEffect(() => {\n function $updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const focusNode = getSelectedNode(selection);\n const focusLinkNode = $findMatchingParent(focusNode, $isLinkNode);\n const focusAutoLinkNode = $findMatchingParent(focusNode, $isAutoLinkNode);\n if (!(focusLinkNode || focusAutoLinkNode)) {\n setIsLink(false);\n return;\n }\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode);\n const autoLinkNode = $findMatchingParent(node, $isAutoLinkNode);\n return (\n (focusLinkNode && !focusLinkNode.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkNode)) ||\n (focusAutoLinkNode && !focusAutoLinkNode.is(autoLinkNode)) ||\n (autoLinkNode &&\n (!autoLinkNode.is(focusAutoLinkNode) || autoLinkNode.getIsUnlinked()))\n );\n });\n if (!badNode) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n } else if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length === 0) {\n setIsLink(false);\n return;\n }\n const node = nodes[0];\n const parent = node.getParent();\n if ($isLinkNode(parent) || $isLinkNode(node)) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), \"_blank\");\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [editor]);\n\n return createPortal(\n <FloatingLinkEditor\n floatingPosition={floatingPosition}\n editor={editor}\n isLink={isLink}\n anchorElem={anchorElem}\n setIsLink={setIsLink}\n isLinkEditMode={isLinkEditMode}\n setIsLinkEditMode={setIsLinkEditMode}\n />,\n anchorElem,\n );\n}\n","import { LinkPlugin as LexicalLinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport { validateUrl } from \"../utils/url\";\n\ntype Props = {\n hasLinkAttributes?: boolean;\n};\n\nexport function CustomLinkPlugin({ hasLinkAttributes = false }: Props) {\n return (\n <LexicalLinkPlugin\n validateUrl={validateUrl}\n attributes={\n hasLinkAttributes\n ? {\n rel: \"noopener noreferrer\",\n target: \"_blank\",\n }\n : undefined\n }\n />\n );\n}\n","/**\n * check the original code at\n * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/App.tsx\n */\n\nimport { AutoLinkNode, LinkNode } from \"@lexical/link\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport type {\n DOMExportOutput,\n DOMExportOutputMap,\n Klass,\n LexicalEditor,\n LexicalNode,\n} from \"lexical\";\nimport { isHTMLElement, ParagraphNode, TextNode } from \"lexical\";\n\nconst removeStylesExportDOM = (editor: LexicalEditor, target: LexicalNode): DOMExportOutput => {\n const output = target.exportDOM(editor);\n // @ts-ignore\n if (output && isHTMLElement(output.element)) {\n // Remove all inline styles and classes if the element is an HTMLElement\n // Children are checked as well since TextNode can be nested\n // in i, b, and strong tags.\n for (const el of [\n output.element,\n ...output.element.querySelectorAll('[style],[class],[dir=\"ltr\"]'),\n ]) {\n el.removeAttribute(\"class\");\n\n const style = el.getAttribute(\"style\");\n let textAlign: string | null = null;\n if (style) {\n const match = style.match(/text-align\\s*:\\s*([^;]+)\\s*;?/i);\n if (match) {\n textAlign = match[1].trim();\n }\n }\n\n el.removeAttribute(\"style\");\n if (textAlign) {\n (el as HTMLElement).style.textAlign = textAlign;\n }\n\n if (el.getAttribute(\"dir\") === \"ltr\") {\n el.removeAttribute(\"dir\");\n }\n }\n }\n return output;\n};\n\nexport const exportMap: DOMExportOutputMap = new Map<\n Klass<LexicalNode>,\n (editor: LexicalEditor, target: LexicalNode) => DOMExportOutput\n>([\n [ParagraphNode, removeStylesExportDOM],\n [HeadingNode, removeStylesExportDOM],\n [AutoLinkNode, removeStylesExportDOM],\n [LinkNode, removeStylesExportDOM],\n [ListNode, removeStylesExportDOM],\n [ListItemNode, removeStylesExportDOM],\n [TextNode, removeStylesExportDOM],\n [QuoteNode, removeStylesExportDOM],\n]);\n","/**\n * check the original code at\n * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/App.tsx\n */\n\nimport type { DOMConversionMap } from \"lexical\";\nimport { $isTextNode, TextNode } from \"lexical\";\n\nconst MIN_ALLOWED_FONT_SIZE = 8;\nconst MAX_ALLOWED_FONT_SIZE = 72;\n\nconst parseAllowedFontSize = (input: string): string => {\n const match = input.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (match) {\n const n = Number(match[1]);\n if (n >= MIN_ALLOWED_FONT_SIZE && n <= MAX_ALLOWED_FONT_SIZE) {\n return input;\n }\n }\n return \"\";\n};\n\nfunction parseAllowedColor(input: string) {\n return /^rgb\\(\\d+, \\d+, \\d+\\)$/.test(input) ? input : \"\";\n}\n\nconst getExtraStyles = (element: HTMLElement): string => {\n // Parse styles from pasted input, but only if they match exactly the\n // sort of styles that would be produced by exportDOM\n let extraStyles = \"\";\n const fontSize = parseAllowedFontSize(element.style.fontSize);\n const backgroundColor = parseAllowedColor(element.style.backgroundColor);\n const color = parseAllowedColor(element.style.color);\n if (fontSize !== \"\" && fontSize !== \"15px\") {\n extraStyles += `font-size: ${fontSize};`;\n }\n if (backgroundColor !== \"\" && backgroundColor !== \"rgb(255, 255, 255)\") {\n extraStyles += `background-color: ${backgroundColor};`;\n }\n if (color !== \"\" && color !== \"rgb(0, 0, 0)\") {\n extraStyles += `color: ${color};`;\n }\n return extraStyles;\n};\n\nexport const constructImportMap = (): DOMConversionMap => {\n const importMap: DOMConversionMap = {};\n\n // Wrap all TextNode importers with a function that also imports\n // the custom styles implemented by the playground\n for (const [tag, fn] of Object.entries(TextNode.importDOM?.() || {})) {\n importMap[tag] = (importNode) => {\n const importer = fn(importNode);\n if (!importer) {\n return null;\n }\n return {\n ...importer,\n conversion: (element) => {\n const output = importer.conversion(element);\n if (\n output === null ||\n output.forChild === undefined ||\n output.after !== undefined ||\n output.node !== null\n ) {\n return output;\n }\n const extraStyles = getExtraStyles(element);\n if (extraStyles) {\n const { forChild } = output;\n return {\n ...output,\n forChild: (child, parent) => {\n const textNode = forChild(child, parent);\n if ($isTextNode(textNode)) {\n textNode.setStyle(textNode.getStyle() + extraStyles);\n }\n return textNode;\n },\n };\n }\n return output;\n },\n };\n };\n }\n\n return importMap;\n};\n","import type { InitialConfigType } from \"@lexical/react/LexicalComposer\";\nimport { exportMap } from \"../parsers/exportMap\";\nimport { constructImportMap } from \"../parsers/importMap\";\nimport { ParagraphNode } from \"lexical\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { LinkNode, AutoLinkNode } from \"@lexical/link\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { HorizontalRuleNode } from \"@lexical/react/LexicalHorizontalRuleNode\";\n\nexport const editorConfig: Pick<\n InitialConfigType,\n \"theme\" | \"html\" | \"namespace\" | \"nodes\" | \"onError\"\n> = {\n html: {\n export: exportMap,\n import: constructImportMap(),\n },\n namespace: \"Melodineo Wysiwyg\",\n nodes: [\n HorizontalRuleNode,\n ParagraphNode,\n HeadingNode,\n AutoLinkNode,\n LinkNode,\n ListNode,\n ListItemNode,\n QuoteNode,\n ],\n onError(error) {\n throw error;\n },\n};\n","import type { LexicalEditor, SerializedEditorState } from \"lexical\";\nimport { $getRoot, $insertNodes, $setSelection, createEditor } from \"lexical\";\n\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from \"@lexical/html\";\n\nimport { editorConfig } from \"./editor\";\n\nexport function importHtmlIntoEditor(initialHtml?: string) {\n if (!initialHtml) {\n return undefined;\n }\n return (editor: LexicalEditor) => {\n editor.update(() => {\n $loadFromHtml(editor, initialHtml);\n });\n };\n}\n\nexport function $loadFromHtml(editor: LexicalEditor, htmlContent: string) {\n const parser = new DOMParser();\n const dom = parser.parseFromString(htmlContent, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n\n const root = $getRoot();\n root.getChildren().forEach((node) => {\n node.remove();\n });\n\n $insertNodes(nodes);\n\n $setSelection(null);\n}\n\n/**\n * Sérialise un `state` en HTML statique via un éditeur jetable (jamais monté dans le DOM),\n * pour un affichage en lecture seule sans payer le coût d'un LexicalComposer complet.\n */\nexport function stateToHtml(state: SerializedEditorState): string {\n const { namespace, nodes, theme, html } = editorConfig;\n const editor = createEditor({\n namespace,\n nodes,\n theme,\n html,\n onError(error) {\n throw error;\n },\n });\n const parsedState = editor.parseEditorState(state);\n editor.setEditorState(parsedState);\n\n return editor.read(() => $generateHtmlFromNodes(editor));\n}\n","import type { ReactNode, RefObject } from \"react\";\nimport { useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\nimport type { LexicalEditor, SerializedEditorState } from \"lexical\";\nimport { $getRoot } from \"lexical\";\nimport { InitialConfigType, LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { EditorRefPlugin } from \"@lexical/react/LexicalEditorRefPlugin\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { HorizontalRulePlugin } from \"@lexical/react/LexicalHorizontalRulePlugin\";\n\nimport { ToolbarPlugin } from \"./plugins/ToolbarPlugin\";\nimport { LazyOnChangePlugin } from \"./plugins/LazyOnChangePlugin\";\nimport { CustomAutoLinkPlugin } from \"./plugins/AutoLinkPlugin\";\nimport { FloatingLinkEditorPlugin } from \"./plugins/FloatingLinkEditorPlugin\";\nimport { CustomLinkPlugin } from \"./plugins/LinkPlugin\";\n\nimport { editorConfig } from \"./config/editor\";\nimport { $loadFromHtml } from \"./config/html\";\nimport type { ToolbarVariantProps } from \"./style\";\nimport { contentEditableStyles } from \"./style\";\nimport { ToolbarContext } from \"./ToolbarContext\";\nimport { WysiwygValue } from \"./types\";\n\ninterface Props {\n id?: string;\n extendedToolbar?: boolean;\n floatingPosition?: \"top\" | \"bottom\";\n defaultValue?: WysiwygValue;\n disabled?: boolean;\n readOnly?: boolean;\n\n proseCompact?: boolean;\n\n contentEditableBaseStyle?: \"normal\" | \"withoutToolbarOnMobile\";\n /**\n * If you want to define custom height\n */\n contentEditableClassName?: string;\n containerClassName?: string;\n /**\n * by default sticky is only available for mobile device with a top-0 if\n * you want to change this provide your own className\n */\n toolbarSticky?: ToolbarVariantProps[\"sticky\"];\n toolbarVisible?: ToolbarVariantProps[\"visible\"];\n\n ref?: RefObject<WysiwygRef>;\n debounceChange?: number | false;\n onChange?: (value: WysiwygValue) => void;\n children?: ReactNode;\n}\nfunction readValue(editor: LexicalEditor): WysiwygValue {\n return {\n state: editor.getEditorState().toJSON(),\n };\n}\n\nexport interface WysiwygRef {\n getValue: () => WysiwygValue;\n setHtml: (html: string, fireEvent?: boolean) => void;\n getState: () => SerializedEditorState;\n setState: (state: SerializedEditorState, fireEvent?: boolean) => void;\n clear: (fireEvent?: boolean) => void;\n}\n\nexport function Wysiwyg({\n id,\n floatingPosition = \"bottom\",\n extendedToolbar = true,\n proseCompact = false,\n defaultValue,\n disabled = false,\n readOnly = false,\n contentEditableBaseStyle = \"normal\",\n contentEditableClassName,\n containerClassName,\n ref,\n toolbarSticky,\n toolbarVisible,\n debounceChange = false,\n onChange,\n children,\n}: Props) {\n const [fullInitialConfig] = useState<InitialConfigType>(() => ({\n ...editorConfig,\n editable: !disabled && !readOnly,\n ...(defaultValue ? { editorState: JSON.stringify(defaultValue.state) } : {}),\n }));\n\n const editorRef = useRef<LexicalEditor | null>(null);\n\n useEffect(() => {\n editorRef.current?.setEditable(!disabled && !readOnly);\n }, [disabled, readOnly]);\n const [floatingAnchorElem, setFloatingAnchorElem] = useState<HTMLDivElement | null>(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const onRef = (floatingAnchorElem: HTMLDivElement) => {\n if (floatingAnchorElem !== null) {\n setFloatingAnchorElem(floatingAnchorElem);\n }\n };\n\n function getEditor(): LexicalEditor {\n const editor = editorRef.current;\n\n if (!editor) {\n throw new Error(\"Wysiwyg ref called before the editor was mounted\");\n }\n\n return editor;\n }\n\n function notifyChange(editor: LexicalEditor) {\n onChange?.(readValue(editor));\n }\n\n useImperativeHandle(ref, () => {\n return {\n getValue: () => {\n const editor = getEditor();\n return readValue(editor);\n },\n setHtml: (nextHtml: string, fireEvent = false) => {\n const editor = getEditor();\n\n editor.update(() => {\n $loadFromHtml(editor, nextHtml);\n });\n if (fireEvent) {\n notifyChange(editor);\n }\n },\n getState: () => {\n return getEditor().getEditorState().toJSON();\n },\n setState: (editorState: SerializedEditorState, fireEvent = false) => {\n const editor = getEditor();\n const parsedEditorState = editor.parseEditorState(editorState);\n editor.setEditorState(parsedEditorState);\n if (fireEvent) {\n notifyChange(editor);\n }\n },\n\n clear: (fireEvent = false) => {\n const editor = getEditor();\n\n editor.update(() => {\n const root = $getRoot();\n root.getChildren().forEach((node) => {\n node.remove();\n });\n });\n if (fireEvent) {\n notifyChange(editor);\n }\n },\n };\n });\n\n return (\n <div className=\"relative z-(--index-wysiwyg) w-full\">\n <LexicalComposer initialConfig={fullInitialConfig}>\n <EditorRefPlugin editorRef={editorRef} />\n <CustomAutoLinkPlugin />\n <CustomLinkPlugin />\n <HorizontalRulePlugin />\n <ListPlugin />\n {debounceChange && <LazyOnChangePlugin wait={debounceChange} onChange={onChange} />}\n <HistoryPlugin />\n\n <ToolbarContext>\n <div\n ref={onRef}\n data-color=\"gray\"\n className={clsx(\"relative mx-auto w-full\", containerClassName)}\n >\n <ToolbarPlugin\n extendedToolbar={extendedToolbar}\n sticky={toolbarSticky}\n visible={toolbarVisible}\n setIsLinkEditMode={setIsLinkEditMode}\n />\n {floatingAnchorElem && (\n <FloatingLinkEditorPlugin\n floatingPosition={floatingPosition}\n anchorElem={floatingAnchorElem}\n isLinkEditMode={isLinkEditMode}\n setIsLinkEditMode={setIsLinkEditMode}\n />\n )}\n {children}\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n id={id}\n autoComplete=\"off\"\n aria-disabled={disabled}\n aria-readonly={readOnly}\n {...(proseCompact ? { \"data-compact\": true } : {})}\n className={clsx(\n \"prose\",\n contentEditableStyles[contentEditableBaseStyle],\n contentEditableClassName,\n )}\n ></ContentEditable>\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </div>\n </ToolbarContext>\n </LexicalComposer>\n </div>\n );\n}\n","import { createEditor, SerializedEditorState } from \"lexical\";\nimport { editorConfig } from \"./editor\";\n\nexport function isPlausibleLexicalState(state: unknown): state is SerializedEditorState {\n if (typeof state !== \"object\" || state === null) return false;\n const root = (state as { root?: unknown }).root;\n return (\n typeof root === \"object\" &&\n root !== null &&\n (root as { type?: unknown }).type === \"root\" &&\n Array.isArray((root as { children?: unknown }).children)\n );\n}\n\n// non utilisée directement dans le flux de validation actuel : `generateHtmlFromLexicalState`\n// (via `stateToHtml`) appelle déjà `editor.parseEditorState` en interne, ce qui\n// fournit la même garantie en évitant un second parse. Conservée comme utilitaire public\n// pour un appelant qui voudrait valider sans avoir besoin du HTML généré.\nexport function isValidLexicalState(state: unknown): state is SerializedEditorState {\n try {\n const editor = createEditor({\n ...editorConfig,\n onError(err) {\n throw err;\n },\n });\n editor.parseEditorState(state as SerializedEditorState);\n return true;\n } catch {\n return false;\n }\n}\n","import { SerializedEditorState } from \"lexical\";\nimport { z } from \"zod/v4-mini\";\nimport { isPlausibleLexicalState } from \"./config/validation\";\n\nexport type WysiwygValue = {\n html?: string;\n state: SerializedEditorState;\n};\n\nconst maxContentBytes = 100_000; // à trancher ensemble\n\nexport const wysiwygSchema = z.object({\n html: z.optional(z.string()),\n state: z\n .custom<SerializedEditorState>(isPlausibleLexicalState)\n .check(z.refine((state) => JSON.stringify(state).length <= maxContentBytes)),\n});\n\n// renvoie `undefined` (convention Zod pour \"absent\", cf. z.optional()) plutôt que `null`\n// (convention Conform) : c'est au point d'appel `useControl.parse` d'adapter avec `?? null`\nexport function parseWysiwygValue(payload: unknown) {\n if (payload == null || payload === \"\") {\n return null;\n }\n if (typeof payload !== \"string\") {\n throw new Error(\"wysiwyg value must be a JSON string\");\n }\n try {\n return JSON.parse(payload) as WysiwygValue;\n } catch {\n // JSON corrompu (ex. donnée persistée avant une migration de schéma) : on dégrade\n // gracieusement vers \"absent\" plutôt que de faire planter le rendu du champ.\n return null;\n }\n}\n\n// trie récursivement les clés des objets rencontrés afin que deux states lexical\n// sémantiquement identiques mais générés avec un ordre de clés différent produisent\n// la même chaîne (nécessaire pour une comparaison isDirty fiable)\nfunction sortKeysReplacer(_key: string, value: unknown): unknown {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n }, {});\n }\n return value;\n}\n\nexport function serializeWysiwygValue(value: unknown): string | null {\n try {\n return value == null\n ? null\n : typeof value === \"string\"\n ? value\n : JSON.stringify({ state: (value as WysiwygValue).state }, sortKeysReplacer);\n } catch {\n return null;\n }\n}\n\nexport function isWysiwygStateEmpty(value: WysiwygValue) {\n return value.state.root.children.length === 0;\n}\n","import { useField, useControl, type FieldName } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport type { RefObject } from \"react\";\nimport type { ToolbarVariantProps } from \"./style\";\nimport type { WysiwygRef } from \"./Wysiwyg\";\nimport { Wysiwyg } from \"./Wysiwyg\";\nimport { parseWysiwygValue, serializeWysiwygValue, WysiwygValue } from \"./types\";\n\ninterface Props extends Omit<FieldProps, \"errors\" | \"children\" | \"group\"> {\n name: FieldName<WysiwygValue | undefined | null>;\n ref?: RefObject<WysiwygRef>;\n debounceChange?: number | false;\n toolbarSticky?: ToolbarVariantProps[\"sticky\"];\n contentEditableClassName?: string;\n containerClassName?: string;\n disabled?: boolean;\n readOnly?: boolean;\n}\n\nexport function WysiwygField({\n name,\n ref,\n debounceChange = false,\n toolbarSticky,\n contentEditableClassName,\n containerClassName,\n disabled = false,\n readOnly = false,\n id: forcedId,\n ...rest\n}: Props) {\n const field = useField(name);\n const id = forcedId ?? field.id;\n\n const control = useControl<WysiwygValue, string>({\n // on utiliserait defaultPayload si on construisait un composant fieldset.\n // ici on a uniquement un input text\n defaultValue: field.defaultValue,\n // useControl attend `null` (pas `undefined`) pour signaler l'absence de valeur\n parse: (payload) => parseWysiwygValue(payload) ?? null,\n serialize: serializeWysiwygValue,\n });\n\n function handleChange(value: WysiwygValue) {\n control.change(value);\n }\n\n return (\n <>\n <input\n name={field.name}\n type=\"text\"\n autoComplete=\"off\"\n tabIndex={-1}\n ref={control.register}\n defaultValue={control.defaultValue ?? \"\"}\n disabled={disabled}\n readOnly={readOnly}\n hidden\n />\n <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n <Wysiwyg\n key={field.key}\n ref={ref}\n defaultValue={control.payload ?? undefined}\n onChange={handleChange}\n debounceChange={debounceChange}\n toolbarSticky={toolbarSticky}\n contentEditableClassName={contentEditableClassName}\n containerClassName={containerClassName}\n disabled={disabled}\n readOnly={readOnly}\n />\n </Field>\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport clsx from \"clsx\";\n\nimport { stateToHtml } from \"./config/html\";\nimport type { WysiwygValue } from \"./types\";\n\ninterface Props {\n value: WysiwygValue;\n proseCompact?: boolean;\n className?: string;\n}\n\nexport function WysiwygReader({ value, proseCompact = false, className }: Props) {\n const html = useMemo(() => value.html ?? stateToHtml(value.state), [value.html, value.state]);\n\n return (\n <div\n className={clsx(className ?? \"prose\")}\n {...(proseCompact ? { \"data-compact\": true } : {})}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n","import { SerializedEditorState } from \"lexical\";\n\nexport function isStateEmpty(state: SerializedEditorState): boolean {\n const children = state.root.children as Array<{ children?: unknown[] }>;\n return children.every((node) => (node.children?.length ?? 0) === 0);\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { CAN_USE_BEFORE_INPUT, IS_APPLE_WEBKIT, IS_IOS, IS_SAFARI } from \"@lexical/utils\";\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n KEY_ENTER_COMMAND,\n} from \"lexical\";\nimport { useEffect } from \"react\";\n\ninterface SubmitOnEnterPluginProps {\n /**\n * When true, Shift+Enter or Ctrl+Enter submits the form and Enter inserts\n * a newline (inverse of the default Enter-to-submit behavior).\n */\n submitOnShiftOrCtrlEnter?: boolean;\n}\n\nexport function SubmitOnEnterPlugin({\n submitOnShiftOrCtrlEnter = false,\n}: SubmitOnEnterPluginProps) {\n const [editor] = useLexicalComposerContext();\n useEffect(() => {\n return editor.registerCommand<KeyboardEvent | null>(\n KEY_ENTER_COMMAND,\n (event) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n if (event !== null) {\n // If we have beforeinput, then we can avoid blocking\n // the default behavior. This ensures that the iOS can\n // intercept that we're actually inserting a paragraph,\n // and autocomplete, autocapitalize etc work as intended.\n // This can also cause a strange performance issue in\n // Safari, where there is a noticeable pause due to\n // preventing the key down of enter.\n /**\n * Warning: when you use devtools the browser UserAgent is modified and\n * all constants are true.\n */\n if ((IS_IOS || IS_SAFARI || IS_APPLE_WEBKIT) && CAN_USE_BEFORE_INPUT) {\n return false;\n }\n event.preventDefault();\n if (submitOnShiftOrCtrlEnter ? !(event.shiftKey || event.ctrlKey) : event.shiftKey) {\n return false;\n }\n }\n\n const form = document.activeElement?.closest<HTMLFormElement>(\"form\");\n form?.requestSubmit();\n return true;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor, submitOnShiftOrCtrlEnter]);\n return null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["focusNextElement","focusableSelectors","focusableElements","Array","from","document","querySelectorAll","HTMLElement","join","filter","el","offsetParent","currentIndex","indexOf","activeElement","nextElement","focus","VariantProps","cva","toolbarVariants","variants","sticky","mobileOnly","allDevice","false","visible","always","custom","desktopOnly","defaultVariants","ToolbarVariantProps","defaultContentEditableStyle","chatContentEditableStyle","contentEditableStyles","normal","withoutToolbarOnMobile","ElementFormatType","ReactNode","createContext","useCallback","useContext","useMemo","useState","blockTypes","const","BlockType","elementFormats","initialToolbarState","canUndo","canRedo","isBold","isItalic","isUnderline","isLink","blockType","elementFormat","ToolbarState","ToolbarStateKey","ToolbarStateValue","Key","ContextShape","toolbarState","updateToolbarState","key","value","Context","undefined","ToolbarContext","t0","$","_c","children","setToolbarState","t1","Symbol","for","prev","t2","contextValue","t3","useToolbarState","context","Error","$isAtNodeEnd","ElementNode","RangeSelection","TextNode","getSelectedNode","selection","anchor","focus","anchorNode","getNode","focusNode","isBackward","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","HeadingTagType","$createHeadingNode","$createQuoteNode","$setBlocksType","LexicalEditor","$createParagraphNode","$getSelection","formatParagraph","editor","update","selection","formatHeading","blockType","headingSize","formatBulletList","dispatchCommand","undefined","formatCheckList","formatNumberedList","formatQuote","LexicalEditor","BlockType","DropdownMenu","DropdownMenuItem","Button","clsx","formatBulletList","formatHeading","formatParagraph","formatQuote","useTranslate","Props","blockType","editor","isFocusable","icons","bullet","check","h1","h2","h3","number","paragraph","quote","BlockFormatDropdown","t0","$","_c","t1","undefined","translate","t2","t3","t4","t5","Symbol","for","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","ElementFormatType","LexicalEditor","FORMAT_ELEMENT_COMMAND","DropdownMenu","DropdownMenuItem","Button","useTranslate","clsx","Props","editor","value","isFocusable","icons","left","center","right","justify","start","end","ElementFormatDropdown","t0","$","_c","t1","undefined","translate","t2","t3","t4","t5","Symbol","for","t6","t7","t8","t9","dispatchCommand","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","useLexicalComposerContext","$findMatchingParent","$getNearestNodeOfType","mergeRegister","clsx","$getSelection","$isElementNode","$isRangeSelection","$isRootOrShadowRoot","CAN_REDO_COMMAND","CAN_UNDO_COMMAND","COMMAND_PRIORITY_CRITICAL","FORMAT_TEXT_COMMAND","REDO_COMMAND","SELECTION_CHANGE_COMMAND","UNDO_COMMAND","INSERT_HORIZONTAL_RULE_COMMAND","ButtonProps","Button","Dispatch","useCallback","useEffect","useRef","useState","useTranslate","focusNextElement","ToolbarVariantProps","toolbarVariants","BlockType","blockTypes","useToolbarState","getSelectedNode","$isLinkNode","TOGGLE_LINK_COMMAND","$isListNode","ListNode","$isHeadingNode","BlockFormatDropdown","ElementFormatDropdown","Divider","$","_c","t0","Symbol","for","buttonBaseProps","label","selected","isFocusable","tabIndex","color","variant","icon","type","Props","className","setIsLinkEditMode","extendedToolbar","ToolbarPlugin","sticky","visible","editor","toolbarRef","setIsFocusable","translate","toolbarState","updateToolbarState","t1","selection","anchorNode","anchor","getNode","element","getKey","_temp","getTopLevelElementOrThrow","elementKey","elementDOM","getElementByKey","node","parent_0","getParent","isLink","parent","parentList","getListType","type_0","getTag","getType","includes","matchingParent","_temp2","getFormatType","hasFormat","$updateToolbar","t2","t3","registerUpdateListener","t4","editorState","read","registerCommand","_payload","_newEditor","console","error","payload","payload_0","dispatchCommand","insertLink","t5","t6","t7","_temp3","t8","t9","t10","t11","canUndo","t12","undefined","t13","t14","t15","t16","canRedo","t17","t18","t19","t20","t21","blockType","elementFormat","t22","isBold","t23","t24","t25","t26","isItalic","t27","t28","t29","t30","isUnderline","t31","t32","t33","t34","t35","t36","t37","t38","f","parentNode","isInline","e","useLexicalComposerContext","useEffect","useRef","debounce","WysiwygValue","Props","wait","onChange","value","LazyOnChangePlugin","editor","onChangeRef","current","notifyChange","state","getEditorState","toJSON","debouncedNotifyChange","unregister","registerUpdateListener","cancel","AutoLinkPlugin","createLinkMatcherWithRegExp","URL_REGEX","EMAIL_REGEX","MATCHERS","text","startsWith","CustomAutoLinkPlugin","$","_c","t0","Symbol","for","SUPPORTED_URL_PROTOCOLS","Set","sanitizeUrl","url","parsedUrl","URL","has","protocol","urlRegExp","RegExp","validateUrl","test","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPositionForLinkEditor","targetRect","DOMRect","floatingElem","HTMLElement","anchorElem","verticalGap","horizontalOffset","scrollerElem","parentElement","style","opacity","transform","floatingElemRect","getBoundingClientRect","anchorElementRect","editorScrollerRect","top","left","height","width","right","useLexicalComposerContext","$findMatchingParent","mergeRegister","BaseSelection","LexicalEditor","$getSelection","$isLineBreakNode","$isNodeSelection","$isRangeSelection","CLICK_COMMAND","COMMAND_PRIORITY_CRITICAL","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","Dispatch","useCallback","useEffect","useRef","useState","getSelectedNode","$createLinkNode","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","createPortal","Input","sanitizeUrl","setFloatingElemPositionForLinkEditor","Button","proseLinkVariant","Dialog","clsx","FloatingOverlay","preventDefault","event","React","KeyboardEvent","HTMLInputElement","MouseEvent","HTMLElement","FloatingLinkEditorProps","floatingPosition","editor","isLink","setIsLink","anchorElem","isLinkEditMode","setIsLinkEditMode","FloatingLinkEditor","t0","$","_c","t1","undefined","editorRef","inputRef","linkUrl","setLinkUrl","editedLinkUrl","setEditedLinkUrl","lastSelection","setLastSelection","t2","selection","node","linkParent","getURL","nodes","getNodes","length","node_0","parent","getParent","editorElem","current","nativeSelection","_window","activeElement","document","rootElement","getRootElement","isEditable","domRect","nodes_0","element","getElementByKey","getKey","getBoundingClientRect","contains","anchorNode","focusNode","parentElement","y","className","$updateLinkEditor","t3","t4","scrollerElem","update","getEditorState","read","window","addEventListener","removeEventListener","t5","t6","registerUpdateListener","t7","editorState","registerCommand","t8","t9","focus","t10","handleLinkSubmission","monitorInputInteraction","key","event_0","dispatchCommand","selection_0","parent_0","linkNode","rel","__rel","target","__target","title","__title","replace","t11","onClickOverlay","t12","e","value","event_1","body","t13","FloatingLinkEditorPluginProps","HTMLDivElement","FloatingLinkEditorPlugin","$updateToolbar","focusLinkNode","focusAutoLinkNode","badNode","filter","_temp","find","autoLinkNode","is","getIsUnlinked","node_1","_temp2","payload","node_2","linkNode_0","metaKey","ctrlKey","open","LinkPlugin","LexicalLinkPlugin","validateUrl","Props","hasLinkAttributes","CustomLinkPlugin","t0","$","_c","t1","undefined","t2","rel","target","t3","AutoLinkNode","LinkNode","ListItemNode","ListNode","HeadingNode","QuoteNode","DOMExportOutput","DOMExportOutputMap","Klass","LexicalEditor","LexicalNode","isHTMLElement","ParagraphNode","TextNode","removeStylesExportDOM","editor","target","output","exportDOM","element","el","querySelectorAll","removeAttribute","style","getAttribute","textAlign","match","trim","HTMLElement","exportMap","Map","DOMConversionMap","$isTextNode","TextNode","MIN_ALLOWED_FONT_SIZE","MAX_ALLOWED_FONT_SIZE","parseAllowedFontSize","input","match","n","Number","parseAllowedColor","test","getExtraStyles","element","HTMLElement","extraStyles","fontSize","style","backgroundColor","color","constructImportMap","importMap","tag","fn","Object","entries","importDOM","importNode","importer","conversion","output","forChild","undefined","after","node","child","parent","textNode","setStyle","getStyle","InitialConfigType","exportMap","constructImportMap","ParagraphNode","HeadingNode","QuoteNode","LinkNode","AutoLinkNode","ListItemNode","ListNode","HorizontalRuleNode","editorConfig","Pick","html","export","import","namespace","nodes","onError","error","LexicalEditor","SerializedEditorState","$getRoot","$insertNodes","$setSelection","createEditor","$generateHtmlFromNodes","$generateNodesFromDOM","editorConfig","importHtmlIntoEditor","initialHtml","undefined","editor","update","$loadFromHtml","htmlContent","parser","DOMParser","dom","parseFromString","nodes","root","getChildren","forEach","node","remove","stateToHtml","state","namespace","theme","html","onError","error","parsedState","parseEditorState","setEditorState","read","ReactNode","RefObject","useEffect","useImperativeHandle","useRef","useState","clsx","LexicalEditor","SerializedEditorState","$getRoot","InitialConfigType","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","EditorRefPlugin","HistoryPlugin","ListPlugin","HorizontalRulePlugin","ToolbarPlugin","LazyOnChangePlugin","CustomAutoLinkPlugin","FloatingLinkEditorPlugin","CustomLinkPlugin","editorConfig","$loadFromHtml","ToolbarVariantProps","contentEditableStyles","ToolbarContext","WysiwygValue","Props","id","extendedToolbar","floatingPosition","defaultValue","disabled","readOnly","proseCompact","contentEditableBaseStyle","contentEditableClassName","containerClassName","toolbarSticky","toolbarVisible","ref","WysiwygRef","debounceChange","onChange","value","children","readValue","editor","state","getEditorState","toJSON","getValue","setHtml","html","fireEvent","getState","setState","clear","Wysiwyg","t0","$","_c","t1","t2","t3","t4","t5","t6","t7","undefined","t8","editable","editorState","JSON","stringify","fullInitialConfig","editorRef","t10","t9","current","setEditable","floatingAnchorElem","setFloatingAnchorElem","isLinkEditMode","setIsLinkEditMode","t11","Symbol","for","floatingAnchorElem_0","onRef","t12","getEditor","Error","t13","notifyChange","editor_0","t14","editor_1","nextHtml","t15","editor_2","update","t16","fireEvent_0","editor_3","parsedEditorState","parseEditorState","setEditorState","t17","fireEvent_1","editor_4","_temp2","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","root","getChildren","forEach","_temp","node","remove","createEditor","SerializedEditorState","editorConfig","isPlausibleLexicalState","state","root","type","Array","isArray","children","isValidLexicalState","editor","onError","err","parseEditorState","SerializedEditorState","z","isPlausibleLexicalState","WysiwygValue","html","state","maxContentBytes","wysiwygSchema","object","optional","string","custom","check","refine","JSON","stringify","length","parseWysiwygValue","payload","Error","parse","sortKeysReplacer","_key","value","Array","isArray","Object","keys","Record","sort","reduce","sorted","key","serializeWysiwygValue","isWysiwygStateEmpty","root","children","useField","useControl","FieldName","Field","FieldProps","RefObject","ToolbarVariantProps","WysiwygRef","Wysiwyg","parseWysiwygValue","serializeWysiwygValue","WysiwygValue","Props","Omit","name","ref","debounceChange","toolbarSticky","contentEditableClassName","containerClassName","disabled","readOnly","WysiwygField","id","forcedId","rest","field","control","defaultValue","parse","payload","serialize","handleChange","value","change","register","errors","key","undefined","useMemo","clsx","stateToHtml","WysiwygValue","Props","value","proseCompact","className","WysiwygReader","t0","$","_c","t1","undefined","t2","html","state","t3","t4","t5","t6","__html","t7","SerializedEditorState","isStateEmpty","state","children","root","Array","every","node","length","useLexicalComposerContext","CAN_USE_BEFORE_INPUT","IS_APPLE_WEBKIT","IS_IOS","IS_SAFARI","$getSelection","$isRangeSelection","COMMAND_PRIORITY_CRITICAL","KEY_ENTER_COMMAND","useEffect","SubmitOnEnterPluginProps","submitOnShiftOrCtrlEnter","SubmitOnEnterPlugin","t0","$","_c","t1","undefined","editor","t2","t3","registerCommand","event","selection","preventDefault","shiftKey","ctrlKey","form","document","activeElement","closest","requestSubmit"],"sources":["../../../../src/components/fields/wysiwyg/utils/dom.ts","../../../../src/components/fields/wysiwyg/style.ts","../../../../src/components/fields/wysiwyg/ToolbarContext.tsx","../../../../src/components/fields/wysiwyg/utils/getSelectedNode.ts","../../../../src/components/fields/wysiwyg/utils/formatters.ts","../../../../src/components/fields/wysiwyg/components/BlockFormatDropdown.tsx","../../../../src/components/fields/wysiwyg/components/ElementFormatDropdown.tsx","../../../../src/components/fields/wysiwyg/plugins/ToolbarPlugin.tsx","../../../../src/components/fields/wysiwyg/plugins/LazyOnChangePlugin.tsx","../../../../src/components/fields/wysiwyg/plugins/AutoLinkPlugin.tsx","../../../../src/components/fields/wysiwyg/utils/url.ts","../../../../src/components/fields/wysiwyg/utils/setFloatingElemPositionForLinkEditor.ts","../../../../src/components/fields/wysiwyg/plugins/FloatingLinkEditorPlugin.tsx","../../../../src/components/fields/wysiwyg/plugins/LinkPlugin.tsx","../../../../src/components/fields/wysiwyg/parsers/exportMap.ts","../../../../src/components/fields/wysiwyg/parsers/importMap.ts","../../../../src/components/fields/wysiwyg/config/editor.ts","../../../../src/components/fields/wysiwyg/config/html.ts","../../../../src/components/fields/wysiwyg/Wysiwyg.tsx","../../../../src/components/fields/wysiwyg/config/validation.ts","../../../../src/components/fields/wysiwyg/types.ts","../../../../src/components/fields/wysiwyg/WysiwygField.tsx","../../../../src/components/fields/wysiwyg/WysiwygReader.tsx","../../../../src/components/fields/wysiwyg/config/state.ts","../../../../src/components/fields/wysiwyg/plugins/SubmitOnEnterPlugin.tsx"],"sourcesContent":["export function focusNextElement() {\n const focusableSelectors = [\n \"button:not([disabled])\",\n \"[href]\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n ];\n\n const focusableElements = Array.from(\n document.querySelectorAll<HTMLElement>(focusableSelectors.join(\",\")),\n ).filter((el) => el.offsetParent !== null);\n\n const currentIndex = focusableElements.indexOf(document.activeElement as HTMLElement);\n const nextElement = focusableElements[currentIndex + 1];\n\n if (nextElement) {\n nextElement.focus();\n }\n}\n","import type { VariantProps } from \"class-variance-authority\";\nimport { cva } from \"class-variance-authority\";\n\nexport const toolbarVariants = cva(\n \"p-1 border-custom-2 border gap-1 bg-gray-0/40 overflow-x-scroll\",\n {\n variants: {\n sticky: {\n mobileOnly: \"max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl\",\n allDevice: \"max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl\",\n false: \"\",\n },\n visible: {\n always: \"flex\",\n custom: \"\",\n desktopOnly: \"hidden lg:flex rounded-t-2xl\",\n },\n },\n defaultVariants: {\n sticky: \"mobileOnly\",\n visible: \"always\",\n },\n },\n);\nexport type ToolbarVariantProps = VariantProps<typeof toolbarVariants>;\n\nexport const defaultContentEditableStyle =\n \"p8n-editor-input border-custom-2 rounded-b-2xl border border-t-0 p-2 -outline-offset-2\";\n\nexport const chatContentEditableStyle =\n \"p8n-editor-input border-custom-2 rounded-2xl border px-2 py-1 -outline-offset-2 lg:py-2 lg:border-t-0 lg:rounded-t-none\";\n\nexport const contentEditableStyles = {\n normal: \"p8n-editor-input border-custom-2 rounded-b-2xl border border-t-0 p-2 -outline-offset-2\",\n withoutToolbarOnMobile:\n \"p8n-editor-input border-custom-2 rounded-2xl border px-2 py-1 -outline-offset-2 lg:py-2 lg:border-t-0 lg:rounded-t-none\",\n};\n","import type { ElementFormatType } from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\nexport const blockTypes = [\n \"h1\",\n \"h2\",\n \"h3\",\n \"paragraph\",\n \"number\",\n \"bullet\",\n \"check\",\n \"quote\",\n] as const;\nexport type BlockType = (typeof blockTypes)[number];\n\nexport const elementFormats = [\"center\", \"end\", \"justify\", \"left\", \"right\", \"start\"];\n\nconst initialToolbarState = {\n canUndo: false,\n canRedo: false,\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isLink: false,\n blockType: \"paragraph\" as BlockType,\n elementFormat: \"left\" as ElementFormatType,\n};\n\ntype ToolbarState = typeof initialToolbarState;\ntype ToolbarStateKey = keyof ToolbarState;\ntype ToolbarStateValue<Key extends ToolbarStateKey> = ToolbarState[Key];\n\ntype ContextShape = {\n toolbarState: ToolbarState;\n updateToolbarState<Key extends ToolbarStateKey>(key: Key, value: ToolbarStateValue<Key>): void;\n};\n\nconst Context = createContext<ContextShape | undefined>(undefined);\n\nexport const ToolbarContext = ({ children }: { children: ReactNode }) => {\n const [toolbarState, setToolbarState] = useState(initialToolbarState);\n const updateToolbarState = useCallback(\n <Key extends ToolbarStateKey>(key: Key, value: ToolbarStateValue<Key>) => {\n setToolbarState((prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [],\n );\n\n const contextValue = useMemo(() => {\n return {\n toolbarState,\n updateToolbarState,\n };\n }, [toolbarState, updateToolbarState]);\n\n return <Context.Provider value={contextValue}>{children}</Context.Provider>;\n};\n\nexport const useToolbarState = () => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\"useToolbarState must be used within a ToolbarProvider\");\n }\n\n return context;\n};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport { $isAtNodeEnd } from \"@lexical/selection\";\nimport type { ElementNode, RangeSelection, TextNode } from \"lexical\";\n\nexport function getSelectedNode(selection: RangeSelection): TextNode | ElementNode {\n /**\n * in a selection of a text\n * ---------\n * ^ anchor ^\n * | focus (end)\n */\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (anchorNode === focusNode) {\n return anchorNode;\n }\n const isBackward = selection.isBackward();\n if (isBackward) {\n // @ts-ignore\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\n } else {\n // @ts-ignore\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\n }\n}\n","import {\n INSERT_CHECK_LIST_COMMAND,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n} from \"@lexical/list\";\nimport type { HeadingTagType } from \"@lexical/rich-text\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport type { LexicalEditor } from \"lexical\";\nimport { $createParagraphNode, $getSelection } from \"lexical\";\n\nexport const formatParagraph = (editor: LexicalEditor) => {\n editor.update(() => {\n const selection = $getSelection();\n $setBlocksType(selection, () => $createParagraphNode());\n });\n};\n\nexport const formatHeading = (\n editor: LexicalEditor,\n blockType: string,\n headingSize: HeadingTagType,\n) => {\n if (blockType !== headingSize) {\n editor.update(() => {\n const selection = $getSelection();\n $setBlocksType(selection, () => $createHeadingNode(headingSize));\n });\n }\n};\n\nexport const formatBulletList = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"bullet\") {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n } else {\n formatParagraph(editor);\n }\n};\n\nexport const formatCheckList = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"check\") {\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined);\n } else {\n formatParagraph(editor);\n }\n};\n\nexport const formatNumberedList = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"number\") {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n } else {\n formatParagraph(editor);\n }\n};\n\nexport const formatQuote = (editor: LexicalEditor, blockType: string) => {\n if (blockType !== \"quote\") {\n editor.update(() => {\n const selection = $getSelection();\n $setBlocksType(selection, () => $createQuoteNode());\n });\n }\n};\n","import type { LexicalEditor } from \"lexical\";\nimport type { BlockType } from \"../ToolbarContext\";\nimport { DropdownMenu, DropdownMenuItem } from \"../../../dropdown-menu\";\nimport { Button } from \"../../../button\";\nimport clsx from \"clsx\";\nimport { formatBulletList, formatHeading, formatParagraph, formatQuote } from \"../utils/formatters\";\nimport { useTranslate } from \"../../../i18n\";\n\ninterface Props {\n blockType: BlockType;\n editor: LexicalEditor;\n isFocusable?: boolean;\n}\n\nconst icons: {\n [K in BlockType]: string;\n} = {\n bullet: \"fe-list-bullet\",\n check: \"fe-help\",\n h1: \"fe-h1\",\n h2: \"fe-h2\",\n h3: \"fe-h3\",\n number: \"fe-list-numbered\",\n paragraph: \"fe-paragraph\",\n quote: \"fe-quote\",\n};\n\nexport function BlockFormatDropdown({ blockType, editor, isFocusable = true }: Props) {\n const translate = useTranslate();\n\n return (\n <DropdownMenu\n data-testid=\"menubar-user-dropdown\"\n placement=\"bottom-start\"\n listClassName=\"flex flex-col gap-1\"\n trigger={\n <Button type=\"button\" variant=\"text\" icon color=\"gray\" tabIndex={isFocusable ? 0 : -1}>\n <i className={icons[blockType]}></i>\n <i className=\"fe-angle-down -ml-4\"></i>\n </Button>\n }\n >\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"paragraph\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatParagraph(editor)}\n >\n <i className={icons.paragraph}></i>\n {translate?.(\"wysiwyg.formats.paragraph\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"h1\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatHeading(editor, blockType, \"h1\")}\n >\n <i className={icons.h1}></i>\n {translate?.(\"wysiwyg.formats.h1\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"h2\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatHeading(editor, blockType, \"h2\")}\n >\n <i className={icons.h2}></i>\n {translate?.(\"wysiwyg.formats.h2\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"h3\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatHeading(editor, blockType, \"h3\")}\n >\n <i className={icons.h3}></i>\n {translate?.(\"wysiwyg.formats.h3\")}\n </DropdownMenuItem>\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"bullet\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatBulletList(editor, blockType)}\n >\n <i className={icons.bullet}></i>\n {translate?.(\"wysiwyg.formats.bullet\")}\n </DropdownMenuItem>\n {/* <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"number\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatNumberedList(editor, blockType)}\n >\n {translate?.(\"wysiwyg.formats.number\")}\n </DropdownMenuItem> */}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(blockType === \"quote\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => formatQuote(editor, blockType)}\n >\n <i className={icons.quote}></i>\n {translate?.(\"wysiwyg.formats.quote\")}\n </DropdownMenuItem>\n </DropdownMenu>\n );\n}\n","import type { ElementFormatType, LexicalEditor } from \"lexical\";\nimport { FORMAT_ELEMENT_COMMAND } from \"lexical\";\nimport { DropdownMenu, DropdownMenuItem } from \"../../../dropdown-menu\";\nimport { Button } from \"../../../button\";\nimport { useTranslate } from \"../../../i18n\";\nimport clsx from \"clsx\";\n\ninterface Props {\n editor: LexicalEditor;\n value: ElementFormatType;\n isFocusable?: boolean;\n}\n\nconst icons = {\n left: \"fe-align-left\",\n center: \"fe-align-center\",\n right: \"fe-align-right\",\n justify: \"fe-align-justify\",\n start: \"fe-align-left\",\n end: \"fe-align-right\",\n \"\": \"\",\n};\n\nexport function ElementFormatDropdown({ editor, value, isFocusable = true }: Props) {\n const translate = useTranslate();\n return (\n <DropdownMenu\n data-testid=\"menubar-user-dropdown\"\n placement=\"bottom-start\"\n className=\"min-w-36\"\n listClassName=\"flex flex-col gap-1\"\n trigger={\n <Button icon variant=\"text\" color=\"gray\" type=\"button\" tabIndex={isFocusable ? 0 : -1}>\n <i className={icons[value || \"left\"]}></i>\n <i className=\"fe-angle-down -ml-4\"></i>\n </Button>\n }\n >\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"left\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"left\");\n }}\n >\n <i className={icons.left}></i>\n {translate?.(\"wysiwyg.elementFormats.left\")}\n </DropdownMenuItem>{\" \"}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"center\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"center\");\n }}\n >\n <i className={icons.center}></i>\n {translate?.(\"wysiwyg.elementFormats.center\")}\n </DropdownMenuItem>{\" \"}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"right\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"right\");\n }}\n >\n <i className={icons.right}></i>\n {translate?.(\"wysiwyg.elementFormats.right\")}\n </DropdownMenuItem>{\" \"}\n <DropdownMenuItem\n type=\"button\"\n className={clsx(value === \"justify\" && \"bg-gray-2!\", \"gap-2\")}\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"justify\");\n }}\n >\n <i className={icons.justify}></i>\n {translate?.(\"wysiwyg.elementFormats.justify\")}\n </DropdownMenuItem>\n </DropdownMenu>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, $getNearestNodeOfType, mergeRegister } from \"@lexical/utils\";\nimport clsx from \"clsx\";\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n $isRootOrShadowRoot,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n FORMAT_TEXT_COMMAND,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n UNDO_COMMAND,\n} from \"lexical\";\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\";\n\nimport type { ButtonProps } from \"../../../button\";\nimport { Button } from \"../../../button\";\nimport type { Dispatch } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslate } from \"../../../i18n\";\nimport { focusNextElement } from \"../utils/dom\";\nimport type { ToolbarVariantProps } from \"../style\";\nimport { toolbarVariants } from \"../style\";\nimport type { BlockType } from \"../ToolbarContext\";\nimport { blockTypes, useToolbarState } from \"../ToolbarContext\";\nimport { getSelectedNode } from \"../utils/getSelectedNode\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { $isListNode, ListNode } from \"@lexical/list\";\nimport { $isHeadingNode } from \"@lexical/rich-text\";\nimport { BlockFormatDropdown } from \"../components/BlockFormatDropdown\";\nimport { ElementFormatDropdown } from \"../components/ElementFormatDropdown\";\n\nfunction Divider() {\n return <div className=\"border-r-gray-2 my-1 border-r\" />;\n}\n\nconst buttonBaseProps: (\n label: string | undefined,\n selected: boolean,\n isFocusable: boolean,\n) => ButtonProps = (label, selected, isFocusable) => ({\n \"aria-label\": label,\n selected,\n tabIndex: isFocusable ? 0 : -1,\n color: \"gray\",\n variant: \"text\",\n icon: true,\n type: \"button\",\n});\n\ninterface Props extends ToolbarVariantProps {\n className?: string;\n setIsLinkEditMode: Dispatch<boolean>;\n extendedToolbar?: boolean;\n}\n\nexport function ToolbarPlugin({\n extendedToolbar,\n className,\n sticky,\n visible,\n setIsLinkEditMode,\n}: Props) {\n const [editor] = useLexicalComposerContext();\n const toolbarRef = useRef(null);\n\n const [isFocusable, setIsFocusable] = useState(false);\n const translate = useTranslate();\n\n const { toolbarState, updateToolbarState } = useToolbarState();\n\n const $updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n let element =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : $findMatchingParent(anchorNode, (e) => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n if (element === null) {\n element = anchorNode.getTopLevelElementOrThrow();\n }\n const elementKey = element.getKey();\n const elementDOM = editor.getElementByKey(elementKey);\n\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n const isLink = $isLinkNode(parent) || $isLinkNode(node);\n updateToolbarState(\"isLink\", isLink);\n\n if (elementDOM !== null) {\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const type = parentList ? parentList.getListType() : element.getListType();\n\n updateToolbarState(\"blockType\", type);\n } else {\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\n if (blockTypes.includes(type as BlockType)) {\n updateToolbarState(\"blockType\", type as BlockType);\n }\n }\n }\n\n let matchingParent;\n if ($isLinkNode(parent)) {\n // If node is a link, we need to fetch the parent paragraph node to set format\n matchingParent = $findMatchingParent(\n node,\n (parentNode) => $isElementNode(parentNode) && !parentNode.isInline(),\n );\n }\n\n updateToolbarState(\n \"elementFormat\",\n $isElementNode(matchingParent)\n ? matchingParent.getFormatType()\n : $isElementNode(node)\n ? node.getFormatType()\n : parent?.getFormatType() || \"left\",\n );\n\n updateToolbarState(\"isBold\", selection.hasFormat(\"bold\"));\n updateToolbarState(\"isItalic\", selection.hasFormat(\"italic\"));\n updateToolbarState(\"isUnderline\", selection.hasFormat(\"underline\"));\n }\n }, [editor, updateToolbarState]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, _newEditor) => {\n if (_newEditor !== editor) {\n console.error(\"_newEditor is different !!\");\n }\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n updateToolbarState(\"canUndo\", payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n updateToolbarState(\"canRedo\", payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n );\n }, [editor, $updateToolbar, updateToolbarState]);\n\n const insertLink = useCallback(() => {\n if (!toolbarState.isLink) {\n setIsLinkEditMode(true);\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, \"https://\");\n } else {\n setIsLinkEditMode(false);\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }, [toolbarState.isLink, setIsLinkEditMode, editor]);\n\n return (\n <div className={toolbarVariants({ sticky, visible, className })} ref={toolbarRef}>\n <button\n className={clsx(\n \"not-focus:hidden-focusable bg-gray-0/40 absolute top-1 right-1 z-20 inline-flex h-8 items-center rounded-2xl px-2 backdrop-blur-xs\",\n )}\n onClick={() => {\n setIsFocusable((f) => !f);\n focusNextElement();\n }}\n type=\"button\"\n >\n {translate?.(\n isFocusable ? \"wysiwyg.button.disableFocusable\" : \"wysiwyg.button.enableFocusable\",\n )}\n </button>\n <Button\n {...buttonBaseProps(translate?.(\"wysiwyg.button.undo\"), false, isFocusable)}\n disabled={!toolbarState.canUndo}\n onClick={() => void editor.dispatchCommand(UNDO_COMMAND, undefined)}\n >\n <i className=\"fe-ccw\"></i>\n </Button>\n <Button\n {...buttonBaseProps(translate?.(\"wysiwyg.button.redo\"), false, isFocusable)}\n disabled={!toolbarState.canRedo}\n onClick={() => void editor.dispatchCommand(REDO_COMMAND, undefined)}\n >\n <i className=\"fe-cw\"></i>\n </Button>\n <Divider />\n {extendedToolbar && (\n <>\n {blockTypes.includes(toolbarState.blockType) && (\n <BlockFormatDropdown\n isFocusable={isFocusable}\n blockType={toolbarState.blockType}\n editor={editor}\n />\n )}\n <ElementFormatDropdown\n isFocusable={isFocusable}\n value={toolbarState.elementFormat}\n editor={editor}\n />\n <Divider />\n </>\n )}\n\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatBold\"),\n toolbarState.isBold,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\n >\n <i className=\"fe-bold\"></i>\n </Button>\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatItalics\"),\n toolbarState.isItalic,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")}\n >\n <i className=\"fe-italic\"></i>\n </Button>\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatUnderline\"),\n toolbarState.isUnderline,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")}\n >\n <i className=\"fe-underline\"></i>\n </Button>\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.formatLink\"),\n toolbarState.isLink,\n isFocusable,\n )}\n onClick={insertLink}\n >\n <i className=\"fe-link\"></i>\n </Button>\n {extendedToolbar && (\n <Button\n {...buttonBaseProps(\n translate?.(\"wysiwyg.button.horizontalRule\"),\n toolbarState.isLink,\n isFocusable,\n )}\n onClick={() => void editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)}\n >\n <i className=\"fe-horizontal-rule\"></i>\n </Button>\n )}\n </div>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect, useRef } from \"react\";\nimport debounce from \"lodash.debounce\";\nimport { WysiwygValue } from \"../types\";\n\ninterface Props {\n wait: number;\n onChange?: (value: WysiwygValue) => void;\n}\n\nexport function LazyOnChangePlugin({ wait, onChange }: Props) {\n const [editor] = useLexicalComposerContext();\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n useEffect(() => {\n function notifyChange() {\n onChangeRef.current?.({\n state: editor.getEditorState().toJSON(),\n });\n }\n\n const debouncedNotifyChange = debounce(notifyChange, wait);\n\n const unregister = editor.registerUpdateListener(() => {\n debouncedNotifyChange();\n });\n\n return () => {\n unregister();\n debouncedNotifyChange.cancel();\n };\n }, [editor, wait]);\n\n return null;\n}\n","import { AutoLinkPlugin, createLinkMatcherWithRegExp } from \"@lexical/react/LexicalAutoLinkPlugin\";\n\n/**\n * Original create an URL with http://mydomain.c\n * const URL_REGEX =\n * /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/;\n * const EMAIL_REGEX =\n * /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/;\n *\n * I'm aware that for tech users with an email in *.me this autolink doesn't trigger\n * but for the majority of users the first tld is 3 chars minimum and trigger an autolink after\n * 1 character can be disturbing\n */\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{3,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/;\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{3,}))/;\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith(\"http\") ? text : `https://${text}`;\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`;\n }),\n];\n\nexport function CustomAutoLinkPlugin() {\n return <AutoLinkPlugin matchers={MATCHERS} />;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst SUPPORTED_URL_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n}\n\n// Source: https://stackoverflow.com/a/8234912/2013580\nconst urlRegExp = new RegExp(\n /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[+~%/.\\w-_]*)?\\??(?:[-+=&;%@.\\w_]*)#?(?:[\\w]*))?)/,\n);\nexport function validateUrl(url: string): boolean {\n // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://.\n // Maybe show a dialog where they user can type the URL before inserting it.\n return url === \"https://\" || urlRegExp.test(url);\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nconst VERTICAL_GAP = 10;\nconst HORIZONTAL_OFFSET = 5;\n\nexport function setFloatingElemPositionForLinkEditor(\n targetRect: DOMRect | null,\n floatingElem: HTMLElement,\n anchorElem: HTMLElement,\n verticalGap: number = VERTICAL_GAP,\n horizontalOffset: number = HORIZONTAL_OFFSET,\n): void {\n const scrollerElem = anchorElem.parentElement;\n\n if (targetRect === null || !scrollerElem) {\n floatingElem.style.opacity = \"0\";\n floatingElem.style.transform = \"translate(-10000px, -10000px)\";\n return;\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect();\n const anchorElementRect = anchorElem.getBoundingClientRect();\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\n\n let top = targetRect.top - verticalGap;\n let left = targetRect.left - horizontalOffset;\n\n if (top < editorScrollerRect.top) {\n top += floatingElemRect.height + targetRect.height + verticalGap * 2;\n }\n\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\n }\n\n top -= anchorElementRect.top;\n left -= anchorElementRect.left;\n\n floatingElem.style.opacity = \"1\";\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport type { BaseSelection, LexicalEditor } from \"lexical\";\nimport {\n $getSelection,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from \"lexical\";\nimport type { Dispatch } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { getSelectedNode } from \"../utils/getSelectedNode\";\nimport { $createLinkNode, $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { createPortal } from \"react-dom\";\nimport { Input } from \"../../text\";\nimport { sanitizeUrl } from \"../utils/url\";\nimport { setFloatingElemPositionForLinkEditor } from \"../utils/setFloatingElemPositionForLinkEditor\";\nimport { Button } from \"../../../button\";\nimport { proseLinkVariant } from \"../../../href\";\nimport { Dialog } from \"../../../dialog\";\nimport clsx from \"clsx\";\nimport { FloatingOverlay } from \"@floating-ui/react\";\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault();\n}\n\ninterface FloatingLinkEditorProps {\n floatingPosition?: \"top\" | \"bottom\";\n editor: LexicalEditor;\n isLink: boolean;\n setIsLink: Dispatch<boolean>;\n anchorElem: HTMLElement;\n isLinkEditMode: boolean;\n setIsLinkEditMode: Dispatch<boolean>;\n}\nfunction FloatingLinkEditor({\n floatingPosition = \"bottom\",\n editor,\n isLink,\n setIsLink,\n anchorElem,\n isLinkEditMode,\n setIsLinkEditMode,\n}: FloatingLinkEditorProps) {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const [editedLinkUrl, setEditedLinkUrl] = useState(\"https://\");\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(null);\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n\n if (linkParent) {\n setLinkUrl(linkParent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkUrl(node.getURL());\n } else {\n setLinkUrl(\"\");\n }\n if (isLinkEditMode) {\n setEditedLinkUrl(linkUrl);\n }\n } else if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length > 0) {\n const node = nodes[0];\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkUrl(node.getURL());\n } else {\n setLinkUrl(\"\");\n }\n if (isLinkEditMode) {\n setEditedLinkUrl(linkUrl);\n }\n }\n }\n\n const editorElem = editorRef.current;\n const nativeSelection = getDOMSelection(editor._window);\n const activeElement = document.activeElement;\n\n if (editorElem === null) {\n return;\n }\n\n const rootElement = editor.getRootElement();\n\n if (selection !== null && rootElement !== null && editor.isEditable()) {\n let domRect: DOMRect | undefined;\n\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length > 0) {\n const element = editor.getElementByKey(nodes[0].getKey());\n if (element) {\n domRect = element.getBoundingClientRect();\n }\n }\n } else if (nativeSelection !== null && rootElement.contains(nativeSelection.anchorNode)) {\n domRect = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n }\n\n if (domRect) {\n if (floatingPosition === \"top\") {\n domRect.y -= 40;\n } else {\n domRect.y += 40;\n }\n setFloatingElemPositionForLinkEditor(domRect, editorElem, anchorElem);\n }\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== \"link-input\") {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem);\n }\n setLastSelection(null);\n setIsLinkEditMode(false);\n setLinkUrl(\"\");\n }\n\n return true;\n }, [anchorElem, editor, setIsLinkEditMode, isLinkEditMode, linkUrl, floatingPosition]);\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement;\n\n const update = () => {\n editor.getEditorState().read(() => {\n $updateLinkEditor();\n });\n };\n\n window.addEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.addEventListener(\"scroll\", update);\n }\n\n return () => {\n window.removeEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.removeEventListener(\"scroll\", update);\n }\n };\n }, [anchorElem.parentElement, editor, $updateLinkEditor]);\n\n // When toggle isLink\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH,\n ),\n );\n }, [editor, $updateLinkEditor, setIsLink, isLink]);\n\n // Init\n useEffect(() => {\n editor.getEditorState().read(() => {\n $updateLinkEditor();\n });\n }, [editor, $updateLinkEditor]);\n\n // When toggle Edit Mode, add focus to input\n useEffect(() => {\n if (isLinkEditMode && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isLinkEditMode, isLink]);\n\n // when editing and press Enter\n const monitorInputInteraction = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n handleLinkSubmission(event);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setIsLinkEditMode(false);\n }\n };\n\n // when editing and click Ok\n const handleLinkSubmission = (\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n ) => {\n event.preventDefault();\n if (lastSelection !== null) {\n if (linkUrl !== \"\") {\n editor.update(() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(editedLinkUrl));\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const parent = getSelectedNode(selection).getParent();\n if ($isAutoLinkNode(parent)) {\n const linkNode = $createLinkNode(parent.getURL(), {\n rel: parent.__rel,\n target: parent.__target,\n title: parent.__title,\n });\n parent.replace(linkNode, true);\n }\n }\n });\n }\n setEditedLinkUrl(\"https://\");\n setIsLinkEditMode(false);\n }\n };\n\n function onClickOverlay() {\n editor.update(() => {\n setIsLink(false);\n });\n }\n return (\n <div\n ref={editorRef}\n className=\"z-dialog absolute top-0 left-0 flex opacity-0 transition-opacity\"\n >\n {isLink ? (\n <>\n <Dialog color=\"yellow\" className=\"flex w-xs gap-1 p-1\">\n {isLinkEditMode ? (\n <>\n <Input\n className=\"flex-1\"\n ref={inputRef}\n value={editedLinkUrl}\n onChange={(e) => setEditedLinkUrl(e.target.value)}\n onKeyDown={monitorInputInteraction}\n />\n <Button\n icon\n variant=\"light\"\n color=\"green\"\n type=\"button\"\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={handleLinkSubmission}\n >\n <i className=\"fe-ok\"></i>\n </Button>\n <Button\n icon\n color=\"red\"\n variant=\"text\"\n type=\"button\"\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={() => void setIsLinkEditMode(false)}\n >\n <i className=\"fe-cancel\"></i>\n </Button>\n </>\n ) : (\n <div className=\"flex w-full items-center gap-1\">\n <span>URL:</span>\n <a\n className={clsx(proseLinkVariant, \"flex-1 items-center truncate\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={sanitizeUrl(linkUrl)}\n >\n {linkUrl}\n </a>\n <Button\n icon\n type=\"button\"\n variant=\"light\"\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={(event) => {\n event.preventDefault();\n setEditedLinkUrl(linkUrl);\n setIsLinkEditMode(true);\n }}\n >\n <i className=\"fe-pencil\"></i>\n </Button>\n <Button\n type=\"button\"\n color=\"red\"\n variant=\"light\"\n icon\n tabIndex={0}\n onMouseDown={preventDefault}\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }}\n >\n <i className=\"fe-trash\"></i>\n </Button>\n </div>\n )}\n </Dialog>\n {createPortal(\n <FloatingOverlay\n className=\"z-[calc(var(--index-wysiwyg)-1)]\"\n onClick={onClickOverlay}\n lockScroll\n />,\n document.body,\n )}\n </>\n ) : null}\n </div>\n );\n}\n\ninterface FloatingLinkEditorPluginProps {\n floatingPosition?: \"top\" | \"bottom\";\n anchorElem: HTMLDivElement;\n isLinkEditMode: boolean;\n setIsLinkEditMode: Dispatch<boolean>;\n}\n\nexport function FloatingLinkEditorPlugin({\n floatingPosition,\n anchorElem,\n isLinkEditMode,\n setIsLinkEditMode,\n}: FloatingLinkEditorPluginProps) {\n const [editor] = useLexicalComposerContext();\n const [isLink, setIsLink] = useState(false);\n\n useEffect(() => {\n function $updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const focusNode = getSelectedNode(selection);\n const focusLinkNode = $findMatchingParent(focusNode, $isLinkNode);\n const focusAutoLinkNode = $findMatchingParent(focusNode, $isAutoLinkNode);\n if (!(focusLinkNode || focusAutoLinkNode)) {\n setIsLink(false);\n return;\n }\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode);\n const autoLinkNode = $findMatchingParent(node, $isAutoLinkNode);\n return (\n (focusLinkNode && !focusLinkNode.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkNode)) ||\n (focusAutoLinkNode && !focusAutoLinkNode.is(autoLinkNode)) ||\n (autoLinkNode &&\n (!autoLinkNode.is(focusAutoLinkNode) || autoLinkNode.getIsUnlinked()))\n );\n });\n if (!badNode) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n } else if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length === 0) {\n setIsLink(false);\n return;\n }\n const node = nodes[0];\n const parent = node.getParent();\n if ($isLinkNode(parent) || $isLinkNode(node)) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), \"_blank\");\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [editor]);\n\n return createPortal(\n <FloatingLinkEditor\n floatingPosition={floatingPosition}\n editor={editor}\n isLink={isLink}\n anchorElem={anchorElem}\n setIsLink={setIsLink}\n isLinkEditMode={isLinkEditMode}\n setIsLinkEditMode={setIsLinkEditMode}\n />,\n anchorElem,\n );\n}\n","import { LinkPlugin as LexicalLinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport { validateUrl } from \"../utils/url\";\n\ntype Props = {\n hasLinkAttributes?: boolean;\n};\n\nexport function CustomLinkPlugin({ hasLinkAttributes = false }: Props) {\n return (\n <LexicalLinkPlugin\n validateUrl={validateUrl}\n attributes={\n hasLinkAttributes\n ? {\n rel: \"noopener noreferrer\",\n target: \"_blank\",\n }\n : undefined\n }\n />\n );\n}\n","/**\n * check the original code at\n * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/App.tsx\n */\n\nimport { AutoLinkNode, LinkNode } from \"@lexical/link\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport type {\n DOMExportOutput,\n DOMExportOutputMap,\n Klass,\n LexicalEditor,\n LexicalNode,\n} from \"lexical\";\nimport { isHTMLElement, ParagraphNode, TextNode } from \"lexical\";\n\nconst removeStylesExportDOM = (editor: LexicalEditor, target: LexicalNode): DOMExportOutput => {\n const output = target.exportDOM(editor);\n // @ts-ignore\n if (output && isHTMLElement(output.element)) {\n // Remove all inline styles and classes if the element is an HTMLElement\n // Children are checked as well since TextNode can be nested\n // in i, b, and strong tags.\n for (const el of [\n output.element,\n ...output.element.querySelectorAll('[style],[class],[dir=\"ltr\"]'),\n ]) {\n el.removeAttribute(\"class\");\n\n const style = el.getAttribute(\"style\");\n let textAlign: string | null = null;\n if (style) {\n const match = style.match(/text-align\\s*:\\s*([^;]+)\\s*;?/i);\n if (match) {\n textAlign = match[1].trim();\n }\n }\n\n el.removeAttribute(\"style\");\n if (textAlign) {\n (el as HTMLElement).style.textAlign = textAlign;\n }\n\n if (el.getAttribute(\"dir\") === \"ltr\") {\n el.removeAttribute(\"dir\");\n }\n }\n }\n return output;\n};\n\nexport const exportMap: DOMExportOutputMap = new Map<\n Klass<LexicalNode>,\n (editor: LexicalEditor, target: LexicalNode) => DOMExportOutput\n>([\n [ParagraphNode, removeStylesExportDOM],\n [HeadingNode, removeStylesExportDOM],\n [AutoLinkNode, removeStylesExportDOM],\n [LinkNode, removeStylesExportDOM],\n [ListNode, removeStylesExportDOM],\n [ListItemNode, removeStylesExportDOM],\n [TextNode, removeStylesExportDOM],\n [QuoteNode, removeStylesExportDOM],\n]);\n","/**\n * check the original code at\n * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/App.tsx\n */\n\nimport type { DOMConversionMap } from \"lexical\";\nimport { $isTextNode, TextNode } from \"lexical\";\n\nconst MIN_ALLOWED_FONT_SIZE = 8;\nconst MAX_ALLOWED_FONT_SIZE = 72;\n\nconst parseAllowedFontSize = (input: string): string => {\n const match = input.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (match) {\n const n = Number(match[1]);\n if (n >= MIN_ALLOWED_FONT_SIZE && n <= MAX_ALLOWED_FONT_SIZE) {\n return input;\n }\n }\n return \"\";\n};\n\nfunction parseAllowedColor(input: string) {\n return /^rgb\\(\\d+, \\d+, \\d+\\)$/.test(input) ? input : \"\";\n}\n\nconst getExtraStyles = (element: HTMLElement): string => {\n // Parse styles from pasted input, but only if they match exactly the\n // sort of styles that would be produced by exportDOM\n let extraStyles = \"\";\n const fontSize = parseAllowedFontSize(element.style.fontSize);\n const backgroundColor = parseAllowedColor(element.style.backgroundColor);\n const color = parseAllowedColor(element.style.color);\n if (fontSize !== \"\" && fontSize !== \"15px\") {\n extraStyles += `font-size: ${fontSize};`;\n }\n if (backgroundColor !== \"\" && backgroundColor !== \"rgb(255, 255, 255)\") {\n extraStyles += `background-color: ${backgroundColor};`;\n }\n if (color !== \"\" && color !== \"rgb(0, 0, 0)\") {\n extraStyles += `color: ${color};`;\n }\n return extraStyles;\n};\n\nexport const constructImportMap = (): DOMConversionMap => {\n const importMap: DOMConversionMap = {};\n\n // Wrap all TextNode importers with a function that also imports\n // the custom styles implemented by the playground\n for (const [tag, fn] of Object.entries(TextNode.importDOM?.() || {})) {\n importMap[tag] = (importNode) => {\n const importer = fn(importNode);\n if (!importer) {\n return null;\n }\n return {\n ...importer,\n conversion: (element) => {\n const output = importer.conversion(element);\n if (\n output === null ||\n output.forChild === undefined ||\n output.after !== undefined ||\n output.node !== null\n ) {\n return output;\n }\n const extraStyles = getExtraStyles(element);\n if (extraStyles) {\n const { forChild } = output;\n return {\n ...output,\n forChild: (child, parent) => {\n const textNode = forChild(child, parent);\n if ($isTextNode(textNode)) {\n textNode.setStyle(textNode.getStyle() + extraStyles);\n }\n return textNode;\n },\n };\n }\n return output;\n },\n };\n };\n }\n\n return importMap;\n};\n","import type { InitialConfigType } from \"@lexical/react/LexicalComposer\";\nimport { exportMap } from \"../parsers/exportMap\";\nimport { constructImportMap } from \"../parsers/importMap\";\nimport { ParagraphNode } from \"lexical\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { LinkNode, AutoLinkNode } from \"@lexical/link\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { HorizontalRuleNode } from \"@lexical/react/LexicalHorizontalRuleNode\";\n\nexport const editorConfig: Pick<\n InitialConfigType,\n \"theme\" | \"html\" | \"namespace\" | \"nodes\" | \"onError\"\n> = {\n html: {\n export: exportMap,\n import: constructImportMap(),\n },\n namespace: \"Melodineo Wysiwyg\",\n nodes: [\n HorizontalRuleNode,\n ParagraphNode,\n HeadingNode,\n AutoLinkNode,\n LinkNode,\n ListNode,\n ListItemNode,\n QuoteNode,\n ],\n onError(error) {\n throw error;\n },\n};\n","import type { LexicalEditor, SerializedEditorState } from \"lexical\";\nimport { $getRoot, $insertNodes, $setSelection, createEditor } from \"lexical\";\n\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from \"@lexical/html\";\n\nimport { editorConfig } from \"./editor\";\n\nexport function importHtmlIntoEditor(initialHtml?: string) {\n if (!initialHtml) {\n return undefined;\n }\n return (editor: LexicalEditor) => {\n editor.update(() => {\n $loadFromHtml(editor, initialHtml);\n });\n };\n}\n\nexport function $loadFromHtml(editor: LexicalEditor, htmlContent: string) {\n const parser = new DOMParser();\n const dom = parser.parseFromString(htmlContent, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n\n const root = $getRoot();\n root.getChildren().forEach((node) => {\n node.remove();\n });\n\n $insertNodes(nodes);\n\n $setSelection(null);\n}\n\n/**\n * Sérialise un `state` en HTML statique via un éditeur jetable (jamais monté dans le DOM),\n * pour un affichage en lecture seule sans payer le coût d'un LexicalComposer complet.\n */\nexport function stateToHtml(state: SerializedEditorState): string {\n const { namespace, nodes, theme, html } = editorConfig;\n const editor = createEditor({\n namespace,\n nodes,\n theme,\n html,\n onError(error) {\n throw error;\n },\n });\n const parsedState = editor.parseEditorState(state);\n editor.setEditorState(parsedState);\n\n return editor.read(() => $generateHtmlFromNodes(editor));\n}\n","import type { ReactNode, RefObject } from \"react\";\nimport { useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\nimport type { LexicalEditor, SerializedEditorState } from \"lexical\";\nimport { $getRoot } from \"lexical\";\nimport { InitialConfigType, LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { EditorRefPlugin } from \"@lexical/react/LexicalEditorRefPlugin\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { HorizontalRulePlugin } from \"@lexical/react/LexicalHorizontalRulePlugin\";\n\nimport { ToolbarPlugin } from \"./plugins/ToolbarPlugin\";\nimport { LazyOnChangePlugin } from \"./plugins/LazyOnChangePlugin\";\nimport { CustomAutoLinkPlugin } from \"./plugins/AutoLinkPlugin\";\nimport { FloatingLinkEditorPlugin } from \"./plugins/FloatingLinkEditorPlugin\";\nimport { CustomLinkPlugin } from \"./plugins/LinkPlugin\";\n\nimport { editorConfig } from \"./config/editor\";\nimport { $loadFromHtml } from \"./config/html\";\nimport type { ToolbarVariantProps } from \"./style\";\nimport { contentEditableStyles } from \"./style\";\nimport { ToolbarContext } from \"./ToolbarContext\";\nimport { WysiwygValue } from \"./types\";\n\ninterface Props {\n id?: string;\n extendedToolbar?: boolean;\n floatingPosition?: \"top\" | \"bottom\";\n defaultValue?: WysiwygValue;\n disabled?: boolean;\n readOnly?: boolean;\n\n proseCompact?: boolean;\n\n contentEditableBaseStyle?: \"normal\" | \"withoutToolbarOnMobile\";\n /**\n * If you want to define custom height\n */\n contentEditableClassName?: string;\n containerClassName?: string;\n /**\n * by default sticky is only available for mobile device with a top-0 if\n * you want to change this provide your own className\n */\n toolbarSticky?: ToolbarVariantProps[\"sticky\"];\n toolbarVisible?: ToolbarVariantProps[\"visible\"];\n\n ref?: RefObject<WysiwygRef>;\n debounceChange?: number | false;\n onChange?: (value: WysiwygValue) => void;\n children?: ReactNode;\n}\nfunction readValue(editor: LexicalEditor): WysiwygValue {\n return {\n state: editor.getEditorState().toJSON(),\n };\n}\n\nexport interface WysiwygRef {\n getValue: () => WysiwygValue;\n setHtml: (html: string, fireEvent?: boolean) => void;\n getState: () => SerializedEditorState;\n setState: (state: SerializedEditorState, fireEvent?: boolean) => void;\n clear: (fireEvent?: boolean) => void;\n}\n\nexport function Wysiwyg({\n id,\n floatingPosition = \"bottom\",\n extendedToolbar = true,\n proseCompact = false,\n defaultValue,\n disabled = false,\n readOnly = false,\n contentEditableBaseStyle = \"normal\",\n contentEditableClassName,\n containerClassName,\n ref,\n toolbarSticky,\n toolbarVisible,\n debounceChange = false,\n onChange,\n children,\n}: Props) {\n const [fullInitialConfig] = useState<InitialConfigType>(() => ({\n ...editorConfig,\n editable: !disabled && !readOnly,\n ...(defaultValue ? { editorState: JSON.stringify(defaultValue.state) } : {}),\n }));\n\n const editorRef = useRef<LexicalEditor | null>(null);\n\n useEffect(() => {\n editorRef.current?.setEditable(!disabled && !readOnly);\n }, [disabled, readOnly]);\n const [floatingAnchorElem, setFloatingAnchorElem] = useState<HTMLDivElement | null>(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const onRef = (floatingAnchorElem: HTMLDivElement) => {\n if (floatingAnchorElem !== null) {\n setFloatingAnchorElem(floatingAnchorElem);\n }\n };\n\n function getEditor(): LexicalEditor {\n const editor = editorRef.current;\n\n if (!editor) {\n throw new Error(\"Wysiwyg ref called before the editor was mounted\");\n }\n\n return editor;\n }\n\n function notifyChange(editor: LexicalEditor) {\n onChange?.(readValue(editor));\n }\n\n useImperativeHandle(ref, () => {\n return {\n getValue: () => {\n const editor = getEditor();\n return readValue(editor);\n },\n setHtml: (nextHtml: string, fireEvent = false) => {\n const editor = getEditor();\n\n editor.update(() => {\n $loadFromHtml(editor, nextHtml);\n });\n if (fireEvent) {\n notifyChange(editor);\n }\n },\n getState: () => {\n return getEditor().getEditorState().toJSON();\n },\n setState: (editorState: SerializedEditorState, fireEvent = false) => {\n const editor = getEditor();\n const parsedEditorState = editor.parseEditorState(editorState);\n editor.setEditorState(parsedEditorState);\n if (fireEvent) {\n notifyChange(editor);\n }\n },\n\n clear: (fireEvent = false) => {\n const editor = getEditor();\n\n editor.update(() => {\n const root = $getRoot();\n root.getChildren().forEach((node) => {\n node.remove();\n });\n });\n if (fireEvent) {\n notifyChange(editor);\n }\n },\n };\n });\n\n return (\n <div className=\"relative z-(--index-wysiwyg) w-full\">\n <LexicalComposer initialConfig={fullInitialConfig}>\n <EditorRefPlugin editorRef={editorRef} />\n <CustomAutoLinkPlugin />\n <CustomLinkPlugin />\n <HorizontalRulePlugin />\n <ListPlugin />\n {debounceChange && <LazyOnChangePlugin wait={debounceChange} onChange={onChange} />}\n <HistoryPlugin />\n\n <ToolbarContext>\n <div\n ref={onRef}\n data-color=\"gray\"\n className={clsx(\"relative mx-auto w-full\", containerClassName)}\n >\n <ToolbarPlugin\n extendedToolbar={extendedToolbar}\n sticky={toolbarSticky}\n visible={toolbarVisible}\n setIsLinkEditMode={setIsLinkEditMode}\n />\n {floatingAnchorElem && (\n <FloatingLinkEditorPlugin\n floatingPosition={floatingPosition}\n anchorElem={floatingAnchorElem}\n isLinkEditMode={isLinkEditMode}\n setIsLinkEditMode={setIsLinkEditMode}\n />\n )}\n {children}\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n id={id}\n autoComplete=\"off\"\n aria-disabled={disabled}\n aria-readonly={readOnly}\n {...(proseCompact ? { \"data-compact\": true } : {})}\n className={clsx(\n \"prose\",\n contentEditableStyles[contentEditableBaseStyle],\n contentEditableClassName,\n )}\n ></ContentEditable>\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </div>\n </ToolbarContext>\n </LexicalComposer>\n </div>\n );\n}\n","import { createEditor, SerializedEditorState } from \"lexical\";\nimport { editorConfig } from \"./editor\";\n\nexport function isPlausibleLexicalState(state: unknown): state is SerializedEditorState {\n if (typeof state !== \"object\" || state === null) return false;\n const root = (state as { root?: unknown }).root;\n return (\n typeof root === \"object\" &&\n root !== null &&\n (root as { type?: unknown }).type === \"root\" &&\n Array.isArray((root as { children?: unknown }).children)\n );\n}\n\n// non utilisée directement dans le flux de validation actuel : `generateHtmlFromLexicalState`\n// (via `stateToHtml`) appelle déjà `editor.parseEditorState` en interne, ce qui\n// fournit la même garantie en évitant un second parse. Conservée comme utilitaire public\n// pour un appelant qui voudrait valider sans avoir besoin du HTML généré.\nexport function isValidLexicalState(state: unknown): state is SerializedEditorState {\n try {\n const editor = createEditor({\n ...editorConfig,\n onError(err) {\n throw err;\n },\n });\n editor.parseEditorState(state as SerializedEditorState);\n return true;\n } catch {\n return false;\n }\n}\n","import { SerializedEditorState } from \"lexical\";\nimport { z } from \"zod/v4-mini\";\nimport { isPlausibleLexicalState } from \"./config/validation\";\n\nexport type WysiwygValue = {\n html?: string;\n state: SerializedEditorState;\n};\n\nconst maxContentBytes = 100_000; // à trancher ensemble\n\nexport const wysiwygSchema = z.object({\n html: z.optional(z.string()),\n state: z\n .custom<SerializedEditorState>(isPlausibleLexicalState)\n .check(z.refine((state) => JSON.stringify(state).length <= maxContentBytes)),\n});\n\n// renvoie `undefined` (convention Zod pour \"absent\", cf. z.optional()) plutôt que `null`\n// (convention Conform) : c'est au point d'appel `useControl.parse` d'adapter avec `?? null`\nexport function parseWysiwygValue(payload: unknown) {\n if (payload == null || payload === \"\") {\n return null;\n }\n if (typeof payload !== \"string\") {\n throw new Error(\"wysiwyg value must be a JSON string\");\n }\n try {\n return JSON.parse(payload) as WysiwygValue;\n } catch {\n // JSON corrompu (ex. donnée persistée avant une migration de schéma) : on dégrade\n // gracieusement vers \"absent\" plutôt que de faire planter le rendu du champ.\n return null;\n }\n}\n\n// trie récursivement les clés des objets rencontrés afin que deux states lexical\n// sémantiquement identiques mais générés avec un ordre de clés différent produisent\n// la même chaîne (nécessaire pour une comparaison isDirty fiable)\nfunction sortKeysReplacer(_key: string, value: unknown): unknown {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n }, {});\n }\n return value;\n}\n\nexport function serializeWysiwygValue(value: unknown): string | null {\n try {\n return value == null\n ? null\n : typeof value === \"string\"\n ? value\n : JSON.stringify({ state: (value as WysiwygValue).state }, sortKeysReplacer);\n } catch {\n return null;\n }\n}\n\nexport function isWysiwygStateEmpty(value: WysiwygValue) {\n return value.state.root.children.length === 0;\n}\n","import { useField, useControl, type FieldName } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport type { RefObject } from \"react\";\nimport type { ToolbarVariantProps } from \"./style\";\nimport type { WysiwygRef } from \"./Wysiwyg\";\nimport { Wysiwyg } from \"./Wysiwyg\";\nimport { parseWysiwygValue, serializeWysiwygValue, WysiwygValue } from \"./types\";\n\ninterface Props extends Omit<FieldProps, \"errors\" | \"children\" | \"group\"> {\n name: FieldName<WysiwygValue | undefined | null>;\n ref?: RefObject<WysiwygRef>;\n debounceChange?: number | false;\n toolbarSticky?: ToolbarVariantProps[\"sticky\"];\n contentEditableClassName?: string;\n containerClassName?: string;\n disabled?: boolean;\n readOnly?: boolean;\n}\n\nexport function WysiwygField({\n name,\n ref,\n debounceChange = false,\n toolbarSticky,\n contentEditableClassName,\n containerClassName,\n disabled = false,\n readOnly = false,\n id: forcedId,\n ...rest\n}: Props) {\n const field = useField(name);\n const id = forcedId ?? field.id;\n\n const control = useControl<WysiwygValue, string>({\n // on utiliserait defaultPayload si on construisait un composant fieldset.\n // ici on a uniquement un input text\n defaultValue: field.defaultValue,\n // useControl attend `null` (pas `undefined`) pour signaler l'absence de valeur\n parse: (payload) => parseWysiwygValue(payload) ?? null,\n serialize: serializeWysiwygValue,\n });\n\n function handleChange(value: WysiwygValue) {\n control.change(value);\n }\n\n return (\n <>\n <input\n name={field.name}\n type=\"text\"\n autoComplete=\"off\"\n tabIndex={-1}\n ref={control.register}\n defaultValue={control.defaultValue ?? \"\"}\n disabled={disabled}\n readOnly={readOnly}\n hidden\n />\n <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n <Wysiwyg\n key={field.key}\n ref={ref}\n defaultValue={control.payload ?? undefined}\n onChange={handleChange}\n debounceChange={debounceChange}\n toolbarSticky={toolbarSticky}\n contentEditableClassName={contentEditableClassName}\n containerClassName={containerClassName}\n disabled={disabled}\n readOnly={readOnly}\n />\n </Field>\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport clsx from \"clsx\";\n\nimport { stateToHtml } from \"./config/html\";\nimport type { WysiwygValue } from \"./types\";\n\ninterface Props {\n value: WysiwygValue;\n proseCompact?: boolean;\n className?: string;\n}\n\nexport function WysiwygReader({ value, proseCompact = false, className }: Props) {\n const html = useMemo(() => value.html ?? stateToHtml(value.state), [value.html, value.state]);\n\n return (\n <div\n className={clsx(className ?? \"prose\")}\n {...(proseCompact ? { \"data-compact\": true } : {})}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n","import { SerializedEditorState } from \"lexical\";\n\nexport function isStateEmpty(state: SerializedEditorState): boolean {\n const children = state.root.children as Array<{ children?: unknown[] }>;\n return children.every((node) => (node.children?.length ?? 0) === 0);\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { CAN_USE_BEFORE_INPUT, IS_APPLE_WEBKIT, IS_IOS, IS_SAFARI } from \"@lexical/utils\";\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n KEY_ENTER_COMMAND,\n} from \"lexical\";\nimport { useEffect } from \"react\";\n\ninterface SubmitOnEnterPluginProps {\n /**\n * When true, Shift+Enter or Ctrl+Enter submits the form and Enter inserts\n * a newline (inverse of the default Enter-to-submit behavior).\n */\n submitOnShiftOrCtrlEnter?: boolean;\n}\n\nexport function SubmitOnEnterPlugin({\n submitOnShiftOrCtrlEnter = false,\n}: SubmitOnEnterPluginProps) {\n const [editor] = useLexicalComposerContext();\n useEffect(() => {\n return editor.registerCommand<KeyboardEvent | null>(\n KEY_ENTER_COMMAND,\n (event) => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n if (event !== null) {\n // If we have beforeinput, then we can avoid blocking\n // the default behavior. This ensures that the iOS can\n // intercept that we're actually inserting a paragraph,\n // and autocomplete, autocapitalize etc work as intended.\n // This can also cause a strange performance issue in\n // Safari, where there is a noticeable pause due to\n // preventing the key down of enter.\n /**\n * Warning: when you use devtools the browser UserAgent is modified and\n * all constants are true.\n */\n if ((IS_IOS || IS_SAFARI || IS_APPLE_WEBKIT) && CAN_USE_BEFORE_INPUT) {\n return false;\n }\n event.preventDefault();\n if (submitOnShiftOrCtrlEnter ? !(event.shiftKey || event.ctrlKey) : event.shiftKey) {\n return false;\n }\n }\n\n const form = document.activeElement?.closest<HTMLFormElement>(\"form\");\n form?.requestSubmit();\n return true;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor, submitOnShiftOrCtrlEnter]);\n return null;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,9 +3,8 @@ import { Field, type FieldProps } from "../field/Field";
|
|
|
3
3
|
import { Color } from "./Color";
|
|
4
4
|
import { Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader } from "../../modal";
|
|
5
5
|
import { useState } from "react";
|
|
6
|
-
import clsx from "clsx";
|
|
7
6
|
import { Button } from "../../button/Button";
|
|
8
|
-
import {
|
|
7
|
+
import { ColorSwatchGrid } from "./ColorSwatchGrid";
|
|
9
8
|
import { useTranslate } from "../../i18n";
|
|
10
9
|
|
|
11
10
|
interface Props extends Omit<FieldProps, "errors" | "children" | "group"> {
|
|
@@ -38,7 +37,7 @@ export function ColorField({ name, id: forcedId, allowInherit = false, ...rest }
|
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
function handleSubmitInherit() {
|
|
41
|
-
control.change(
|
|
40
|
+
control.change(null);
|
|
42
41
|
setTempValue(null);
|
|
43
42
|
}
|
|
44
43
|
|
|
@@ -57,7 +56,7 @@ export function ColorField({ name, id: forcedId, allowInherit = false, ...rest }
|
|
|
57
56
|
type="button"
|
|
58
57
|
value={control.value}
|
|
59
58
|
onClick={() => setTempValue(control.value ?? "")}
|
|
60
|
-
label={control.value
|
|
59
|
+
label={control.value ? undefined : translate?.("form.values.color.inherit")}
|
|
61
60
|
/>
|
|
62
61
|
</Field>
|
|
63
62
|
<Modal
|
|
@@ -69,30 +68,7 @@ export function ColorField({ name, id: forcedId, allowInherit = false, ...rest }
|
|
|
69
68
|
<ModalContent className="max-w-190 overflow-auto" zClassName="z-modal-overlay">
|
|
70
69
|
<ModalHeader>{translate?.("form.label.pickYourColor")}</ModalHeader>
|
|
71
70
|
<ModalDescription className="max-h-[calc(100lvh-6.5rem)]" scrollable={true}>
|
|
72
|
-
<
|
|
73
|
-
{colorByGroups.map(({ name, colors }) => (
|
|
74
|
-
<div key={name}>
|
|
75
|
-
<div className="text-body-xs truncate">{name}</div>
|
|
76
|
-
<div className="grid shadow">
|
|
77
|
-
{colors.map(([colorNumber, colorCode]) => (
|
|
78
|
-
<button
|
|
79
|
-
key={colorNumber}
|
|
80
|
-
className={clsx(
|
|
81
|
-
"cursor-pointer",
|
|
82
|
-
parseInt(colorNumber) > 600 ? "text-white" : "text-black",
|
|
83
|
-
"hover:z-20 hover:scale-125 hover:rounded hover:shadow active:scale-125",
|
|
84
|
-
tempValue === colorCode && "outline-yellow-5 z-10 rounded outline-2",
|
|
85
|
-
)}
|
|
86
|
-
style={{ backgroundColor: colorCode }}
|
|
87
|
-
onClick={() => handleSelectAndSubmit(colorCode)}
|
|
88
|
-
>
|
|
89
|
-
{colorNumber}
|
|
90
|
-
</button>
|
|
91
|
-
))}
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
))}
|
|
95
|
-
</div>
|
|
71
|
+
<ColorSwatchGrid value={tempValue} onChange={handleSelectAndSubmit} />
|
|
96
72
|
</ModalDescription>
|
|
97
73
|
<ModalFooter className="mt-2">
|
|
98
74
|
<div className="flex justify-between">
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import clsx from "clsx";
|
|
2
|
+
import { colorByGroups } from "../../../lib/color";
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
value: string | null;
|
|
6
|
+
onChange: (color: string) => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function ColorSwatchGrid({ value, onChange }: Props) {
|
|
10
|
+
return (
|
|
11
|
+
<div className="grid-cols-repeat-fill-50 grid gap-1 text-center text-sm p-2">
|
|
12
|
+
{colorByGroups.map(({ name, colors }) => (
|
|
13
|
+
<div key={name}>
|
|
14
|
+
<div className="text-body-xs truncate">{name}</div>
|
|
15
|
+
<div className="grid shadow">
|
|
16
|
+
{colors.map(([colorNumber, colorCode]) => (
|
|
17
|
+
<button
|
|
18
|
+
key={colorNumber}
|
|
19
|
+
className={clsx(
|
|
20
|
+
"cursor-pointer",
|
|
21
|
+
parseInt(colorNumber) > 600 ? "text-white" : "text-black",
|
|
22
|
+
"hover:z-20 hover:scale-125 hover:rounded hover:shadow active:scale-125",
|
|
23
|
+
value === colorCode && "outline-yellow-5 z-10 rounded outline-2",
|
|
24
|
+
)}
|
|
25
|
+
style={{ backgroundColor: colorCode }}
|
|
26
|
+
onClick={() => onChange(colorCode)}
|
|
27
|
+
>
|
|
28
|
+
{colorNumber}
|
|
29
|
+
</button>
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
))}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
import type { VariantProps } from "class-variance-authority";
|
|
2
2
|
import { cva } from "class-variance-authority";
|
|
3
3
|
|
|
4
|
-
export const toolbarVariants = cva(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
export const toolbarVariants = cva(
|
|
5
|
+
"p-1 border-custom-2 border gap-1 bg-gray-0/40 overflow-x-scroll",
|
|
6
|
+
{
|
|
7
|
+
variants: {
|
|
8
|
+
sticky: {
|
|
9
|
+
mobileOnly: "max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl",
|
|
10
|
+
allDevice: "max-lg:sticky max-lg:top-0 max-lg:backdrop-blur-xs lg:rounded-t-2xl",
|
|
11
|
+
false: "",
|
|
12
|
+
},
|
|
13
|
+
visible: {
|
|
14
|
+
always: "flex",
|
|
15
|
+
custom: "",
|
|
16
|
+
desktopOnly: "hidden lg:flex rounded-t-2xl",
|
|
17
|
+
},
|
|
10
18
|
},
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
desktopOnly: "hidden lg:flex rounded-t-2xl",
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
sticky: "mobileOnly",
|
|
21
|
+
visible: "always",
|
|
15
22
|
},
|
|
16
23
|
},
|
|
17
|
-
|
|
18
|
-
sticky: "mobileOnly",
|
|
19
|
-
visible: "always",
|
|
20
|
-
},
|
|
21
|
-
});
|
|
24
|
+
);
|
|
22
25
|
export type ToolbarVariantProps = VariantProps<typeof toolbarVariants>;
|
|
23
26
|
|
|
24
27
|
export const defaultContentEditableStyle =
|
package/src/tailwind/prose.css
CHANGED
package/src/tailwind/theme.css
CHANGED
|
@@ -135,8 +135,8 @@
|
|
|
135
135
|
--text-h6--line-height: 1.5;
|
|
136
136
|
--text-h6--font-weight: 500;
|
|
137
137
|
|
|
138
|
-
--text-prose
|
|
139
|
-
--text-prose
|
|
138
|
+
--text-prose: 16px;
|
|
139
|
+
--text-prose--line-height: 24px;
|
|
140
140
|
|
|
141
141
|
/** 32px size / 36px high / normal */
|
|
142
142
|
--text-body-6xl: 5rem;
|