@melv1c/ui-kit 0.0.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.
Files changed (58) hide show
  1. package/README.md +65 -0
  2. package/dist/base.css +49 -0
  3. package/dist/chunk-2ZWQNZEN.cjs +63 -0
  4. package/dist/chunk-2ZWQNZEN.cjs.map +1 -0
  5. package/dist/chunk-4H5OSMBC.js +52 -0
  6. package/dist/chunk-4H5OSMBC.js.map +1 -0
  7. package/dist/chunk-GQ6Z5A4R.cjs +262 -0
  8. package/dist/chunk-GQ6Z5A4R.cjs.map +1 -0
  9. package/dist/chunk-I7WHASOO.cjs +13 -0
  10. package/dist/chunk-I7WHASOO.cjs.map +1 -0
  11. package/dist/chunk-PYHBC3IQ.js +17 -0
  12. package/dist/chunk-PYHBC3IQ.js.map +1 -0
  13. package/dist/chunk-PZ5AY32C.js +9 -0
  14. package/dist/chunk-PZ5AY32C.js.map +1 -0
  15. package/dist/chunk-Q4GFV3J3.cjs +19 -0
  16. package/dist/chunk-Q4GFV3J3.cjs.map +1 -0
  17. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  18. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  19. package/dist/chunk-QV4CTFLS.cjs +60 -0
  20. package/dist/chunk-QV4CTFLS.cjs.map +1 -0
  21. package/dist/chunk-RZJFYAJW.js +60 -0
  22. package/dist/chunk-RZJFYAJW.js.map +1 -0
  23. package/dist/chunk-WTLIXI2B.js +225 -0
  24. package/dist/chunk-WTLIXI2B.js.map +1 -0
  25. package/dist/chunk-WZ2GOU2J.js +11 -0
  26. package/dist/chunk-WZ2GOU2J.js.map +1 -0
  27. package/dist/code-diff-editor-IT2RMVDC.js +73 -0
  28. package/dist/code-diff-editor-IT2RMVDC.js.map +1 -0
  29. package/dist/code-diff-editor-J24VGXHL.cjs +75 -0
  30. package/dist/code-diff-editor-J24VGXHL.cjs.map +1 -0
  31. package/dist/code-editor-DK64HVFQ.cjs +84 -0
  32. package/dist/code-editor-DK64HVFQ.cjs.map +1 -0
  33. package/dist/code-editor-EJIJXZLN.js +82 -0
  34. package/dist/code-editor-EJIJXZLN.js.map +1 -0
  35. package/dist/index.cjs +4196 -0
  36. package/dist/index.cjs.map +1 -0
  37. package/dist/index.d.cts +623 -0
  38. package/dist/index.d.ts +623 -0
  39. package/dist/index.js +3870 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/locales/index.cjs +33 -0
  42. package/dist/locales/index.cjs.map +1 -0
  43. package/dist/locales/index.d.cts +43 -0
  44. package/dist/locales/index.d.ts +43 -0
  45. package/dist/locales/index.js +4 -0
  46. package/dist/locales/index.js.map +1 -0
  47. package/dist/rich-text-editor-JUERRDHQ.js +442 -0
  48. package/dist/rich-text-editor-JUERRDHQ.js.map +1 -0
  49. package/dist/rich-text-editor-MOJDWQTI.cjs +451 -0
  50. package/dist/rich-text-editor-MOJDWQTI.cjs.map +1 -0
  51. package/dist/themes/claude.css +125 -0
  52. package/dist/themes/default.css +70 -0
  53. package/dist/themes/doom64.css +117 -0
  54. package/dist/themes/t3chat.css +125 -0
  55. package/dist/themes/twitter.css +127 -0
  56. package/dist/themes/vercel.css +117 -0
  57. package/package.json +166 -0
  58. package/styles.css +120 -0
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ var chunkQV4CTFLS_cjs = require('../chunk-QV4CTFLS.cjs');
4
+ require('../chunk-Q7SFCCGT.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "de", {
9
+ enumerable: true,
10
+ get: function () { return chunkQV4CTFLS_cjs.de_default; }
11
+ });
12
+ Object.defineProperty(exports, "en", {
13
+ enumerable: true,
14
+ get: function () { return chunkQV4CTFLS_cjs.en_default; }
15
+ });
16
+ Object.defineProperty(exports, "es", {
17
+ enumerable: true,
18
+ get: function () { return chunkQV4CTFLS_cjs.es_default; }
19
+ });
20
+ Object.defineProperty(exports, "fr", {
21
+ enumerable: true,
22
+ get: function () { return chunkQV4CTFLS_cjs.fr_default; }
23
+ });
24
+ Object.defineProperty(exports, "it", {
25
+ enumerable: true,
26
+ get: function () { return chunkQV4CTFLS_cjs.it_default; }
27
+ });
28
+ Object.defineProperty(exports, "nl", {
29
+ enumerable: true,
30
+ get: function () { return chunkQV4CTFLS_cjs.nl_default; }
31
+ });
32
+ //# sourceMappingURL=index.cjs.map
33
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,43 @@
1
+ var next$5 = "Weiter";
2
+ var previous$5 = "Zurück";
3
+ var de = {
4
+ next: next$5,
5
+ previous: previous$5
6
+ };
7
+
8
+ var next$4 = "Next";
9
+ var previous$4 = "Previous";
10
+ var en = {
11
+ next: next$4,
12
+ previous: previous$4
13
+ };
14
+
15
+ var next$3 = "Siguiente";
16
+ var previous$3 = "Anterior";
17
+ var es = {
18
+ next: next$3,
19
+ previous: previous$3
20
+ };
21
+
22
+ var next$2 = "Suivant";
23
+ var previous$2 = "Précédent";
24
+ var fr = {
25
+ next: next$2,
26
+ previous: previous$2
27
+ };
28
+
29
+ var next$1 = "Successivo";
30
+ var previous$1 = "Precedente";
31
+ var it = {
32
+ next: next$1,
33
+ previous: previous$1
34
+ };
35
+
36
+ var next = "Volgende";
37
+ var previous = "Vorige";
38
+ var nl = {
39
+ next: next,
40
+ previous: previous
41
+ };
42
+
43
+ export { de, en, es, fr, it, nl };
@@ -0,0 +1,43 @@
1
+ var next$5 = "Weiter";
2
+ var previous$5 = "Zurück";
3
+ var de = {
4
+ next: next$5,
5
+ previous: previous$5
6
+ };
7
+
8
+ var next$4 = "Next";
9
+ var previous$4 = "Previous";
10
+ var en = {
11
+ next: next$4,
12
+ previous: previous$4
13
+ };
14
+
15
+ var next$3 = "Siguiente";
16
+ var previous$3 = "Anterior";
17
+ var es = {
18
+ next: next$3,
19
+ previous: previous$3
20
+ };
21
+
22
+ var next$2 = "Suivant";
23
+ var previous$2 = "Précédent";
24
+ var fr = {
25
+ next: next$2,
26
+ previous: previous$2
27
+ };
28
+
29
+ var next$1 = "Successivo";
30
+ var previous$1 = "Precedente";
31
+ var it = {
32
+ next: next$1,
33
+ previous: previous$1
34
+ };
35
+
36
+ var next = "Volgende";
37
+ var previous = "Vorige";
38
+ var nl = {
39
+ next: next,
40
+ previous: previous
41
+ };
42
+
43
+ export { de, en, es, fr, it, nl };
@@ -0,0 +1,4 @@
1
+ export { de_default as de, en_default as en, es_default as es, fr_default as fr, it_default as it, nl_default as nl } from '../chunk-4H5OSMBC.js';
2
+ import '../chunk-PZ5AY32C.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,442 @@
1
+ import { ToggleGroup, ToggleGroupItem, Separator, Popover, PopoverTrigger, Toggle, PopoverContent, Input, Button } from './chunk-WTLIXI2B.js';
2
+ import { cn } from './chunk-WZ2GOU2J.js';
3
+ import './chunk-PZ5AY32C.js';
4
+ import Link from '@tiptap/extension-link';
5
+ import Placeholder from '@tiptap/extension-placeholder';
6
+ import Underline from '@tiptap/extension-underline';
7
+ import { useEditor, EditorContent } from '@tiptap/react';
8
+ import StarterKit from '@tiptap/starter-kit';
9
+ import { Heading1, Heading2, Heading3, Bold, Italic, Underline as Underline$1, Strikethrough, List, ListOrdered, Link as Link$1, Check, X, Unlink } from 'lucide-react';
10
+ import { cva } from 'class-variance-authority';
11
+ import { useState, useRef, useCallback } from 'react';
12
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
+
14
+ var richTextEditorVariants = cva(
15
+ "relative overflow-hidden rounded-md border transition-[color,box-shadow] outline-none focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]",
16
+ {
17
+ variants: {
18
+ variant: {
19
+ default: "border-input bg-transparent",
20
+ ghost: "border-transparent bg-transparent",
21
+ card: "border-border bg-card shadow-sm"
22
+ },
23
+ size: {
24
+ default: "min-h-[200px]",
25
+ sm: "min-h-[120px]",
26
+ lg: "min-h-[350px]"
27
+ }
28
+ },
29
+ defaultVariants: {
30
+ variant: "default",
31
+ size: "default"
32
+ }
33
+ }
34
+ );
35
+ var toolbarVariants = cva(
36
+ "flex flex-wrap items-center gap-1 border-b p-2",
37
+ {
38
+ variants: {
39
+ variant: {
40
+ default: "border-input bg-muted/30",
41
+ ghost: "border-transparent bg-transparent",
42
+ card: "border-border bg-muted/50"
43
+ }
44
+ },
45
+ defaultVariants: {
46
+ variant: "default"
47
+ }
48
+ }
49
+ );
50
+ var editorContentVariants = cva(
51
+ "prose prose-sm dark:prose-invert max-w-none p-4 focus:outline-none",
52
+ {
53
+ variants: {
54
+ size: {
55
+ default: "min-h-[150px]",
56
+ sm: "min-h-[80px]",
57
+ lg: "min-h-[300px]"
58
+ }
59
+ },
60
+ defaultVariants: {
61
+ size: "default"
62
+ }
63
+ }
64
+ );
65
+ function LinkPopover({ editor, disabled }) {
66
+ const [isOpen, setIsOpen] = useState(false);
67
+ const [url, setUrl] = useState("");
68
+ const inputRef = useRef(null);
69
+ const handleOpen = useCallback(
70
+ (open) => {
71
+ if (open) {
72
+ const previousUrl = editor.getAttributes("link").href || "";
73
+ setUrl(previousUrl);
74
+ }
75
+ setIsOpen(open);
76
+ },
77
+ [editor]
78
+ );
79
+ const handleSetLink = useCallback(() => {
80
+ if (url === "") {
81
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
82
+ } else {
83
+ editor.chain().focus().extendMarkRange("link").setLink({ href: url, target: "_blank" }).run();
84
+ }
85
+ setIsOpen(false);
86
+ setUrl("");
87
+ }, [editor, url]);
88
+ const handleUnsetLink = useCallback(() => {
89
+ editor.chain().focus().unsetLink().run();
90
+ setIsOpen(false);
91
+ setUrl("");
92
+ }, [editor]);
93
+ const isActive = editor.isActive("link");
94
+ return /* @__PURE__ */ jsxs(Popover, { open: isOpen, onOpenChange: handleOpen, children: [
95
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
96
+ Toggle,
97
+ {
98
+ size: "sm",
99
+ pressed: isActive,
100
+ disabled,
101
+ "aria-label": isActive ? "Edit link" : "Add link",
102
+ variant: "outline",
103
+ children: /* @__PURE__ */ jsx(Link$1, { className: "size-4" })
104
+ }
105
+ ) }),
106
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-80 p-3", align: "start", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
107
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: isActive ? "Edit Link" : "Insert Link" }),
108
+ /* @__PURE__ */ jsx(
109
+ Input,
110
+ {
111
+ ref: inputRef,
112
+ type: "url",
113
+ placeholder: "https://example.com",
114
+ value: url,
115
+ onChange: (e) => setUrl(e.target.value),
116
+ onKeyDown: (e) => {
117
+ if (e.key === "Enter") {
118
+ e.preventDefault();
119
+ handleSetLink();
120
+ }
121
+ if (e.key === "Escape") {
122
+ setIsOpen(false);
123
+ }
124
+ }
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
128
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
129
+ /* @__PURE__ */ jsxs(Button, { type: "button", size: "sm", onClick: handleSetLink, children: [
130
+ /* @__PURE__ */ jsx(Check, { className: "size-3.5" }),
131
+ isActive ? "Update" : "Insert"
132
+ ] }),
133
+ /* @__PURE__ */ jsxs(
134
+ Button,
135
+ {
136
+ type: "button",
137
+ variant: "outline",
138
+ size: "sm",
139
+ onClick: () => {
140
+ setIsOpen(false);
141
+ setUrl("");
142
+ },
143
+ children: [
144
+ /* @__PURE__ */ jsx(X, { className: "size-3.5" }),
145
+ "Cancel"
146
+ ]
147
+ }
148
+ )
149
+ ] }),
150
+ isActive && /* @__PURE__ */ jsxs(
151
+ Button,
152
+ {
153
+ type: "button",
154
+ variant: "ghost",
155
+ size: "sm",
156
+ onClick: handleUnsetLink,
157
+ className: "text-destructive hover:text-destructive",
158
+ children: [
159
+ /* @__PURE__ */ jsx(Unlink, { className: "size-3.5" }),
160
+ "Remove"
161
+ ]
162
+ }
163
+ )
164
+ ] })
165
+ ] }) })
166
+ ] });
167
+ }
168
+ var defaultOptions = {
169
+ headings: true,
170
+ bold: true,
171
+ italic: true,
172
+ underline: true,
173
+ strikethrough: true,
174
+ bulletList: true,
175
+ orderedList: true,
176
+ link: true
177
+ };
178
+ function EditorToolbar({
179
+ editor,
180
+ variant,
181
+ disabled,
182
+ className,
183
+ options
184
+ }) {
185
+ const opts = { ...defaultOptions, ...options };
186
+ const showHeadings = opts.headings;
187
+ const showFormatting = opts.bold || opts.italic || opts.underline || opts.strikethrough;
188
+ const showLists = opts.bulletList || opts.orderedList;
189
+ const showLink = opts.link;
190
+ const activeGroups = [showHeadings, showFormatting, showLists, showLink];
191
+ const needsSeparatorAfter = (groupIndex) => {
192
+ return activeGroups.slice(groupIndex + 1).some(Boolean);
193
+ };
194
+ return /* @__PURE__ */ jsxs(
195
+ "div",
196
+ {
197
+ "data-slot": "rich-text-editor-toolbar",
198
+ className: cn(toolbarVariants({ variant }), className),
199
+ children: [
200
+ showHeadings && /* @__PURE__ */ jsxs(Fragment, { children: [
201
+ /* @__PURE__ */ jsxs(
202
+ ToggleGroup,
203
+ {
204
+ type: "single",
205
+ value: editor?.isActive("heading", { level: 1 }) ? "h1" : editor?.isActive("heading", { level: 2 }) ? "h2" : editor?.isActive("heading", { level: 3 }) ? "h3" : "",
206
+ size: "sm",
207
+ variant: "outline",
208
+ children: [
209
+ /* @__PURE__ */ jsx(
210
+ ToggleGroupItem,
211
+ {
212
+ value: "h1",
213
+ "aria-label": "Heading 1",
214
+ disabled: disabled || !editor?.can().chain().focus().toggleHeading({ level: 1 }).run(),
215
+ onClick: () => editor?.chain().focus().toggleHeading({ level: 1 }).run(),
216
+ children: /* @__PURE__ */ jsx(Heading1, { className: "size-4" })
217
+ }
218
+ ),
219
+ /* @__PURE__ */ jsx(
220
+ ToggleGroupItem,
221
+ {
222
+ value: "h2",
223
+ "aria-label": "Heading 2",
224
+ disabled: disabled || !editor?.can().chain().focus().toggleHeading({ level: 2 }).run(),
225
+ onClick: () => editor?.chain().focus().toggleHeading({ level: 2 }).run(),
226
+ children: /* @__PURE__ */ jsx(Heading2, { className: "size-4" })
227
+ }
228
+ ),
229
+ /* @__PURE__ */ jsx(
230
+ ToggleGroupItem,
231
+ {
232
+ value: "h3",
233
+ "aria-label": "Heading 3",
234
+ disabled: disabled || !editor?.can().chain().focus().toggleHeading({ level: 3 }).run(),
235
+ onClick: () => editor?.chain().focus().toggleHeading({ level: 3 }).run(),
236
+ children: /* @__PURE__ */ jsx(Heading3, { className: "size-4" })
237
+ }
238
+ )
239
+ ]
240
+ }
241
+ ),
242
+ needsSeparatorAfter(0) && /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" })
243
+ ] }),
244
+ showFormatting && /* @__PURE__ */ jsxs(Fragment, { children: [
245
+ /* @__PURE__ */ jsxs(
246
+ ToggleGroup,
247
+ {
248
+ type: "multiple",
249
+ value: ["bold", "italic", "underline", "strike"].filter(
250
+ (format) => editor?.isActive(format)
251
+ ),
252
+ size: "sm",
253
+ variant: "outline",
254
+ children: [
255
+ opts.bold && /* @__PURE__ */ jsx(
256
+ ToggleGroupItem,
257
+ {
258
+ value: "bold",
259
+ "aria-label": "Bold",
260
+ disabled: disabled || !editor.can().chain().focus().toggleBold().run(),
261
+ onClick: () => editor.chain().focus().toggleBold().run(),
262
+ children: /* @__PURE__ */ jsx(Bold, { className: "size-4" })
263
+ }
264
+ ),
265
+ opts.italic && /* @__PURE__ */ jsx(
266
+ ToggleGroupItem,
267
+ {
268
+ value: "italic",
269
+ "aria-label": "Italic",
270
+ disabled: disabled || !editor.can().chain().focus().toggleItalic().run(),
271
+ onClick: () => editor.chain().focus().toggleItalic().run(),
272
+ children: /* @__PURE__ */ jsx(Italic, { className: "size-4" })
273
+ }
274
+ ),
275
+ opts.underline && /* @__PURE__ */ jsx(
276
+ ToggleGroupItem,
277
+ {
278
+ value: "underline",
279
+ "aria-label": "Underline",
280
+ disabled: disabled || !editor.can().chain().focus().toggleUnderline().run(),
281
+ onClick: () => editor.chain().focus().toggleUnderline().run(),
282
+ children: /* @__PURE__ */ jsx(Underline$1, { className: "size-4" })
283
+ }
284
+ ),
285
+ opts.strikethrough && /* @__PURE__ */ jsx(
286
+ ToggleGroupItem,
287
+ {
288
+ value: "strike",
289
+ "aria-label": "Strikethrough",
290
+ disabled: disabled || !editor.can().chain().focus().toggleStrike().run(),
291
+ onClick: () => editor.chain().focus().toggleStrike().run(),
292
+ children: /* @__PURE__ */ jsx(Strikethrough, { className: "size-4" })
293
+ }
294
+ )
295
+ ]
296
+ }
297
+ ),
298
+ needsSeparatorAfter(1) && /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" })
299
+ ] }),
300
+ showLists && /* @__PURE__ */ jsxs(Fragment, { children: [
301
+ /* @__PURE__ */ jsxs(
302
+ ToggleGroup,
303
+ {
304
+ type: "single",
305
+ value: editor.isActive("bulletList") ? "bulletList" : editor.isActive("orderedList") ? "orderedList" : "",
306
+ size: "sm",
307
+ variant: "outline",
308
+ children: [
309
+ opts.bulletList && /* @__PURE__ */ jsx(
310
+ ToggleGroupItem,
311
+ {
312
+ value: "bulletList",
313
+ "aria-label": "Bullet list",
314
+ disabled,
315
+ onClick: () => editor.chain().focus().toggleBulletList().run(),
316
+ children: /* @__PURE__ */ jsx(List, { className: "size-4" })
317
+ }
318
+ ),
319
+ opts.orderedList && /* @__PURE__ */ jsx(
320
+ ToggleGroupItem,
321
+ {
322
+ value: "orderedList",
323
+ "aria-label": "Ordered list",
324
+ disabled,
325
+ onClick: () => editor.chain().focus().toggleOrderedList().run(),
326
+ children: /* @__PURE__ */ jsx(ListOrdered, { className: "size-4" })
327
+ }
328
+ )
329
+ ]
330
+ }
331
+ ),
332
+ needsSeparatorAfter(2) && /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" })
333
+ ] }),
334
+ showLink && /* @__PURE__ */ jsx(LinkPopover, { editor, disabled })
335
+ ]
336
+ }
337
+ );
338
+ }
339
+ function RichTextEditor({
340
+ value,
341
+ onChange,
342
+ placeholder = "Start typing...",
343
+ readOnly = false,
344
+ disabled = false,
345
+ multiline = true,
346
+ className,
347
+ variant,
348
+ size,
349
+ contentClassName,
350
+ toolbarClassName,
351
+ toolbarOptions,
352
+ ...props
353
+ }) {
354
+ const editor = useEditor({
355
+ extensions: [
356
+ StarterKit.configure({
357
+ heading: {
358
+ levels: [1, 2, 3]
359
+ },
360
+ codeBlock: false,
361
+ blockquote: false
362
+ }),
363
+ Underline,
364
+ Link.configure({
365
+ openOnClick: false,
366
+ HTMLAttributes: {
367
+ class: "text-primary underline underline-offset-2 cursor-pointer"
368
+ }
369
+ }),
370
+ Placeholder.configure({
371
+ placeholder,
372
+ emptyEditorClass: "before:content-[attr(data-placeholder)] before:text-muted-foreground before:float-left before:h-0 before:pointer-events-none"
373
+ })
374
+ ],
375
+ content: value,
376
+ onUpdate: ({ editor: editor2 }) => {
377
+ onChange(editor2.isEmpty ? "" : editor2.getHTML());
378
+ },
379
+ editable: !readOnly && !disabled,
380
+ shouldRerenderOnTransaction: true,
381
+ // Force a re-render when a transaction is made
382
+ editorProps: {
383
+ attributes: {
384
+ class: cn(
385
+ editorContentVariants({ size: multiline ? size : void 0 }),
386
+ "[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mb-2",
387
+ "[&_h2]:text-xl [&_h2]:font-semibold [&_h2]:mb-2",
388
+ "[&_h3]:text-lg [&_h3]:font-medium [&_h3]:mb-1",
389
+ "[&_ul]:list-disc [&_ul]:ml-4 [&_ol]:list-decimal [&_ol]:ml-4",
390
+ "[&_a]:text-primary [&_a]:underline [&_a]:underline-offset-2",
391
+ !multiline && "min-h-0 py-2"
392
+ )
393
+ },
394
+ handleKeyDown: (_, event) => {
395
+ if (!multiline && event.key === "Enter") {
396
+ return true;
397
+ }
398
+ return false;
399
+ }
400
+ }
401
+ });
402
+ return /* @__PURE__ */ jsxs(
403
+ "div",
404
+ {
405
+ "data-slot": "rich-text-editor",
406
+ className: cn(
407
+ richTextEditorVariants({ variant, size: multiline ? size : void 0 }),
408
+ !multiline && "min-h-0",
409
+ disabled && "cursor-not-allowed opacity-50",
410
+ className
411
+ ),
412
+ ...props,
413
+ children: [
414
+ !readOnly && /* @__PURE__ */ jsx(
415
+ EditorToolbar,
416
+ {
417
+ editor,
418
+ variant,
419
+ disabled,
420
+ className: toolbarClassName,
421
+ options: toolbarOptions
422
+ }
423
+ ),
424
+ /* @__PURE__ */ jsx(
425
+ EditorContent,
426
+ {
427
+ editor,
428
+ className: cn(
429
+ "w-full",
430
+ disabled && "pointer-events-none",
431
+ contentClassName
432
+ )
433
+ }
434
+ )
435
+ ]
436
+ }
437
+ );
438
+ }
439
+
440
+ export { RichTextEditor };
441
+ //# sourceMappingURL=rich-text-editor-JUERRDHQ.js.map
442
+ //# sourceMappingURL=rich-text-editor-JUERRDHQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/editors/rich-text/variants.ts","../src/components/editors/rich-text/toolbar/link-popover.tsx","../src/components/editors/rich-text/toolbar/editor-toolbar.tsx","../src/components/editors/rich-text/rich-text-editor.tsx"],"names":["LinkIcon","jsxs","jsx","UnderlineIcon","editor"],"mappings":"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","file":"rich-text-editor-JUERRDHQ.js","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const richTextEditorVariants = cva(\n \"relative overflow-hidden rounded-md border transition-[color,box-shadow] outline-none focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]\",\n {\n variants: {\n variant: {\n default: \"border-input bg-transparent\",\n ghost: \"border-transparent bg-transparent\",\n card: \"border-border bg-card shadow-sm\",\n },\n size: {\n default: \"min-h-[200px]\",\n sm: \"min-h-[120px]\",\n lg: \"min-h-[350px]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport const toolbarVariants = cva(\n \"flex flex-wrap items-center gap-1 border-b p-2\",\n {\n variants: {\n variant: {\n default: \"border-input bg-muted/30\",\n ghost: \"border-transparent bg-transparent\",\n card: \"border-border bg-muted/50\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport const editorContentVariants = cva(\n \"prose prose-sm dark:prose-invert max-w-none p-4 focus:outline-none\",\n {\n variants: {\n size: {\n default: \"min-h-[150px]\",\n sm: \"min-h-[80px]\",\n lg: \"min-h-[300px]\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n","import { Check, Link as LinkIcon, Unlink, X } from \"lucide-react\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"@/components/base/button\";\nimport { Input } from \"@/components/base/input\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/base/popover\";\nimport { Toggle } from \"@/components/base/toggle\";\nimport type { LinkPopoverProps } from \"../types\";\n\nfunction LinkPopover({ editor, disabled }: LinkPopoverProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [url, setUrl] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleOpen = useCallback(\n (open: boolean) => {\n if (open) {\n const previousUrl = editor.getAttributes(\"link\").href || \"\";\n setUrl(previousUrl);\n }\n setIsOpen(open);\n },\n [editor],\n );\n\n const handleSetLink = useCallback(() => {\n if (url === \"\") {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n } else {\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url, target: \"_blank\" })\n .run();\n }\n setIsOpen(false);\n setUrl(\"\");\n }, [editor, url]);\n\n const handleUnsetLink = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n setIsOpen(false);\n setUrl(\"\");\n }, [editor]);\n\n const isActive = editor.isActive(\"link\");\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpen}>\n <PopoverTrigger asChild>\n <Toggle\n size=\"sm\"\n pressed={isActive}\n disabled={disabled}\n aria-label={isActive ? \"Edit link\" : \"Add link\"}\n variant=\"outline\"\n >\n <LinkIcon className=\"size-4\" />\n </Toggle>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-3\" align=\"start\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"text-sm font-medium\">\n {isActive ? \"Edit Link\" : \"Insert Link\"}\n </div>\n <Input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleSetLink();\n }\n if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n }}\n />\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1\">\n <Button type=\"button\" size=\"sm\" onClick={handleSetLink}>\n <Check className=\"size-3.5\" />\n {isActive ? \"Update\" : \"Insert\"}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setIsOpen(false);\n setUrl(\"\");\n }}\n >\n <X className=\"size-3.5\" />\n Cancel\n </Button>\n </div>\n {isActive && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleUnsetLink}\n className=\"text-destructive hover:text-destructive\"\n >\n <Unlink className=\"size-3.5\" />\n Remove\n </Button>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { LinkPopover };\n","import {\n Bold,\n Heading1,\n Heading2,\n Heading3,\n Italic,\n List,\n ListOrdered,\n Strikethrough,\n Underline as UnderlineIcon,\n} from \"lucide-react\";\nimport { Separator } from \"@/components/base/separator\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/base/toggle-group\";\nimport { cn } from \"@/lib/utils\";\nimport type { EditorToolbarProps, ToolbarOptions } from \"../types\";\nimport { toolbarVariants } from \"../variants\";\nimport { LinkPopover } from \"./link-popover\";\n\nconst defaultOptions: Required<ToolbarOptions> = {\n headings: true,\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n bulletList: true,\n orderedList: true,\n link: true,\n};\n\nfunction EditorToolbar({\n editor,\n variant,\n disabled,\n className,\n options,\n}: EditorToolbarProps) {\n const opts = { ...defaultOptions, ...options };\n\n const showHeadings = opts.headings;\n const showFormatting =\n opts.bold || opts.italic || opts.underline || opts.strikethrough;\n const showLists = opts.bulletList || opts.orderedList;\n const showLink = opts.link;\n\n // Determine which separators to show based on active groups\n const activeGroups = [showHeadings, showFormatting, showLists, showLink];\n const needsSeparatorAfter = (groupIndex: number): boolean => {\n // Show separator if there's at least one active group after this one\n return activeGroups.slice(groupIndex + 1).some(Boolean);\n };\n\n return (\n <div\n data-slot=\"rich-text-editor-toolbar\"\n className={cn(toolbarVariants({ variant }), className)}\n >\n {/* Heading Group */}\n {showHeadings && (\n <>\n <ToggleGroup\n type=\"single\"\n value={\n editor?.isActive(\"heading\", { level: 1 })\n ? \"h1\"\n : editor?.isActive(\"heading\", { level: 2 })\n ? \"h2\"\n : editor?.isActive(\"heading\", { level: 3 })\n ? \"h3\"\n : \"\"\n }\n size=\"sm\"\n variant=\"outline\"\n >\n <ToggleGroupItem\n value=\"h1\"\n aria-label=\"Heading 1\"\n disabled={\n disabled ||\n !editor?.can().chain().focus().toggleHeading({ level: 1 }).run()\n }\n onClick={() =>\n editor?.chain().focus().toggleHeading({ level: 1 }).run()\n }\n >\n <Heading1 className=\"size-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem\n value=\"h2\"\n aria-label=\"Heading 2\"\n disabled={\n disabled ||\n !editor?.can().chain().focus().toggleHeading({ level: 2 }).run()\n }\n onClick={() =>\n editor?.chain().focus().toggleHeading({ level: 2 }).run()\n }\n >\n <Heading2 className=\"size-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem\n value=\"h3\"\n aria-label=\"Heading 3\"\n disabled={\n disabled ||\n !editor?.can().chain().focus().toggleHeading({ level: 3 }).run()\n }\n onClick={() =>\n editor?.chain().focus().toggleHeading({ level: 3 }).run()\n }\n >\n <Heading3 className=\"size-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n {needsSeparatorAfter(0) && (\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n )}\n </>\n )}\n\n {/* Text Formatting Group */}\n {showFormatting && (\n <>\n <ToggleGroup\n type=\"multiple\"\n value={[\"bold\", \"italic\", \"underline\", \"strike\"].filter((format) =>\n editor?.isActive(format),\n )}\n size=\"sm\"\n variant=\"outline\"\n >\n {opts.bold && (\n <ToggleGroupItem\n value=\"bold\"\n aria-label=\"Bold\"\n disabled={\n disabled || !editor.can().chain().focus().toggleBold().run()\n }\n onClick={() => editor.chain().focus().toggleBold().run()}\n >\n <Bold className=\"size-4\" />\n </ToggleGroupItem>\n )}\n {opts.italic && (\n <ToggleGroupItem\n value=\"italic\"\n aria-label=\"Italic\"\n disabled={\n disabled || !editor.can().chain().focus().toggleItalic().run()\n }\n onClick={() => editor.chain().focus().toggleItalic().run()}\n >\n <Italic className=\"size-4\" />\n </ToggleGroupItem>\n )}\n {opts.underline && (\n <ToggleGroupItem\n value=\"underline\"\n aria-label=\"Underline\"\n disabled={\n disabled ||\n !editor.can().chain().focus().toggleUnderline().run()\n }\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n >\n <UnderlineIcon className=\"size-4\" />\n </ToggleGroupItem>\n )}\n {opts.strikethrough && (\n <ToggleGroupItem\n value=\"strike\"\n aria-label=\"Strikethrough\"\n disabled={\n disabled || !editor.can().chain().focus().toggleStrike().run()\n }\n onClick={() => editor.chain().focus().toggleStrike().run()}\n >\n <Strikethrough className=\"size-4\" />\n </ToggleGroupItem>\n )}\n </ToggleGroup>\n {needsSeparatorAfter(1) && (\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n )}\n </>\n )}\n\n {/* List Group */}\n {showLists && (\n <>\n <ToggleGroup\n type=\"single\"\n value={\n editor.isActive(\"bulletList\")\n ? \"bulletList\"\n : editor.isActive(\"orderedList\")\n ? \"orderedList\"\n : \"\"\n }\n size=\"sm\"\n variant=\"outline\"\n >\n {opts.bulletList && (\n <ToggleGroupItem\n value=\"bulletList\"\n aria-label=\"Bullet list\"\n disabled={disabled}\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n >\n <List className=\"size-4\" />\n </ToggleGroupItem>\n )}\n {opts.orderedList && (\n <ToggleGroupItem\n value=\"orderedList\"\n aria-label=\"Ordered list\"\n disabled={disabled}\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n >\n <ListOrdered className=\"size-4\" />\n </ToggleGroupItem>\n )}\n </ToggleGroup>\n {needsSeparatorAfter(2) && (\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n )}\n </>\n )}\n\n {/* Link */}\n {showLink && <LinkPopover editor={editor} disabled={disabled} />}\n </div>\n );\n}\n\nexport { EditorToolbar };\n","import Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Underline from \"@tiptap/extension-underline\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { cn } from \"@/lib/utils\";\nimport { EditorToolbar } from \"./toolbar\";\nimport type { RichTextEditorProps } from \"./types\";\nimport { editorContentVariants, richTextEditorVariants } from \"./variants\";\n\nfunction RichTextEditor({\n value,\n onChange,\n placeholder = \"Start typing...\",\n readOnly = false,\n disabled = false,\n multiline = true,\n className,\n variant,\n size,\n contentClassName,\n toolbarClassName,\n toolbarOptions,\n ...props\n}: RichTextEditorProps) {\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n },\n codeBlock: false,\n blockquote: false,\n }),\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: \"text-primary underline underline-offset-2 cursor-pointer\",\n },\n }),\n Placeholder.configure({\n placeholder,\n emptyEditorClass:\n \"before:content-[attr(data-placeholder)] before:text-muted-foreground before:float-left before:h-0 before:pointer-events-none\",\n }),\n ],\n content: value,\n onUpdate: ({ editor }) => {\n onChange(editor.isEmpty ? \"\" : editor.getHTML());\n },\n editable: !readOnly && !disabled,\n shouldRerenderOnTransaction: true, // Force a re-render when a transaction is made\n editorProps: {\n attributes: {\n class: cn(\n editorContentVariants({ size: multiline ? size : undefined }),\n \"[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mb-2\",\n \"[&_h2]:text-xl [&_h2]:font-semibold [&_h2]:mb-2\",\n \"[&_h3]:text-lg [&_h3]:font-medium [&_h3]:mb-1\",\n \"[&_ul]:list-disc [&_ul]:ml-4 [&_ol]:list-decimal [&_ol]:ml-4\",\n \"[&_a]:text-primary [&_a]:underline [&_a]:underline-offset-2\",\n !multiline && \"min-h-0 py-2\",\n ),\n },\n handleKeyDown: (_, event) => {\n // Prevent Enter key when multiline is disabled\n if (!multiline && event.key === \"Enter\") {\n return true;\n }\n return false;\n },\n },\n });\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\n richTextEditorVariants({ variant, size: multiline ? size : undefined }),\n !multiline && \"min-h-0\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n {...props}\n >\n {!readOnly && (\n <EditorToolbar\n editor={editor}\n variant={variant}\n disabled={disabled}\n className={toolbarClassName}\n options={toolbarOptions}\n />\n )}\n <EditorContent\n editor={editor}\n className={cn(\n \"w-full\",\n disabled && \"pointer-events-none\",\n contentClassName,\n )}\n />\n </div>\n );\n}\n\nexport { RichTextEditor, type RichTextEditorProps };\n"]}