formanitor 0.2.11 → 0.2.12
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/dist/{RichTextWidget-NJHWDCAT.cjs → RichTextWidget-5A3ZRPH7.cjs} +4 -4
- package/dist/{RichTextWidget-25JIMEWA.mjs.map → RichTextWidget-5A3ZRPH7.cjs.map} +1 -1
- package/dist/{RichTextWidget-25JIMEWA.mjs → RichTextWidget-UVKVVRFX.mjs} +3 -3
- package/dist/{RichTextWidget-NJHWDCAT.cjs.map → RichTextWidget-UVKVVRFX.mjs.map} +1 -1
- package/dist/{chunk-PRKGLE57.mjs → chunk-NNKHB7JW.mjs} +7 -2
- package/dist/chunk-NNKHB7JW.mjs.map +1 -0
- package/dist/{chunk-RGVDR724.cjs → chunk-SXTI7LDP.cjs} +7 -2
- package/dist/chunk-SXTI7LDP.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/rich-text.cjs +2 -2
- package/dist/rich-text.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-PRKGLE57.mjs.map +0 -1
- package/dist/chunk-RGVDR724.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSXTI7LDP_cjs = require('./chunk-SXTI7LDP.cjs');
|
|
4
4
|
var chunkIFSKLIS2_cjs = require('./chunk-IFSKLIS2.cjs');
|
|
5
5
|
require('./chunk-L2H5SOAV.cjs');
|
|
6
6
|
require('./chunk-5E3APMY6.cjs');
|
|
@@ -14,11 +14,11 @@ require('./chunk-FHHISVCH.cjs');
|
|
|
14
14
|
|
|
15
15
|
Object.defineProperty(exports, "RichTextWidget", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkSXTI7LDP_cjs.RichTextWidget; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "richTextHtmlClassName", {
|
|
20
20
|
enumerable: true,
|
|
21
21
|
get: function () { return chunkIFSKLIS2_cjs.richTextHtmlClassName; }
|
|
22
22
|
});
|
|
23
|
-
//# sourceMappingURL=RichTextWidget-
|
|
24
|
-
//# sourceMappingURL=RichTextWidget-
|
|
23
|
+
//# sourceMappingURL=RichTextWidget-5A3ZRPH7.cjs.map
|
|
24
|
+
//# sourceMappingURL=RichTextWidget-5A3ZRPH7.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"RichTextWidget-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"RichTextWidget-5A3ZRPH7.cjs"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { RichTextWidget } from './chunk-
|
|
1
|
+
export { RichTextWidget } from './chunk-NNKHB7JW.mjs';
|
|
2
2
|
export { richTextHtmlClassName } from './chunk-I4AV6BQF.mjs';
|
|
3
3
|
import './chunk-QM6UMI2M.mjs';
|
|
4
4
|
import './chunk-WYVXXEZI.mjs';
|
|
@@ -7,5 +7,5 @@ import './chunk-GXXWMHAA.mjs';
|
|
|
7
7
|
import './chunk-HKEUAERY.mjs';
|
|
8
8
|
import './chunk-HEFZA2AH.mjs';
|
|
9
9
|
import './chunk-VPU66PI6.mjs';
|
|
10
|
-
//# sourceMappingURL=RichTextWidget-
|
|
11
|
-
//# sourceMappingURL=RichTextWidget-
|
|
10
|
+
//# sourceMappingURL=RichTextWidget-UVKVVRFX.mjs.map
|
|
11
|
+
//# sourceMappingURL=RichTextWidget-UVKVVRFX.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"RichTextWidget-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"RichTextWidget-UVKVVRFX.mjs"}
|
|
@@ -279,6 +279,11 @@ var RichTextWidget = ({ fieldId }) => {
|
|
|
279
279
|
class: "tiptap focus:outline-none",
|
|
280
280
|
style: `min-height: ${minHeight}px`
|
|
281
281
|
},
|
|
282
|
+
// Windows clipboard paths (RDP/Citrix, clipboard managers, native DOM
|
|
283
|
+
// serialization) copy ProseMirror's invisible trailing-break <br>s as
|
|
284
|
+
// real content; strip them before parsing so they can't become
|
|
285
|
+
// hardBreak nodes (blank lines) in the pasted text.
|
|
286
|
+
transformPastedHTML: (html) => html.replace(/<br[^>]*ProseMirror-trailingBreak[^>]*>/gi, ""),
|
|
282
287
|
transformPasted: cleanPastedSlice
|
|
283
288
|
}
|
|
284
289
|
},
|
|
@@ -378,5 +383,5 @@ var RichTextWidget = ({ fieldId }) => {
|
|
|
378
383
|
};
|
|
379
384
|
|
|
380
385
|
export { RichTextWidget };
|
|
381
|
-
//# sourceMappingURL=chunk-
|
|
382
|
-
//# sourceMappingURL=chunk-
|
|
386
|
+
//# sourceMappingURL=chunk-NNKHB7JW.mjs.map
|
|
387
|
+
//# sourceMappingURL=chunk-NNKHB7JW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["jsx","UnderlineIcon","TableIcon"],"mappings":"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","file":"chunk-NNKHB7JW.mjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport { Slice } from '@tiptap/pm/model';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction isEmptyParagraph(node: PMNode | null): boolean {\n return !!node && node.type.name === 'paragraph' && node.content.size === 0;\n}\n\n/**\n * Clean up pasted content. Clipboard HTML that did not come from ProseMirror's\n * own copy handler (Windows clipboard layers, RDP/Citrix, native browser\n * serialization) carries invisible empty paragraphs and trailing-break <br>s\n * around the copied text; pasted as-is they split the target paragraph and add\n * blank lines above/below.\n * 1. Drop empty paragraphs at both edges of the pasted slice.\n * 2. Open the slice ends when the edge block is a plain paragraph, so pasting\n * mid-paragraph merges into the surrounding text (word-processor behavior)\n * instead of splitting it. Tables/lists keep their default block behavior.\n */\nfunction cleanPastedSlice(slice: Slice): Slice {\n let content = slice.content;\n let openStart = slice.openStart;\n let openEnd = slice.openEnd;\n\n while (content.childCount > 1 && isEmptyParagraph(content.firstChild)) {\n content = content.cut(content.firstChild!.nodeSize);\n openStart = 0;\n }\n while (content.childCount > 1 && isEmptyParagraph(content.lastChild)) {\n content = content.cut(0, content.size - content.lastChild!.nodeSize);\n openEnd = 0;\n }\n\n if (content.firstChild?.type.name === 'paragraph') openStart = Math.max(1, openStart);\n if (content.lastChild?.type.name === 'paragraph') openEnd = Math.max(1, openEnd);\n\n return new Slice(content, openStart, openEnd);\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n // Windows clipboard paths (RDP/Citrix, clipboard managers, native DOM\n // serialization) copy ProseMirror's invisible trailing-break <br>s as\n // real content; strip them before parsing so they can't become\n // hardBreak nodes (blank lines) in the pasted text.\n transformPastedHTML: (html) =>\n html.replace(/<br[^>]*ProseMirror-trailingBreak[^>]*>/gi, ''),\n transformPasted: cleanPastedSlice,\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}
|
|
@@ -306,6 +306,11 @@ var RichTextWidget = ({ fieldId }) => {
|
|
|
306
306
|
class: "tiptap focus:outline-none",
|
|
307
307
|
style: `min-height: ${minHeight}px`
|
|
308
308
|
},
|
|
309
|
+
// Windows clipboard paths (RDP/Citrix, clipboard managers, native DOM
|
|
310
|
+
// serialization) copy ProseMirror's invisible trailing-break <br>s as
|
|
311
|
+
// real content; strip them before parsing so they can't become
|
|
312
|
+
// hardBreak nodes (blank lines) in the pasted text.
|
|
313
|
+
transformPastedHTML: (html) => html.replace(/<br[^>]*ProseMirror-trailingBreak[^>]*>/gi, ""),
|
|
309
314
|
transformPasted: cleanPastedSlice
|
|
310
315
|
}
|
|
311
316
|
},
|
|
@@ -405,5 +410,5 @@ var RichTextWidget = ({ fieldId }) => {
|
|
|
405
410
|
};
|
|
406
411
|
|
|
407
412
|
exports.RichTextWidget = RichTextWidget;
|
|
408
|
-
//# sourceMappingURL=chunk-
|
|
409
|
-
//# sourceMappingURL=chunk-
|
|
413
|
+
//# sourceMappingURL=chunk-SXTI7LDP.cjs.map
|
|
414
|
+
//# sourceMappingURL=chunk-SXTI7LDP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["React","jsx","SeparatorPrimitive","cn","Slice","StarterKit","Underline","Placeholder","Table","TableRow","TableHeader","TableCell","useReducer","useEffect","Button","jsxs","Bold","Italic","UnderlineIcon","Strikethrough","List","ListOrdered","Fragment","TableIcon","Rows2","Columns2","TableRowsSplit","TableColumnsSplit","Trash2","Undo","Redo","useField","useForm","useFormStore","useMemo","useEditor","isLabelVisible","FieldRequiredIndicator","Label","fieldLabelClass","fieldWrapperClass","VoiceMicButton","fieldControlClass","EditorContent","fieldErrorClass"],"mappings":"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","file":"chunk-SXTI7LDP.cjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport { Slice } from '@tiptap/pm/model';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction isEmptyParagraph(node: PMNode | null): boolean {\n return !!node && node.type.name === 'paragraph' && node.content.size === 0;\n}\n\n/**\n * Clean up pasted content. Clipboard HTML that did not come from ProseMirror's\n * own copy handler (Windows clipboard layers, RDP/Citrix, native browser\n * serialization) carries invisible empty paragraphs and trailing-break <br>s\n * around the copied text; pasted as-is they split the target paragraph and add\n * blank lines above/below.\n * 1. Drop empty paragraphs at both edges of the pasted slice.\n * 2. Open the slice ends when the edge block is a plain paragraph, so pasting\n * mid-paragraph merges into the surrounding text (word-processor behavior)\n * instead of splitting it. Tables/lists keep their default block behavior.\n */\nfunction cleanPastedSlice(slice: Slice): Slice {\n let content = slice.content;\n let openStart = slice.openStart;\n let openEnd = slice.openEnd;\n\n while (content.childCount > 1 && isEmptyParagraph(content.firstChild)) {\n content = content.cut(content.firstChild!.nodeSize);\n openStart = 0;\n }\n while (content.childCount > 1 && isEmptyParagraph(content.lastChild)) {\n content = content.cut(0, content.size - content.lastChild!.nodeSize);\n openEnd = 0;\n }\n\n if (content.firstChild?.type.name === 'paragraph') openStart = Math.max(1, openStart);\n if (content.lastChild?.type.name === 'paragraph') openEnd = Math.max(1, openEnd);\n\n return new Slice(content, openStart, openEnd);\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n // Windows clipboard paths (RDP/Citrix, clipboard managers, native DOM\n // serialization) copy ProseMirror's invisible trailing-break <br>s as\n // real content; strip them before parsing so they can't become\n // hardBreak nodes (blank lines) in the pasted text.\n transformPastedHTML: (html) =>\n html.replace(/<br[^>]*ProseMirror-trailingBreak[^>]*>/gi, ''),\n transformPasted: cleanPastedSlice,\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -2185,7 +2185,7 @@ var CampTimeSlotsWidget = ({ fieldId }) => {
|
|
|
2185
2185
|
function lazyNamed(loader, name) {
|
|
2186
2186
|
return React6__namespace.default.lazy(async () => ({ default: (await loader())[name] }));
|
|
2187
2187
|
}
|
|
2188
|
-
var RichTextWidget = lazyNamed(() => import('./RichTextWidget-
|
|
2188
|
+
var RichTextWidget = lazyNamed(() => import('./RichTextWidget-5A3ZRPH7.cjs'), "RichTextWidget");
|
|
2189
2189
|
var DateWidget = lazyNamed(() => import('./DateWidget-HIYZ3TY7.cjs'), "DateWidget");
|
|
2190
2190
|
var DateTimeWidget = lazyNamed(() => import('./DateTimeWidget-3E6N4NOK.cjs'), "DateTimeWidget");
|
|
2191
2191
|
var EditableTableWidget = lazyNamed(() => import('./EditableTable-OFVKAYRA.cjs'), "EditableTableWidget");
|
package/dist/index.mjs
CHANGED
|
@@ -2170,7 +2170,7 @@ var CampTimeSlotsWidget = ({ fieldId }) => {
|
|
|
2170
2170
|
function lazyNamed(loader, name) {
|
|
2171
2171
|
return React6__default.lazy(async () => ({ default: (await loader())[name] }));
|
|
2172
2172
|
}
|
|
2173
|
-
var RichTextWidget = lazyNamed(() => import('./RichTextWidget-
|
|
2173
|
+
var RichTextWidget = lazyNamed(() => import('./RichTextWidget-UVKVVRFX.mjs'), "RichTextWidget");
|
|
2174
2174
|
var DateWidget = lazyNamed(() => import('./DateWidget-5LFXAWRK.mjs'), "DateWidget");
|
|
2175
2175
|
var DateTimeWidget = lazyNamed(() => import('./DateTimeWidget-TAHCCYCX.mjs'), "DateTimeWidget");
|
|
2176
2176
|
var EditableTableWidget = lazyNamed(() => import('./EditableTable-ECNOISL3.mjs'), "EditableTableWidget");
|
package/dist/rich-text.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSXTI7LDP_cjs = require('./chunk-SXTI7LDP.cjs');
|
|
4
4
|
var chunkIFSKLIS2_cjs = require('./chunk-IFSKLIS2.cjs');
|
|
5
5
|
require('./chunk-L2H5SOAV.cjs');
|
|
6
6
|
require('./chunk-5E3APMY6.cjs');
|
|
@@ -14,7 +14,7 @@ require('./chunk-FHHISVCH.cjs');
|
|
|
14
14
|
|
|
15
15
|
Object.defineProperty(exports, "RichTextWidget", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkSXTI7LDP_cjs.RichTextWidget; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "richTextHtmlClassName", {
|
|
20
20
|
enumerable: true,
|
package/dist/rich-text.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["jsx","UnderlineIcon","TableIcon"],"mappings":";;;;;;;;;;;;;;;;;;;AAKA,IAAM,SAAA,GAAkB,KAAA,CAAA,UAAA;AAAA,EAItB,CACE,EAAE,SAAA,EAAW,WAAA,GAAc,YAAA,EAAc,aAAa,IAAA,EAAM,GAAG,KAAA,EAAM,EACrE,GAAA,qBAEA,GAAA;AAAA,IAAoB,kBAAA,CAAA,IAAA;AAAA,IAAnB;AAAA,MACC,GAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,oBAAA;AAAA,QACA,WAAA,KAAgB,eAAe,gBAAA,GAAmB,gBAAA;AAAA,QAClD;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV,CAAA;AACA,SAAA,CAAU,cAAiC,kBAAA,CAAA,IAAA,CAAK,WAAA;ACkBhD,SAAS,YAAY,IAAA,EAAuB;AAC1C,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,EAAA,OACE,MAAM,EAAA,IACN,CAAA,KAAM,SAAA,IACN,CAAA,KAAM,iBACN,CAAA,KAAM,+CAAA;AAEV;AAEA,SAAS,iBAAiB,IAAA,EAA8B;AACtD,EAAA,OAAO,CAAC,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA;AAC3E;AAaA,SAAS,iBAAiB,KAAA,EAAqB;AAC7C,EAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AACpB,EAAA,IAAI,YAAY,KAAA,CAAM,SAAA;AACtB,EAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,EAAA,OAAO,QAAQ,UAAA,GAAa,CAAA,IAAK,gBAAA,CAAiB,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrE,IAAA,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,UAAA,CAAY,QAAQ,CAAA;AAClD,IAAA,SAAA,GAAY,CAAA;AAAA,EACd;AACA,EAAA,OAAO,QAAQ,UAAA,GAAa,CAAA,IAAK,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpE,IAAA,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAA,EAAG,QAAQ,IAAA,GAAO,OAAA,CAAQ,UAAW,QAAQ,CAAA;AACnE,IAAA,OAAA,GAAU,CAAA;AAAA,EACZ;AAEA,EAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,CAAK,IAAA,KAAS,aAAa,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AACpF,EAAA,IAAI,OAAA,CAAQ,WAAW,IAAA,CAAK,IAAA,KAAS,aAAa,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA;AAE/E,EAAA,OAAO,IAAI,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAC9C;AAEA,SAAS,uBAAA,CAAwB,aAAqB,MAAA,EAA6B;AACjF,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,WAAW,SAAA,CAAU;AAAA;AAAA,MAEnB,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY;AAAA,QACV,cAAA,EAAgB;AAAA,UACd,KAAA,EAAO;AAAA;AACT,OACF;AAAA,MACA,WAAA,EAAa;AAAA,QACX,cAAA,EAAgB;AAAA,UACd,KAAA,EAAO;AAAA;AACT,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB;AAAA,UACd,KAAA,EAAO;AAAA;AACT;AACF,KACD,CAAA;AAAA,IACD,SAAA;AAAA,IACA,YAAY,SAAA,CAAU;AAAA,MACpB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAM,SAAA,CAAU;AAAA,MACd,SAAA,EAAW,IAAA;AAAA;AAAA,MAEX,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,IACD,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,GAAG,QAAQ,CAAA,GAAI,WAAW,CAAC,CAAA,KAAc,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAEvD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,IAAA,MAAA,CAAO,EAAA,CAAG,mBAAmB,OAAO,CAAA;AACpC,IAAA,MAAA,CAAO,EAAA,CAAG,eAAe,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAmB,OAAO,CAAA;AACrC,MAAA,MAAA,CAAO,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EAAkF,CAAA;AAAA,EAErG;AAEA,EAAA,MAAM,SAAS,CAAC,MAAA,EAAiB,OAAA,EAAqB,IAAA,EAAuB,0BAC3EA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,SAAS,WAAA,GAAc,SAAA;AAAA,MAChC,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,kBAAA;AAAA,MACV,QAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,IAAI,CAAC,UAAU,OAAA,EAAQ;AAAA,MACzB,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,MAAM,OAAA,GAAU,aAAA,IAAiB,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AAExD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iFAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAW,sBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,QAAA,MAAA;AAAA,UACC,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,UACtB,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,UAAA,GAAa,GAAA,EAAI;AAAA,0BAC9CA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UAC1B;AAAA,SACF;AAAA,QACC,MAAA;AAAA,UACC,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,UACxB,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,YAAA,GAAe,GAAA,EAAI;AAAA,0BAChDA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UAC5B;AAAA,SACF;AAAA,QACC,MAAA;AAAA,UACC,MAAA,CAAO,SAAS,WAAW,CAAA;AAAA,UAC3B,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,eAAA,GAAkB,GAAA,EAAI;AAAA,0BACnDA,GAAAA,CAACC,WAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UACnC;AAAA,SACF;AAAA,QACC,MAAA;AAAA,UACC,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,UACxB,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,YAAA,GAAe,GAAA,EAAI;AAAA,0BAChDD,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UACnC;AAAA,SACF;AAAA,wBAEAA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,YAAA,EAAa,CAAA;AAAA,QAExD,MAAA;AAAA,UACC,MAAA,CAAO,SAAS,YAAY,CAAA;AAAA,UAC5B,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,gBAAA,GAAmB,GAAA,EAAI;AAAA,0BACpDA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UAC1B;AAAA,SACF;AAAA,QACC,MAAA;AAAA,UACC,MAAA,CAAO,SAAS,aAAa,CAAA;AAAA,UAC7B,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,iBAAA,GAAoB,GAAA,EAAI;AAAA,0BACrDA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UACjC;AAAA,SACF;AAAA,QAEC,iCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,YAAA,EAAa,CAAA;AAAA,UACxD,CAAC,OAAA,GACA,MAAA;AAAA,YACE,KAAA;AAAA,YACA,MACE,MAAA,CACG,KAAA,EAAM,CACN,KAAA,GACA,WAAA,CAAY,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAG,aAAA,EAAe,IAAA,EAAM,EACrD,GAAA,EAAI;AAAA,4BACTA,GAAAA,CAACE,OAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAC/B;AAAA,8BAGF,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,MAAA;AAAA,cACC,KAAA;AAAA,cACA,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,WAAA,GAAc,GAAA,EAAI;AAAA,8BAC/CF,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC3B;AAAA,aACF;AAAA,YACC,MAAA;AAAA,cACC,KAAA;AAAA,cACA,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,cAAA,GAAiB,GAAA,EAAI;AAAA,8BAClDA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC9B;AAAA,aACF;AAAA,YACC,MAAA;AAAA,cACC,KAAA;AAAA,cACA,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,SAAA,GAAY,GAAA,EAAI;AAAA,8BAC7CA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cACpC;AAAA,aACF;AAAA,YACC,MAAA;AAAA,cACC,KAAA;AAAA,cACA,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,YAAA,GAAe,GAAA,EAAI;AAAA,8BAChDA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cACvC;AAAA,aACF;AAAA,YACC,MAAA;AAAA,cACC,KAAA;AAAA,cACA,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,WAAA,GAAc,GAAA,EAAI;AAAA,8BAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC5B;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAGFA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,YAAA,EAAa,CAAA;AAAA,wBAEzDA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,kBAAA;AAAA,YACV,UAAU,QAAA,IAAY,CAAC,MAAA,CAAO,GAAA,GAAM,IAAA,EAAK;AAAA,YACzC,KAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,IAAA,EAAK,CAAE,GAAA,EAAI;AAAA,YAEjD,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SAC5B;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,kBAAA;AAAA,YACV,UAAU,QAAA,IAAY,CAAC,MAAA,CAAO,GAAA,GAAM,IAAA,EAAK;AAAA,YACzC,KAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,IAAA,EAAK,CAAE,GAAA,EAAI;AAAA,YAEjD,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC5B;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,cAAA,GAAgD,CAAC,EAAE,OAAA,EAAQ,KAAM;AAC5E,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,OAAO,QAAA,EAAU,OAAA,EAAQ,GAAI,QAAA,CAAS,OAAO,CAAA;AAC5F,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,OAAA,EAAQ;AAC1B,EAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,EAAA,MAAM,WAAW,CAAC,EAAE,QAAA,EAAU,KAAA,IAAS,MAAM,QAAA,EAAS,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,MAAM,GAAA,GAAM,QAAA;AACZ,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,oBAAA;AACxC,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,GAAA,EAAK,MAAA;AAE7B,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,uBAAA,CAAwB,WAAA,EAAa,aAAa,CAAA;AAAA,IACxD,CAAC,aAAa,aAAa;AAAA,GAC7B;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAExD,EAAA,MAAM,MAAA,GAAS,SAAA;AAAA,IACb;AAAA,MACE,UAAA;AAAA,MACA,SAAS,WAAA,IAAe,EAAA;AAAA,MACxB,UAAU,CAAC,QAAA;AAAA,MACX,iBAAA,EAAmB,KAAA;AAAA,MACnB,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,IAAG,KAAM;AAC5B,QAAA,MAAM,IAAA,GAAO,GAAG,OAAA,EAAQ;AACxB,QAAA,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA;AAAA,MACxC,CAAA;AAAA,MACA,MAAA,EAAQ,MAAM,UAAA,EAAW;AAAA,MACzB,WAAA,EAAa;AAAA,QACX,UAAA,EAAY;AAAA,UACV,EAAA,EAAI,OAAA;AAAA,UACJ,KAAA,EAAO,2BAAA;AAAA,UACP,KAAA,EAAO,eAAe,SAAS,CAAA,EAAA;AAAA,SACjC;AAAA,QACA,eAAA,EAAiB;AAAA;AACnB,KACF;AAAA,IACA,CAAC,YAAY,OAAO;AAAA,GACtB;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,EAAa;AACnC,IAAA,MAAA,CAAO,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,EAAa;AACnC,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,GAAA;AACvB,IAAA,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAItB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,EAAa;AACnC,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,GAAA;AACvB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,EAAE,IAAA,EAAK,GAAK,CAAA,CAAoC,MAAA;AACtD,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,WAAA,GAAc,OAAO,OAAA,EAAQ;AACnC,MAAA,MAAM,MAAA,GAAS,YAAY,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,GAAI,GAAA,GAAM,EAAA;AAC1E,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,cAAc,MAAA,GAAS,IAAI,EAAE,GAAA,EAAI;AAAA,IAC1D,CAAA;AACA,IAAA,EAAA,CAAG,gBAAA,CAAiB,oBAAoB,OAAO,CAAA;AAC/C,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,EAAa;AACnC,IAAA,MAAM,QAAA,GAAW,WAAA;AACjB,IAAA,MAAM,UAAA,GAAa,OAAO,OAAA,EAAQ;AAClC,IAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,IAAK,WAAA,CAAY,UAAU,CAAA,EAAG;AACtD,IAAA,IAAI,QAAA,IAAY,aAAa,UAAA,EAAY;AACvC,MAAA,MAAA,CAAO,SAAS,UAAA,CAAW,QAAA,EAAU,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,WAAA,CAAY,UAAU,CAAA,EAAG;AACzC,MAAA,MAAA,CAAO,SAAS,UAAA,CAAW,EAAA,EAAI,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAExB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,EAAA,MAAM,+BACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,KAAA;AAAA,IAAO,GAAA;AAAA,oBACjBA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAoB;AAAA,GAAA,EAC9C,CAAA;AAGF,EAAA,MAAM,OAAA,mBACJA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAW,eAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA,YAAA,EACH,CAAA;AAGF,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,iBAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,QAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,SAAA,GAAY,OAAA,GAAU,IAAA;AAAA,sBACvBA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,mBAAmB,QAAA,EAAU;AAAA,KAAA,EACjE,CAAA,GACE,YACF,OAAA,GACE,IAAA;AAAA,oBACJ,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,iBAAA;AAAA,UACT,QAAA;AAAA,UACA,EAAA;AAAA,YACE,6FAAA;AAAA,YACA,SAAA,IAAa,gBAAA;AAAA,YACb,QAAA,IAAY;AAAA;AACd,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,QAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BACAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,WAAA;AAAA,gBACA,+BAAA;AAAA,gBACA,iFAAA;AAAA,gBACA,oFAAA;AAAA,gBACA,+BAAA;AAAA,gBACA,oMAAA;AAAA,gBACA,8EAAA;AAAA,gBACA,yFAAA;AAAA,gBACA,mEAAA;AAAA,gBACA,4EAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAgB;AAAA;AAAA;AACjC;AAAA;AAAA,KACF;AAAA,IACC,SAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,eAAA,CAAgB,QAAA,EAAU,sBAAsB,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"chunk-PRKGLE57.mjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport { Slice } from '@tiptap/pm/model';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction isEmptyParagraph(node: PMNode | null): boolean {\n return !!node && node.type.name === 'paragraph' && node.content.size === 0;\n}\n\n/**\n * Clean up pasted content. Clipboard HTML that did not come from ProseMirror's\n * own copy handler (Windows clipboard layers, RDP/Citrix, native browser\n * serialization) carries invisible empty paragraphs and trailing-break <br>s\n * around the copied text; pasted as-is they split the target paragraph and add\n * blank lines above/below.\n * 1. Drop empty paragraphs at both edges of the pasted slice.\n * 2. Open the slice ends when the edge block is a plain paragraph, so pasting\n * mid-paragraph merges into the surrounding text (word-processor behavior)\n * instead of splitting it. Tables/lists keep their default block behavior.\n */\nfunction cleanPastedSlice(slice: Slice): Slice {\n let content = slice.content;\n let openStart = slice.openStart;\n let openEnd = slice.openEnd;\n\n while (content.childCount > 1 && isEmptyParagraph(content.firstChild)) {\n content = content.cut(content.firstChild!.nodeSize);\n openStart = 0;\n }\n while (content.childCount > 1 && isEmptyParagraph(content.lastChild)) {\n content = content.cut(0, content.size - content.lastChild!.nodeSize);\n openEnd = 0;\n }\n\n if (content.firstChild?.type.name === 'paragraph') openStart = Math.max(1, openStart);\n if (content.lastChild?.type.name === 'paragraph') openEnd = Math.max(1, openEnd);\n\n return new Slice(content, openStart, openEnd);\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n transformPasted: cleanPastedSlice,\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["React","jsx","SeparatorPrimitive","cn","Slice","StarterKit","Underline","Placeholder","Table","TableRow","TableHeader","TableCell","useReducer","useEffect","Button","jsxs","Bold","Italic","UnderlineIcon","Strikethrough","List","ListOrdered","Fragment","TableIcon","Rows2","Columns2","TableRowsSplit","TableColumnsSplit","Trash2","Undo","Redo","useField","useForm","useFormStore","useMemo","useEditor","isLabelVisible","FieldRequiredIndicator","Label","fieldLabelClass","fieldWrapperClass","VoiceMicButton","fieldControlClass","EditorContent","fieldErrorClass"],"mappings":"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","file":"chunk-RGVDR724.cjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport { Slice } from '@tiptap/pm/model';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction isEmptyParagraph(node: PMNode | null): boolean {\n return !!node && node.type.name === 'paragraph' && node.content.size === 0;\n}\n\n/**\n * Clean up pasted content. Clipboard HTML that did not come from ProseMirror's\n * own copy handler (Windows clipboard layers, RDP/Citrix, native browser\n * serialization) carries invisible empty paragraphs and trailing-break <br>s\n * around the copied text; pasted as-is they split the target paragraph and add\n * blank lines above/below.\n * 1. Drop empty paragraphs at both edges of the pasted slice.\n * 2. Open the slice ends when the edge block is a plain paragraph, so pasting\n * mid-paragraph merges into the surrounding text (word-processor behavior)\n * instead of splitting it. Tables/lists keep their default block behavior.\n */\nfunction cleanPastedSlice(slice: Slice): Slice {\n let content = slice.content;\n let openStart = slice.openStart;\n let openEnd = slice.openEnd;\n\n while (content.childCount > 1 && isEmptyParagraph(content.firstChild)) {\n content = content.cut(content.firstChild!.nodeSize);\n openStart = 0;\n }\n while (content.childCount > 1 && isEmptyParagraph(content.lastChild)) {\n content = content.cut(0, content.size - content.lastChild!.nodeSize);\n openEnd = 0;\n }\n\n if (content.firstChild?.type.name === 'paragraph') openStart = Math.max(1, openStart);\n if (content.lastChild?.type.name === 'paragraph') openEnd = Math.max(1, openEnd);\n\n return new Slice(content, openStart, openEnd);\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n transformPasted: cleanPastedSlice,\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}
|