@andreagiugni/tailwind-dashboard-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +282 -0
- package/dist/Editor-uOYxR3HX.d.cts +53 -0
- package/dist/Editor-uOYxR3HX.d.ts +53 -0
- package/dist/chunk-4OETC46A.js +353 -0
- package/dist/chunk-4OETC46A.js.map +1 -0
- package/dist/chunk-7OWZKV75.js +420 -0
- package/dist/chunk-7OWZKV75.js.map +1 -0
- package/dist/chunk-BGA7AECV.cjs +152 -0
- package/dist/chunk-BGA7AECV.cjs.map +1 -0
- package/dist/chunk-HT7SQXRF.cjs +85 -0
- package/dist/chunk-HT7SQXRF.cjs.map +1 -0
- package/dist/chunk-HZQZC5CK.js +124 -0
- package/dist/chunk-HZQZC5CK.js.map +1 -0
- package/dist/chunk-MEU4PMP5.js +146 -0
- package/dist/chunk-MEU4PMP5.js.map +1 -0
- package/dist/chunk-MYOOZFHK.cjs +430 -0
- package/dist/chunk-MYOOZFHK.cjs.map +1 -0
- package/dist/chunk-OSIOO5AE.cjs +130 -0
- package/dist/chunk-OSIOO5AE.cjs.map +1 -0
- package/dist/chunk-R66LONPQ.js +83 -0
- package/dist/chunk-R66LONPQ.js.map +1 -0
- package/dist/chunk-W7SNEBD7.cjs +362 -0
- package/dist/chunk-W7SNEBD7.cjs.map +1 -0
- package/dist/chunk-YERNSNT4.cjs +13 -0
- package/dist/chunk-YERNSNT4.cjs.map +1 -0
- package/dist/chunk-ZLIYUUA4.js +11 -0
- package/dist/chunk-ZLIYUUA4.js.map +1 -0
- package/dist/components/Calendar/Calendar.cjs +14 -0
- package/dist/components/Calendar/Calendar.cjs.map +1 -0
- package/dist/components/Calendar/Calendar.d.cts +12 -0
- package/dist/components/Calendar/Calendar.d.ts +12 -0
- package/dist/components/Calendar/Calendar.js +5 -0
- package/dist/components/Calendar/Calendar.js.map +1 -0
- package/dist/components/Charts/BarChart.cjs +13 -0
- package/dist/components/Charts/BarChart.cjs.map +1 -0
- package/dist/components/Charts/BarChart.d.cts +13 -0
- package/dist/components/Charts/BarChart.d.ts +13 -0
- package/dist/components/Charts/BarChart.js +4 -0
- package/dist/components/Charts/BarChart.js.map +1 -0
- package/dist/components/Charts/LineChart.cjs +13 -0
- package/dist/components/Charts/LineChart.cjs.map +1 -0
- package/dist/components/Charts/LineChart.d.cts +13 -0
- package/dist/components/Charts/LineChart.d.ts +13 -0
- package/dist/components/Charts/LineChart.js +4 -0
- package/dist/components/Charts/LineChart.js.map +1 -0
- package/dist/components/Editor/Editor.cjs +14 -0
- package/dist/components/Editor/Editor.cjs.map +1 -0
- package/dist/components/Editor/Editor.d.cts +3 -0
- package/dist/components/Editor/Editor.d.ts +3 -0
- package/dist/components/Editor/Editor.js +5 -0
- package/dist/components/Editor/Editor.js.map +1 -0
- package/dist/components/Map/CountryMap.cjs +13 -0
- package/dist/components/Map/CountryMap.cjs.map +1 -0
- package/dist/components/Map/CountryMap.d.cts +13 -0
- package/dist/components/Map/CountryMap.d.ts +13 -0
- package/dist/components/Map/CountryMap.js +4 -0
- package/dist/components/Map/CountryMap.js.map +1 -0
- package/dist/index.cjs +2896 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +573 -0
- package/dist/index.d.ts +573 -0
- package/dist/index.js +2816 -0
- package/dist/index.js.map +1 -0
- package/package.json +134 -0
- package/src/theme.css +784 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from './chunk-ZLIYUUA4.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { useEditor, EditorContent } from '@tiptap/react';
|
|
5
|
+
import StarterKit from '@tiptap/starter-kit';
|
|
6
|
+
import Link from '@tiptap/extension-link';
|
|
7
|
+
import Placeholder from '@tiptap/extension-placeholder';
|
|
8
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var base = {
|
|
11
|
+
width: 18,
|
|
12
|
+
height: 18,
|
|
13
|
+
viewBox: "0 0 24 24",
|
|
14
|
+
fill: "none",
|
|
15
|
+
stroke: "currentColor",
|
|
16
|
+
strokeWidth: 2,
|
|
17
|
+
strokeLinecap: "round",
|
|
18
|
+
strokeLinejoin: "round",
|
|
19
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
20
|
+
};
|
|
21
|
+
var BoldIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
22
|
+
/* @__PURE__ */ jsx("path", { d: "M6 4h7a4 4 0 0 1 0 8H6z" }),
|
|
23
|
+
/* @__PURE__ */ jsx("path", { d: "M6 12h8a4 4 0 0 1 0 8H6z" })
|
|
24
|
+
] });
|
|
25
|
+
var ItalicIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
26
|
+
/* @__PURE__ */ jsx("line", { x1: "19", y1: "4", x2: "10", y2: "4" }),
|
|
27
|
+
/* @__PURE__ */ jsx("line", { x1: "14", y1: "20", x2: "5", y2: "20" }),
|
|
28
|
+
/* @__PURE__ */ jsx("line", { x1: "15", y1: "4", x2: "9", y2: "20" })
|
|
29
|
+
] });
|
|
30
|
+
var StrikeIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
31
|
+
/* @__PURE__ */ jsx("path", { d: "M16 4H9a3 3 0 0 0-2.83 4" }),
|
|
32
|
+
/* @__PURE__ */ jsx("path", { d: "M14 12a4 4 0 0 1 0 8H6" }),
|
|
33
|
+
/* @__PURE__ */ jsx("line", { x1: "4", y1: "12", x2: "20", y2: "12" })
|
|
34
|
+
] });
|
|
35
|
+
var CodeIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
36
|
+
/* @__PURE__ */ jsx("polyline", { points: "16 18 22 12 16 6" }),
|
|
37
|
+
/* @__PURE__ */ jsx("polyline", { points: "8 6 2 12 8 18" })
|
|
38
|
+
] });
|
|
39
|
+
var Heading1Icon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
40
|
+
/* @__PURE__ */ jsx("path", { d: "M4 12h8" }),
|
|
41
|
+
/* @__PURE__ */ jsx("path", { d: "M4 18V6" }),
|
|
42
|
+
/* @__PURE__ */ jsx("path", { d: "M12 18V6" }),
|
|
43
|
+
/* @__PURE__ */ jsx("path", { d: "M17 12l3-2v8" })
|
|
44
|
+
] });
|
|
45
|
+
var Heading2Icon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
46
|
+
/* @__PURE__ */ jsx("path", { d: "M4 12h8" }),
|
|
47
|
+
/* @__PURE__ */ jsx("path", { d: "M4 18V6" }),
|
|
48
|
+
/* @__PURE__ */ jsx("path", { d: "M12 18V6" }),
|
|
49
|
+
/* @__PURE__ */ jsx("path", { d: "M17 10c2 0 3 1 3 2.5S18 15 17 16l-2 2h5" })
|
|
50
|
+
] });
|
|
51
|
+
var Heading3Icon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
52
|
+
/* @__PURE__ */ jsx("path", { d: "M4 12h8" }),
|
|
53
|
+
/* @__PURE__ */ jsx("path", { d: "M4 18V6" }),
|
|
54
|
+
/* @__PURE__ */ jsx("path", { d: "M12 18V6" }),
|
|
55
|
+
/* @__PURE__ */ jsx("path", { d: "M17 10c2.5-1 3.5 1 2.5 2c1 1 0.5 4-2.5 3" })
|
|
56
|
+
] });
|
|
57
|
+
var BulletListIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
58
|
+
/* @__PURE__ */ jsx("line", { x1: "9", y1: "6", x2: "20", y2: "6" }),
|
|
59
|
+
/* @__PURE__ */ jsx("line", { x1: "9", y1: "12", x2: "20", y2: "12" }),
|
|
60
|
+
/* @__PURE__ */ jsx("line", { x1: "9", y1: "18", x2: "20", y2: "18" }),
|
|
61
|
+
/* @__PURE__ */ jsx("circle", { cx: "4", cy: "6", r: "1" }),
|
|
62
|
+
/* @__PURE__ */ jsx("circle", { cx: "4", cy: "12", r: "1" }),
|
|
63
|
+
/* @__PURE__ */ jsx("circle", { cx: "4", cy: "18", r: "1" })
|
|
64
|
+
] });
|
|
65
|
+
var OrderedListIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
66
|
+
/* @__PURE__ */ jsx("line", { x1: "10", y1: "6", x2: "20", y2: "6" }),
|
|
67
|
+
/* @__PURE__ */ jsx("line", { x1: "10", y1: "12", x2: "20", y2: "12" }),
|
|
68
|
+
/* @__PURE__ */ jsx("line", { x1: "10", y1: "18", x2: "20", y2: "18" }),
|
|
69
|
+
/* @__PURE__ */ jsx("path", { d: "M4 6V3.5L3 4" }),
|
|
70
|
+
/* @__PURE__ */ jsx("path", { d: "M3 12h2l-2 3h2" }),
|
|
71
|
+
/* @__PURE__ */ jsx("path", { d: "M3 17h2v3H3" })
|
|
72
|
+
] });
|
|
73
|
+
var BlockquoteIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
74
|
+
/* @__PURE__ */ jsx("path", { d: "M3 21c3 0 7-1 7-8V5H3v7h4" }),
|
|
75
|
+
/* @__PURE__ */ jsx("path", { d: "M14 21c3 0 7-1 7-8V5h-7v7h4" })
|
|
76
|
+
] });
|
|
77
|
+
var CodeBlockIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
78
|
+
/* @__PURE__ */ jsx("rect", { x: "3", y: "4", width: "18", height: "16", rx: "2" }),
|
|
79
|
+
/* @__PURE__ */ jsx("polyline", { points: "9 9 7 12 9 15" }),
|
|
80
|
+
/* @__PURE__ */ jsx("polyline", { points: "15 9 17 12 15 15" })
|
|
81
|
+
] });
|
|
82
|
+
var LinkIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
83
|
+
/* @__PURE__ */ jsx("path", { d: "M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1" }),
|
|
84
|
+
/* @__PURE__ */ jsx("path", { d: "M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1" })
|
|
85
|
+
] });
|
|
86
|
+
var UndoIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
87
|
+
/* @__PURE__ */ jsx("path", { d: "M3 7v6h6" }),
|
|
88
|
+
/* @__PURE__ */ jsx("path", { d: "M3 13a9 9 0 1 0 3-7.7L3 8" })
|
|
89
|
+
] });
|
|
90
|
+
var RedoIcon = () => /* @__PURE__ */ jsxs("svg", { ...base, children: [
|
|
91
|
+
/* @__PURE__ */ jsx("path", { d: "M21 7v6h-6" }),
|
|
92
|
+
/* @__PURE__ */ jsx("path", { d: "M21 13a9 9 0 1 1-3-7.7L21 8" })
|
|
93
|
+
] });
|
|
94
|
+
var DEFAULT_TOOLBAR = [
|
|
95
|
+
"bold",
|
|
96
|
+
"italic",
|
|
97
|
+
"strike",
|
|
98
|
+
"code",
|
|
99
|
+
"divider",
|
|
100
|
+
"heading1",
|
|
101
|
+
"heading2",
|
|
102
|
+
"heading3",
|
|
103
|
+
"divider",
|
|
104
|
+
"bulletList",
|
|
105
|
+
"orderedList",
|
|
106
|
+
"blockquote",
|
|
107
|
+
"codeBlock",
|
|
108
|
+
"divider",
|
|
109
|
+
"link",
|
|
110
|
+
"divider",
|
|
111
|
+
"undo",
|
|
112
|
+
"redo"
|
|
113
|
+
];
|
|
114
|
+
var BUILTINS = {
|
|
115
|
+
bold: {
|
|
116
|
+
icon: /* @__PURE__ */ jsx(BoldIcon, {}),
|
|
117
|
+
title: "Bold",
|
|
118
|
+
onClick: (e) => e.chain().focus().toggleBold().run(),
|
|
119
|
+
isActive: (e) => e.isActive("bold")
|
|
120
|
+
},
|
|
121
|
+
italic: {
|
|
122
|
+
icon: /* @__PURE__ */ jsx(ItalicIcon, {}),
|
|
123
|
+
title: "Italic",
|
|
124
|
+
onClick: (e) => e.chain().focus().toggleItalic().run(),
|
|
125
|
+
isActive: (e) => e.isActive("italic")
|
|
126
|
+
},
|
|
127
|
+
strike: {
|
|
128
|
+
icon: /* @__PURE__ */ jsx(StrikeIcon, {}),
|
|
129
|
+
title: "Strikethrough",
|
|
130
|
+
onClick: (e) => e.chain().focus().toggleStrike().run(),
|
|
131
|
+
isActive: (e) => e.isActive("strike")
|
|
132
|
+
},
|
|
133
|
+
code: {
|
|
134
|
+
icon: /* @__PURE__ */ jsx(CodeIcon, {}),
|
|
135
|
+
title: "Inline code",
|
|
136
|
+
onClick: (e) => e.chain().focus().toggleCode().run(),
|
|
137
|
+
isActive: (e) => e.isActive("code")
|
|
138
|
+
},
|
|
139
|
+
heading1: {
|
|
140
|
+
icon: /* @__PURE__ */ jsx(Heading1Icon, {}),
|
|
141
|
+
title: "Heading 1",
|
|
142
|
+
onClick: (e) => e.chain().focus().toggleHeading({ level: 1 }).run(),
|
|
143
|
+
isActive: (e) => e.isActive("heading", { level: 1 })
|
|
144
|
+
},
|
|
145
|
+
heading2: {
|
|
146
|
+
icon: /* @__PURE__ */ jsx(Heading2Icon, {}),
|
|
147
|
+
title: "Heading 2",
|
|
148
|
+
onClick: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
149
|
+
isActive: (e) => e.isActive("heading", { level: 2 })
|
|
150
|
+
},
|
|
151
|
+
heading3: {
|
|
152
|
+
icon: /* @__PURE__ */ jsx(Heading3Icon, {}),
|
|
153
|
+
title: "Heading 3",
|
|
154
|
+
onClick: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
155
|
+
isActive: (e) => e.isActive("heading", { level: 3 })
|
|
156
|
+
},
|
|
157
|
+
bulletList: {
|
|
158
|
+
icon: /* @__PURE__ */ jsx(BulletListIcon, {}),
|
|
159
|
+
title: "Bullet list",
|
|
160
|
+
onClick: (e) => e.chain().focus().toggleBulletList().run(),
|
|
161
|
+
isActive: (e) => e.isActive("bulletList")
|
|
162
|
+
},
|
|
163
|
+
orderedList: {
|
|
164
|
+
icon: /* @__PURE__ */ jsx(OrderedListIcon, {}),
|
|
165
|
+
title: "Ordered list",
|
|
166
|
+
onClick: (e) => e.chain().focus().toggleOrderedList().run(),
|
|
167
|
+
isActive: (e) => e.isActive("orderedList")
|
|
168
|
+
},
|
|
169
|
+
blockquote: {
|
|
170
|
+
icon: /* @__PURE__ */ jsx(BlockquoteIcon, {}),
|
|
171
|
+
title: "Blockquote",
|
|
172
|
+
onClick: (e) => e.chain().focus().toggleBlockquote().run(),
|
|
173
|
+
isActive: (e) => e.isActive("blockquote")
|
|
174
|
+
},
|
|
175
|
+
codeBlock: {
|
|
176
|
+
icon: /* @__PURE__ */ jsx(CodeBlockIcon, {}),
|
|
177
|
+
title: "Code block",
|
|
178
|
+
onClick: (e) => e.chain().focus().toggleCodeBlock().run(),
|
|
179
|
+
isActive: (e) => e.isActive("codeBlock")
|
|
180
|
+
},
|
|
181
|
+
link: {
|
|
182
|
+
icon: /* @__PURE__ */ jsx(LinkIcon, {}),
|
|
183
|
+
title: "Link",
|
|
184
|
+
// Minimal UX: window.prompt for the URL (no extra UI deps). Empty input
|
|
185
|
+
// clears any existing link on the selection.
|
|
186
|
+
onClick: (e) => {
|
|
187
|
+
const prev = e.getAttributes("link").href ?? "";
|
|
188
|
+
const url = typeof window !== "undefined" ? window.prompt("Enter URL", prev) : null;
|
|
189
|
+
if (url === null) return;
|
|
190
|
+
if (url === "") {
|
|
191
|
+
e.chain().focus().extendMarkRange("link").unsetLink().run();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
e.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
|
|
195
|
+
},
|
|
196
|
+
isActive: (e) => e.isActive("link")
|
|
197
|
+
},
|
|
198
|
+
undo: {
|
|
199
|
+
icon: /* @__PURE__ */ jsx(UndoIcon, {}),
|
|
200
|
+
title: "Undo",
|
|
201
|
+
onClick: (e) => e.chain().focus().undo().run(),
|
|
202
|
+
isDisabled: (e) => !e.can().undo()
|
|
203
|
+
},
|
|
204
|
+
redo: {
|
|
205
|
+
icon: /* @__PURE__ */ jsx(RedoIcon, {}),
|
|
206
|
+
title: "Redo",
|
|
207
|
+
onClick: (e) => e.chain().focus().redo().run(),
|
|
208
|
+
isDisabled: (e) => !e.can().redo()
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
var toolButtonClass = (active) => cn(
|
|
212
|
+
"inline-flex h-8 w-8 items-center justify-center rounded-lg text-gray-600 transition",
|
|
213
|
+
"hover:bg-gray-100 hover:text-gray-800 disabled:cursor-not-allowed disabled:opacity-40",
|
|
214
|
+
"dark:text-gray-400 dark:hover:bg-white/[0.06] dark:hover:text-gray-200",
|
|
215
|
+
active && "bg-brand-50 text-brand-600 hover:bg-brand-50 hover:text-brand-600 dark:bg-brand-500/15 dark:text-brand-400 dark:hover:bg-brand-500/15 dark:hover:text-brand-400"
|
|
216
|
+
);
|
|
217
|
+
var Divider = () => /* @__PURE__ */ jsx(
|
|
218
|
+
"span",
|
|
219
|
+
{
|
|
220
|
+
"aria-hidden": true,
|
|
221
|
+
className: "mx-1 h-5 w-px self-center bg-gray-200 dark:bg-gray-700"
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
var Editor = ({
|
|
225
|
+
content,
|
|
226
|
+
onChange,
|
|
227
|
+
placeholder = "Start writing\u2026",
|
|
228
|
+
editable = true,
|
|
229
|
+
toolbar = DEFAULT_TOOLBAR,
|
|
230
|
+
className,
|
|
231
|
+
editorClassName
|
|
232
|
+
}) => {
|
|
233
|
+
const editor = useEditor({
|
|
234
|
+
extensions: [
|
|
235
|
+
StarterKit,
|
|
236
|
+
Link.configure({ openOnClick: false }),
|
|
237
|
+
Placeholder.configure({ placeholder })
|
|
238
|
+
],
|
|
239
|
+
content,
|
|
240
|
+
editable,
|
|
241
|
+
immediatelyRender: false,
|
|
242
|
+
editorProps: {
|
|
243
|
+
attributes: {
|
|
244
|
+
class: "focus:outline-none"
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
onUpdate: ({ editor: editor2 }) => onChange?.(editor2.getHTML())
|
|
248
|
+
});
|
|
249
|
+
React.useEffect(() => {
|
|
250
|
+
editor?.setEditable(editable);
|
|
251
|
+
}, [editor, editable]);
|
|
252
|
+
if (!editor) {
|
|
253
|
+
return /* @__PURE__ */ jsxs(
|
|
254
|
+
"div",
|
|
255
|
+
{
|
|
256
|
+
className: cn(
|
|
257
|
+
"w-full overflow-hidden rounded-xl border border-gray-200 dark:border-gray-800",
|
|
258
|
+
className
|
|
259
|
+
),
|
|
260
|
+
children: [
|
|
261
|
+
editable && /* @__PURE__ */ jsx("div", { className: "h-12 border-b border-gray-200 bg-gray-50 dark:border-gray-800 dark:bg-white/[0.02]" }),
|
|
262
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-[200px] animate-pulse bg-gray-50/50 dark:bg-white/[0.01]" })
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
const renderToolbar = () => {
|
|
268
|
+
let dividerKey = 0;
|
|
269
|
+
return toolbar.map((item, index) => {
|
|
270
|
+
if (typeof item === "object") {
|
|
271
|
+
const active2 = item.isActive?.(editor) ?? false;
|
|
272
|
+
return /* @__PURE__ */ jsx(
|
|
273
|
+
"button",
|
|
274
|
+
{
|
|
275
|
+
type: "button",
|
|
276
|
+
title: item.title,
|
|
277
|
+
"aria-label": item.title,
|
|
278
|
+
"aria-pressed": active2,
|
|
279
|
+
onClick: () => item.onClick(editor),
|
|
280
|
+
className: toolButtonClass(active2),
|
|
281
|
+
children: item.icon
|
|
282
|
+
},
|
|
283
|
+
item.id || `custom-${index}`
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
if (item === "divider") {
|
|
287
|
+
return /* @__PURE__ */ jsx(Divider, {}, `divider-${dividerKey++}`);
|
|
288
|
+
}
|
|
289
|
+
const def = BUILTINS[item];
|
|
290
|
+
if (!def) return null;
|
|
291
|
+
const active = def.isActive?.(editor) ?? false;
|
|
292
|
+
const disabled = def.isDisabled?.(editor) ?? false;
|
|
293
|
+
return /* @__PURE__ */ jsx(
|
|
294
|
+
"button",
|
|
295
|
+
{
|
|
296
|
+
type: "button",
|
|
297
|
+
title: def.title,
|
|
298
|
+
"aria-label": def.title,
|
|
299
|
+
"aria-pressed": active,
|
|
300
|
+
disabled,
|
|
301
|
+
onClick: () => def.onClick(editor),
|
|
302
|
+
className: toolButtonClass(active),
|
|
303
|
+
children: def.icon
|
|
304
|
+
},
|
|
305
|
+
item
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
};
|
|
309
|
+
return /* @__PURE__ */ jsxs(
|
|
310
|
+
"div",
|
|
311
|
+
{
|
|
312
|
+
className: cn(
|
|
313
|
+
"w-full overflow-hidden rounded-xl border border-gray-200 bg-white shadow-theme-xs dark:border-gray-800 dark:bg-white/[0.02]",
|
|
314
|
+
className
|
|
315
|
+
),
|
|
316
|
+
children: [
|
|
317
|
+
editable && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-0.5 border-b border-gray-200 bg-gray-50 px-2 py-1.5 dark:border-gray-800 dark:bg-white/[0.02]", children: renderToolbar() }),
|
|
318
|
+
/* @__PURE__ */ jsx(
|
|
319
|
+
EditorContent,
|
|
320
|
+
{
|
|
321
|
+
editor,
|
|
322
|
+
className: cn(
|
|
323
|
+
"min-h-[200px] px-4 py-3 text-sm text-gray-700 dark:text-gray-300",
|
|
324
|
+
"rounded-b-xl",
|
|
325
|
+
// Explicit element styling (no @tailwindcss/typography assumed).
|
|
326
|
+
"[&_.ProseMirror]:min-h-[180px] [&_.ProseMirror]:outline-none",
|
|
327
|
+
"[&_h1]:mb-3 [&_h1]:mt-4 [&_h1]:text-2xl [&_h1]:font-semibold [&_h1]:text-gray-900 dark:[&_h1]:text-white/90",
|
|
328
|
+
"[&_h2]:mb-2 [&_h2]:mt-4 [&_h2]:text-xl [&_h2]:font-semibold [&_h2]:text-gray-900 dark:[&_h2]:text-white/90",
|
|
329
|
+
"[&_h3]:mb-2 [&_h3]:mt-3 [&_h3]:text-lg [&_h3]:font-semibold [&_h3]:text-gray-900 dark:[&_h3]:text-white/90",
|
|
330
|
+
"[&_p]:my-2 [&_p]:leading-relaxed",
|
|
331
|
+
"[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6",
|
|
332
|
+
"[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6",
|
|
333
|
+
"[&_li]:my-1 [&_li>p]:my-0",
|
|
334
|
+
"[&_a]:text-brand-500 [&_a]:underline hover:[&_a]:text-brand-600 dark:[&_a]:text-brand-400",
|
|
335
|
+
"[&_blockquote]:my-3 [&_blockquote]:border-l-4 [&_blockquote]:border-gray-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:text-gray-600 dark:[&_blockquote]:border-gray-700 dark:[&_blockquote]:text-gray-400",
|
|
336
|
+
"[&_code]:rounded [&_code]:bg-gray-100 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.85em] [&_code]:text-brand-600 dark:[&_code]:bg-white/[0.06] dark:[&_code]:text-brand-400",
|
|
337
|
+
"[&_pre]:my-3 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-gray-900 [&_pre]:p-4 [&_pre]:font-mono [&_pre]:text-sm [&_pre]:text-gray-100 dark:[&_pre]:bg-black/40",
|
|
338
|
+
"[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:text-inherit",
|
|
339
|
+
"[&_hr]:my-4 [&_hr]:border-gray-200 dark:[&_hr]:border-gray-800",
|
|
340
|
+
// Placeholder styling for the empty-document first node.
|
|
341
|
+
"[&_.is-editor-empty:first-child::before]:pointer-events-none [&_.is-editor-empty:first-child::before]:float-left [&_.is-editor-empty:first-child::before]:h-0 [&_.is-editor-empty:first-child::before]:text-gray-400 [&_.is-editor-empty:first-child::before]:content-[attr(data-placeholder)] dark:[&_.is-editor-empty:first-child::before]:text-gray-600",
|
|
342
|
+
editorClassName
|
|
343
|
+
)
|
|
344
|
+
}
|
|
345
|
+
)
|
|
346
|
+
]
|
|
347
|
+
}
|
|
348
|
+
);
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
export { Editor };
|
|
352
|
+
//# sourceMappingURL=chunk-4OETC46A.js.map
|
|
353
|
+
//# sourceMappingURL=chunk-4OETC46A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Editor/icons.tsx","../src/components/Editor/Editor.tsx"],"names":["jsx","editor","jsxs","active"],"mappings":"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","file":"chunk-4OETC46A.js","sourcesContent":["import React from \"react\";\n\n/**\n * Small inline stroke icons (16–18px) for the editor toolbar.\n * They inherit color via `stroke=\"currentColor\"` so the active/inactive\n * button states drive their appearance.\n */\n\nconst base = {\n width: 18,\n height: 18,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n xmlns: \"http://www.w3.org/2000/svg\",\n};\n\nexport const BoldIcon: React.FC = () => (\n <svg {...base}>\n <path d=\"M6 4h7a4 4 0 0 1 0 8H6z\" />\n <path d=\"M6 12h8a4 4 0 0 1 0 8H6z\" />\n </svg>\n);\n\nexport const ItalicIcon: React.FC = () => (\n <svg {...base}>\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n </svg>\n);\n\nexport const StrikeIcon: React.FC = () => (\n <svg {...base}>\n <path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n <path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n);\n\nexport const CodeIcon: React.FC = () => (\n <svg {...base}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n);\n\nexport const Heading1Icon: React.FC = () => (\n <svg {...base}>\n <path d=\"M4 12h8\" />\n <path d=\"M4 18V6\" />\n <path d=\"M12 18V6\" />\n <path d=\"M17 12l3-2v8\" />\n </svg>\n);\n\nexport const Heading2Icon: React.FC = () => (\n <svg {...base}>\n <path d=\"M4 12h8\" />\n <path d=\"M4 18V6\" />\n <path d=\"M12 18V6\" />\n <path d=\"M17 10c2 0 3 1 3 2.5S18 15 17 16l-2 2h5\" />\n </svg>\n);\n\nexport const Heading3Icon: React.FC = () => (\n <svg {...base}>\n <path d=\"M4 12h8\" />\n <path d=\"M4 18V6\" />\n <path d=\"M12 18V6\" />\n <path d=\"M17 10c2.5-1 3.5 1 2.5 2c1 1 0.5 4-2.5 3\" />\n </svg>\n);\n\nexport const BulletListIcon: React.FC = () => (\n <svg {...base}>\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"1\" />\n <circle cx=\"4\" cy=\"12\" r=\"1\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" />\n </svg>\n);\n\nexport const OrderedListIcon: React.FC = () => (\n <svg {...base}>\n <line x1=\"10\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"10\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"20\" y2=\"18\" />\n <path d=\"M4 6V3.5L3 4\" />\n <path d=\"M3 12h2l-2 3h2\" />\n <path d=\"M3 17h2v3H3\" />\n </svg>\n);\n\nexport const BlockquoteIcon: React.FC = () => (\n <svg {...base}>\n <path d=\"M3 21c3 0 7-1 7-8V5H3v7h4\" />\n <path d=\"M14 21c3 0 7-1 7-8V5h-7v7h4\" />\n </svg>\n);\n\nexport const CodeBlockIcon: React.FC = () => (\n <svg {...base}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <polyline points=\"9 9 7 12 9 15\" />\n <polyline points=\"15 9 17 12 15 15\" />\n </svg>\n);\n\nexport const LinkIcon: React.FC = () => (\n <svg {...base}>\n <path d=\"M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1\" />\n <path d=\"M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1\" />\n </svg>\n);\n\nexport const UndoIcon: React.FC = () => (\n <svg {...base}>\n <path d=\"M3 7v6h6\" />\n <path d=\"M3 13a9 9 0 1 0 3-7.7L3 8\" />\n </svg>\n);\n\nexport const RedoIcon: React.FC = () => (\n <svg {...base}>\n <path d=\"M21 7v6h-6\" />\n <path d=\"M21 13a9 9 0 1 1-3-7.7L21 8\" />\n </svg>\n);\n","\"use client\";\nimport React from \"react\";\nimport { useEditor, EditorContent, type Editor as TiptapEditor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { cn } from \"../../lib/cn\";\nimport { type ColorOverrideProps } from \"../../lib/styleOverride\";\nimport {\n BoldIcon,\n ItalicIcon,\n StrikeIcon,\n CodeIcon,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n BulletListIcon,\n OrderedListIcon,\n BlockquoteIcon,\n CodeBlockIcon,\n LinkIcon,\n UndoIcon,\n RedoIcon,\n} from \"./icons\";\n\n/** Built-in toolbar tool ids. */\nexport type ToolbarItemId =\n | \"bold\"\n | \"italic\"\n | \"strike\"\n | \"code\"\n | \"heading1\"\n | \"heading2\"\n | \"heading3\"\n | \"bulletList\"\n | \"orderedList\"\n | \"blockquote\"\n | \"codeBlock\"\n | \"link\"\n | \"undo\"\n | \"redo\"\n | \"divider\";\n\n/** A fully custom toolbar button. */\nexport interface CustomToolbarItem {\n id: string;\n icon: React.ReactNode;\n title: string;\n onClick: (editor: TiptapEditor) => void;\n isActive?: (editor: TiptapEditor) => boolean;\n}\n\n/** A toolbar entry: either a built-in id or a custom button object. */\nexport type EditorToolItem = ToolbarItemId | CustomToolbarItem;\n\n/** @deprecated Alias kept for naming flexibility. Use `EditorToolItem`. */\nexport type ToolbarItem = EditorToolItem;\n\nexport interface EditorProps extends ColorOverrideProps {\n /** Initial HTML content. */\n content?: string;\n /** Fires with the current HTML whenever the document changes. */\n onChange?: (html: string) => void;\n /** Placeholder shown when the document is empty. */\n placeholder?: string;\n /** When false the editor is read-only and the toolbar is hidden. */\n editable?: boolean;\n /** Ordered toolbar configuration. Defaults to a sensible full set. */\n toolbar?: EditorToolItem[];\n /** Wrapper class. */\n className?: string;\n /** Class for the prose content area. */\n editorClassName?: string;\n}\n\nconst DEFAULT_TOOLBAR: EditorToolItem[] = [\n \"bold\",\n \"italic\",\n \"strike\",\n \"code\",\n \"divider\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"divider\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"codeBlock\",\n \"divider\",\n \"link\",\n \"divider\",\n \"undo\",\n \"redo\",\n];\n\ninterface BuiltInDef {\n icon: React.ReactNode;\n title: string;\n onClick: (editor: TiptapEditor) => void;\n isActive?: (editor: TiptapEditor) => boolean;\n /** Disable callback (used for undo/redo). */\n isDisabled?: (editor: TiptapEditor) => boolean;\n}\n\nconst BUILTINS: Record<Exclude<ToolbarItemId, \"divider\">, BuiltInDef> = {\n bold: {\n icon: <BoldIcon />,\n title: \"Bold\",\n onClick: (e) => e.chain().focus().toggleBold().run(),\n isActive: (e) => e.isActive(\"bold\"),\n },\n italic: {\n icon: <ItalicIcon />,\n title: \"Italic\",\n onClick: (e) => e.chain().focus().toggleItalic().run(),\n isActive: (e) => e.isActive(\"italic\"),\n },\n strike: {\n icon: <StrikeIcon />,\n title: \"Strikethrough\",\n onClick: (e) => e.chain().focus().toggleStrike().run(),\n isActive: (e) => e.isActive(\"strike\"),\n },\n code: {\n icon: <CodeIcon />,\n title: \"Inline code\",\n onClick: (e) => e.chain().focus().toggleCode().run(),\n isActive: (e) => e.isActive(\"code\"),\n },\n heading1: {\n icon: <Heading1Icon />,\n title: \"Heading 1\",\n onClick: (e) => e.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: (e) => e.isActive(\"heading\", { level: 1 }),\n },\n heading2: {\n icon: <Heading2Icon />,\n title: \"Heading 2\",\n onClick: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n heading3: {\n icon: <Heading3Icon />,\n title: \"Heading 3\",\n onClick: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n bulletList: {\n icon: <BulletListIcon />,\n title: \"Bullet list\",\n onClick: (e) => e.chain().focus().toggleBulletList().run(),\n isActive: (e) => e.isActive(\"bulletList\"),\n },\n orderedList: {\n icon: <OrderedListIcon />,\n title: \"Ordered list\",\n onClick: (e) => e.chain().focus().toggleOrderedList().run(),\n isActive: (e) => e.isActive(\"orderedList\"),\n },\n blockquote: {\n icon: <BlockquoteIcon />,\n title: \"Blockquote\",\n onClick: (e) => e.chain().focus().toggleBlockquote().run(),\n isActive: (e) => e.isActive(\"blockquote\"),\n },\n codeBlock: {\n icon: <CodeBlockIcon />,\n title: \"Code block\",\n onClick: (e) => e.chain().focus().toggleCodeBlock().run(),\n isActive: (e) => e.isActive(\"codeBlock\"),\n },\n link: {\n icon: <LinkIcon />,\n title: \"Link\",\n // Minimal UX: window.prompt for the URL (no extra UI deps). Empty input\n // clears any existing link on the selection.\n onClick: (e) => {\n const prev = (e.getAttributes(\"link\") as { href?: string }).href ?? \"\";\n const url =\n typeof window !== \"undefined\"\n ? window.prompt(\"Enter URL\", prev)\n : null;\n if (url === null) return; // cancelled\n if (url === \"\") {\n e.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n return;\n }\n e.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run();\n },\n isActive: (e) => e.isActive(\"link\"),\n },\n undo: {\n icon: <UndoIcon />,\n title: \"Undo\",\n onClick: (e) => e.chain().focus().undo().run(),\n isDisabled: (e) => !e.can().undo(),\n },\n redo: {\n icon: <RedoIcon />,\n title: \"Redo\",\n onClick: (e) => e.chain().focus().redo().run(),\n isDisabled: (e) => !e.can().redo(),\n },\n};\n\nconst toolButtonClass = (active: boolean) =>\n cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-lg text-gray-600 transition\",\n \"hover:bg-gray-100 hover:text-gray-800 disabled:cursor-not-allowed disabled:opacity-40\",\n \"dark:text-gray-400 dark:hover:bg-white/[0.06] dark:hover:text-gray-200\",\n active &&\n \"bg-brand-50 text-brand-600 hover:bg-brand-50 hover:text-brand-600 dark:bg-brand-500/15 dark:text-brand-400 dark:hover:bg-brand-500/15 dark:hover:text-brand-400\"\n );\n\nconst Divider: React.FC = () => (\n <span\n aria-hidden\n className=\"mx-1 h-5 w-px self-center bg-gray-200 dark:bg-gray-700\"\n />\n);\n\n/**\n * Tiptap-powered WYSIWYG editor.\n *\n * Heavy, optional peer-dependency component (`@tiptap/*`). It is a client\n * component and touches the DOM at import time, so in SSR frameworks render it\n * client-only (e.g. next/dynamic with `ssr:false`), like the charts.\n */\nexport const Editor: React.FC<EditorProps> = ({\n content,\n onChange,\n placeholder = \"Start writing…\",\n editable = true,\n toolbar = DEFAULT_TOOLBAR,\n className,\n editorClassName,\n}) => {\n const editor = useEditor({\n extensions: [\n StarterKit,\n Link.configure({ openOnClick: false }),\n Placeholder.configure({ placeholder }),\n ],\n content,\n editable,\n immediatelyRender: false,\n editorProps: {\n attributes: {\n class: \"focus:outline-none\",\n },\n },\n onUpdate: ({ editor }) => onChange?.(editor.getHTML()),\n });\n\n // Keep editability in sync if the prop changes after mount.\n React.useEffect(() => {\n editor?.setEditable(editable);\n }, [editor, editable]);\n\n // Not yet mounted (SSR / first paint): render a skeleton placeholder.\n if (!editor) {\n return (\n <div\n className={cn(\n \"w-full overflow-hidden rounded-xl border border-gray-200 dark:border-gray-800\",\n className\n )}\n >\n {editable && (\n <div className=\"h-12 border-b border-gray-200 bg-gray-50 dark:border-gray-800 dark:bg-white/[0.02]\" />\n )}\n <div className=\"min-h-[200px] animate-pulse bg-gray-50/50 dark:bg-white/[0.01]\" />\n </div>\n );\n }\n\n const renderToolbar = () => {\n let dividerKey = 0;\n return toolbar.map((item, index) => {\n // Custom button object.\n if (typeof item === \"object\") {\n const active = item.isActive?.(editor) ?? false;\n return (\n <button\n key={item.id || `custom-${index}`}\n type=\"button\"\n title={item.title}\n aria-label={item.title}\n aria-pressed={active}\n onClick={() => item.onClick(editor)}\n className={toolButtonClass(active)}\n >\n {item.icon}\n </button>\n );\n }\n\n if (item === \"divider\") {\n return <Divider key={`divider-${dividerKey++}`} />;\n }\n\n const def = BUILTINS[item];\n if (!def) return null;\n const active = def.isActive?.(editor) ?? false;\n const disabled = def.isDisabled?.(editor) ?? false;\n return (\n <button\n key={item}\n type=\"button\"\n title={def.title}\n aria-label={def.title}\n aria-pressed={active}\n disabled={disabled}\n onClick={() => def.onClick(editor)}\n className={toolButtonClass(active)}\n >\n {def.icon}\n </button>\n );\n });\n };\n\n return (\n <div\n className={cn(\n \"w-full overflow-hidden rounded-xl border border-gray-200 bg-white shadow-theme-xs dark:border-gray-800 dark:bg-white/[0.02]\",\n className\n )}\n >\n {editable && (\n <div className=\"flex flex-wrap items-center gap-0.5 border-b border-gray-200 bg-gray-50 px-2 py-1.5 dark:border-gray-800 dark:bg-white/[0.02]\">\n {renderToolbar()}\n </div>\n )}\n <EditorContent\n editor={editor}\n className={cn(\n \"min-h-[200px] px-4 py-3 text-sm text-gray-700 dark:text-gray-300\",\n \"rounded-b-xl\",\n // Explicit element styling (no @tailwindcss/typography assumed).\n \"[&_.ProseMirror]:min-h-[180px] [&_.ProseMirror]:outline-none\",\n \"[&_h1]:mb-3 [&_h1]:mt-4 [&_h1]:text-2xl [&_h1]:font-semibold [&_h1]:text-gray-900 dark:[&_h1]:text-white/90\",\n \"[&_h2]:mb-2 [&_h2]:mt-4 [&_h2]:text-xl [&_h2]:font-semibold [&_h2]:text-gray-900 dark:[&_h2]:text-white/90\",\n \"[&_h3]:mb-2 [&_h3]:mt-3 [&_h3]:text-lg [&_h3]:font-semibold [&_h3]:text-gray-900 dark:[&_h3]:text-white/90\",\n \"[&_p]:my-2 [&_p]:leading-relaxed\",\n \"[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6\",\n \"[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6\",\n \"[&_li]:my-1 [&_li>p]:my-0\",\n \"[&_a]:text-brand-500 [&_a]:underline hover:[&_a]:text-brand-600 dark:[&_a]:text-brand-400\",\n \"[&_blockquote]:my-3 [&_blockquote]:border-l-4 [&_blockquote]:border-gray-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:text-gray-600 dark:[&_blockquote]:border-gray-700 dark:[&_blockquote]:text-gray-400\",\n \"[&_code]:rounded [&_code]:bg-gray-100 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.85em] [&_code]:text-brand-600 dark:[&_code]:bg-white/[0.06] dark:[&_code]:text-brand-400\",\n \"[&_pre]:my-3 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-gray-900 [&_pre]:p-4 [&_pre]:font-mono [&_pre]:text-sm [&_pre]:text-gray-100 dark:[&_pre]:bg-black/40\",\n \"[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:text-inherit\",\n \"[&_hr]:my-4 [&_hr]:border-gray-200 dark:[&_hr]:border-gray-800\",\n // Placeholder styling for the empty-document first node.\n \"[&_.is-editor-empty:first-child::before]:pointer-events-none [&_.is-editor-empty:first-child::before]:float-left [&_.is-editor-empty:first-child::before]:h-0 [&_.is-editor-empty:first-child::before]:text-gray-400 [&_.is-editor-empty:first-child::before]:content-[attr(data-placeholder)] dark:[&_.is-editor-empty:first-child::before]:text-gray-600\",\n editorClassName\n )}\n />\n </div>\n );\n};\n"]}
|