@akira-io/ui 1.1.0 → 1.1.1

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/dist/blocks.d.ts +25 -25
  2. package/dist/blocks.js +74 -59
  3. package/dist/blocks.js.map +1 -1
  4. package/dist/{button-B6wQRe7p.d.ts → button-Bj6My68b.d.ts} +2 -1
  5. package/dist/{chunk-JAHTUAQL.js → chunk-2WIIRDHT.js} +5 -4
  6. package/dist/chunk-2WIIRDHT.js.map +1 -0
  7. package/dist/{chunk-KYWA5UYN.js → chunk-4SOQAVUP.js} +5 -5
  8. package/dist/{chunk-KYWA5UYN.js.map → chunk-4SOQAVUP.js.map} +1 -1
  9. package/dist/{chunk-UUTXPPRN.js → chunk-CFDDAFPJ.js} +125 -82
  10. package/dist/chunk-CFDDAFPJ.js.map +1 -0
  11. package/dist/{chunk-LKSM3WLK.js → chunk-FWQFB37J.js} +6 -5
  12. package/dist/chunk-FWQFB37J.js.map +1 -0
  13. package/dist/{chunk-DSD7MVLL.js → chunk-ODYCBCKS.js} +10 -7
  14. package/dist/chunk-ODYCBCKS.js.map +1 -0
  15. package/dist/{chunk-MNGNBEYN.js → chunk-QHZWW55M.js} +245 -156
  16. package/dist/chunk-QHZWW55M.js.map +1 -0
  17. package/dist/{chunk-SA5LM2GD.js → chunk-RPCL7VFQ.js} +41 -20
  18. package/dist/chunk-RPCL7VFQ.js.map +1 -0
  19. package/dist/{chunk-6QM5BA7B.js → chunk-T2INZOCM.js} +40 -23
  20. package/dist/chunk-T2INZOCM.js.map +1 -0
  21. package/dist/{chunk-UUEWFCKT.js → chunk-TGF54WAO.js} +6 -5
  22. package/dist/chunk-TGF54WAO.js.map +1 -0
  23. package/dist/{chunk-6X4TKSF6.js → chunk-XZCC6MTE.js} +11 -6
  24. package/dist/chunk-XZCC6MTE.js.map +1 -0
  25. package/dist/code.d.ts +5 -2
  26. package/dist/code.js +51 -52
  27. package/dist/code.js.map +1 -1
  28. package/dist/{context-VgHq4U98.d.ts → context-YWbxMH0C.d.ts} +26 -27
  29. package/dist/editor.d.ts +8 -6
  30. package/dist/editor.js +32 -18
  31. package/dist/editor.js.map +1 -1
  32. package/dist/index.d.ts +229 -229
  33. package/dist/index.js +431 -325
  34. package/dist/index.js.map +1 -1
  35. package/dist/inertia.d.ts +1 -1
  36. package/dist/inertia.js +5 -5
  37. package/dist/input-Dpi7pXeR.d.ts +6 -0
  38. package/dist/{json-viewer-BTHBACj9.d.ts → json-viewer-BARA2RCW.d.ts} +3 -2
  39. package/dist/locales/pt.d.ts +8 -8
  40. package/dist/{password-input-r39y2pCT.d.ts → password-input-DcXX7SG9.d.ts} +8 -7
  41. package/dist/shells.d.ts +7 -7
  42. package/dist/shells.js +10 -9
  43. package/dist/shells.js.map +1 -1
  44. package/dist/sidebar-DqkFRUxQ.d.ts +81 -0
  45. package/dist/{types-CT0rBsFc.d.ts → types-B-eGPoFD.d.ts} +3 -2
  46. package/dist/{types-B4QS3h5p.d.ts → types-cmBL8zOc.d.ts} +4 -1
  47. package/package.json +3 -3
  48. package/dist/chunk-6QM5BA7B.js.map +0 -1
  49. package/dist/chunk-6X4TKSF6.js.map +0 -1
  50. package/dist/chunk-DSD7MVLL.js.map +0 -1
  51. package/dist/chunk-JAHTUAQL.js.map +0 -1
  52. package/dist/chunk-LKSM3WLK.js.map +0 -1
  53. package/dist/chunk-MNGNBEYN.js.map +0 -1
  54. package/dist/chunk-SA5LM2GD.js.map +0 -1
  55. package/dist/chunk-UUEWFCKT.js.map +0 -1
  56. package/dist/chunk-UUTXPPRN.js.map +0 -1
  57. package/dist/input-4uxAHW6y.d.ts +0 -5
  58. package/dist/sidebar-BhOIlSjt.d.ts +0 -80
package/dist/editor.d.ts CHANGED
@@ -1,12 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
+ import { S as SlotNameProps } from './types-cmBL8zOc.js';
3
4
  import { Editor as Editor$1, Extensions, JSONContent } from '@tiptap/core';
4
5
  import { LucideIcon } from 'lucide-react';
6
+ import '@tanstack/react-table';
5
7
 
6
8
  interface EditorContentProps {
7
9
  className?: string;
8
10
  }
9
- declare function EditorContent({ className }: EditorContentProps): React.JSX.Element;
11
+ declare function EditorContent({ className, slotName, }: EditorContentProps & SlotNameProps): React.JSX.Element;
10
12
 
11
13
  interface EditorLabels {
12
14
  toolbarLabel: string;
@@ -70,7 +72,7 @@ interface EditorHistoryProps {
70
72
  label?: string;
71
73
  className?: string;
72
74
  }
73
- declare function EditorHistory({ action, label, className, }: EditorHistoryProps): React.JSX.Element;
75
+ declare function EditorHistory({ action, label, className, slotName, }: EditorHistoryProps & SlotNameProps): React.JSX.Element;
74
76
 
75
77
  type EditorOutput = 'html' | 'json';
76
78
  type EditorDocument = string | JSONContent;
@@ -93,7 +95,7 @@ type EditorProps = EditorSharedProps & ({
93
95
  value: JSONContent;
94
96
  onChange: (value: JSONContent) => void;
95
97
  });
96
- declare function Editor({ value, onChange, output, extensions, labels, placeholder, label, disabled, readOnly, className, children, }: EditorProps): React.JSX.Element | null;
98
+ declare function Editor({ value, onChange, output, extensions, labels, placeholder, label, disabled, readOnly, className, children, slotName, }: EditorProps & SlotNameProps): React.JSX.Element | null;
97
99
 
98
100
  declare function isSafeEditorUrl(url: string): boolean;
99
101
  declare function defaultEditorExtensions(): Extensions;
@@ -102,7 +104,7 @@ interface EditorLinkProps {
102
104
  label?: string;
103
105
  className?: string;
104
106
  }
105
- declare function EditorLink({ label, className }: EditorLinkProps): React.JSX.Element;
107
+ declare function EditorLink({ label, className, slotName, }: EditorLinkProps & SlotNameProps): React.JSX.Element;
106
108
 
107
109
  type WithoutChildren<T> = T extends unknown ? Omit<T, 'children'> : never;
108
110
  type RichTextEditorProps = WithoutChildren<EditorProps>;
@@ -112,7 +114,7 @@ interface EditorToolbarProps {
112
114
  children: ReactNode;
113
115
  className?: string;
114
116
  }
115
- declare function EditorToolbar({ children, className }: EditorToolbarProps): React.JSX.Element;
117
+ declare function EditorToolbar({ children, className, slotName, }: EditorToolbarProps & SlotNameProps): React.JSX.Element;
116
118
  interface EditorControlProps {
117
119
  label: string;
118
120
  icon: LucideIcon;
@@ -121,6 +123,6 @@ interface EditorControlProps {
121
123
  onActivate: () => void;
122
124
  className?: string;
123
125
  }
124
- declare function EditorControl({ label, icon: Icon, pressed, disabled, onActivate, className, }: EditorControlProps): React.JSX.Element;
126
+ declare function EditorControl({ label, icon: Icon, pressed, disabled, onActivate, className, slotName, }: EditorControlProps & SlotNameProps): React.JSX.Element;
125
127
 
126
128
  export { Editor, EditorBlockquote, type EditorBlockquoteProps, EditorContent, type EditorContentProps, type EditorContextValue, EditorControl, type EditorControlProps, type EditorDocument, EditorHeading, type EditorHeadingProps, EditorHistory, type EditorHistoryAction, type EditorHistoryProps, type EditorLabels, EditorLink, type EditorLinkProps, EditorList, type EditorListProps, type EditorListVariant, EditorMark, type EditorMarkName, type EditorMarkProps, type EditorOutput, type EditorProps, EditorToolbar, type EditorToolbarProps, RichTextEditor, type RichTextEditorProps, defaultEditorExtensions, editorLabels, isSafeEditorUrl, useEditorContext };
package/dist/editor.js CHANGED
@@ -1,8 +1,8 @@
1
- import { Toggle } from './chunk-LKSM3WLK.js';
2
- import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, DialogFooter } from './chunk-6QM5BA7B.js';
3
- import { Separator } from './chunk-UUEWFCKT.js';
4
- import { Input } from './chunk-6X4TKSF6.js';
5
- import { cn, Button, fieldSurface, focusRing } from './chunk-DSD7MVLL.js';
1
+ import { Toggle } from './chunk-FWQFB37J.js';
2
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, DialogFooter } from './chunk-T2INZOCM.js';
3
+ import { Separator } from './chunk-TGF54WAO.js';
4
+ import { Input } from './chunk-XZCC6MTE.js';
5
+ import { cn, Button, fieldSurface, focusRing } from './chunk-ODYCBCKS.js';
6
6
  import { EditorContent as EditorContent$1, useEditor } from '@tiptap/react';
7
7
  import { createContext, useContext, useState, useRef, useMemo, useEffect, useId } from 'react';
8
8
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -18,32 +18,39 @@ function useEditorContext() {
18
18
  }
19
19
  return context;
20
20
  }
21
- function EditorContent({ className }) {
21
+ function EditorContent({
22
+ className,
23
+ slotName = "editor-content"
24
+ }) {
22
25
  const { editor, placeholder } = useEditorContext();
23
26
  return /* @__PURE__ */ jsx(
24
27
  "div",
25
28
  {
26
- "data-slot": "editor-content",
27
29
  "data-placeholder": placeholder,
28
30
  "data-empty": editor.isEmpty ? "" : void 0,
29
31
  className: cn(
30
32
  "data-empty:before:top-3 data-empty:before:left-4 data-empty:before:text-sm data-empty:before:font-medium relative w-full data-empty:before:pointer-events-none data-empty:before:absolute data-empty:before:text-muted-foreground data-empty:before:content-[attr(data-placeholder)]",
31
33
  className
32
34
  ),
35
+ "data-slot": slotName,
33
36
  children: /* @__PURE__ */ jsx(EditorContent$1, { editor })
34
37
  }
35
38
  );
36
39
  }
37
- function EditorToolbar({ children, className }) {
40
+ function EditorToolbar({
41
+ children,
42
+ className,
43
+ slotName = "editor-toolbar"
44
+ }) {
38
45
  const { labels } = useEditorContext();
39
46
  return /* @__PURE__ */ jsx(
40
47
  "div",
41
48
  {
42
- "data-slot": "editor-toolbar",
43
49
  role: "toolbar",
44
50
  "aria-label": labels.toolbarLabel,
45
51
  "aria-orientation": "horizontal",
46
52
  className: cn("gap-1 flex flex-wrap items-center", className),
53
+ "data-slot": slotName,
47
54
  children
48
55
  }
49
56
  );
@@ -54,13 +61,13 @@ function EditorControl({
54
61
  pressed = false,
55
62
  disabled = false,
56
63
  onActivate,
57
- className
64
+ className,
65
+ slotName = "editor-control"
58
66
  }) {
59
67
  const { editable } = useEditorContext();
60
68
  return /* @__PURE__ */ jsx(
61
69
  Toggle,
62
70
  {
63
- "data-slot": "editor-control",
64
71
  size: "sm",
65
72
  "aria-label": label,
66
73
  title: label,
@@ -68,6 +75,7 @@ function EditorControl({
68
75
  disabled: disabled || !editable,
69
76
  onPressedChange: onActivate,
70
77
  className,
78
+ slotName,
71
79
  children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
72
80
  }
73
81
  );
@@ -152,7 +160,8 @@ function EditorBlockquote({ label, className }) {
152
160
  function EditorHistory({
153
161
  action,
154
162
  label,
155
- className
163
+ className,
164
+ slotName = "editor-history"
156
165
  }) {
157
166
  const { editor, labels, editable } = useEditorContext();
158
167
  const undoing = action === "undo";
@@ -161,7 +170,6 @@ function EditorHistory({
161
170
  return /* @__PURE__ */ jsx(
162
171
  Button,
163
172
  {
164
- "data-slot": "editor-history",
165
173
  type: "button",
166
174
  variant: "ghost",
167
175
  size: "icon-sm",
@@ -170,6 +178,7 @@ function EditorHistory({
170
178
  disabled: !available || !editable,
171
179
  onClick: () => undoing ? editor.chain().focus().undo().run() : editor.chain().focus().redo().run(),
172
180
  className,
181
+ slotName,
173
182
  children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
174
183
  }
175
184
  );
@@ -240,7 +249,8 @@ function Editor({
240
249
  disabled = false,
241
250
  readOnly = false,
242
251
  className,
243
- children
252
+ children,
253
+ slotName = "editor"
244
254
  }) {
245
255
  const [revision, setRevision] = useState(0);
246
256
  const editable = !disabled && !readOnly;
@@ -308,18 +318,22 @@ function Editor({
308
318
  return /* @__PURE__ */ jsx(EditorContextProvider, { value: context, children: /* @__PURE__ */ jsx(
309
319
  "div",
310
320
  {
311
- "data-slot": "editor",
312
321
  "data-disabled": disabled ? "" : void 0,
313
322
  "data-readonly": readOnly ? "" : void 0,
314
323
  className: cn(
315
324
  "gap-2 flex w-full flex-col data-disabled:opacity-50",
316
325
  className
317
326
  ),
327
+ "data-slot": slotName,
318
328
  children
319
329
  }
320
330
  ) });
321
331
  }
322
- function EditorLink({ label, className }) {
332
+ function EditorLink({
333
+ label,
334
+ className,
335
+ slotName = "editor-link-dialog"
336
+ }) {
323
337
  const { editor, labels, editable } = useEditorContext();
324
338
  const [open, setOpen] = useState(false);
325
339
  const [href, setHref] = useState("");
@@ -352,7 +366,7 @@ function EditorLink({ label, className }) {
352
366
  className
353
367
  }
354
368
  ),
355
- /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(DialogContent, { "data-slot": "editor-link-dialog", children: [
369
+ /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(DialogContent, { slotName, children: [
356
370
  /* @__PURE__ */ jsxs(DialogHeader, { children: [
357
371
  /* @__PURE__ */ jsx(DialogTitle, { children: labels.linkDialogTitle }),
358
372
  /* @__PURE__ */ jsx(DialogDescription, { children: labels.linkDialogDescription })
@@ -363,7 +377,7 @@ function EditorLink({ label, className }) {
363
377
  Input,
364
378
  {
365
379
  id: fieldId,
366
- "data-slot": "editor-link-url",
380
+ slotName: "editor-link-url",
367
381
  value: href,
368
382
  placeholder: labels.linkUrlPlaceholder,
369
383
  onChange: (event) => setHref(event.target.value),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/editor/context.tsx","../src/components/ui/editor/content.tsx","../src/components/ui/editor/toolbar.tsx","../src/components/ui/editor/controls.tsx","../src/components/ui/editor/extensions.ts","../src/components/ui/editor/labels.ts","../src/components/ui/editor/editor.tsx","../src/components/ui/editor/link.tsx","../src/components/ui/editor/rich-text-editor.tsx"],"names":["TiptapContent","jsx","revision","useState","jsxs"],"mappings":"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","file":"editor.js","sourcesContent":["import type { Editor as TiptapEditor } from '@tiptap/core';\nimport { createContext, useContext } from 'react';\n\nimport type { EditorLabels } from '@/components/ui/editor/labels';\n\nexport interface EditorContextValue {\n editor: TiptapEditor;\n labels: EditorLabels;\n editable: boolean;\n placeholder?: string;\n}\n\nconst EditorContext = createContext<EditorContextValue | null>(null);\n\nexport const EditorContextProvider = EditorContext.Provider;\n\nexport function useEditorContext(): EditorContextValue {\n const context = useContext(EditorContext);\n\n if (context === null) {\n throw new Error('Editor parts must be used inside <Editor>.');\n }\n\n return context;\n}\n","import { EditorContent as TiptapContent } from '@tiptap/react';\n\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { cn } from '@/lib/utils';\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport function EditorContent({ className }: EditorContentProps) {\n const { editor, placeholder } = useEditorContext();\n\n return (\n <div\n data-slot=\"editor-content\"\n data-placeholder={placeholder}\n data-empty={editor.isEmpty ? '' : undefined}\n className={cn(\n 'data-empty:before:top-3 data-empty:before:left-4 data-empty:before:text-sm data-empty:before:font-medium relative w-full data-empty:before:pointer-events-none data-empty:before:absolute data-empty:before:text-muted-foreground data-empty:before:content-[attr(data-placeholder)]',\n className,\n )}\n >\n <TiptapContent editor={editor} />\n </div>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { Toggle } from '@/components/ui/toggle';\nimport { cn } from '@/lib/utils';\n\nexport interface EditorToolbarProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function EditorToolbar({ children, className }: EditorToolbarProps) {\n const { labels } = useEditorContext();\n\n return (\n <div\n data-slot=\"editor-toolbar\"\n role=\"toolbar\"\n aria-label={labels.toolbarLabel}\n aria-orientation=\"horizontal\"\n className={cn('gap-1 flex flex-wrap items-center', className)}\n >\n {children}\n </div>\n );\n}\n\nexport interface EditorControlProps {\n label: string;\n icon: LucideIcon;\n pressed?: boolean;\n disabled?: boolean;\n onActivate: () => void;\n className?: string;\n}\n\nexport function EditorControl({\n label,\n icon: Icon,\n pressed = false,\n disabled = false,\n onActivate,\n className,\n}: EditorControlProps) {\n const { editable } = useEditorContext();\n\n return (\n <Toggle\n data-slot=\"editor-control\"\n size=\"sm\"\n aria-label={label}\n title={label}\n pressed={pressed}\n disabled={disabled || !editable}\n onPressedChange={onActivate}\n className={className}\n >\n <Icon aria-hidden=\"true\" />\n </Toggle>\n );\n}\n","import {\n Bold,\n Code,\n Heading1,\n Heading2,\n Heading3,\n Heading4,\n Heading5,\n Heading6,\n Italic,\n List,\n ListOrdered,\n Quote,\n Redo2,\n Strikethrough,\n Undo2,\n type LucideIcon,\n} from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { EditorControl } from '@/components/ui/editor/toolbar';\n\nexport type EditorMarkName = 'bold' | 'italic' | 'strike' | 'code';\n\nconst MARK_ICONS: Record<EditorMarkName, LucideIcon> = {\n bold: Bold,\n italic: Italic,\n strike: Strikethrough,\n code: Code,\n};\n\nexport interface EditorMarkProps {\n mark: EditorMarkName;\n label?: string;\n className?: string;\n}\n\nexport function EditorMark({ mark, label, className }: EditorMarkProps) {\n const { editor, labels } = useEditorContext();\n\n const names: Record<EditorMarkName, string> = {\n bold: labels.boldLabel,\n italic: labels.italicLabel,\n strike: labels.strikeLabel,\n code: labels.codeLabel,\n };\n\n return (\n <EditorControl\n label={label ?? names[mark]}\n icon={MARK_ICONS[mark]}\n pressed={editor.isActive(mark)}\n disabled={!editor.can().toggleMark(mark)}\n onActivate={() => editor.chain().focus().toggleMark(mark).run()}\n className={className}\n />\n );\n}\n\nconst HEADING_ICONS: Record<number, LucideIcon> = {\n 1: Heading1,\n 2: Heading2,\n 3: Heading3,\n 4: Heading4,\n 5: Heading5,\n 6: Heading6,\n};\n\nexport interface EditorHeadingProps {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n label?: string;\n className?: string;\n}\n\nexport function EditorHeading({ level, label, className }: EditorHeadingProps) {\n const { editor, labels } = useEditorContext();\n\n return (\n <EditorControl\n label={label ?? labels.headingLabel(level)}\n icon={HEADING_ICONS[level]}\n pressed={editor.isActive('heading', { level })}\n disabled={\n !editor.can().toggleNode('heading', 'paragraph', { level })\n }\n onActivate={() =>\n editor.chain().focus().toggleHeading({ level }).run()\n }\n className={className}\n />\n );\n}\n\nexport type EditorListVariant = 'bullet' | 'ordered';\n\nexport interface EditorListProps {\n variant: EditorListVariant;\n label?: string;\n className?: string;\n}\n\nexport function EditorList({ variant, label, className }: EditorListProps) {\n const { editor, labels } = useEditorContext();\n const name = variant === 'bullet' ? 'bulletList' : 'orderedList';\n\n return (\n <EditorControl\n label={\n label ??\n (variant === 'bullet'\n ? labels.bulletListLabel\n : labels.orderedListLabel)\n }\n icon={variant === 'bullet' ? List : ListOrdered}\n pressed={editor.isActive(name)}\n disabled={!editor.can().toggleList(name, 'listItem')}\n onActivate={() =>\n variant === 'bullet'\n ? editor.chain().focus().toggleBulletList().run()\n : editor.chain().focus().toggleOrderedList().run()\n }\n className={className}\n />\n );\n}\n\nexport interface EditorBlockquoteProps {\n label?: string;\n className?: string;\n}\n\nexport function EditorBlockquote({ label, className }: EditorBlockquoteProps) {\n const { editor, labels } = useEditorContext();\n\n return (\n <EditorControl\n label={label ?? labels.blockquoteLabel}\n icon={Quote}\n pressed={editor.isActive('blockquote')}\n disabled={!editor.can().toggleWrap('blockquote')}\n onActivate={() => editor.chain().focus().toggleBlockquote().run()}\n className={className}\n />\n );\n}\n\nexport type EditorHistoryAction = 'undo' | 'redo';\n\nexport interface EditorHistoryProps {\n action: EditorHistoryAction;\n label?: string;\n className?: string;\n}\n\nexport function EditorHistory({\n action,\n label,\n className,\n}: EditorHistoryProps) {\n const { editor, labels, editable } = useEditorContext();\n const undoing = action === 'undo';\n const available = undoing ? editor.can().undo() : editor.can().redo();\n const Icon = undoing ? Undo2 : Redo2;\n\n return (\n <Button\n data-slot=\"editor-history\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={\n label ?? (undoing ? labels.undoLabel : labels.redoLabel)\n }\n title={label ?? (undoing ? labels.undoLabel : labels.redoLabel)}\n disabled={!available || !editable}\n onClick={() =>\n undoing\n ? editor.chain().focus().undo().run()\n : editor.chain().focus().redo().run()\n }\n className={className}\n >\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n}\n","import type { Extensions } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\n\nconst SAFE_PROTOCOLS = ['http', 'https', 'mailto', 'tel'];\n\nexport function isSafeEditorUrl(url: string): boolean {\n const protocol = /^([a-z][a-z0-9+.-]*):/i.exec(url.trim())?.[1];\n\n return (\n protocol === undefined ||\n SAFE_PROTOCOLS.includes(protocol.toLowerCase())\n );\n}\n\nexport function defaultEditorExtensions(): Extensions {\n return [\n StarterKit.configure({\n link: {\n openOnClick: false,\n autolink: true,\n protocols: SAFE_PROTOCOLS,\n isAllowedUri: (url) => isSafeEditorUrl(url),\n HTMLAttributes: {\n rel: 'noopener noreferrer nofollow',\n target: '_blank',\n },\n },\n }),\n ];\n}\n","export interface EditorLabels {\n toolbarLabel: string;\n boldLabel: string;\n italicLabel: string;\n strikeLabel: string;\n codeLabel: string;\n headingLabel: (level: number) => string;\n bulletListLabel: string;\n orderedListLabel: string;\n blockquoteLabel: string;\n undoLabel: string;\n redoLabel: string;\n linkLabel: string;\n linkDialogTitle: string;\n linkDialogDescription: string;\n linkUrlLabel: string;\n linkUrlPlaceholder: string;\n linkApplyLabel: string;\n linkRemoveLabel: string;\n linkCancelLabel: string;\n}\n\nexport const editorLabels: EditorLabels = {\n toolbarLabel: 'Formatting',\n boldLabel: 'Bold',\n italicLabel: 'Italic',\n strikeLabel: 'Strikethrough',\n codeLabel: 'Code',\n headingLabel: (level) => `Heading ${level}`,\n bulletListLabel: 'Bullet list',\n orderedListLabel: 'Numbered list',\n blockquoteLabel: 'Quote',\n undoLabel: 'Undo',\n redoLabel: 'Redo',\n linkLabel: 'Link',\n linkDialogTitle: 'Link',\n linkDialogDescription: 'Point the selected text at an address.',\n linkUrlLabel: 'Address',\n linkUrlPlaceholder: 'https://example.com',\n linkApplyLabel: 'Apply',\n linkRemoveLabel: 'Remove',\n linkCancelLabel: 'Cancel',\n};\n","import type { Extensions, JSONContent } from '@tiptap/core';\nimport { useEditor } from '@tiptap/react';\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport {\n EditorContextProvider,\n type EditorContextValue,\n} from '@/components/ui/editor/context';\nimport { defaultEditorExtensions } from '@/components/ui/editor/extensions';\nimport { editorLabels, type EditorLabels } from '@/components/ui/editor/labels';\nimport { fieldSurface, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nexport type EditorOutput = 'html' | 'json';\n\nexport type EditorDocument = string | JSONContent;\n\ninterface EditorSharedProps {\n extensions?: Extensions;\n labels?: EditorLabels;\n placeholder?: string;\n label?: string;\n disabled?: boolean;\n readOnly?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nexport type EditorProps = EditorSharedProps &\n (\n | {\n output?: 'html';\n value: string;\n onChange: (value: string) => void;\n }\n | {\n output: 'json';\n value: JSONContent;\n onChange: (value: JSONContent) => void;\n }\n );\n\nconst editorProse =\n 'text-sm font-medium leading-relaxed [&_p]:my-2 [&_h1]:mt-4 [&_h1]:mb-2 [&_h1]:text-2xl [&_h1]:font-bold [&_h2]:mt-4 [&_h2]:mb-2 [&_h2]:text-xl [&_h2]:font-bold [&_h3]:mt-3 [&_h3]:mb-2 [&_h3]:text-lg [&_h3]:font-semibold [&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6 [&_li]:my-1 [&_blockquote]:my-3 [&_blockquote]:border-l-2 [&_blockquote]:border-border [&_blockquote]:pl-4 [&_blockquote]:text-muted-foreground [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4 [&_code]:rounded-md [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-normal [&_pre]:my-3 [&_pre]:rounded-xl [&_pre]:bg-muted [&_pre]:p-4 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_hr]:my-4 [&_hr]:border-border';\n\nconst editingSurface = `${fieldSurface} ${focusRing} ${editorProse} min-h-32 w-full px-4 py-3 selection:bg-primary selection:text-primary-foreground`;\n\nfunction read(\n editor: { getHTML: () => string; getJSON: () => JSONContent },\n output: EditorOutput,\n): EditorDocument {\n return output === 'json' ? editor.getJSON() : editor.getHTML();\n}\n\nfunction isSameDocument(left: EditorDocument, right: EditorDocument): boolean {\n if (typeof left === 'string' && typeof right === 'string') {\n return left === right;\n }\n\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport function Editor({\n value,\n onChange,\n output = 'html',\n extensions,\n labels = editorLabels,\n placeholder,\n label,\n disabled = false,\n readOnly = false,\n className,\n children,\n}: EditorProps) {\n const [revision, setRevision] = useState(0);\n const editable = !disabled && !readOnly;\n const emit = useRef(onChange as (next: EditorDocument) => void);\n emit.current = onChange as (next: EditorDocument) => void;\n const emitted = useRef<EditorDocument | null>(null);\n\n const extensionSet = useMemo(\n () => extensions ?? defaultEditorExtensions(),\n [extensions],\n );\n\n const editor = useEditor(\n {\n extensions: extensionSet,\n content: value,\n editable,\n immediatelyRender: false,\n editorProps: {\n attributes: {\n 'data-slot': 'editor-surface',\n role: 'textbox',\n 'aria-multiline': 'true',\n ...(label === undefined ? {} : { 'aria-label': label }),\n class: editingSurface,\n },\n },\n onUpdate: ({ editor: instance }) => {\n const next = read(instance, output);\n\n emitted.current = next;\n emit.current(next);\n },\n },\n [extensionSet],\n );\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n\n const rerender = () => setRevision((revision) => revision + 1);\n\n editor.on('transaction', rerender);\n\n return () => {\n editor.off('transaction', rerender);\n };\n }, [editor]);\n\n useEffect(() => {\n editor?.setEditable(editable, false);\n }, [editor, editable]);\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n\n const echoed =\n emitted.current !== null && isSameDocument(emitted.current, value);\n\n if (echoed || isSameDocument(read(editor, output), value)) {\n return;\n }\n\n emitted.current = null;\n editor.commands.setContent(value, { emitUpdate: false });\n }, [editor, value, output]);\n\n const context = useMemo<EditorContextValue | null>(\n () =>\n editor === null ? null : { editor, labels, editable, placeholder },\n [editor, labels, editable, placeholder, revision],\n );\n\n if (context === null) {\n return null;\n }\n\n return (\n <EditorContextProvider value={context}>\n <div\n data-slot=\"editor\"\n data-disabled={disabled ? '' : undefined}\n data-readonly={readOnly ? '' : undefined}\n className={cn(\n 'gap-2 flex w-full flex-col data-disabled:opacity-50',\n className,\n )}\n >\n {children}\n </div>\n </EditorContextProvider>\n );\n}\n","import { Link2 } from 'lucide-react';\nimport { useId, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { isSafeEditorUrl } from '@/components/ui/editor/extensions';\nimport { EditorControl } from '@/components/ui/editor/toolbar';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\n\nexport interface EditorLinkProps {\n label?: string;\n className?: string;\n}\n\nexport function EditorLink({ label, className }: EditorLinkProps) {\n const { editor, labels, editable } = useEditorContext();\n const [open, setOpen] = useState(false);\n const [href, setHref] = useState('');\n const attached = editor.isActive('link');\n const fieldId = useId();\n\n function openDialog() {\n setHref(editor.getAttributes('link').href ?? '');\n setOpen(true);\n }\n\n function apply() {\n if (!isSafeEditorUrl(href)) {\n return;\n }\n\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: href.trim() })\n .run();\n\n setOpen(false);\n }\n\n function remove() {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n setOpen(false);\n }\n\n return (\n <>\n <EditorControl\n label={label ?? labels.linkLabel}\n icon={Link2}\n pressed={attached}\n disabled={!editable}\n onActivate={openDialog}\n className={className}\n />\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent data-slot=\"editor-link-dialog\">\n <DialogHeader>\n <DialogTitle>{labels.linkDialogTitle}</DialogTitle>\n <DialogDescription>\n {labels.linkDialogDescription}\n </DialogDescription>\n </DialogHeader>\n <div className=\"gap-2 flex flex-col\">\n <Label htmlFor={fieldId}>{labels.linkUrlLabel}</Label>\n <Input\n id={fieldId}\n data-slot=\"editor-link-url\"\n value={href}\n placeholder={labels.linkUrlPlaceholder}\n onChange={(event) => setHref(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n apply();\n }\n }}\n />\n </div>\n <DialogFooter>\n {attached && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={remove}\n >\n {labels.linkRemoveLabel}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen(false)}\n >\n {labels.linkCancelLabel}\n </Button>\n <Button\n type=\"button\"\n onClick={apply}\n disabled={href.trim() === ''}\n >\n {labels.linkApplyLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","import { EditorContent } from '@/components/ui/editor/content';\nimport {\n EditorBlockquote,\n EditorHeading,\n EditorHistory,\n EditorList,\n EditorMark,\n} from '@/components/ui/editor/controls';\nimport { Editor, type EditorProps } from '@/components/ui/editor/editor';\nimport { EditorLink } from '@/components/ui/editor/link';\nimport { EditorToolbar } from '@/components/ui/editor/toolbar';\nimport { Separator } from '@/components/ui/separator';\n\ntype WithoutChildren<T> = T extends unknown ? Omit<T, 'children'> : never;\n\nexport type RichTextEditorProps = WithoutChildren<EditorProps>;\n\nexport function RichTextEditor(props: RichTextEditorProps) {\n return (\n <Editor {...props}>\n <EditorToolbar>\n <EditorMark mark=\"bold\" />\n <EditorMark mark=\"italic\" />\n <EditorMark mark=\"strike\" />\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <EditorHeading level={2} />\n <EditorHeading level={3} />\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <EditorList variant=\"bullet\" />\n <EditorList variant=\"ordered\" />\n <EditorBlockquote />\n <EditorMark mark=\"code\" />\n <EditorLink />\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <EditorHistory action=\"undo\" />\n <EditorHistory action=\"redo\" />\n </EditorToolbar>\n <EditorContent />\n </Editor>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/ui/editor/context.tsx","../src/components/ui/editor/content.tsx","../src/components/ui/editor/toolbar.tsx","../src/components/ui/editor/controls.tsx","../src/components/ui/editor/extensions.ts","../src/components/ui/editor/labels.ts","../src/components/ui/editor/editor.tsx","../src/components/ui/editor/link.tsx","../src/components/ui/editor/rich-text-editor.tsx"],"names":["TiptapContent","jsx","revision","useState","jsxs"],"mappings":"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","file":"editor.js","sourcesContent":["import type { Editor as TiptapEditor } from '@tiptap/core';\nimport { createContext, useContext } from 'react';\n\nimport type { EditorLabels } from '@/components/ui/editor/labels';\n\nexport interface EditorContextValue {\n editor: TiptapEditor;\n labels: EditorLabels;\n editable: boolean;\n placeholder?: string;\n}\n\nconst EditorContext = createContext<EditorContextValue | null>(null);\n\nexport const EditorContextProvider = EditorContext.Provider;\n\nexport function useEditorContext(): EditorContextValue {\n const context = useContext(EditorContext);\n\n if (context === null) {\n throw new Error('Editor parts must be used inside <Editor>.');\n }\n\n return context;\n}\n","import { EditorContent as TiptapContent } from '@tiptap/react';\n\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport function EditorContent({\n className,\n slotName = 'editor-content',\n}: EditorContentProps & SlotNameProps) {\n const { editor, placeholder } = useEditorContext();\n\n return (\n <div\n data-placeholder={placeholder}\n data-empty={editor.isEmpty ? '' : undefined}\n className={cn(\n 'data-empty:before:top-3 data-empty:before:left-4 data-empty:before:text-sm data-empty:before:font-medium relative w-full data-empty:before:pointer-events-none data-empty:before:absolute data-empty:before:text-muted-foreground data-empty:before:content-[attr(data-placeholder)]',\n className,\n )}\n data-slot={slotName}\n >\n <TiptapContent editor={editor} />\n </div>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { Toggle } from '@/components/ui/toggle';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport interface EditorToolbarProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function EditorToolbar({\n children,\n className,\n slotName = 'editor-toolbar',\n}: EditorToolbarProps & SlotNameProps) {\n const { labels } = useEditorContext();\n\n return (\n <div\n role=\"toolbar\"\n aria-label={labels.toolbarLabel}\n aria-orientation=\"horizontal\"\n className={cn('gap-1 flex flex-wrap items-center', className)}\n data-slot={slotName}\n >\n {children}\n </div>\n );\n}\n\nexport interface EditorControlProps {\n label: string;\n icon: LucideIcon;\n pressed?: boolean;\n disabled?: boolean;\n onActivate: () => void;\n className?: string;\n}\n\nexport function EditorControl({\n label,\n icon: Icon,\n pressed = false,\n disabled = false,\n onActivate,\n className,\n slotName = 'editor-control',\n}: EditorControlProps & SlotNameProps) {\n const { editable } = useEditorContext();\n\n return (\n <Toggle\n size=\"sm\"\n aria-label={label}\n title={label}\n pressed={pressed}\n disabled={disabled || !editable}\n onPressedChange={onActivate}\n className={className}\n slotName={slotName}\n >\n <Icon aria-hidden=\"true\" />\n </Toggle>\n );\n}\n","import {\n Bold,\n Code,\n Heading1,\n Heading2,\n Heading3,\n Heading4,\n Heading5,\n Heading6,\n Italic,\n List,\n ListOrdered,\n Quote,\n Redo2,\n Strikethrough,\n Undo2,\n type LucideIcon,\n} from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { EditorControl } from '@/components/ui/editor/toolbar';\nimport type { SlotNameProps } from '@/types';\n\nexport type EditorMarkName = 'bold' | 'italic' | 'strike' | 'code';\n\nconst MARK_ICONS: Record<EditorMarkName, LucideIcon> = {\n bold: Bold,\n italic: Italic,\n strike: Strikethrough,\n code: Code,\n};\n\nexport interface EditorMarkProps {\n mark: EditorMarkName;\n label?: string;\n className?: string;\n}\n\nexport function EditorMark({ mark, label, className }: EditorMarkProps) {\n const { editor, labels } = useEditorContext();\n\n const names: Record<EditorMarkName, string> = {\n bold: labels.boldLabel,\n italic: labels.italicLabel,\n strike: labels.strikeLabel,\n code: labels.codeLabel,\n };\n\n return (\n <EditorControl\n label={label ?? names[mark]}\n icon={MARK_ICONS[mark]}\n pressed={editor.isActive(mark)}\n disabled={!editor.can().toggleMark(mark)}\n onActivate={() => editor.chain().focus().toggleMark(mark).run()}\n className={className}\n />\n );\n}\n\nconst HEADING_ICONS: Record<number, LucideIcon> = {\n 1: Heading1,\n 2: Heading2,\n 3: Heading3,\n 4: Heading4,\n 5: Heading5,\n 6: Heading6,\n};\n\nexport interface EditorHeadingProps {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n label?: string;\n className?: string;\n}\n\nexport function EditorHeading({ level, label, className }: EditorHeadingProps) {\n const { editor, labels } = useEditorContext();\n\n return (\n <EditorControl\n label={label ?? labels.headingLabel(level)}\n icon={HEADING_ICONS[level]}\n pressed={editor.isActive('heading', { level })}\n disabled={\n !editor.can().toggleNode('heading', 'paragraph', { level })\n }\n onActivate={() =>\n editor.chain().focus().toggleHeading({ level }).run()\n }\n className={className}\n />\n );\n}\n\nexport type EditorListVariant = 'bullet' | 'ordered';\n\nexport interface EditorListProps {\n variant: EditorListVariant;\n label?: string;\n className?: string;\n}\n\nexport function EditorList({ variant, label, className }: EditorListProps) {\n const { editor, labels } = useEditorContext();\n const name = variant === 'bullet' ? 'bulletList' : 'orderedList';\n\n return (\n <EditorControl\n label={\n label ??\n (variant === 'bullet'\n ? labels.bulletListLabel\n : labels.orderedListLabel)\n }\n icon={variant === 'bullet' ? List : ListOrdered}\n pressed={editor.isActive(name)}\n disabled={!editor.can().toggleList(name, 'listItem')}\n onActivate={() =>\n variant === 'bullet'\n ? editor.chain().focus().toggleBulletList().run()\n : editor.chain().focus().toggleOrderedList().run()\n }\n className={className}\n />\n );\n}\n\nexport interface EditorBlockquoteProps {\n label?: string;\n className?: string;\n}\n\nexport function EditorBlockquote({ label, className }: EditorBlockquoteProps) {\n const { editor, labels } = useEditorContext();\n\n return (\n <EditorControl\n label={label ?? labels.blockquoteLabel}\n icon={Quote}\n pressed={editor.isActive('blockquote')}\n disabled={!editor.can().toggleWrap('blockquote')}\n onActivate={() => editor.chain().focus().toggleBlockquote().run()}\n className={className}\n />\n );\n}\n\nexport type EditorHistoryAction = 'undo' | 'redo';\n\nexport interface EditorHistoryProps {\n action: EditorHistoryAction;\n label?: string;\n className?: string;\n}\n\nexport function EditorHistory({\n action,\n label,\n className,\n slotName = 'editor-history',\n}: EditorHistoryProps & SlotNameProps) {\n const { editor, labels, editable } = useEditorContext();\n const undoing = action === 'undo';\n const available = undoing ? editor.can().undo() : editor.can().redo();\n const Icon = undoing ? Undo2 : Redo2;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={\n label ?? (undoing ? labels.undoLabel : labels.redoLabel)\n }\n title={label ?? (undoing ? labels.undoLabel : labels.redoLabel)}\n disabled={!available || !editable}\n onClick={() =>\n undoing\n ? editor.chain().focus().undo().run()\n : editor.chain().focus().redo().run()\n }\n className={className}\n slotName={slotName}\n >\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n}\n","import type { Extensions } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\n\nconst SAFE_PROTOCOLS = ['http', 'https', 'mailto', 'tel'];\n\nexport function isSafeEditorUrl(url: string): boolean {\n const protocol = /^([a-z][a-z0-9+.-]*):/i.exec(url.trim())?.[1];\n\n return (\n protocol === undefined ||\n SAFE_PROTOCOLS.includes(protocol.toLowerCase())\n );\n}\n\nexport function defaultEditorExtensions(): Extensions {\n return [\n StarterKit.configure({\n link: {\n openOnClick: false,\n autolink: true,\n protocols: SAFE_PROTOCOLS,\n isAllowedUri: (url) => isSafeEditorUrl(url),\n HTMLAttributes: {\n rel: 'noopener noreferrer nofollow',\n target: '_blank',\n },\n },\n }),\n ];\n}\n","export interface EditorLabels {\n toolbarLabel: string;\n boldLabel: string;\n italicLabel: string;\n strikeLabel: string;\n codeLabel: string;\n headingLabel: (level: number) => string;\n bulletListLabel: string;\n orderedListLabel: string;\n blockquoteLabel: string;\n undoLabel: string;\n redoLabel: string;\n linkLabel: string;\n linkDialogTitle: string;\n linkDialogDescription: string;\n linkUrlLabel: string;\n linkUrlPlaceholder: string;\n linkApplyLabel: string;\n linkRemoveLabel: string;\n linkCancelLabel: string;\n}\n\nexport const editorLabels: EditorLabels = {\n toolbarLabel: 'Formatting',\n boldLabel: 'Bold',\n italicLabel: 'Italic',\n strikeLabel: 'Strikethrough',\n codeLabel: 'Code',\n headingLabel: (level) => `Heading ${level}`,\n bulletListLabel: 'Bullet list',\n orderedListLabel: 'Numbered list',\n blockquoteLabel: 'Quote',\n undoLabel: 'Undo',\n redoLabel: 'Redo',\n linkLabel: 'Link',\n linkDialogTitle: 'Link',\n linkDialogDescription: 'Point the selected text at an address.',\n linkUrlLabel: 'Address',\n linkUrlPlaceholder: 'https://example.com',\n linkApplyLabel: 'Apply',\n linkRemoveLabel: 'Remove',\n linkCancelLabel: 'Cancel',\n};\n","import type { Extensions, JSONContent } from '@tiptap/core';\nimport { useEditor } from '@tiptap/react';\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport {\n EditorContextProvider,\n type EditorContextValue,\n} from '@/components/ui/editor/context';\nimport { defaultEditorExtensions } from '@/components/ui/editor/extensions';\nimport { editorLabels, type EditorLabels } from '@/components/ui/editor/labels';\nimport { fieldSurface, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport type EditorOutput = 'html' | 'json';\n\nexport type EditorDocument = string | JSONContent;\n\ninterface EditorSharedProps {\n extensions?: Extensions;\n labels?: EditorLabels;\n placeholder?: string;\n label?: string;\n disabled?: boolean;\n readOnly?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nexport type EditorProps = EditorSharedProps &\n (\n | {\n output?: 'html';\n value: string;\n onChange: (value: string) => void;\n }\n | {\n output: 'json';\n value: JSONContent;\n onChange: (value: JSONContent) => void;\n }\n );\n\nconst editorProse =\n 'text-sm font-medium leading-relaxed [&_p]:my-2 [&_h1]:mt-4 [&_h1]:mb-2 [&_h1]:text-2xl [&_h1]:font-bold [&_h2]:mt-4 [&_h2]:mb-2 [&_h2]:text-xl [&_h2]:font-bold [&_h3]:mt-3 [&_h3]:mb-2 [&_h3]:text-lg [&_h3]:font-semibold [&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6 [&_li]:my-1 [&_blockquote]:my-3 [&_blockquote]:border-l-2 [&_blockquote]:border-border [&_blockquote]:pl-4 [&_blockquote]:text-muted-foreground [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4 [&_code]:rounded-md [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-normal [&_pre]:my-3 [&_pre]:rounded-xl [&_pre]:bg-muted [&_pre]:p-4 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_hr]:my-4 [&_hr]:border-border';\n\nconst editingSurface = `${fieldSurface} ${focusRing} ${editorProse} min-h-32 w-full px-4 py-3 selection:bg-primary selection:text-primary-foreground`;\n\nfunction read(\n editor: { getHTML: () => string; getJSON: () => JSONContent },\n output: EditorOutput,\n): EditorDocument {\n return output === 'json' ? editor.getJSON() : editor.getHTML();\n}\n\nfunction isSameDocument(left: EditorDocument, right: EditorDocument): boolean {\n if (typeof left === 'string' && typeof right === 'string') {\n return left === right;\n }\n\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport function Editor({\n value,\n onChange,\n output = 'html',\n extensions,\n labels = editorLabels,\n placeholder,\n label,\n disabled = false,\n readOnly = false,\n className,\n children,\n slotName = 'editor',\n}: EditorProps & SlotNameProps) {\n const [revision, setRevision] = useState(0);\n const editable = !disabled && !readOnly;\n const emit = useRef(onChange as (next: EditorDocument) => void);\n emit.current = onChange as (next: EditorDocument) => void;\n const emitted = useRef<EditorDocument | null>(null);\n\n const extensionSet = useMemo(\n () => extensions ?? defaultEditorExtensions(),\n [extensions],\n );\n\n const editor = useEditor(\n {\n extensions: extensionSet,\n content: value,\n editable,\n immediatelyRender: false,\n editorProps: {\n attributes: {\n 'data-slot': 'editor-surface',\n role: 'textbox',\n 'aria-multiline': 'true',\n ...(label === undefined ? {} : { 'aria-label': label }),\n class: editingSurface,\n },\n },\n onUpdate: ({ editor: instance }) => {\n const next = read(instance, output);\n\n emitted.current = next;\n emit.current(next);\n },\n },\n [extensionSet],\n );\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n\n const rerender = () => setRevision((revision) => revision + 1);\n\n editor.on('transaction', rerender);\n\n return () => {\n editor.off('transaction', rerender);\n };\n }, [editor]);\n\n useEffect(() => {\n editor?.setEditable(editable, false);\n }, [editor, editable]);\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n\n const echoed =\n emitted.current !== null && isSameDocument(emitted.current, value);\n\n if (echoed || isSameDocument(read(editor, output), value)) {\n return;\n }\n\n emitted.current = null;\n editor.commands.setContent(value, { emitUpdate: false });\n }, [editor, value, output]);\n\n const context = useMemo<EditorContextValue | null>(\n () =>\n editor === null ? null : { editor, labels, editable, placeholder },\n [editor, labels, editable, placeholder, revision],\n );\n\n if (context === null) {\n return null;\n }\n\n return (\n <EditorContextProvider value={context}>\n <div\n data-disabled={disabled ? '' : undefined}\n data-readonly={readOnly ? '' : undefined}\n className={cn(\n 'gap-2 flex w-full flex-col data-disabled:opacity-50',\n className,\n )}\n data-slot={slotName}\n >\n {children}\n </div>\n </EditorContextProvider>\n );\n}\n","import { Link2 } from 'lucide-react';\nimport { useId, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { useEditorContext } from '@/components/ui/editor/context';\nimport { isSafeEditorUrl } from '@/components/ui/editor/extensions';\nimport { EditorControl } from '@/components/ui/editor/toolbar';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport type { SlotNameProps } from '@/types';\n\nexport interface EditorLinkProps {\n label?: string;\n className?: string;\n}\n\nexport function EditorLink({\n label,\n className,\n slotName = 'editor-link-dialog',\n}: EditorLinkProps & SlotNameProps) {\n const { editor, labels, editable } = useEditorContext();\n const [open, setOpen] = useState(false);\n const [href, setHref] = useState('');\n const attached = editor.isActive('link');\n const fieldId = useId();\n\n function openDialog() {\n setHref(editor.getAttributes('link').href ?? '');\n setOpen(true);\n }\n\n function apply() {\n if (!isSafeEditorUrl(href)) {\n return;\n }\n\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: href.trim() })\n .run();\n\n setOpen(false);\n }\n\n function remove() {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n setOpen(false);\n }\n\n return (\n <>\n <EditorControl\n label={label ?? labels.linkLabel}\n icon={Link2}\n pressed={attached}\n disabled={!editable}\n onActivate={openDialog}\n className={className}\n />\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent slotName={slotName}>\n <DialogHeader>\n <DialogTitle>{labels.linkDialogTitle}</DialogTitle>\n <DialogDescription>\n {labels.linkDialogDescription}\n </DialogDescription>\n </DialogHeader>\n <div className=\"gap-2 flex flex-col\">\n <Label htmlFor={fieldId}>{labels.linkUrlLabel}</Label>\n <Input\n id={fieldId}\n slotName=\"editor-link-url\"\n value={href}\n placeholder={labels.linkUrlPlaceholder}\n onChange={(event) => setHref(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n apply();\n }\n }}\n />\n </div>\n <DialogFooter>\n {attached && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={remove}\n >\n {labels.linkRemoveLabel}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen(false)}\n >\n {labels.linkCancelLabel}\n </Button>\n <Button\n type=\"button\"\n onClick={apply}\n disabled={href.trim() === ''}\n >\n {labels.linkApplyLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","import { EditorContent } from '@/components/ui/editor/content';\nimport {\n EditorBlockquote,\n EditorHeading,\n EditorHistory,\n EditorList,\n EditorMark,\n} from '@/components/ui/editor/controls';\nimport { Editor, type EditorProps } from '@/components/ui/editor/editor';\nimport { EditorLink } from '@/components/ui/editor/link';\nimport { EditorToolbar } from '@/components/ui/editor/toolbar';\nimport { Separator } from '@/components/ui/separator';\n\ntype WithoutChildren<T> = T extends unknown ? Omit<T, 'children'> : never;\n\nexport type RichTextEditorProps = WithoutChildren<EditorProps>;\n\nexport function RichTextEditor(props: RichTextEditorProps) {\n return (\n <Editor {...props}>\n <EditorToolbar>\n <EditorMark mark=\"bold\" />\n <EditorMark mark=\"italic\" />\n <EditorMark mark=\"strike\" />\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <EditorHeading level={2} />\n <EditorHeading level={3} />\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <EditorList variant=\"bullet\" />\n <EditorList variant=\"ordered\" />\n <EditorBlockquote />\n <EditorMark mark=\"code\" />\n <EditorLink />\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <EditorHistory action=\"undo\" />\n <EditorHistory action=\"redo\" />\n </EditorToolbar>\n <EditorContent />\n </Editor>\n );\n}\n"]}