@namroodinc/liquid-editorial 0.1.2 → 0.1.4
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/AGENTS.md +11 -0
- package/README.md +8 -0
- package/UPGRADING.md +56 -0
- package/dist/chunks/{EntryEditor-cjDk4vdH.cjs → EntryEditor-C32lKKnV.cjs} +2 -2
- package/dist/chunks/{EntryEditor-cjDk4vdH.cjs.map → EntryEditor-C32lKKnV.cjs.map} +1 -1
- package/dist/chunks/EntryEditor-xVuiqtFo.js +181 -0
- package/dist/chunks/{EntryEditor-BF808OZR.js.map → EntryEditor-xVuiqtFo.js.map} +1 -1
- package/dist/chunks/RichTextEditor-CSpjsL1z.js +357 -0
- package/dist/chunks/RichTextEditor-CSpjsL1z.js.map +1 -0
- package/dist/chunks/RichTextEditor-DC_0oN1s.cjs +2 -0
- package/dist/chunks/RichTextEditor-DC_0oN1s.cjs.map +1 -0
- package/dist/components/AssetGrid/index.js.map +1 -1
- package/dist/components/EntryEditor/index.cjs +1 -1
- package/dist/components/EntryEditor/index.js +3 -3
- package/dist/components/EntryPicker/index.cjs +1 -1
- package/dist/components/EntryPicker/index.cjs.map +1 -1
- package/dist/components/EntryPicker/index.js +4 -4
- package/dist/components/EntryPicker/index.js.map +1 -1
- package/dist/components/Field/index.js.map +1 -1
- package/dist/components/ImageCropper/index.js.map +1 -1
- package/dist/components/Modal/index.cjs +1 -1
- package/dist/components/Modal/index.cjs.map +1 -1
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.d.cts.map +1 -1
- package/dist/components/RichTextEditor/index.d.ts.map +1 -1
- package/dist/components/RichTextEditor/index.js +3 -1
- package/dist/components/Table/index.cjs +1 -1
- package/dist/components/Table/index.cjs.map +1 -1
- package/dist/components/Table/index.d.cts +5 -1
- package/dist/components/Table/index.d.cts.map +1 -1
- package/dist/components/Table/index.d.ts +5 -1
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/Table/index.js +74 -55
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Table/style.css +4 -0
- package/dist/components/Time/index.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +13 -13
- package/package.json +3 -1
- package/dist/chunks/EntryEditor-BF808OZR.js +0 -181
- package/dist/chunks/RichTextEditor-DRt-kibg.js +0 -248
- package/dist/chunks/RichTextEditor-DRt-kibg.js.map +0 -1
- package/dist/chunks/RichTextEditor-tFkISOvq.cjs +0 -2
- package/dist/chunks/RichTextEditor-tFkISOvq.cjs.map +0 -1
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { Button as e } from "../components/Button/index.js";
|
|
2
|
-
import { ButtonGroup as t } from "../components/ButtonGroup/index.js";
|
|
3
|
-
/* empty css */
|
|
4
|
-
import { forwardRef as n, useCallback as r, useEffect as i, useId as a, useMemo as o, useState as s } from "react";
|
|
5
|
-
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
-
import { EditorContent as u, createDocument as d, getSchema as f, useEditor as p, useEditorState as m } from "@tiptap/react";
|
|
7
|
-
import { Placeholder as h } from "@tiptap/extension-placeholder";
|
|
8
|
-
import { StarterKit as g } from "@tiptap/starter-kit";
|
|
9
|
-
import { Link as _ } from "@tiptap/extension-link";
|
|
10
|
-
//#region src/components/RichTextEditor/document.ts
|
|
11
|
-
var v = {
|
|
12
|
-
type: "doc",
|
|
13
|
-
content: [{ type: "paragraph" }]
|
|
14
|
-
};
|
|
15
|
-
function y() {
|
|
16
|
-
return [g.configure({ link: !1 }), _.configure({
|
|
17
|
-
openOnClick: !1,
|
|
18
|
-
autolink: !0
|
|
19
|
-
})];
|
|
20
|
-
}
|
|
21
|
-
var b = f(y());
|
|
22
|
-
function x(e) {
|
|
23
|
-
return e.content?.length ? e : {
|
|
24
|
-
...e,
|
|
25
|
-
content: v.content
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function S(e) {
|
|
29
|
-
try {
|
|
30
|
-
if (!e || typeof e != "object" || !("type" in e) || e.type !== "doc") throw Error();
|
|
31
|
-
let t = (e) => {
|
|
32
|
-
let n = b.nodes[e.type ?? ""];
|
|
33
|
-
if (!n || Object.keys(e).some((e) => ![
|
|
34
|
-
"type",
|
|
35
|
-
"attrs",
|
|
36
|
-
"content",
|
|
37
|
-
"marks",
|
|
38
|
-
"text"
|
|
39
|
-
].includes(e)) || e.text !== void 0 && e.type !== "text" || e.attrs && Object.keys(e.attrs).some((e) => !Object.hasOwn(n.spec.attrs ?? {}, e))) throw Error();
|
|
40
|
-
for (let t of e.marks ?? []) {
|
|
41
|
-
let e = b.marks[t.type];
|
|
42
|
-
if (!e || Object.keys(t).some((e) => !["type", "attrs"].includes(e)) || Object.keys(t.attrs ?? {}).some((t) => !Object.hasOwn(e.spec.attrs ?? {}, t))) throw Error();
|
|
43
|
-
}
|
|
44
|
-
e.content?.forEach(t);
|
|
45
|
-
}, n = e;
|
|
46
|
-
t(n), b.nodeFromJSON(x(n)).check();
|
|
47
|
-
} catch {
|
|
48
|
-
return "Unsupported or invalid rich-text document.";
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
//#region src/components/RichTextEditor/index.tsx
|
|
53
|
-
var C = [
|
|
54
|
-
[
|
|
55
|
-
{
|
|
56
|
-
id: "bold",
|
|
57
|
-
icon: "bold",
|
|
58
|
-
label: "Bold",
|
|
59
|
-
run: (e) => e.chain().focus().toggleBold().run(),
|
|
60
|
-
active: (e) => e.isActive("bold")
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
id: "italic",
|
|
64
|
-
icon: "italic",
|
|
65
|
-
label: "Italic",
|
|
66
|
-
run: (e) => e.chain().focus().toggleItalic().run(),
|
|
67
|
-
active: (e) => e.isActive("italic")
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
id: "strike",
|
|
71
|
-
icon: "strikethrough",
|
|
72
|
-
label: "Strikethrough",
|
|
73
|
-
run: (e) => e.chain().focus().toggleStrike().run(),
|
|
74
|
-
active: (e) => e.isActive("strike")
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
id: "code",
|
|
78
|
-
icon: "code",
|
|
79
|
-
label: "Inline code",
|
|
80
|
-
run: (e) => e.chain().focus().toggleCode().run(),
|
|
81
|
-
active: (e) => e.isActive("code")
|
|
82
|
-
}
|
|
83
|
-
],
|
|
84
|
-
[
|
|
85
|
-
{
|
|
86
|
-
id: "h2",
|
|
87
|
-
icon: "heading-2",
|
|
88
|
-
label: "Heading",
|
|
89
|
-
run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
90
|
-
active: (e) => e.isActive("heading", { level: 2 })
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
id: "h3",
|
|
94
|
-
icon: "heading-3",
|
|
95
|
-
label: "Subheading",
|
|
96
|
-
run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
97
|
-
active: (e) => e.isActive("heading", { level: 3 })
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
id: "quote",
|
|
101
|
-
icon: "quote",
|
|
102
|
-
label: "Quote",
|
|
103
|
-
run: (e) => e.chain().focus().toggleBlockquote().run(),
|
|
104
|
-
active: (e) => e.isActive("blockquote")
|
|
105
|
-
}
|
|
106
|
-
],
|
|
107
|
-
[{
|
|
108
|
-
id: "ul",
|
|
109
|
-
icon: "list",
|
|
110
|
-
label: "Bulleted list",
|
|
111
|
-
run: (e) => e.chain().focus().toggleBulletList().run(),
|
|
112
|
-
active: (e) => e.isActive("bulletList")
|
|
113
|
-
}, {
|
|
114
|
-
id: "ol",
|
|
115
|
-
icon: "list-ordered",
|
|
116
|
-
label: "Numbered list",
|
|
117
|
-
run: (e) => e.chain().focus().toggleOrderedList().run(),
|
|
118
|
-
active: (e) => e.isActive("orderedList")
|
|
119
|
-
}],
|
|
120
|
-
[{
|
|
121
|
-
id: "undo",
|
|
122
|
-
icon: "undo",
|
|
123
|
-
label: "Undo",
|
|
124
|
-
run: (e) => e.chain().focus().undo().run()
|
|
125
|
-
}, {
|
|
126
|
-
id: "redo",
|
|
127
|
-
icon: "redo",
|
|
128
|
-
label: "Redo",
|
|
129
|
-
run: (e) => e.chain().focus().redo().run()
|
|
130
|
-
}]
|
|
131
|
-
], w = n(function(n, f) {
|
|
132
|
-
let { placeholder: g = "Write something…", size: _ = "md", isDisabled: b = !1, isInvalid: w = !1, label: T = "Rich text editor", className: E, toolbarExtra: D, id: O, isRequired: k, "aria-labelledby": A, "aria-describedby": j, "aria-invalid": M } = n, [N, P] = s(!1), [F] = s(() => n.defaultValue ?? (n.format === "json" ? v : "")), I = n.value === void 0 ? F : n.value, L = o(() => n.format === "json" ? S(I) : void 0, [n.format, I]), R = a(), z = w || !!L || M, B = b || !!L, V = o(() => ({
|
|
133
|
-
role: "textbox",
|
|
134
|
-
"aria-label": T,
|
|
135
|
-
"aria-multiline": "true",
|
|
136
|
-
...O ? { id: O } : {},
|
|
137
|
-
...A ? { "aria-labelledby": A } : {},
|
|
138
|
-
...j ? { "aria-describedby": j } : {},
|
|
139
|
-
...z ? { "aria-invalid": String(z) } : {},
|
|
140
|
-
...k ? { "aria-required": "true" } : {}
|
|
141
|
-
}), [
|
|
142
|
-
T,
|
|
143
|
-
O,
|
|
144
|
-
A,
|
|
145
|
-
j,
|
|
146
|
-
z,
|
|
147
|
-
k
|
|
148
|
-
]), H = p({
|
|
149
|
-
immediatelyRender: !1,
|
|
150
|
-
editable: !B,
|
|
151
|
-
content: L ? v : typeof I == "string" ? I : x(I),
|
|
152
|
-
extensions: [...y(), h.configure({ placeholder: g })],
|
|
153
|
-
editorProps: { attributes: V },
|
|
154
|
-
onFocus: () => P(!0),
|
|
155
|
-
onBlur: () => P(!1),
|
|
156
|
-
onUpdate: ({ editor: e }) => {
|
|
157
|
-
B || (n.format === "json" ? n.onChange?.(e.getJSON()) : n.onChange?.(e.getHTML()));
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
i(() => {
|
|
161
|
-
H && (H.setEditable(!B, !1), H.setOptions({ editorProps: { attributes: V } }));
|
|
162
|
-
}, [
|
|
163
|
-
H,
|
|
164
|
-
B,
|
|
165
|
-
V
|
|
166
|
-
]), i(() => {
|
|
167
|
-
if (!H || n.value === void 0 || L) return;
|
|
168
|
-
let e = typeof n.value == "string" ? d(n.value, H.schema) : H.schema.nodeFromJSON(x(n.value));
|
|
169
|
-
e.eq(H.state.doc) || H.commands.setContent(e, { emitUpdate: !1 });
|
|
170
|
-
}, [
|
|
171
|
-
H,
|
|
172
|
-
n.value,
|
|
173
|
-
L
|
|
174
|
-
]);
|
|
175
|
-
let U = m({
|
|
176
|
-
editor: H,
|
|
177
|
-
selector: ({ editor: e }) => e ? {
|
|
178
|
-
active: Object.fromEntries(C.flat().map((t) => [t.id, t.active?.(e) ?? !1])),
|
|
179
|
-
linkActive: e.isActive("link")
|
|
180
|
-
} : null
|
|
181
|
-
}), W = r(() => {
|
|
182
|
-
if (!H) return;
|
|
183
|
-
if (H.isActive("link")) {
|
|
184
|
-
H.chain().focus().unsetLink().run();
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
let e = window.prompt("Link to");
|
|
188
|
-
e && H.chain().focus().extendMarkRange("link").setLink({ href: e }).run();
|
|
189
|
-
}, [H]);
|
|
190
|
-
return /* @__PURE__ */ l("div", {
|
|
191
|
-
ref: f,
|
|
192
|
-
className: ["ds-rte", E].filter(Boolean).join(" "),
|
|
193
|
-
"data-focused": N || void 0,
|
|
194
|
-
"data-disabled": B || void 0,
|
|
195
|
-
"aria-invalid": z || void 0,
|
|
196
|
-
children: [L && /* @__PURE__ */ c("p", {
|
|
197
|
-
id: R,
|
|
198
|
-
role: "alert",
|
|
199
|
-
className: "ds-field__error",
|
|
200
|
-
children: L
|
|
201
|
-
}), /* @__PURE__ */ l("div", {
|
|
202
|
-
hidden: !!L,
|
|
203
|
-
children: [/* @__PURE__ */ l("div", {
|
|
204
|
-
className: "ds-rte__toolbar",
|
|
205
|
-
role: "toolbar",
|
|
206
|
-
"aria-label": `${T} formatting`,
|
|
207
|
-
children: [
|
|
208
|
-
C.map((n, r) => /* @__PURE__ */ c(t, {
|
|
209
|
-
"aria-label": `Formatting ${r + 1}`,
|
|
210
|
-
children: n.map((t) => /* @__PURE__ */ c(e, {
|
|
211
|
-
size: "sm",
|
|
212
|
-
isIconOnly: !0,
|
|
213
|
-
iconStart: t.icon,
|
|
214
|
-
"aria-label": t.label,
|
|
215
|
-
title: t.label,
|
|
216
|
-
"aria-pressed": t.active ? U?.active[t.id] : void 0,
|
|
217
|
-
variant: U?.active[t.id] ? "active" : "neutral",
|
|
218
|
-
isDisabled: B || !H,
|
|
219
|
-
onClick: () => H && t.run(H)
|
|
220
|
-
}, t.id))
|
|
221
|
-
}, r)),
|
|
222
|
-
/* @__PURE__ */ c(t, {
|
|
223
|
-
"aria-label": "Link",
|
|
224
|
-
children: /* @__PURE__ */ c(e, {
|
|
225
|
-
size: "sm",
|
|
226
|
-
isIconOnly: !0,
|
|
227
|
-
iconStart: U?.linkActive ? "link-off" : "link",
|
|
228
|
-
"aria-label": U?.linkActive ? "Remove link" : "Add link",
|
|
229
|
-
title: U?.linkActive ? "Remove link" : "Add link",
|
|
230
|
-
variant: U?.linkActive ? "active" : "neutral",
|
|
231
|
-
isDisabled: B || !H,
|
|
232
|
-
onClick: W
|
|
233
|
-
})
|
|
234
|
-
}),
|
|
235
|
-
D
|
|
236
|
-
]
|
|
237
|
-
}), /* @__PURE__ */ c("div", {
|
|
238
|
-
className: "ds-rte__content",
|
|
239
|
-
"data-size": _,
|
|
240
|
-
children: /* @__PURE__ */ c(u, { editor: H })
|
|
241
|
-
})]
|
|
242
|
-
})]
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
//#endregion
|
|
246
|
-
export { S as n, v as r, w as t };
|
|
247
|
-
|
|
248
|
-
//# sourceMappingURL=RichTextEditor-DRt-kibg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextEditor-DRt-kibg.js","names":["emptyDocument","richTextExtensions","StarterKit","Link","schema","getSchema","normalizeDocument","document","documentError","value","check","type","node","key","mark","markType","GROUPS","RichTextEditor","forwardRef","labelledBy","describedBy","ariaInvalid","props","isFocused","setIsFocused","useState","initialValue","content","contentError","useMemo","errorId","useId","invalid","isInvalid","disabled","isDisabled","attributes","label","id","isRequired","editor","useEditor","Placeholder","useEffect","next","createDocument","state","useEditorState","toggleLink","useCallback","href","className","ButtonGroup","i","group","Button","tool","toolbarExtra","size","EditorContent"],"sources":["../../src/components/RichTextEditor/document.ts","../../src/components/RichTextEditor/index.tsx"],"sourcesContent":["import { getSchema, type JSONContent } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport { Link } from \"@tiptap/extension-link\";\n\nexport type RichTextDocument = JSONContent & { type: \"doc\" };\n\nexport const emptyDocument: RichTextDocument = { type: \"doc\", content: [{ type: \"paragraph\" }] };\n\nexport function richTextExtensions() {\n return [StarterKit.configure({ link: false }), Link.configure({ openOnClick: false, autolink: true })];\n}\n\nconst schema = getSchema(richTextExtensions());\n\n/** ProseMirror represents an empty writing surface with one empty paragraph. */\nexport function normalizeDocument(document: RichTextDocument): RichTextDocument {\n return !document.content?.length ? { ...document, content: emptyDocument.content } : document;\n}\n\nexport function documentError(value: unknown): string | undefined {\n try {\n if (!value || typeof value !== \"object\" || !(\"type\" in value) || value.type !== \"doc\") throw new Error();\n const check = (node: JSONContent) => {\n const type = schema.nodes[node.type ?? \"\"];\n if (!type || Object.keys(node).some((key) => ![\"type\", \"attrs\", \"content\", \"marks\", \"text\"].includes(key)) ||\n (node.text !== undefined && node.type !== \"text\") ||\n (node.attrs && Object.keys(node.attrs).some((key) => !Object.hasOwn(type.spec.attrs ?? {}, key)))) {\n throw new Error();\n }\n for (const mark of node.marks ?? []) {\n const markType = schema.marks[mark.type];\n if (!markType || Object.keys(mark).some((key) => ![\"type\", \"attrs\"].includes(key)) ||\n Object.keys(mark.attrs ?? {}).some((key) => !Object.hasOwn(markType.spec.attrs ?? {}, key))) {\n throw new Error();\n }\n }\n node.content?.forEach(check);\n };\n const document = value as RichTextDocument;\n check(document);\n schema.nodeFromJSON(normalizeDocument(document)).check();\n } catch {\n return \"Unsupported or invalid rich-text document.\";\n }\n}\n","import { forwardRef, useCallback, useEffect, useId, useMemo, useState, type AriaAttributes, type ReactNode } from \"react\";\nimport { createDocument, EditorContent, useEditor, useEditorState, type Editor } from \"@tiptap/react\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { Button } from \"../Button\";\nimport { ButtonGroup } from \"../ButtonGroup\";\nimport type { IconName } from \"../Icon/icons\";\nimport { documentError, emptyDocument, normalizeDocument, richTextExtensions, type RichTextDocument } from \"./document\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport type RichTextEditorSize = \"sm\" | \"md\" | \"lg\";\n\nexport type { RichTextDocument } from \"./document\";\n\ninterface RichTextEditorCommonProps {\n placeholder?: string;\n size?: RichTextEditorSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Accessible name for the editing surface. */\n label?: string;\n className?: string;\n /** Extra controls appended to the toolbar, e.g. a word count. */\n toolbarExtra?: ReactNode;\n /** Applied to the editable surface. */\n id?: string;\n isRequired?: boolean;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: AriaAttributes[\"aria-invalid\"];\n}\n\nexport type RichTextEditorProps = RichTextEditorCommonProps & (\n | { format?: \"html\"; value?: string; defaultValue?: string; onChange?: (html: string) => void }\n | { format: \"json\"; value?: RichTextDocument; defaultValue?: RichTextDocument; onChange?: (document: RichTextDocument) => void }\n);\n\ninterface ToolItem {\n id: string;\n icon: IconName;\n label: string;\n run: (editor: Editor) => void;\n active?: (editor: Editor) => boolean;\n}\n\nconst GROUPS: ToolItem[][] = [\n [\n {\n id: \"bold\",\n icon: \"bold\",\n label: \"Bold\",\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive(\"bold\"),\n },\n {\n id: \"italic\",\n icon: \"italic\",\n label: \"Italic\",\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive(\"italic\"),\n },\n {\n id: \"strike\",\n icon: \"strikethrough\",\n label: \"Strikethrough\",\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive(\"strike\"),\n },\n {\n id: \"code\",\n icon: \"code\",\n label: \"Inline code\",\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive(\"code\"),\n },\n ],\n [\n {\n id: \"h2\",\n icon: \"heading-2\",\n label: \"Heading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n {\n id: \"h3\",\n icon: \"heading-3\",\n label: \"Subheading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n {\n id: \"quote\",\n icon: \"quote\",\n label: \"Quote\",\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive(\"blockquote\"),\n },\n ],\n [\n {\n id: \"ul\",\n icon: \"list\",\n label: \"Bulleted list\",\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive(\"bulletList\"),\n },\n {\n id: \"ol\",\n icon: \"list-ordered\",\n label: \"Numbered list\",\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive(\"orderedList\"),\n },\n ],\n [\n {\n id: \"undo\",\n icon: \"undo\",\n label: \"Undo\",\n run: (e) => e.chain().focus().undo().run(),\n },\n {\n id: \"redo\",\n icon: \"redo\",\n label: \"Redo\",\n run: (e) => e.chain().focus().redo().run(),\n },\n ],\n];\n\n/**\n * The editorial writing surface. Rich text plus links — the same field skin,\n * radius and states as `TextField`, with the toolbar inside the frame.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n props,\n ref,\n ) {\n const {\n placeholder = \"Write something…\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n label = \"Rich text editor\",\n className,\n toolbarExtra,\n id,\n isRequired,\n \"aria-labelledby\": labelledBy,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": ariaInvalid,\n } = props;\n const [isFocused, setIsFocused] = useState(false);\n const [initialValue] = useState(() => props.defaultValue ?? (props.format === \"json\" ? emptyDocument : \"\"));\n const content = props.value !== undefined ? props.value : initialValue;\n const contentError = useMemo(() => props.format === \"json\" ? documentError(content) : undefined, [props.format, content]);\n const errorId = useId();\n const invalid = isInvalid || !!contentError || ariaInvalid;\n const disabled = isDisabled || !!contentError;\n const attributes = useMemo(() => ({\n role: \"textbox\",\n \"aria-label\": label,\n \"aria-multiline\": \"true\",\n ...(id ? { id } : {}),\n ...(labelledBy ? { \"aria-labelledby\": labelledBy } : {}),\n ...(describedBy ? { \"aria-describedby\": describedBy } : {}),\n ...(invalid ? { \"aria-invalid\": String(invalid) } : {}),\n ...(isRequired ? { \"aria-required\": \"true\" } : {}),\n }), [label, id, labelledBy, describedBy, invalid, isRequired]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n content: contentError ? emptyDocument : typeof content === \"string\" ? content : normalizeDocument(content),\n extensions: [\n ...richTextExtensions(),\n Placeholder.configure({ placeholder }),\n ],\n editorProps: {\n attributes,\n },\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onUpdate: ({ editor: e }) => {\n if (disabled) return;\n if (props.format === \"json\") props.onChange?.(e.getJSON() as RichTextDocument);\n else props.onChange?.(e.getHTML());\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!disabled, false);\n editor.setOptions({ editorProps: { attributes } });\n }, [editor, disabled, attributes]);\n\n useEffect(() => {\n if (!editor || props.value === undefined || contentError) return;\n const next = typeof props.value === \"string\"\n ? createDocument(props.value, editor.schema)\n : editor.schema.nodeFromJSON(normalizeDocument(props.value));\n // Parent echoes should preserve the current selection and undo history.\n if (!next.eq(editor.state.doc)) editor.commands.setContent(next, { emitUpdate: false });\n }, [editor, props.value, contentError]);\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n e\n ? {\n active: Object.fromEntries(\n GROUPS.flat().map((t) => [t.id, t.active?.(e) ?? false]),\n ),\n linkActive: e.isActive(\"link\"),\n }\n : null,\n });\n\n const toggleLink = useCallback(() => {\n if (!editor) return;\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const href = window.prompt(\"Link to\");\n if (!href) return;\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n }, [editor]);\n\n return (\n <div\n ref={ref}\n className={[\"ds-rte\", className].filter(Boolean).join(\" \")}\n data-focused={isFocused || undefined}\n data-disabled={disabled || undefined}\n aria-invalid={invalid || undefined}\n >\n {contentError && <p id={errorId} role=\"alert\" className=\"ds-field__error\">{contentError}</p>}\n <div hidden={!!contentError}>\n <div className=\"ds-rte__toolbar\" role=\"toolbar\" aria-label={`${label} formatting`}>\n {GROUPS.map((group, i) => (\n <ButtonGroup key={i} aria-label={`Formatting ${i + 1}`}>\n {group.map((tool) => (\n <Button\n key={tool.id}\n size=\"sm\"\n isIconOnly\n iconStart={tool.icon}\n aria-label={tool.label}\n title={tool.label}\n aria-pressed={tool.active ? state?.active[tool.id] : undefined}\n variant={state?.active[tool.id] ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={() => editor && tool.run(editor)}\n />\n ))}\n </ButtonGroup>\n ))}\n <ButtonGroup aria-label=\"Link\">\n <Button\n size=\"sm\"\n isIconOnly\n iconStart={state?.linkActive ? \"link-off\" : \"link\"}\n aria-label={state?.linkActive ? \"Remove link\" : \"Add link\"}\n title={state?.linkActive ? \"Remove link\" : \"Add link\"}\n variant={state?.linkActive ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={toggleLink}\n />\n </ButtonGroup>\n {toolbarExtra}\n </div>\n <div className=\"ds-rte__content\" data-size={size}>\n <EditorContent editor={editor} />\n </div>\n </div>\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAMA,IAAaA,IAAkC;CAAE,MAAM;CAAO,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;AAAE;AAE/F,SAAgBC,IAAqB;CACnC,OAAO,CAACC,EAAW,UAAU,EAAE,MAAM,GAAM,CAAC,GAAGC,EAAK,UAAU;EAAE,aAAa;EAAO,UAAU;CAAK,CAAC,CAAC;AACvG;AAEA,IAAMC,IAASC,EAAUJ,EAAmB,CAAC;AAG7C,SAAgBK,EAAkB,GAA8C;CAC9E,OAAQC,EAAS,SAAS,SAA2DA,IAAlD;EAAE,GAAGA;EAAU,SAASP,EAAc;CAAQ;AACnF;AAEA,SAAgBQ,EAAc,GAAoC;CAChE,IAAI;EACF,IAAI,CAACC,KAAS,OAAOA,KAAU,YAAY,EAAE,UAAUA,MAAUA,EAAM,SAAS,OAAO,MAAU,MAAM;EACvG,IAAMC,KAAS,MAAsB;GACnC,IAAMC,IAAOP,EAAO,MAAMQ,EAAK,QAAQ;GACvC,IAAI,CAACD,KAAQ,OAAO,KAAKC,CAAI,CAAC,CAAC,MAAM,MAAQ,CAAC;IAAC;IAAQ;IAAS;IAAW;IAAS;GAAM,CAAC,CAAC,SAASC,CAAG,CAAC,KACtGD,EAAK,SAAS,KAAA,KAAaA,EAAK,SAAS,UACzCA,EAAK,SAAS,OAAO,KAAKA,EAAK,KAAK,CAAC,CAAC,MAAM,MAAQ,CAAC,OAAO,OAAOD,EAAK,KAAK,SAAS,CAAC,GAAGE,CAAG,CAAC,GAC/F,MAAU,MAAM;GAElB,KAAK,IAAMC,KAAQF,EAAK,SAAS,CAAC,GAAG;IACnC,IAAMG,IAAWX,EAAO,MAAMU,EAAK;IACnC,IAAI,CAACC,KAAY,OAAO,KAAKD,CAAI,CAAC,CAAC,MAAM,MAAQ,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,SAASD,CAAG,CAAC,KAC/E,OAAO,KAAKC,EAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,MAAQ,CAAC,OAAO,OAAOC,EAAS,KAAK,SAAS,CAAC,GAAGF,CAAG,CAAC,GAC1F,MAAU,MAAM;GAEpB;GACA,EAAK,SAAS,QAAQH,CAAK;EAC7B,GACMH,IAAWE;EAEjB,AADAC,EAAMH,CAAQ,GACdH,EAAO,aAAaE,EAAkBC,CAAQ,CAAC,CAAC,CAAC,MAAM;CACzD,QAAQ;EACN,OAAO;CACT;AACF;;;ACCA,IAAMS,IAAuB;CAC3B;EACE;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;GAC/C,SAAS,MAAM,EAAE,SAAS,MAAM;EAClC;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;GACjD,SAAS,MAAM,EAAE,SAAS,QAAQ;EACpC;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;GACjD,SAAS,MAAM,EAAE,SAAS,QAAQ;EACpC;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;GAC/C,SAAS,MAAM,EAAE,SAAS,MAAM;EAClC;CACF;CACA;EACE;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;GAC9D,SAAS,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;EACnD;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;GAC9D,SAAS,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;EACnD;EACA;GACE,IAAI;GACJ,MAAM;GACN,OAAO;GACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;GACrD,SAAS,MAAM,EAAE,SAAS,YAAY;EACxC;CACF;CACA,CACE;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;EACrD,SAAS,MAAM,EAAE,SAAS,YAAY;CACxC,GACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;EACtD,SAAS,MAAM,EAAE,SAAS,aAAa;CACzC,CACF;CACA,CACE;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;CAC3C,GACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;CAC3C,CACF;AACF,GAMaC,IAAiBC,EAC5B,SACE,GACA,GACA;CACA,IAAM,EACJ,iBAAc,oBACd,UAAO,MACP,gBAAa,IACb,eAAY,IACZ,WAAQ,oBACR,cACA,iBACA,OACA,eACA,mBAAmBC,GACnB,oBAAoBC,GACpB,gBAAgBC,MACdC,GACE,CAACC,GAAWC,KAAgBC,EAAS,EAAK,GAC1C,CAACC,KAAgBD,QAAeH,EAAM,iBAAiBA,EAAM,WAAW,SAAStB,IAAgB,GAAG,GACpG2B,IAAUL,EAAM,UAAU,KAAA,IAA0BI,IAAdJ,EAAM,OAC5CM,IAAeC,QAAcP,EAAM,WAAW,SAASd,EAAcmB,CAAO,IAAI,KAAA,GAAW,CAACL,EAAM,QAAQK,CAAO,CAAC,GAClHG,IAAUC,EAAM,GAChBC,IAAUC,KAAa,CAAC,CAACL,KAAgBP,GACzCa,IAAWC,KAAc,CAAC,CAACP,GAC3BQ,IAAaP,SAAe;EAChC,MAAM;EACN,cAAcQ;EACd,kBAAkB;EAClB,GAAIC,IAAK,EAAE,MAAG,IAAI,CAAC;EACnB,GAAInB,IAAa,EAAE,mBAAmBA,EAAW,IAAI,CAAC;EACtD,GAAIC,IAAc,EAAE,oBAAoBA,EAAY,IAAI,CAAC;EACzD,GAAIY,IAAU,EAAE,gBAAgB,OAAOA,CAAO,EAAE,IAAI,CAAC;EACrD,GAAIO,IAAa,EAAE,iBAAiB,OAAO,IAAI,CAAC;CAClD,IAAI;EAACF;EAAOC;EAAInB;EAAYC;EAAaY;EAASO;CAAU,CAAC,GAEvDC,IAASC,EAAU;EACvB,mBAAmB;EACnB,UAAU,CAACP;EACX,SAASN,IAAe5B,IAAgB,OAAO2B,KAAY,WAAWA,IAAUrB,EAAkBqB,CAAO;EACzG,YAAY,CACV,GAAG1B,EAAmB,GACtByC,EAAY,UAAU,EAAE,eAAY,CAAC,CACvC;EACA,aAAa,EACX,cACF;EACA,eAAelB,EAAa,EAAI;EAChC,cAAcA,EAAa,EAAK;EAChC,WAAW,EAAE,QAAQ,QAAQ;GAC3B,AAAIU,MACAZ,EAAM,WAAW,SAAQA,EAAM,WAAW,EAAE,QAAQ,CAAqB,IACxEA,EAAM,WAAW,EAAE,QAAQ,CAAC;EACnC;CACF,CAAC;CAQD,AANAqB,QAAgB;EACd,AAAKH,MACLA,EAAO,YAAY,CAACN,GAAU,EAAK,GACnCM,EAAO,WAAW,EAAE,aAAa,EAAE,cAAW,EAAE,CAAC;CACnD,GAAG;EAACA;EAAQN;EAAUE;CAAU,CAAC,GAEjCO,QAAgB;EACd,IAAI,CAACH,KAAUlB,EAAM,UAAU,KAAA,KAAaM,GAAc;EAC1D,IAAMgB,IAAO,OAAOtB,EAAM,SAAU,WAChCuB,EAAevB,EAAM,OAAOkB,EAAO,MAAM,IACzCA,EAAO,OAAO,aAAalC,EAAkBgB,EAAM,KAAK,CAAC;EAE7D,AAAKsB,EAAK,GAAGJ,EAAO,MAAM,GAAG,KAAGA,EAAO,SAAS,WAAWI,GAAM,EAAE,YAAY,GAAM,CAAC;CACxF,GAAG;EAACJ;EAAQlB,EAAM;EAAOM;CAAY,CAAC;CAEtC,IAAMkB,IAAQC,EAAe;EAC3B;EACA,WAAW,EAAE,QAAQ,QACnB,IACI;GACE,QAAQ,OAAO,YACb/B,EAAO,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAK,CAAC,CACzD;GACA,YAAY,EAAE,SAAS,MAAM;EAC/B,IACA;CACR,CAAC,GAEKgC,IAAaC,QAAkB;EACnC,IAAI,CAACT,GAAQ;EACb,IAAIA,EAAO,SAAS,MAAM,GAAG;GAC3B,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI;GACvC;EACF;EACA,IAAMU,IAAO,OAAO,OAAO,SAAS;EACpC,AAAKA,KACLV,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAK,CAAC,CAAC,CAAC,IAAI;CACvE,GAAG,CAACA,CAAM,CAAC;CAEX,OACE,kBAAC,OAAD;EACO;EACL,WAAW,CAAC,UAAUW,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACzD,gBAAc5B,KAAa,KAAA;EAC3B,iBAAeW,KAAY,KAAA;EAC3B,gBAAcF,KAAW,KAAA;EAL3B,UAAA,CAOGJ,KAAgB,kBAAC,KAAD;GAAG,IAAIE;GAAS,MAAK;GAAQ,WAAU;GAAmB,UAAAF;EAAgB,CAAA,GAC3F,kBAAC,OAAD;GAAK,QAAQ,CAAC,CAACA;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAkB,MAAK;IAAU,cAAY,GAAGS,EAAM;IAArE,UAAA;KACGrB,EAAO,KAAK,GAAO,MAClB,kBAACoC,GAAD;MAAqB,cAAY,cAAcC,IAAI;MAChD,UAAAC,EAAM,KAAK,MACV,kBAACC,GAAD;OAEE,MAAK;OACL,YAAA;OACA,WAAWC,EAAK;OAChB,cAAYA,EAAK;OACjB,OAAOA,EAAK;OACZ,gBAAcA,EAAK,SAASV,GAAO,OAAOU,EAAK,MAAM,KAAA;OACrD,SAASV,GAAO,OAAOU,EAAK,MAAM,WAAW;OAC7C,YAAYtB,KAAY,CAACM;OACzB,eAAeA,KAAUgB,EAAK,IAAIhB,CAAM;MACzC,GAVMgB,EAAK,EAUX,CACF;KACU,GAfKH,CAeL,CACd;KACD,kBAACD,GAAD;MAAa,cAAW;MACtB,UAAA,kBAACG,GAAD;OACE,MAAK;OACL,YAAA;OACA,WAAWT,GAAO,aAAa,aAAa;OAC5C,cAAYA,GAAO,aAAa,gBAAgB;OAChD,OAAOA,GAAO,aAAa,gBAAgB;OAC3C,SAASA,GAAO,aAAa,WAAW;OACxC,YAAYZ,KAAY,CAACM;OACzB,SAASQ;MACV,CAAA;KACU,CAAA;KACZS;IACE;GACL,CAAA,GAAA,kBAAC,OAAD;IAAK,WAAU;IAAkB,aAAWC;IAC1C,UAAA,kBAACC,GAAD,EAAuB,UAAS,CAAA;GAC7B,CAAA,CACF;EACF,CAAA,CAAA;;AAET,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../components/Button/index.cjs"),t=require("../components/ButtonGroup/index.cjs");;/* empty css */let n=require("react"),r=require("react/jsx-runtime"),i=require("@tiptap/react"),a=require("@tiptap/extension-placeholder"),o=require("@tiptap/starter-kit"),s=require("@tiptap/extension-link");var c={type:`doc`,content:[{type:`paragraph`}]};function l(){return[o.StarterKit.configure({link:!1}),s.Link.configure({openOnClick:!1,autolink:!0})]}var u=(0,i.getSchema)(l());function d(e){return e.content?.length?e:{...e,content:c.content}}function f(e){try{if(!e||typeof e!=`object`||!(`type`in e)||e.type!==`doc`)throw Error();let t=e=>{let n=u.nodes[e.type??``];if(!n||Object.keys(e).some(e=>![`type`,`attrs`,`content`,`marks`,`text`].includes(e))||e.text!==void 0&&e.type!==`text`||e.attrs&&Object.keys(e.attrs).some(e=>!Object.hasOwn(n.spec.attrs??{},e)))throw Error();for(let t of e.marks??[]){let e=u.marks[t.type];if(!e||Object.keys(t).some(e=>![`type`,`attrs`].includes(e))||Object.keys(t.attrs??{}).some(t=>!Object.hasOwn(e.spec.attrs??{},t)))throw Error()}e.content?.forEach(t)},n=e;t(n),u.nodeFromJSON(d(n)).check()}catch{return`Unsupported or invalid rich-text document.`}}var p=[[{id:`bold`,icon:`bold`,label:`Bold`,run:e=>e.chain().focus().toggleBold().run(),active:e=>e.isActive(`bold`)},{id:`italic`,icon:`italic`,label:`Italic`,run:e=>e.chain().focus().toggleItalic().run(),active:e=>e.isActive(`italic`)},{id:`strike`,icon:`strikethrough`,label:`Strikethrough`,run:e=>e.chain().focus().toggleStrike().run(),active:e=>e.isActive(`strike`)},{id:`code`,icon:`code`,label:`Inline code`,run:e=>e.chain().focus().toggleCode().run(),active:e=>e.isActive(`code`)}],[{id:`h2`,icon:`heading-2`,label:`Heading`,run:e=>e.chain().focus().toggleHeading({level:2}).run(),active:e=>e.isActive(`heading`,{level:2})},{id:`h3`,icon:`heading-3`,label:`Subheading`,run:e=>e.chain().focus().toggleHeading({level:3}).run(),active:e=>e.isActive(`heading`,{level:3})},{id:`quote`,icon:`quote`,label:`Quote`,run:e=>e.chain().focus().toggleBlockquote().run(),active:e=>e.isActive(`blockquote`)}],[{id:`ul`,icon:`list`,label:`Bulleted list`,run:e=>e.chain().focus().toggleBulletList().run(),active:e=>e.isActive(`bulletList`)},{id:`ol`,icon:`list-ordered`,label:`Numbered list`,run:e=>e.chain().focus().toggleOrderedList().run(),active:e=>e.isActive(`orderedList`)}],[{id:`undo`,icon:`undo`,label:`Undo`,run:e=>e.chain().focus().undo().run()},{id:`redo`,icon:`redo`,label:`Redo`,run:e=>e.chain().focus().redo().run()}]],m=(0,n.forwardRef)(function(o,s){let{placeholder:u=`Write something…`,size:m=`md`,isDisabled:h=!1,isInvalid:g=!1,label:_=`Rich text editor`,className:v,toolbarExtra:y,id:b,isRequired:x,"aria-labelledby":S,"aria-describedby":C,"aria-invalid":w}=o,[T,E]=(0,n.useState)(!1),[D]=(0,n.useState)(()=>o.defaultValue??(o.format===`json`?c:``)),O=o.value===void 0?D:o.value,k=(0,n.useMemo)(()=>o.format===`json`?f(O):void 0,[o.format,O]),A=(0,n.useId)(),j=g||!!k||w,M=h||!!k,N=(0,n.useMemo)(()=>({role:`textbox`,"aria-label":_,"aria-multiline":`true`,...b?{id:b}:{},...S?{"aria-labelledby":S}:{},...C?{"aria-describedby":C}:{},...j?{"aria-invalid":String(j)}:{},...x?{"aria-required":`true`}:{}}),[_,b,S,C,j,x]),P=(0,i.useEditor)({immediatelyRender:!1,editable:!M,content:k?c:typeof O==`string`?O:d(O),extensions:[...l(),a.Placeholder.configure({placeholder:u})],editorProps:{attributes:N},onFocus:()=>E(!0),onBlur:()=>E(!1),onUpdate:({editor:e})=>{M||(o.format===`json`?o.onChange?.(e.getJSON()):o.onChange?.(e.getHTML()))}});(0,n.useEffect)(()=>{P&&(P.setEditable(!M,!1),P.setOptions({editorProps:{attributes:N}}))},[P,M,N]),(0,n.useEffect)(()=>{if(!P||o.value===void 0||k)return;let e=typeof o.value==`string`?(0,i.createDocument)(o.value,P.schema):P.schema.nodeFromJSON(d(o.value));e.eq(P.state.doc)||P.commands.setContent(e,{emitUpdate:!1})},[P,o.value,k]);let F=(0,i.useEditorState)({editor:P,selector:({editor:e})=>e?{active:Object.fromEntries(p.flat().map(t=>[t.id,t.active?.(e)??!1])),linkActive:e.isActive(`link`)}:null}),I=(0,n.useCallback)(()=>{if(!P)return;if(P.isActive(`link`)){P.chain().focus().unsetLink().run();return}let e=window.prompt(`Link to`);e&&P.chain().focus().extendMarkRange(`link`).setLink({href:e}).run()},[P]);return(0,r.jsxs)(`div`,{ref:s,className:[`ds-rte`,v].filter(Boolean).join(` `),"data-focused":T||void 0,"data-disabled":M||void 0,"aria-invalid":j||void 0,children:[k&&(0,r.jsx)(`p`,{id:A,role:`alert`,className:`ds-field__error`,children:k}),(0,r.jsxs)(`div`,{hidden:!!k,children:[(0,r.jsxs)(`div`,{className:`ds-rte__toolbar`,role:`toolbar`,"aria-label":`${_} formatting`,children:[p.map((n,i)=>(0,r.jsx)(t.ButtonGroup,{"aria-label":`Formatting ${i+1}`,children:n.map(t=>(0,r.jsx)(e.Button,{size:`sm`,isIconOnly:!0,iconStart:t.icon,"aria-label":t.label,title:t.label,"aria-pressed":t.active?F?.active[t.id]:void 0,variant:F?.active[t.id]?`active`:`neutral`,isDisabled:M||!P,onClick:()=>P&&t.run(P)},t.id))},i)),(0,r.jsx)(t.ButtonGroup,{"aria-label":`Link`,children:(0,r.jsx)(e.Button,{size:`sm`,isIconOnly:!0,iconStart:F?.linkActive?`link-off`:`link`,"aria-label":F?.linkActive?`Remove link`:`Add link`,title:F?.linkActive?`Remove link`:`Add link`,variant:F?.linkActive?`active`:`neutral`,isDisabled:M||!P,onClick:I})}),y]}),(0,r.jsx)(`div`,{className:`ds-rte__content`,"data-size":m,children:(0,r.jsx)(i.EditorContent,{editor:P})})]})]})});Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
|
|
2
|
-
//# sourceMappingURL=RichTextEditor-tFkISOvq.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextEditor-tFkISOvq.cjs","names":["StarterKit","Link","getSchema","forwardRef","useState","useMemo","useId","useEditor","Placeholder","createDocument","useEditorState","useCallback","ButtonGroup","Button","EditorContent","require_components_Button_index","require_components_ButtonGroup_index","react","react_jsx_runtime","_tiptap_react","_tiptap_extension_placeholder","_tiptap_starter_kit","_tiptap_extension_link","emptyDocument","richTextExtensions","schema","normalizeDocument","document","documentError","value","check","type","node","key","mark","markType","GROUPS","RichTextEditor","labelledBy","describedBy","ariaInvalid","props","isFocused","setIsFocused","initialValue","content","contentError","errorId","invalid","isInvalid","disabled","isDisabled","attributes","label","id","isRequired","editor","next","state","toggleLink","href","className","group","tool","toolbarExtra","size"],"sources":["../../src/components/RichTextEditor/document.ts","../../src/components/RichTextEditor/index.tsx"],"sourcesContent":["import { getSchema, type JSONContent } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport { Link } from \"@tiptap/extension-link\";\n\nexport type RichTextDocument = JSONContent & { type: \"doc\" };\n\nexport const emptyDocument: RichTextDocument = { type: \"doc\", content: [{ type: \"paragraph\" }] };\n\nexport function richTextExtensions() {\n return [StarterKit.configure({ link: false }), Link.configure({ openOnClick: false, autolink: true })];\n}\n\nconst schema = getSchema(richTextExtensions());\n\n/** ProseMirror represents an empty writing surface with one empty paragraph. */\nexport function normalizeDocument(document: RichTextDocument): RichTextDocument {\n return !document.content?.length ? { ...document, content: emptyDocument.content } : document;\n}\n\nexport function documentError(value: unknown): string | undefined {\n try {\n if (!value || typeof value !== \"object\" || !(\"type\" in value) || value.type !== \"doc\") throw new Error();\n const check = (node: JSONContent) => {\n const type = schema.nodes[node.type ?? \"\"];\n if (!type || Object.keys(node).some((key) => ![\"type\", \"attrs\", \"content\", \"marks\", \"text\"].includes(key)) ||\n (node.text !== undefined && node.type !== \"text\") ||\n (node.attrs && Object.keys(node.attrs).some((key) => !Object.hasOwn(type.spec.attrs ?? {}, key)))) {\n throw new Error();\n }\n for (const mark of node.marks ?? []) {\n const markType = schema.marks[mark.type];\n if (!markType || Object.keys(mark).some((key) => ![\"type\", \"attrs\"].includes(key)) ||\n Object.keys(mark.attrs ?? {}).some((key) => !Object.hasOwn(markType.spec.attrs ?? {}, key))) {\n throw new Error();\n }\n }\n node.content?.forEach(check);\n };\n const document = value as RichTextDocument;\n check(document);\n schema.nodeFromJSON(normalizeDocument(document)).check();\n } catch {\n return \"Unsupported or invalid rich-text document.\";\n }\n}\n","import { forwardRef, useCallback, useEffect, useId, useMemo, useState, type AriaAttributes, type ReactNode } from \"react\";\nimport { createDocument, EditorContent, useEditor, useEditorState, type Editor } from \"@tiptap/react\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { Button } from \"../Button\";\nimport { ButtonGroup } from \"../ButtonGroup\";\nimport type { IconName } from \"../Icon/icons\";\nimport { documentError, emptyDocument, normalizeDocument, richTextExtensions, type RichTextDocument } from \"./document\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport type RichTextEditorSize = \"sm\" | \"md\" | \"lg\";\n\nexport type { RichTextDocument } from \"./document\";\n\ninterface RichTextEditorCommonProps {\n placeholder?: string;\n size?: RichTextEditorSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Accessible name for the editing surface. */\n label?: string;\n className?: string;\n /** Extra controls appended to the toolbar, e.g. a word count. */\n toolbarExtra?: ReactNode;\n /** Applied to the editable surface. */\n id?: string;\n isRequired?: boolean;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: AriaAttributes[\"aria-invalid\"];\n}\n\nexport type RichTextEditorProps = RichTextEditorCommonProps & (\n | { format?: \"html\"; value?: string; defaultValue?: string; onChange?: (html: string) => void }\n | { format: \"json\"; value?: RichTextDocument; defaultValue?: RichTextDocument; onChange?: (document: RichTextDocument) => void }\n);\n\ninterface ToolItem {\n id: string;\n icon: IconName;\n label: string;\n run: (editor: Editor) => void;\n active?: (editor: Editor) => boolean;\n}\n\nconst GROUPS: ToolItem[][] = [\n [\n {\n id: \"bold\",\n icon: \"bold\",\n label: \"Bold\",\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive(\"bold\"),\n },\n {\n id: \"italic\",\n icon: \"italic\",\n label: \"Italic\",\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive(\"italic\"),\n },\n {\n id: \"strike\",\n icon: \"strikethrough\",\n label: \"Strikethrough\",\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive(\"strike\"),\n },\n {\n id: \"code\",\n icon: \"code\",\n label: \"Inline code\",\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive(\"code\"),\n },\n ],\n [\n {\n id: \"h2\",\n icon: \"heading-2\",\n label: \"Heading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n {\n id: \"h3\",\n icon: \"heading-3\",\n label: \"Subheading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n {\n id: \"quote\",\n icon: \"quote\",\n label: \"Quote\",\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive(\"blockquote\"),\n },\n ],\n [\n {\n id: \"ul\",\n icon: \"list\",\n label: \"Bulleted list\",\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive(\"bulletList\"),\n },\n {\n id: \"ol\",\n icon: \"list-ordered\",\n label: \"Numbered list\",\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive(\"orderedList\"),\n },\n ],\n [\n {\n id: \"undo\",\n icon: \"undo\",\n label: \"Undo\",\n run: (e) => e.chain().focus().undo().run(),\n },\n {\n id: \"redo\",\n icon: \"redo\",\n label: \"Redo\",\n run: (e) => e.chain().focus().redo().run(),\n },\n ],\n];\n\n/**\n * The editorial writing surface. Rich text plus links — the same field skin,\n * radius and states as `TextField`, with the toolbar inside the frame.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n props,\n ref,\n ) {\n const {\n placeholder = \"Write something…\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n label = \"Rich text editor\",\n className,\n toolbarExtra,\n id,\n isRequired,\n \"aria-labelledby\": labelledBy,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": ariaInvalid,\n } = props;\n const [isFocused, setIsFocused] = useState(false);\n const [initialValue] = useState(() => props.defaultValue ?? (props.format === \"json\" ? emptyDocument : \"\"));\n const content = props.value !== undefined ? props.value : initialValue;\n const contentError = useMemo(() => props.format === \"json\" ? documentError(content) : undefined, [props.format, content]);\n const errorId = useId();\n const invalid = isInvalid || !!contentError || ariaInvalid;\n const disabled = isDisabled || !!contentError;\n const attributes = useMemo(() => ({\n role: \"textbox\",\n \"aria-label\": label,\n \"aria-multiline\": \"true\",\n ...(id ? { id } : {}),\n ...(labelledBy ? { \"aria-labelledby\": labelledBy } : {}),\n ...(describedBy ? { \"aria-describedby\": describedBy } : {}),\n ...(invalid ? { \"aria-invalid\": String(invalid) } : {}),\n ...(isRequired ? { \"aria-required\": \"true\" } : {}),\n }), [label, id, labelledBy, describedBy, invalid, isRequired]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n content: contentError ? emptyDocument : typeof content === \"string\" ? content : normalizeDocument(content),\n extensions: [\n ...richTextExtensions(),\n Placeholder.configure({ placeholder }),\n ],\n editorProps: {\n attributes,\n },\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onUpdate: ({ editor: e }) => {\n if (disabled) return;\n if (props.format === \"json\") props.onChange?.(e.getJSON() as RichTextDocument);\n else props.onChange?.(e.getHTML());\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!disabled, false);\n editor.setOptions({ editorProps: { attributes } });\n }, [editor, disabled, attributes]);\n\n useEffect(() => {\n if (!editor || props.value === undefined || contentError) return;\n const next = typeof props.value === \"string\"\n ? createDocument(props.value, editor.schema)\n : editor.schema.nodeFromJSON(normalizeDocument(props.value));\n // Parent echoes should preserve the current selection and undo history.\n if (!next.eq(editor.state.doc)) editor.commands.setContent(next, { emitUpdate: false });\n }, [editor, props.value, contentError]);\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n e\n ? {\n active: Object.fromEntries(\n GROUPS.flat().map((t) => [t.id, t.active?.(e) ?? false]),\n ),\n linkActive: e.isActive(\"link\"),\n }\n : null,\n });\n\n const toggleLink = useCallback(() => {\n if (!editor) return;\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const href = window.prompt(\"Link to\");\n if (!href) return;\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n }, [editor]);\n\n return (\n <div\n ref={ref}\n className={[\"ds-rte\", className].filter(Boolean).join(\" \")}\n data-focused={isFocused || undefined}\n data-disabled={disabled || undefined}\n aria-invalid={invalid || undefined}\n >\n {contentError && <p id={errorId} role=\"alert\" className=\"ds-field__error\">{contentError}</p>}\n <div hidden={!!contentError}>\n <div className=\"ds-rte__toolbar\" role=\"toolbar\" aria-label={`${label} formatting`}>\n {GROUPS.map((group, i) => (\n <ButtonGroup key={i} aria-label={`Formatting ${i + 1}`}>\n {group.map((tool) => (\n <Button\n key={tool.id}\n size=\"sm\"\n isIconOnly\n iconStart={tool.icon}\n aria-label={tool.label}\n title={tool.label}\n aria-pressed={tool.active ? state?.active[tool.id] : undefined}\n variant={state?.active[tool.id] ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={() => editor && tool.run(editor)}\n />\n ))}\n </ButtonGroup>\n ))}\n <ButtonGroup aria-label=\"Link\">\n <Button\n size=\"sm\"\n isIconOnly\n iconStart={state?.linkActive ? \"link-off\" : \"link\"}\n aria-label={state?.linkActive ? \"Remove link\" : \"Add link\"}\n title={state?.linkActive ? \"Remove link\" : \"Add link\"}\n variant={state?.linkActive ? \"active\" : \"neutral\"}\n isDisabled={disabled || !editor}\n onClick={toggleLink}\n />\n </ButtonGroup>\n {toolbarExtra}\n </div>\n <div className=\"ds-rte__content\" data-size={size}>\n <EditorContent editor={editor} />\n </div>\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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"}
|