@lax-wp/design-system 0.14.39 → 0.14.40
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/components/data-display/infinite-table/body/cell/DataCell.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js +149 -166
- package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/constants.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/constants.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/constants.d.ts +0 -8
- package/dist/components/data-display/infinite-table/constants.es.js +20 -24
- package/dist/components/data-display/infinite-table/constants.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/context.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/context.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/context.d.ts +1 -5
- package/dist/components/data-display/infinite-table/context.es.js +2 -5
- package/dist/components/data-display/infinite-table/context.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/index.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/head/cell/index.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/index.es.js +39 -39
- package/dist/components/data-display/infinite-table/head/cell/index.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/index.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/index.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/index.d.ts +1 -1
- package/dist/components/data-display/infinite-table/index.es.js +526 -547
- package/dist/components/data-display/infinite-table/index.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/types.d.ts +4 -75
- package/dist/components/data-display/label-value/LabelValue.cjs.js +1 -1
- package/dist/components/data-display/label-value/LabelValue.cjs.js.map +1 -1
- package/dist/components/data-display/label-value/LabelValue.es.js +1 -1
- package/dist/components/data-display/label-value/LabelValue.es.js.map +1 -1
- package/dist/components/floating-bar/FloatingBar.cjs.js +1 -1
- package/dist/components/floating-bar/FloatingBar.cjs.js.map +1 -1
- package/dist/components/floating-bar/FloatingBar.es.js +29 -32
- package/dist/components/floating-bar/FloatingBar.es.js.map +1 -1
- package/dist/components/forms/currency-input/CurrencyInputField.cjs.js +1 -1
- package/dist/components/forms/currency-input/CurrencyInputField.cjs.js.map +1 -1
- package/dist/components/forms/currency-input/CurrencyInputField.es.js +24 -24
- package/dist/components/forms/currency-input/CurrencyInputField.es.js.map +1 -1
- package/dist/components/forms/icon-picker/IconPicker.cjs.js +1 -1
- package/dist/components/forms/icon-picker/IconPicker.cjs.js.map +1 -1
- package/dist/components/forms/icon-picker/IconPicker.es.js +65 -79
- package/dist/components/forms/icon-picker/IconPicker.es.js.map +1 -1
- package/dist/components/forms/master-data-input/MasterDataInputField.cjs.js +1 -1
- package/dist/components/forms/master-data-input/MasterDataInputField.cjs.js.map +1 -1
- package/dist/components/forms/master-data-input/MasterDataInputField.es.js +2 -2
- package/dist/components/forms/master-data-input/MasterDataInputField.es.js.map +1 -1
- package/dist/components/forms/md-input/RichMarkdownInput.cjs.js +1 -1
- package/dist/components/forms/md-input/RichMarkdownInput.cjs.js.map +1 -1
- package/dist/components/forms/md-input/RichMarkdownInput.es.js +38 -39
- package/dist/components/forms/md-input/RichMarkdownInput.es.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/providers/design-system-provider/types.d.ts +0 -1
- package/package.json +1 -1
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.cjs.js +0 -2
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.cjs.js.map +0 -1
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.d.ts +0 -30
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.es.js +0 -248
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.es.js.map +0 -1
- package/dist/components/data-display/infinite-table/copy-text.cjs.js +0 -2
- package/dist/components/data-display/infinite-table/copy-text.cjs.js.map +0 -1
- package/dist/components/data-display/infinite-table/copy-text.d.ts +0 -13
- package/dist/components/data-display/infinite-table/copy-text.es.js +0 -56
- package/dist/components/data-display/infinite-table/copy-text.es.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichMarkdownInput.es.js","sources":["../../../../src/components/forms/md-input/RichMarkdownInput.tsx"],"sourcesContent":["import cn from \"classnames\";\nimport { forwardRef, useRef, useState } from \"react\";\nimport {\n\tFormatBold,\n\tFormatItalic,\n\tFormatUnderlined,\n\tFormatListBulleted,\n\tFormatListNumbered,\n\tOpenInFull,\n\tEdit,\n\tVisibilityOutlined,\n} from \"@mui/icons-material\";\nimport { Modal } from \"../../data-display/modal/Modal\";\nimport Button from \"../../button/Button\";\nimport { Tabs } from \"../../navigation/tabs/Tabs\";\nimport { MarkdownPreview } from \"./MarkdownPreview\";\nimport { continueList, toggleList, type ListType } from \"./listEditing\";\nimport Tooltip from \"../../tooltip/Tooltip\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Typography } from \"../../data-display/typography/Typography\";\nimport { InputLabel } from \"../shared/InputLabel\";\nimport { EditIcon, VisibilityIcon } from \"../../icon\";\n\n/**\n * Props for the RichMarkdownInput component\n */\nexport interface RichMarkdownInputProps {\n\t/** Unique identifier for the markdown input */\n\tid?: string;\n\t/** Current markdown value */\n\tvalue?: string;\n\t/** Default value for the input */\n\tdefaultValue?: string;\n\t/** Placeholder text for the textarea */\n\tplaceholder?: string;\n\t/** Minimum number of visible text lines */\n\tminRows?: number;\n\t/** Maximum number of visible text lines */\n\tmaxRows?: number;\n\t/** Whether the input is disabled */\n\tisDisabled?: boolean;\n\t/** Additional CSS classes for the wrapper container */\n\tclassName?: string;\n\t/** Additional CSS classes for the textarea */\n\ttextareaClassName?: string;\n\t/** Additional CSS classes for the preview container */\n\tpreviewClassName?: string;\n\t/** Label text to display above the input */\n\tlabel?: string;\n\t/** Additional CSS classes for the label */\n\tlabelClassName?: string;\n\t/** Whether the field is required and the required indicator shows as conditional */\n\tisRequiredConditional?: boolean;\n\t/** Whether the field is required */\n\trequired?: boolean;\n\t/** Whether to show the preview button */\n\tshowPreviewOnModal?: boolean;\n\t/** Maximum character count */\n\tmaxLength?: number;\n\t/** Link target behavior: '_blank' for new tab, '_self' for current tab */\n\tlinkTarget?: '_blank' | '_self';\n\t/** Error message to display */\n\terrorMessage?: string;\n\t/** Tooltip text */\n\ttooltip?: string;\n\t/** Whether to preserve original case (no auto-lowercase) */\n\toriginalCase?: boolean;\n\t/** Icon to display at the end of the input */\n\tsuffixIcon?: React.ReactNode;\n\t/** Whether the input is clearable */\n\tisClearable?: boolean;\n\t/** Ref for the input element */\n\tinputref?: React.RefObject<HTMLTextAreaElement>;\n\t/** Whether to show the formatting help tooltip */\n\tshowFormattingHelp?: boolean;\n\t/** Keyboard event handler */\n\tonKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n\t/** Whether to remove indentation from lists and align all content to the left in preview */\n\tnoIndent?: boolean;\n\t/** Whether to display all content with uniform font size/weight (paragraph-like) while keeping formatting */\n\tshowMinimalPreview?: boolean;\n\t/** Whether to accept and render advanced content (code blocks, blockquotes, tables, images) in preview */\n\tacceptAdvanceContent?: boolean;\n\t/** Callback function called when the markdown value changes */\n\tonChange: (value: string) => void;\n}\n\n/**\n * The type of view for the rich markdown input\n */\ntype RichMarkdownInputViewType = \"edit\" | \"preview\";\n\n/**\n * The tabs for the rich markdown input\n */\nconst RichMarkdownInputTabs: RichMarkdownInputViewType[] = [\"edit\", \"preview\"];\n\n/**\n * Close icon for clearable input\n */\nconst CloseIcon = ({ className, size = 16 }: { className?: string; size?: number }) => (\n\t<svg\n\t\twidth={size}\n\t\theight={size}\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\tclassName={className}\n\t>\n\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n\t</svg>\n);\n\n/**\n * A rich markdown input component with comprehensive formatting toolbar.\n * \n * **Text Formatting:**\n * - Bold (Ctrl+B) - Always visible\n * - Italic (Ctrl+I) - Always visible\n * - Underline (Ctrl+U) - Always visible\n * \n * **Lists:**\n * - Bullet lists - Always visible\n * - Numbered lists - Always visible\n * - Enter continues the list with the next marker; Enter on an empty item exits it\n * \n * **Features:**\n * - Edit/Preview toggle with icons\n * - Character counter (optional)\n * - Preview modal with scrolling\n * - Keyboard shortcuts\n * - Syntax highlighting for code blocks\n * - Responsive toolbar\n * - Dark mode support\n * - Configurable link target behavior\n * - Error message display\n * - Tooltip support\n * - Clear button (optional)\n * - Suffix icon support\n * - Custom keyboard handlers\n * - Minimal preview mode (uniform typography)\n * - Toggle advanced content in preview\n *\n * @example\n * ```tsx\n * <RichMarkdownInput\n * value={markdown}\n * onChange={setMarkdown}\n * placeholder=\"Enter description...\"\n * label=\"Description\"\n * maxLength={300}\n * linkTarget=\"_blank\"\n * isClearable\n * errorMessage=\"Invalid input\"\n * tooltip=\"Use markdown formatting\"\n * showMinimalPreview={false}\n * acceptAdvanceContent={true}\n * />\n * ```\n */\nexport const RichMarkdownInput = forwardRef<\n\tHTMLTextAreaElement,\n\tRichMarkdownInputProps\n>(\n\t(\n\t\t{\n\t\t\tid,\n\t\t\tvalue = \"\",\n\t\t\tdefaultValue,\n\t\t\tonChange,\n\t\t\tplaceholder = \"Enter markdown content...\",\n\t\t\tminRows = 4,\n\t\t\tmaxRows = 20,\n\t\t\tisDisabled = false,\n\t\t\tclassName,\n\t\t\ttextareaClassName,\n\t\t\tpreviewClassName,\n\t\t\tlabel,\n\t\t\tlabelClassName,\n\t\t\tisRequiredConditional,\n\t\t\trequired = false,\n\t\t\tshowPreviewOnModal = false,\n\t\t\tmaxLength,\n\t\t\tlinkTarget = '_blank',\n\t\t\terrorMessage,\n\t\t\ttooltip,\n\t\t\toriginalCase,\n\t\t\tsuffixIcon,\n\t\t\tisClearable,\n\t\t\tinputref,\n\t\t\tshowFormattingHelp = true,\n\t\t\tonKeyDown,\n\t\t\tnoIndent = false,\n\t\t\tshowMinimalPreview = false,\n\t\t\tacceptAdvanceContent = true,\n\t\t},\n\t\tref\n\t) => {\n\t\tconst [mode, setMode] = useState<RichMarkdownInputViewType>(\"edit\");\n\t\tconst [isPreviewOpen, setIsPreviewOpen] = useState(false);\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst inputId = id || `rich-md-input-${Math.random().toString(36).slice(2, 11)}`;\n\n\t\tconst charCount = value.length;\n\n\t\t/**\n\t\t * Insert markdown syntax at cursor position\n\t\t */\n\t\tconst insertMarkdown = (before: string, after: string = \"\", placeholder: string = \"\") => {\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\tif (!textarea) return;\n\n\t\t\tconst start = textarea.selectionStart;\n\t\t\tconst end = textarea.selectionEnd;\n\t\t\tconst selectedText = value.substring(start, end);\n\t\t\tconst textToInsert = selectedText || placeholder;\n\n\t\t\tconst newValue = value.substring(0, start) + before + textToInsert + after + value.substring(end);\n\t\t\tonChange(newValue);\n\n\t\t\t// Set cursor position after insertion\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst newCursorPos = start + before.length + (selectedText ? selectedText.length : 0);\n\t\t\t\ttextarea.focus();\n\t\t\t\ttextarea.setSelectionRange(newCursorPos, newCursorPos + (selectedText ? 0 : placeholder.length));\n\t\t\t}, 0);\n\t\t};\n\n\t\t/**\n\t\t * Toggle list markers on the selected line(s).\n\t\t * Ordered lists are numbered sequentially (1., 2., 3., ...) so the raw\n\t\t * markdown matches what the preview renders.\n\t\t */\n\t\tconst insertList = (type: ListType) => {\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\tif (!textarea) return;\n\n\t\t\tconst result = toggleList(value, textarea.selectionStart, textarea.selectionEnd, type);\n\t\t\tif (maxLength && result.value.length > maxLength) return;\n\n\t\t\tonChange(result.value);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\ttextarea.focus();\n\t\t\t\ttextarea.setSelectionRange(result.caret, result.caret);\n\t\t\t}, 0);\n\t\t};\n\n\t\t/**\n\t\t * Continue the list the caret sits in when Enter is pressed.\n\t\t * Returns true when the key was handled and the default should be prevented.\n\t\t */\n\t\tconst continueListOnEnter = () => {\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\tif (!textarea) return false;\n\n\t\t\tconst result = continueList(value, textarea.selectionStart, textarea.selectionEnd);\n\t\t\tif (!result) return false;\n\t\t\tif (maxLength && result.value.length > maxLength) return false;\n\n\t\t\tonChange(result.value);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\ttextarea.focus();\n\t\t\t\ttextarea.setSelectionRange(result.caret, result.caret);\n\t\t\t}, 0);\n\n\t\t\treturn true;\n\t\t};\n\n\t\t/**\n\t\t * Handle keyboard shortcuts\n\t\t */\n\t\tconst handleKeyDownInternal = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\t\t// Call external handler first\n\t\t\tonKeyDown?.(e);\n\n\t\t\tif (\n\t\t\t\te.key === 'Enter' &&\n\t\t\t\t!e.shiftKey &&\n\t\t\t\t!e.altKey &&\n\t\t\t\t!e.metaKey &&\n\t\t\t\t!e.ctrlKey &&\n\t\t\t\t!e.defaultPrevented\n\t\t\t) {\n\t\t\t\tif (continueListOnEnter()) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.metaKey || e.ctrlKey) {\n\t\t\t\tswitch (e.key.toLowerCase()) {\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('**', '**', 'bold text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('*', '*', 'italic text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'u':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('<u>', '</u>', 'underlined text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'k':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('[', '](url)', 'link text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'e':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('```', '```', 'code');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * Handle clear button click\n\t\t */\n\t\tconst handleClear = () => {\n\t\t\tonChange('');\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\ttextarea?.focus();\n\t\t};\n\n\t\t/**\n\t\t * Calculate dynamic rows based on content\n\t\t */\n\t\tconst calculateRows = () => {\n\t\t\tconst lineCount = (value.match(/\\n/g) || []).length + 1;\n\t\t\treturn Math.min(maxRows, Math.max(minRows, lineCount));\n\t\t};\n\n\t\tconst rows = calculateRows();\n\n\t\tconst content = (\n\t\t\t<div className={cn(\"flex flex-col\", className)}>\n\t\t\t\t<div className={`flex flex-row items-center ${label ? \"justify-between\" : \"justify-end\"} w-full`}>\n\t\t\t\t\t{/* Label */}\n\t\t\t\t\t{label && (\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\t\tclassName={`mb-1 text-xs font-medium text-gray-600 inline-flex items-center gap-1 ${!originalCase ? \"capitalize\" : \"\"\n\t\t\t\t\t\t\t\t} ${labelClassName || \"!uppercse\"}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap items-center justify-between w-full\">\n\t\t\t\t\t\t\t\t<div className=\"inline-flex flex-wrap items-center gap-1\">\n\t\t\t\t\t\t\t\t\t<InputLabel label={label || \"\"} required={required || false} isRequiredConditional={isRequiredConditional || false} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Markdown Formatting Info */}\n\t\t\t\t\t{showFormattingHelp && (\n\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-center py-2 px-3 min-w-[220px] gap-2 bg-neutral-900 rounded-lg\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-start gap-1 w-full\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">**bold**</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <strong>bold</strong> text\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">*italic*</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <em>italic</em> text\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">`code`</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <code>inline code</code>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\"><u>text</u></span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <u>underline</u>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">~~strike~~</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <del>strike</del>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">- item</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ bullet list\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">1. item</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ numbered list\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{acceptAdvanceContent && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">## heading</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t→ heading 2\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">[link](url)</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ hyperlink\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{acceptAdvanceContent && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-start gap-1 w-full\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">> quote</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t→ blockquote\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-start gap-0.5 w-full mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-center gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTable:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col px-1 py-0.5 bg-neutral-700 ml-2 rounded-sm gap-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter whitespace-nowrap\">| Header 1 | Header 2 | Header 3 |</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter whitespace-nowrap\">| :--- | :---: | ---: |</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter whitespace-nowrap\">| Left | Center | Right |</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Typography className=\"mb-2 text-xs font-medium text-primary-700 inline-flex items-center gap-1 cursor-pointer\">\n\t\t\t\t\t\t\t\tFormatting help ?\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Main Container */}\n\t\t\t\t<div className={cn(\n\t\t\t\t\t\"flex flex-col border shadow-[0px_1px_2px_rgba(0,0,0,0.05)] rounded-lg bg-white dark:bg-black-700 w-full\",\n\t\t\t\t\terrorMessage\n\t\t\t\t\t\t? \"border-red-300 focus-within:border-red-500 focus-within:shadow-[0_0_0_1.5px_var(--color-red-200)]\"\n\t\t\t\t\t\t: \"border-[#EAECF0] dark:border-black-600 focus-within:border-primary-600 dark:focus-within:border-primary-400 focus-within:shadow-[0_0_0_1.5px_var(--color-primary-100)] dark:focus-within:shadow-[0_0_0_1.5px_var(--color-primary-950)]\"\n\t\t\t\t)}>\n\t\t\t\t\t{/* Toolbar */}\n\t\t\t\t\t<div className={cn(\n\t\t\t\t\t\t\"flex flex-row justify-between items-center px-3 py-2 gap-2 h-11 rounded-t-lg bg-[#F9FAFB] dark:bg-black-600 border-b border-[#EAECF0] dark:border-black-600\"\n\t\t\t\t\t)}>\n\t\t\t\t\t\t{/* Left: Formatting Buttons */}\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-bold`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertMarkdown('**', '**', 'bold text')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Bold (Ctrl+B)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatBold sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-italic`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertMarkdown('*', '*', 'italic text')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Italic (Ctrl+I)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatItalic sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-underline`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertMarkdown('<u>', '</u>', 'underlined text')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Underline (Ctrl+U)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatUnderlined sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<div className=\"w-px h-5 bg-[#EAECF0] dark:bg-black-500 rounded-full\" />\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-numbered-list`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertList('ordered')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Numbered List\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatListNumbered sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-bullet-list`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertList('bullet')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Bullet List\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatListBulleted sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t{/* Center: Character Count */}\n\t\t\t\t\t\t\t{maxLength && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium text-[#475467] dark:text-neutral-400\">\n\t\t\t\t\t\t\t\t\t\t{charCount}/{maxLength}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<div className=\"w-px h-6 bg-[#EAECF0] dark:bg-black-500 rounded-full\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{/* Right: Edit/Preview Toggle */}\n\t\t\t\t\t\t\t{showPreviewOnModal ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tid={`${inputId}-expand`}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setIsPreviewOpen(true)}\n\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto ml-1 !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\t\ttitle=\"Expand Preview\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<OpenInFull sx={{ fontSize: 16, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Tabs<RichMarkdownInputViewType>\n\t\t\t\t\t\t\t\t\tvariant=\"switch\"\n\t\t\t\t\t\t\t\t\ttabs={RichMarkdownInputTabs}\n\t\t\t\t\t\t\t\t\tactiveTab={mode}\n\t\t\t\t\t\t\t\t\tonTabClick={(tab) => setMode(tab)}\n\t\t\t\t\t\t\t\t\theight=\"h-5\"\n\t\t\t\t\t\t\t\t\ticonsOnly\n\t\t\t\t\t\t\t\t\ttabIcons={{\n\t\t\t\t\t\t\t\t\t\tedit: (<EditIcon className=\"h-md w-md dark:text-neutral-400\" />),\n\t\t\t\t\t\t\t\t\t\tpreview: (\n\t\t\t\t\t\t\t\t\t\t\t<VisibilityIcon className=\"h-md w-md dark:text-neutral-400\" />\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-lg\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Content Area */}\n\t\t\t\t\t<div className=\"px-3 py-2 relative\">\n\t\t\t\t\t\t{mode === \"edit\" ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t// Handle all refs: forwarded ref, internal ref, and inputref\n\t\t\t\t\t\t\t\t\t\tif (typeof ref === 'function') {\n\t\t\t\t\t\t\t\t\t\t\tref(node);\n\t\t\t\t\t\t\t\t\t\t} else if (ref) {\n\t\t\t\t\t\t\t\t\t\t\t(ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t(textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n\t\t\t\t\t\t\t\t\t\tif (inputref) {\n\t\t\t\t\t\t\t\t\t\t\t(inputref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\tconst newValue = originalCase ? e.target.value : e.target.value;\n\t\t\t\t\t\t\t\t\t\tif (!maxLength || newValue.length <= maxLength) {\n\t\t\t\t\t\t\t\t\t\t\tonChange(newValue);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDownInternal}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\trows={rows}\n\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\trequired={required}\n\t\t\t\t\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// Base styles\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent !focus:ring-0 !focus:border-none\",\n\t\t\t\t\t\t\t\t\t\t\"font-inter font-medium text-sm leading-5\",\n\t\t\t\t\t\t\t\t\t\t\"text-[#101828] dark:text-neutral-100\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-neutral-400 dark:placeholder:text-neutral-500\",\n\t\t\t\t\t\t\t\t\t\t\"focus:outline-none resize-none\",\n\t\t\t\t\t\t\t\t\t\t// Hide scrollbar\n\t\t\t\t\t\t\t\t\t\t\"scrollbar-none\",\n\t\t\t\t\t\t\t\t\t\t\"[&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\t\t\t\t\t\t\"[-ms-overflow-style:none]\",\n\t\t\t\t\t\t\t\t\t\t\"[scrollbar-width:none]\",\n\t\t\t\t\t\t\t\t\t\t// Disabled state\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"text-neutral-400 dark:text-neutral-500 cursor-not-allowed\": isDisabled,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t// Add padding if suffix icons exist\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"pr-20\": isClearable || suffixIcon,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\ttextareaClassName\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t{/* Suffix Icons */}\n\t\t\t\t\t\t\t\t{(isClearable || suffixIcon) && mode === \"edit\" && (\n\t\t\t\t\t\t\t\t\t<div className=\"absolute right-1 top-2 flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t{isClearable && value && (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tid={`btn-input-field-clear-${id}`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 flex items-center cursor-pointer top-2 right-1 focus:outline-none\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<CloseIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-neutral-300 dark:text-black-500 hover:text-neutral-400 dark:hover:text-black-400 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{suffixIcon && <div className=\"flex items-center\">{suffixIcon}</div>}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"w-full min-h-[92px] max-h-[400px] overflow-y-auto\">\n\t\t\t\t\t\t\t\t<MarkdownPreview\n\t\t\t\t\t\t\t\t\tcontent={value}\n\t\t\t\t\t\t\t\t\tlinkTarget={linkTarget}\n\t\t\t\t\t\t\t\t\tclassName={previewClassName}\n\t\t\t\t\t\t\t\t\tnoIndent={noIndent}\n\t\t\t\t\t\t\t\t\tshowMinimalPreview={showMinimalPreview}\n\t\t\t\t\t\t\t\t\tacceptAdvanceContent={acceptAdvanceContent}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Expanded Preview Modal */}\n\t\t\t\t<Modal\n\t\t\t\t\topen={isPreviewOpen}\n\t\t\t\t\tonCancel={() => setIsPreviewOpen(false)}\n\t\t\t\t\ttitle=\"Markdown Preview\"\n\t\t\t\t\twidth={900}\n\t\t\t\t\tfooter={null}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"max-h-[calc(100vh-200px)] overflow-y-auto p-4\">\n\t\t\t\t\t\t<MarkdownPreview\n\t\t\t\t\t\t\tcontent={value}\n\t\t\t\t\t\t\tlinkTarget={linkTarget}\n\t\t\t\t\t\t\tclassName={previewClassName}\n\t\t\t\t\t\t\tnoIndent={noIndent}\n\t\t\t\t\t\t\tshowMinimalPreview={showMinimalPreview}\n\t\t\t\t\t\t\tacceptAdvanceContent={acceptAdvanceContent}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Modal>\n\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{errorMessage && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\tclassName=\"mt-1 text-error-500\"\n\t\t\t\t\t\t\t\tappearance=\"custom\"\n\t\t\t\t\t\t\t\tsize=\"extra-small\"\n\t\t\t\t\t\t\t\tvariant=\"medium\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{errorMessage}\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t);\n\n\t\treturn tooltip ? (\n\t\t\t<Tooltip title={tooltip}>\n\t\t\t\t{content}\n\t\t\t</Tooltip>\n\t\t) : (\n\t\t\tcontent\n\t\t);\n\t}\n);\n\nRichMarkdownInput.displayName = \"RichMarkdownInput\";\n"],"names":["RichMarkdownInputTabs","CloseIcon","className","size","jsxs","jsx","RichMarkdownInput","forwardRef","id","value","defaultValue","onChange","placeholder","minRows","maxRows","isDisabled","textareaClassName","previewClassName","label","labelClassName","isRequiredConditional","required","showPreviewOnModal","maxLength","linkTarget","errorMessage","tooltip","originalCase","suffixIcon","isClearable","inputref","showFormattingHelp","onKeyDown","noIndent","showMinimalPreview","acceptAdvanceContent","ref","mode","setMode","useState","isPreviewOpen","setIsPreviewOpen","textareaRef","useRef","inputId","charCount","insertMarkdown","before","after","textarea","start","end","selectedText","textToInsert","newValue","newCursorPos","insertList","type","result","toggleList","continueListOnEnter","continueList","handleKeyDownInternal","e","handleClear","rows","lineCount","content","cn","InputLabel","Tooltip","Fragment","Typography","Button","FormatBold","FormatItalic","FormatUnderlined","FormatListNumbered","FormatListBulleted","OpenInFull","Tabs","tab","EditIcon","VisibilityIcon","node","MarkdownPreview","Modal","AnimatePresence","motion"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RichMarkdownInput.es.js","sources":["../../../../src/components/forms/md-input/RichMarkdownInput.tsx"],"sourcesContent":["import cn from \"classnames\";\nimport { forwardRef, useRef, useState } from \"react\";\nimport {\n\tFormatBold,\n\tFormatItalic,\n\tFormatUnderlined,\n\tFormatListBulleted,\n\tFormatListNumbered,\n\tOpenInFull,\n\tEdit,\n\tVisibilityOutlined,\n} from \"@mui/icons-material\";\nimport { Modal } from \"../../data-display/modal/Modal\";\nimport Button from \"../../button/Button\";\nimport { Tabs } from \"../../navigation/tabs/Tabs\";\nimport { MarkdownPreview } from \"./MarkdownPreview\";\nimport { continueList, toggleList, type ListType } from \"./listEditing\";\nimport Tooltip from \"../../tooltip/Tooltip\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Typography } from \"../../data-display/typography/Typography\";\nimport { InputLabel } from \"../shared/InputLabel\";\n\n/**\n * Props for the RichMarkdownInput component\n */\nexport interface RichMarkdownInputProps {\n\t/** Unique identifier for the markdown input */\n\tid?: string;\n\t/** Current markdown value */\n\tvalue?: string;\n\t/** Default value for the input */\n\tdefaultValue?: string;\n\t/** Placeholder text for the textarea */\n\tplaceholder?: string;\n\t/** Minimum number of visible text lines */\n\tminRows?: number;\n\t/** Maximum number of visible text lines */\n\tmaxRows?: number;\n\t/** Whether the input is disabled */\n\tisDisabled?: boolean;\n\t/** Additional CSS classes for the wrapper container */\n\tclassName?: string;\n\t/** Additional CSS classes for the textarea */\n\ttextareaClassName?: string;\n\t/** Additional CSS classes for the preview container */\n\tpreviewClassName?: string;\n\t/** Label text to display above the input */\n\tlabel?: string;\n\t/** Additional CSS classes for the label */\n\tlabelClassName?: string;\n\t/** Whether the field is required and the required indicator shows as conditional */\n\tisRequiredConditional?: boolean;\n\t/** Whether the field is required */\n\trequired?: boolean;\n\t/** Whether to show the preview button */\n\tshowPreviewOnModal?: boolean;\n\t/** Maximum character count */\n\tmaxLength?: number;\n\t/** Link target behavior: '_blank' for new tab, '_self' for current tab */\n\tlinkTarget?: '_blank' | '_self';\n\t/** Error message to display */\n\terrorMessage?: string;\n\t/** Tooltip text */\n\ttooltip?: string;\n\t/** Whether to preserve original case (no auto-lowercase) */\n\toriginalCase?: boolean;\n\t/** Icon to display at the end of the input */\n\tsuffixIcon?: React.ReactNode;\n\t/** Whether the input is clearable */\n\tisClearable?: boolean;\n\t/** Ref for the input element */\n\tinputref?: React.RefObject<HTMLTextAreaElement>;\n\t/** Whether to show the formatting help tooltip */\n\tshowFormattingHelp?: boolean;\n\t/** Keyboard event handler */\n\tonKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n\t/** Whether to remove indentation from lists and align all content to the left in preview */\n\tnoIndent?: boolean;\n\t/** Whether to display all content with uniform font size/weight (paragraph-like) while keeping formatting */\n\tshowMinimalPreview?: boolean;\n\t/** Whether to accept and render advanced content (code blocks, blockquotes, tables, images) in preview */\n\tacceptAdvanceContent?: boolean;\n\t/** Callback function called when the markdown value changes */\n\tonChange: (value: string) => void;\n}\n\n/**\n * The type of view for the rich markdown input\n */\ntype RichMarkdownInputViewType = \"edit\" | \"preview\";\n\n/**\n * The tabs for the rich markdown input\n */\nconst RichMarkdownInputTabs: RichMarkdownInputViewType[] = [\"edit\", \"preview\"];\n\n/**\n * Close icon for clearable input\n */\nconst CloseIcon = ({ className, size = 16 }: { className?: string; size?: number }) => (\n\t<svg\n\t\twidth={size}\n\t\theight={size}\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\tclassName={className}\n\t>\n\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n\t</svg>\n);\n\n/**\n * A rich markdown input component with comprehensive formatting toolbar.\n * \n * **Text Formatting:**\n * - Bold (Ctrl+B) - Always visible\n * - Italic (Ctrl+I) - Always visible\n * - Underline (Ctrl+U) - Always visible\n * \n * **Lists:**\n * - Bullet lists - Always visible\n * - Numbered lists - Always visible\n * - Enter continues the list with the next marker; Enter on an empty item exits it\n * \n * **Features:**\n * - Edit/Preview toggle with icons\n * - Character counter (optional)\n * - Preview modal with scrolling\n * - Keyboard shortcuts\n * - Syntax highlighting for code blocks\n * - Responsive toolbar\n * - Dark mode support\n * - Configurable link target behavior\n * - Error message display\n * - Tooltip support\n * - Clear button (optional)\n * - Suffix icon support\n * - Custom keyboard handlers\n * - Minimal preview mode (uniform typography)\n * - Toggle advanced content in preview\n *\n * @example\n * ```tsx\n * <RichMarkdownInput\n * value={markdown}\n * onChange={setMarkdown}\n * placeholder=\"Enter description...\"\n * label=\"Description\"\n * maxLength={300}\n * linkTarget=\"_blank\"\n * isClearable\n * errorMessage=\"Invalid input\"\n * tooltip=\"Use markdown formatting\"\n * showMinimalPreview={false}\n * acceptAdvanceContent={true}\n * />\n * ```\n */\nexport const RichMarkdownInput = forwardRef<\n\tHTMLTextAreaElement,\n\tRichMarkdownInputProps\n>(\n\t(\n\t\t{\n\t\t\tid,\n\t\t\tvalue = \"\",\n\t\t\tdefaultValue,\n\t\t\tonChange,\n\t\t\tplaceholder = \"Enter markdown content...\",\n\t\t\tminRows = 4,\n\t\t\tmaxRows = 20,\n\t\t\tisDisabled = false,\n\t\t\tclassName,\n\t\t\ttextareaClassName,\n\t\t\tpreviewClassName,\n\t\t\tlabel,\n\t\t\tlabelClassName,\n\t\t\tisRequiredConditional,\n\t\t\trequired = false,\n\t\t\tshowPreviewOnModal = false,\n\t\t\tmaxLength,\n\t\t\tlinkTarget = '_blank',\n\t\t\terrorMessage,\n\t\t\ttooltip,\n\t\t\toriginalCase,\n\t\t\tsuffixIcon,\n\t\t\tisClearable,\n\t\t\tinputref,\n\t\t\tshowFormattingHelp = true,\n\t\t\tonKeyDown,\n\t\t\tnoIndent = false,\n\t\t\tshowMinimalPreview = false,\n\t\t\tacceptAdvanceContent = true,\n\t\t},\n\t\tref\n\t) => {\n\t\tconst [mode, setMode] = useState<RichMarkdownInputViewType>(\"edit\");\n\t\tconst [isPreviewOpen, setIsPreviewOpen] = useState(false);\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst inputId = id || `rich-md-input-${Math.random().toString(36).slice(2, 11)}`;\n\n\t\tconst charCount = value.length;\n\n\t\t/**\n\t\t * Insert markdown syntax at cursor position\n\t\t */\n\t\tconst insertMarkdown = (before: string, after: string = \"\", placeholder: string = \"\") => {\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\tif (!textarea) return;\n\n\t\t\tconst start = textarea.selectionStart;\n\t\t\tconst end = textarea.selectionEnd;\n\t\t\tconst selectedText = value.substring(start, end);\n\t\t\tconst textToInsert = selectedText || placeholder;\n\n\t\t\tconst newValue = value.substring(0, start) + before + textToInsert + after + value.substring(end);\n\t\t\tonChange(newValue);\n\n\t\t\t// Set cursor position after insertion\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst newCursorPos = start + before.length + (selectedText ? selectedText.length : 0);\n\t\t\t\ttextarea.focus();\n\t\t\t\ttextarea.setSelectionRange(newCursorPos, newCursorPos + (selectedText ? 0 : placeholder.length));\n\t\t\t}, 0);\n\t\t};\n\n\t\t/**\n\t\t * Toggle list markers on the selected line(s).\n\t\t * Ordered lists are numbered sequentially (1., 2., 3., ...) so the raw\n\t\t * markdown matches what the preview renders.\n\t\t */\n\t\tconst insertList = (type: ListType) => {\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\tif (!textarea) return;\n\n\t\t\tconst result = toggleList(value, textarea.selectionStart, textarea.selectionEnd, type);\n\t\t\tif (maxLength && result.value.length > maxLength) return;\n\n\t\t\tonChange(result.value);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\ttextarea.focus();\n\t\t\t\ttextarea.setSelectionRange(result.caret, result.caret);\n\t\t\t}, 0);\n\t\t};\n\n\t\t/**\n\t\t * Continue the list the caret sits in when Enter is pressed.\n\t\t * Returns true when the key was handled and the default should be prevented.\n\t\t */\n\t\tconst continueListOnEnter = () => {\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\tif (!textarea) return false;\n\n\t\t\tconst result = continueList(value, textarea.selectionStart, textarea.selectionEnd);\n\t\t\tif (!result) return false;\n\t\t\tif (maxLength && result.value.length > maxLength) return false;\n\n\t\t\tonChange(result.value);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\ttextarea.focus();\n\t\t\t\ttextarea.setSelectionRange(result.caret, result.caret);\n\t\t\t}, 0);\n\n\t\t\treturn true;\n\t\t};\n\n\t\t/**\n\t\t * Handle keyboard shortcuts\n\t\t */\n\t\tconst handleKeyDownInternal = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\t\t// Call external handler first\n\t\t\tonKeyDown?.(e);\n\n\t\t\tif (\n\t\t\t\te.key === 'Enter' &&\n\t\t\t\t!e.shiftKey &&\n\t\t\t\t!e.altKey &&\n\t\t\t\t!e.metaKey &&\n\t\t\t\t!e.ctrlKey &&\n\t\t\t\t!e.defaultPrevented\n\t\t\t) {\n\t\t\t\tif (continueListOnEnter()) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.metaKey || e.ctrlKey) {\n\t\t\t\tswitch (e.key.toLowerCase()) {\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('**', '**', 'bold text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('*', '*', 'italic text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'u':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('<u>', '</u>', 'underlined text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'k':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('[', '](url)', 'link text');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'e':\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tinsertMarkdown('```', '```', 'code');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * Handle clear button click\n\t\t */\n\t\tconst handleClear = () => {\n\t\t\tonChange('');\n\t\t\tconst textarea = (ref as React.RefObject<HTMLTextAreaElement>)?.current || textareaRef.current;\n\t\t\ttextarea?.focus();\n\t\t};\n\n\t\t/**\n\t\t * Calculate dynamic rows based on content\n\t\t */\n\t\tconst calculateRows = () => {\n\t\t\tconst lineCount = (value.match(/\\n/g) || []).length + 1;\n\t\t\treturn Math.min(maxRows, Math.max(minRows, lineCount));\n\t\t};\n\n\t\tconst rows = calculateRows();\n\n\t\tconst content = (\n\t\t\t<div className={cn(\"flex flex-col\", className)}>\n\t\t\t\t<div className={`flex flex-row items-center ${label ? \"justify-between\" : \"justify-end\"} w-full`}>\n\t\t\t\t\t{/* Label */}\n\t\t\t\t\t{label && (\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\t\tclassName={`mb-1 text-xs font-medium text-gray-600 inline-flex items-center gap-1 ${!originalCase ? \"capitalize\" : \"\"\n\t\t\t\t\t\t\t\t} ${labelClassName || \"!uppercse\"}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap items-center justify-between w-full\">\n\t\t\t\t\t\t\t\t<div className=\"inline-flex flex-wrap items-center gap-1\">\n\t\t\t\t\t\t\t\t\t<InputLabel label={label || \"\"} required={required || false} isRequiredConditional={isRequiredConditional || false} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Markdown Formatting Info */}\n\t\t\t\t\t{showFormattingHelp && (\n\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-center py-2 px-3 min-w-[220px] gap-2 bg-neutral-900 rounded-lg\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-start gap-1 w-full\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">**bold**</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <strong>bold</strong> text\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">*italic*</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <em>italic</em> text\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">`code`</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <code>inline code</code>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\"><u>text</u></span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <u>underline</u>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">~~strike~~</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ <del>strike</del>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">- item</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ bullet list\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">1. item</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ numbered list\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{acceptAdvanceContent && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">## heading</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t→ heading 2\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">[link](url)</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t→ hyperlink\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{acceptAdvanceContent && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-start gap-1 w-full\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-start gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row justify-center items-center px-[3px] bg-neutral-700 rounded-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter\">> quote</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t→ blockquote\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start justify-start gap-0.5 w-full mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-row items-center gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-[18px] leading-4\">•</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white text-xs font-medium leading-4 font-inter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTable:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col px-1 py-0.5 bg-neutral-700 ml-2 rounded-sm gap-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter whitespace-nowrap\">| Header 1 | Header 2 | Header 3 |</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter whitespace-nowrap\">| :--- | :---: | ---: |</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-neutral-300 text-xs font-medium leading-4 font-inter whitespace-nowrap\">| Left | Center | Right |</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Typography className=\"mb-2 text-xs font-medium text-primary-700 inline-flex items-center gap-1 cursor-pointer\">\n\t\t\t\t\t\t\t\tFormatting help ?\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Main Container */}\n\t\t\t\t<div className={cn(\n\t\t\t\t\t\"flex flex-col border shadow-[0px_1px_2px_rgba(0,0,0,0.05)] rounded-lg bg-white dark:bg-black-700 w-full\",\n\t\t\t\t\terrorMessage\n\t\t\t\t\t\t? \"border-red-300 focus-within:border-red-500 focus-within:shadow-[0_0_0_1.5px_var(--color-red-200)]\"\n\t\t\t\t\t\t: \"border-[#EAECF0] dark:border-black-600 focus-within:border-primary-600 dark:focus-within:border-primary-400 focus-within:shadow-[0_0_0_1.5px_var(--color-primary-100)] dark:focus-within:shadow-[0_0_0_1.5px_var(--color-primary-950)]\"\n\t\t\t\t)}>\n\t\t\t\t\t{/* Toolbar */}\n\t\t\t\t\t<div className={cn(\n\t\t\t\t\t\t\"flex flex-row justify-between items-center px-3 py-2 gap-2 h-11 rounded-t-lg bg-[#F9FAFB] dark:bg-black-600 border-b border-[#EAECF0] dark:border-black-600\"\n\t\t\t\t\t)}>\n\t\t\t\t\t\t{/* Left: Formatting Buttons */}\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-bold`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertMarkdown('**', '**', 'bold text')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Bold (Ctrl+B)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatBold sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-italic`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertMarkdown('*', '*', 'italic text')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Italic (Ctrl+I)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatItalic sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-underline`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertMarkdown('<u>', '</u>', 'underlined text')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Underline (Ctrl+U)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatUnderlined sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<div className=\"w-px h-5 bg-[#EAECF0] dark:bg-black-500 rounded-full\" />\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-numbered-list`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertList('ordered')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Numbered List\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatListNumbered sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tid={`${inputId}-bullet-list`}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => insertList('bullet')}\n\t\t\t\t\t\t\t\tdisabled={isDisabled || mode === \"preview\"}\n\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\ttitle=\"Bullet List\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FormatListBulleted sx={{ fontSize: 20, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t{/* Center: Character Count */}\n\t\t\t\t\t\t\t{maxLength && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium text-[#475467] dark:text-neutral-400\">\n\t\t\t\t\t\t\t\t\t\t{charCount}/{maxLength}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<div className=\"w-px h-6 bg-[#EAECF0] dark:bg-black-500 rounded-full\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{/* Right: Edit/Preview Toggle */}\n\t\t\t\t\t\t\t{showPreviewOnModal ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tid={`${inputId}-expand`}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setIsPreviewOpen(true)}\n\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\tclassName=\"!p-0.5 !min-w-0 !h-auto ml-1 !rounded-md hover:!bg-neutral-200 dark:hover:!bg-black-500 hover:!scale-110 !transition-all !duration-200\"\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\tstatus=\"no-background\"\n\t\t\t\t\t\t\t\t\ttitle=\"Expand Preview\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<OpenInFull sx={{ fontSize: 16, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Tabs<RichMarkdownInputViewType>\n\t\t\t\t\t\t\t\t\tvariant=\"switch\"\n\t\t\t\t\t\t\t\t\ttabs={RichMarkdownInputTabs}\n\t\t\t\t\t\t\t\t\tactiveTab={mode}\n\t\t\t\t\t\t\t\t\tonTabClick={(tab) => setMode(tab)}\n\t\t\t\t\t\t\t\t\theight=\"h-5\"\n\t\t\t\t\t\t\t\t\ticonsOnly\n\t\t\t\t\t\t\t\t\ttabIcons={{\n\t\t\t\t\t\t\t\t\t\tedit: (<Edit sx={{ fontSize: 16, color: '#667085' }} className=\"dark:text-neutral-400\" />),\n\t\t\t\t\t\t\t\t\t\tpreview: (\n\t\t\t\t\t\t\t\t\t\t\t<VisibilityOutlined sx={{ fontSize: 16, color: '#667085' }} className=\"dark:text-neutral-400\" />\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-lg\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Content Area */}\n\t\t\t\t\t<div className=\"px-3 py-2 relative\">\n\t\t\t\t\t\t{mode === \"edit\" ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t// Handle all refs: forwarded ref, internal ref, and inputref\n\t\t\t\t\t\t\t\t\t\tif (typeof ref === 'function') {\n\t\t\t\t\t\t\t\t\t\t\tref(node);\n\t\t\t\t\t\t\t\t\t\t} else if (ref) {\n\t\t\t\t\t\t\t\t\t\t\t(ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t(textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n\t\t\t\t\t\t\t\t\t\tif (inputref) {\n\t\t\t\t\t\t\t\t\t\t\t(inputref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\tconst newValue = originalCase ? e.target.value : e.target.value;\n\t\t\t\t\t\t\t\t\t\tif (!maxLength || newValue.length <= maxLength) {\n\t\t\t\t\t\t\t\t\t\t\tonChange(newValue);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDownInternal}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\trows={rows}\n\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\trequired={required}\n\t\t\t\t\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// Base styles\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent !focus:ring-0 !focus:border-none\",\n\t\t\t\t\t\t\t\t\t\t\"font-inter font-medium text-sm leading-5\",\n\t\t\t\t\t\t\t\t\t\t\"text-[#101828] dark:text-neutral-100\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-neutral-400 dark:placeholder:text-neutral-500\",\n\t\t\t\t\t\t\t\t\t\t\"focus:outline-none resize-none\",\n\t\t\t\t\t\t\t\t\t\t// Hide scrollbar\n\t\t\t\t\t\t\t\t\t\t\"scrollbar-none\",\n\t\t\t\t\t\t\t\t\t\t\"[&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\t\t\t\t\t\t\"[-ms-overflow-style:none]\",\n\t\t\t\t\t\t\t\t\t\t\"[scrollbar-width:none]\",\n\t\t\t\t\t\t\t\t\t\t// Disabled state\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"text-neutral-400 dark:text-neutral-500 cursor-not-allowed\": isDisabled,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t// Add padding if suffix icons exist\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"pr-20\": isClearable || suffixIcon,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\ttextareaClassName\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t{/* Suffix Icons */}\n\t\t\t\t\t\t\t\t{(isClearable || suffixIcon) && mode === \"edit\" && (\n\t\t\t\t\t\t\t\t\t<div className=\"absolute right-1 top-2 flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t{isClearable && value && (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tid={`btn-input-field-clear-${id}`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 flex items-center cursor-pointer top-2 right-1 focus:outline-none\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<CloseIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-neutral-300 dark:text-black-500 hover:text-neutral-400 dark:hover:text-black-400 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{suffixIcon && <div className=\"flex items-center\">{suffixIcon}</div>}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"w-full min-h-[92px] max-h-[400px] overflow-y-auto\">\n\t\t\t\t\t\t\t\t<MarkdownPreview\n\t\t\t\t\t\t\t\t\tcontent={value}\n\t\t\t\t\t\t\t\t\tlinkTarget={linkTarget}\n\t\t\t\t\t\t\t\t\tclassName={previewClassName}\n\t\t\t\t\t\t\t\t\tnoIndent={noIndent}\n\t\t\t\t\t\t\t\t\tshowMinimalPreview={showMinimalPreview}\n\t\t\t\t\t\t\t\t\tacceptAdvanceContent={acceptAdvanceContent}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Expanded Preview Modal */}\n\t\t\t\t<Modal\n\t\t\t\t\topen={isPreviewOpen}\n\t\t\t\t\tonCancel={() => setIsPreviewOpen(false)}\n\t\t\t\t\ttitle=\"Markdown Preview\"\n\t\t\t\t\twidth={900}\n\t\t\t\t\tfooter={null}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"max-h-[calc(100vh-200px)] overflow-y-auto p-4\">\n\t\t\t\t\t\t<MarkdownPreview\n\t\t\t\t\t\t\tcontent={value}\n\t\t\t\t\t\t\tlinkTarget={linkTarget}\n\t\t\t\t\t\t\tclassName={previewClassName}\n\t\t\t\t\t\t\tnoIndent={noIndent}\n\t\t\t\t\t\t\tshowMinimalPreview={showMinimalPreview}\n\t\t\t\t\t\t\tacceptAdvanceContent={acceptAdvanceContent}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Modal>\n\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{errorMessage && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\tclassName=\"mt-1 text-error-500\"\n\t\t\t\t\t\t\t\tappearance=\"custom\"\n\t\t\t\t\t\t\t\tsize=\"extra-small\"\n\t\t\t\t\t\t\t\tvariant=\"medium\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{errorMessage}\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t);\n\n\t\treturn tooltip ? (\n\t\t\t<Tooltip title={tooltip}>\n\t\t\t\t{content}\n\t\t\t</Tooltip>\n\t\t) : (\n\t\t\tcontent\n\t\t);\n\t}\n);\n\nRichMarkdownInput.displayName = \"RichMarkdownInput\";\n"],"names":["RichMarkdownInputTabs","CloseIcon","className","size","jsxs","jsx","RichMarkdownInput","forwardRef","id","value","defaultValue","onChange","placeholder","minRows","maxRows","isDisabled","textareaClassName","previewClassName","label","labelClassName","isRequiredConditional","required","showPreviewOnModal","maxLength","linkTarget","errorMessage","tooltip","originalCase","suffixIcon","isClearable","inputref","showFormattingHelp","onKeyDown","noIndent","showMinimalPreview","acceptAdvanceContent","ref","mode","setMode","useState","isPreviewOpen","setIsPreviewOpen","textareaRef","useRef","inputId","charCount","insertMarkdown","before","after","textarea","start","end","selectedText","textToInsert","newValue","newCursorPos","insertList","type","result","toggleList","continueListOnEnter","continueList","handleKeyDownInternal","e","handleClear","rows","lineCount","content","cn","InputLabel","Tooltip","Fragment","Typography","Button","FormatBold","FormatItalic","FormatUnderlined","FormatListNumbered","FormatListBulleted","OpenInFull","Tabs","tab","Edit","VisibilityOutlined","node","MarkdownPreview","Modal","AnimatePresence","motion"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -259,7 +259,7 @@ export type { DesignSystemConfig, TabConfig, TableConfig, TableViewApi, MasterDa
|
|
|
259
259
|
export { InfiniteTable } from "./components/data-display/infinite-table";
|
|
260
260
|
export { TableContext } from "./components/data-display/infinite-table/context";
|
|
261
261
|
export type { ITableContext } from "./components/data-display/infinite-table/context";
|
|
262
|
-
export type { ITableProps, ICell, IColumn, ITableView, IMultiSelectConfig, TTableKey, TTableRow, TCheckboxUtilities, IMasterDataModalConfig, ICurrencyDropdownConfig,
|
|
262
|
+
export type { ITableProps, ICell, IColumn, ITableView, IMultiSelectConfig, TTableKey, TTableRow, TCheckboxUtilities, IMasterDataModalConfig, ICurrencyDropdownConfig, IPendingEdit, PendingEditsMap, ValidateAndSaveResult, THeaderInlineAction, } from "./components/data-display/infinite-table/types";
|
|
263
263
|
export { useCheckbox } from "./hooks/useCheckbox";
|
|
264
264
|
export { default as UserCell } from "./components/data-display/infinite-table/body/cell/UserCell";
|
|
265
265
|
export { Dropdown } from "./components/dropdown/Dropdown";
|
|
@@ -104,7 +104,6 @@ export type TableConfig = {
|
|
|
104
104
|
renderColumnOptions?: (props: Record<string, unknown>) => ReactNode;
|
|
105
105
|
renderCurrencyDropdown?: (props: Record<string, unknown>) => ReactNode;
|
|
106
106
|
renderColumnContextOptions?: (props: Record<string, unknown>) => ReactNode;
|
|
107
|
-
renderCellContextMenu?: (props: Record<string, unknown>) => ReactNode;
|
|
108
107
|
renderSapLabel?: () => ReactNode;
|
|
109
108
|
renderKeyIcons?: (type: 'primary' | 'composite', color?: string) => ReactNode;
|
|
110
109
|
getRowOptionsDropdownProps?: () => {
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),Y=require("../../../providers/design-system-provider/hooks.cjs.js"),K=require("./copy-text.cjs.js"),O=require("../../../_virtual/index.cjs.js"),o=require("react"),Z=require("react-dom"),T=require("./constants.cjs.js"),L=require("../../icon/icons.generated.cjs.js"),Q=async t=>{try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(t),!0}catch{}try{const i=document.createElement("textarea");i.value=t,i.setAttribute("readonly",""),i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select();const d=document.execCommand("copy");return document.body.removeChild(i),d}catch{return!1}},ee=t=>{if(!t)return"";try{return new URL(t,window.location.href).href}catch{return""}},S=(t,i,d)=>t===void 0?d:typeof t=="function"?t(i):t,te=({item:t,isDisabled:i,isActive:d,onSelect:w,onHover:y})=>l.jsxs("button",{type:"button",role:"menuitem","data-menu-item":!0,disabled:i,"aria-disabled":i,tabIndex:d?0:-1,className:O("flex w-full items-center gap-3 px-3 py-2 text-sm font-medium text-left outline-none",i?"opacity-50 cursor-not-allowed":O("cursor-pointer",t.isDanger?"text-error-600 dark:text-error-400 hover:bg-error-50 dark:hover:bg-error-950 focus-visible:bg-error-50 dark:focus-visible:bg-error-950":"text-neutral-900 dark:text-white hover:bg-neutral-100 dark:hover:bg-black-600 focus-visible:bg-neutral-100 dark:focus-visible:bg-black-600")),onClick:w,onMouseEnter:()=>!i&&y(),children:[t.icon?l.jsx("span",{className:O("flex shrink-0 items-center",t.isDanger?"text-error-600 dark:text-error-400":"text-neutral-500 dark:text-black-300"),children:t.icon}):null,l.jsx("span",{className:"flex-1 truncate",children:t.label}),t.shortcut?l.jsx("span",{className:"shrink-0 text-xs text-neutral-400 dark:text-black-300",children:t.shortcut}):null]}),ne=({state:t,config:i,rowOptions:d,asyncRowOptionsFilter:w,checkedIds:y,rows:P,columns:g,rowLinkConfig:E,onClose:m})=>{const p=Y.useTableConfig(),c=o.useMemo(()=>p?.t??(e=>e),[p]),b=o.useRef(null),[j,B]=o.useState(null),[M,v]=o.useState(-1),[k,U]=o.useState(null),[h,N]=o.useState({status:"off"}),z=o.useRef(),a=o.useMemo(()=>t?{...t.target,close:m}:null,[t,m]),F=o.useCallback(async(e,n,r)=>{if(k)return;const s=await Q(n);s?(i?.onCopy?.(n,r),p?.showNotification?.("success",c("Copied to clipboard"))):p?.showNotification?.("error",c("Could not copy to clipboard")),U({key:e,isCopied:s}),z.current=setTimeout(()=>m(),T.COPY_FEEDBACK_DURATION)},[i,p,c,m,k]),C=o.useCallback((e,n,r,s)=>{const u=k?.key===e;return{key:e,label:u?k?.isCopied?c("Copied"):c("Copy failed"):n,icon:u&&k?.isCopied?l.jsx(L.CheckIcon,{size:16,className:"text-success-600 dark:text-success-400"}):s??l.jsx(L.ContentCopyIcon,{size:16}),isDisabled:!r,keepOpenOnClick:!0,onClick:q=>F(e,r,q)}},[k,F,c]),H=o.useMemo(()=>K.getRowJson(t?.target.rowData,g),[t?.target.rowData,g]),J=o.useMemo(()=>t?K.getSelectedRowsJson(P,g,y):"",[t,P,g,y]),R=y?.length??0,x=o.useMemo(()=>!t||!E?.isEnabled||!E.linkTo||t.target.column?.disableRowClick?"":ee(E.linkTo(String(t.target.rowId),t.target.rowData)),[t,E]),X=o.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),_=o.useMemo(()=>{if(!a)return[];const e=i?.hideDefaultItems?[]:[C("copy-cell",i?.copyLabel??c("Copy Cell"),a.text),C("copy-row",c("Copy Row"),H),...R>0?[C("copy-selected-rows",R===1?c("Copy Selected Row"):`${c("Copy Selected Rows")} (${R})`,J)]:[],...x&&!i?.hideLinkItems?[{...C("copy-link",c("Copy Link"),x,l.jsx(L.LinkIcon,{size:16})),withDividerBefore:!0},{key:"open-in-new-tab",label:c("Open in New Tab"),icon:l.jsx(L.OpenInNewIcon,{size:16}),onClick:X}]:[]],n=typeof i?.items=="function"?i.items(a):i?.items??[];return[...e,...n].filter(r=>S(r.isVisible,a,!0))},[i,a,C,R,H,J,x,X,c]),D=o.useMemo(()=>!t||i?.includeRowOptions===!1||!d?[]:((typeof d=="function"?d(t.target.rowData):d)??[]).filter(n=>n.isVisible!==!1),[t,d,i?.includeRowOptions]),V=D.length>0;o.useEffect(()=>{if(!t||!V||!w){N({status:"off"});return}let e=!1;return N({status:"loading"}),w(String(t.target.rowId)).then(n=>!e&&N({status:"ready",available:n})).catch(()=>!e&&N({status:"failed"})),()=>{e=!0}},[t,V,w]);const A=o.useMemo(()=>{if(h.status==="off")return D;if(h.status!=="ready")return[];const{available:e}=h;return D.filter(n=>e[n.key]??!0)},[D,h]),f=o.useMemo(()=>{const e=_.map(r=>({kind:"item",key:r.key,item:r})),n=e.length>0;return h.status==="loading"?[...e,{kind:"skeleton",key:"row-options-loading",withDividerBefore:n}]:[...e,...A.map((r,s)=>({kind:"node",key:`row-option-${r.key}`,node:r.label,withDividerBefore:n&&s===0}))]},[_,A,h.status]),I=o.useCallback(e=>e.kind==="item"?!(a&&S(e.item.isDisabled,a,!1)):e.kind==="node",[a]),W=o.useMemo(()=>f.findIndex(I),[f,I]);o.useLayoutEffect(()=>{if(!t||!b.current){B(null);return}const{width:e,height:n}=b.current.getBoundingClientRect(),r=T.CELL_CONTEXT_MENU_VIEWPORT_MARGIN,s=T.CELL_CONTEXT_MENU_CURSOR_OFFSET,u=t.x+e+r>window.innerWidth?t.x-e-s:t.x+s,q=t.y+n+r>window.innerHeight?t.y-n-s:t.y+s;B({left:Math.max(r,Math.min(u,window.innerWidth-e-r)),top:Math.max(r,Math.min(q,window.innerHeight-n-r))})},[t,f.length]),o.useEffect(()=>(U(null),()=>clearTimeout(z.current)),[t]),o.useEffect(()=>{if(!t){v(-1);return}v(W)},[t,W]),o.useEffect(()=>{if(!t||M<0)return;const e=b.current?.querySelectorAll("[data-menu-item]")[M];(e?.matches("button")?e:e?.querySelector("button")??e)?.focus({preventScroll:!0})},[t,M]);const $=o.useCallback(e=>{f.length!==0&&v(n=>{let r=n;for(let s=0;s<f.length;s+=1)if(r=(r+e+f.length)%f.length,I(f[r]))return r;return n})},[f,I]);if(o.useEffect(()=>{if(!t)return;const e=u=>{b.current&&!b.current.contains(u.target)&&m()},n=u=>{if(u.key==="Escape"){u.stopPropagation(),m();return}(u.key==="ArrowDown"||u.key==="ArrowUp")&&(u.preventDefault(),$(u.key==="ArrowDown"?1:-1))},r=()=>m(),s=setTimeout(()=>{document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",n),document.addEventListener("scroll",r,!0),window.addEventListener("resize",r)},0);return()=>{clearTimeout(s),document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("keydown",n),document.removeEventListener("scroll",r,!0),window.removeEventListener("resize",r)}},[t,m,$]),!t||!a||f.length===0)return null;if(p?.renderCellContextMenu)return p.renderCellContextMenu({state:t,context:a,items:_,rowOptions:A,onClose:m});const G=async e=>{S(e.isDisabled,a,!1)||(e.keepOpenOnClick||m(),await e.onClick?.(a))};return Z.createPortal(l.jsx("div",{ref:b,role:"menu","aria-label":c("Cell actions"),"data-testid":"cell-context-menu",className:O("fixed min-w-[180px] max-w-[280px] py-1 rounded-lg font-inter","bg-white dark:bg-black-700","border border-neutral-200 dark:border-black-600","shadow-lg dark:shadow-black/40",i?.className),style:{left:j?.left??t.x,top:j?.top??t.y,zIndex:T.CELL_CONTEXT_MENU_Z_INDEX,visibility:j?"visible":"hidden"},onContextMenu:e=>e.preventDefault(),children:f.map((e,n)=>l.jsxs(o.Fragment,{children:[(e.kind==="item"?e.item.withDividerBefore&&n>0:e.withDividerBefore)?l.jsx("div",{className:"my-1 h-px bg-neutral-200 dark:bg-black-600"}):null,e.kind==="item"?l.jsx(te,{item:e.item,isDisabled:S(e.item.isDisabled,a,!1),isActive:n===M,onSelect:()=>void G(e.item),onHover:()=>v(n)}):e.kind==="skeleton"?l.jsx("div",{className:"px-3 py-2","data-testid":"cell-context-menu-loading",children:l.jsx("div",{className:"h-3.5 w-full animate-pulse rounded bg-neutral-200 dark:bg-black-600"})}):l.jsx("div",{"data-menu-item":!0,tabIndex:-1,className:"outline-none [&_button]:w-full",onClick:m,onMouseEnter:()=>v(n),children:e.node})]},e.key))}),document.body)};exports.CellContextMenuPortal=ne;
|
|
2
|
-
//# sourceMappingURL=CellContextMenuPortal.cjs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CellContextMenuPortal.cjs.js","sources":["../../../../src/components/data-display/infinite-table/CellContextMenuPortal.tsx"],"sourcesContent":["import { useTableConfig } from '../../../providers/design-system-provider/hooks';\nimport { CheckIcon, ContentCopyIcon, LinkIcon, OpenInNewIcon } from '../../icon';\nimport type {\n ICellContextMenuConfig,\n ICellContextMenuContext,\n ICellContextMenuItem,\n ICellContextMenuState,\n IColumn,\n IRowLinkConfig,\n} from './types';\nimport { getRowJson, getSelectedRowsJson } from './copy-text';\nimport cn from 'classnames';\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n CELL_CONTEXT_MENU_CURSOR_OFFSET,\n COPY_FEEDBACK_DURATION,\n CELL_CONTEXT_MENU_VIEWPORT_MARGIN,\n CELL_CONTEXT_MENU_Z_INDEX,\n} from './constants';\n\ntype TRowOption = { key: string; label: React.ReactNode; isVisible?: boolean };\n\n/** Result of the per-row availability check for row actions. */\ntype TRowOptionsFilter =\n | { status: 'off' }\n | { status: 'loading' }\n | { status: 'ready'; available: Record<string, boolean> }\n | { status: 'failed' };\n\n/** One rendered menu line: a declared item, a row-action node supplied by the table, or the row-action placeholder. */\ntype TMenuRow =\n | { kind: 'item'; key: string; item: ICellContextMenuItem }\n | { kind: 'node'; key: string; node: React.ReactNode; withDividerBefore?: boolean }\n | { kind: 'skeleton'; key: string; withDividerBefore?: boolean };\n\ninterface CellContextMenuPortalProps {\n state: ICellContextMenuState | null;\n config?: ICellContextMenuConfig | null;\n /** The table's row actions, appended to the menu — same list the three-dot cell renders. */\n rowOptions?: TRowOption[] | ((rowData: Record<string, unknown>) => TRowOption[] | null) | null;\n /** Per-row availability check for `rowOptions`, mirroring the three-dot cell so both menus agree. */\n asyncRowOptionsFilter?: ((rowId: string) => Promise<Record<string, boolean>>) | null;\n /** Checked row ids, enabling the \"Copy selected rows\" item. */\n checkedIds?: (string | number)[];\n /** Table rows, used to build the text for selected rows that are scrolled out of view. */\n rows?: Record<string, unknown>[];\n /** Visible columns in display order, used to order the copied values. */\n columns?: IColumn[];\n /** The table's row link, enabling the \"Copy Link\" / \"Open in New Tab\" items. */\n rowLinkConfig?: IRowLinkConfig | null;\n onClose: () => void;\n}\n\n/** Clipboard write with a fallback for browsers / insecure contexts without the async clipboard API. */\nconst writeToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through to the textarea fallback\n }\n\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n const copied = document.execCommand('copy');\n document.body.removeChild(textarea);\n return copied;\n } catch {\n return false;\n }\n};\n\n/** `linkTo` returns a router path; the clipboard and a new tab both need a full URL. */\nconst toAbsoluteUrl = (path: string): string => {\n if (!path) return '';\n\n try {\n return new URL(path, window.location.href).href;\n } catch {\n return '';\n }\n};\n\nconst resolveFlag = (\n flag: boolean | ((context: ICellContextMenuContext) => boolean) | undefined,\n context: ICellContextMenuContext,\n fallback: boolean,\n): boolean => {\n if (flag === undefined) return fallback;\n return typeof flag === 'function' ? flag(context) : flag;\n};\n\nconst MenuItemButton: React.FC<{\n item: ICellContextMenuItem;\n isDisabled: boolean;\n isActive: boolean;\n onSelect: () => void;\n onHover: () => void;\n}> = ({ item, isDisabled, isActive, onSelect, onHover }) => (\n <button\n type='button'\n role='menuitem'\n data-menu-item\n disabled={isDisabled}\n aria-disabled={isDisabled}\n tabIndex={isActive ? 0 : -1}\n className={cn(\n 'flex w-full items-center gap-3 px-3 py-2 text-sm font-medium text-left outline-none',\n isDisabled\n ? 'opacity-50 cursor-not-allowed'\n : cn(\n 'cursor-pointer',\n item.isDanger\n ? 'text-error-600 dark:text-error-400 hover:bg-error-50 dark:hover:bg-error-950 focus-visible:bg-error-50 dark:focus-visible:bg-error-950'\n : 'text-neutral-900 dark:text-white hover:bg-neutral-100 dark:hover:bg-black-600 focus-visible:bg-neutral-100 dark:focus-visible:bg-black-600',\n ),\n )}\n onClick={onSelect}\n onMouseEnter={() => !isDisabled && onHover()}\n >\n {item.icon ? (\n <span className={cn('flex shrink-0 items-center', item.isDanger ? 'text-error-600 dark:text-error-400' : 'text-neutral-500 dark:text-black-300')}>\n {item.icon}\n </span>\n ) : null}\n <span className='flex-1 truncate'>{item.label}</span>\n {item.shortcut ? <span className='shrink-0 text-xs text-neutral-400 dark:text-black-300'>{item.shortcut}</span> : null}\n </button>\n);\n\n/**\n * Right-click menu for data cells. Rendered once per table and positioned at the\n * cursor; `DataCell` opens it through `openCellContextMenu` on the table context.\n */\nexport const CellContextMenuPortal: React.FC<CellContextMenuPortalProps> = ({\n state, config, rowOptions, asyncRowOptionsFilter, checkedIds, rows, columns, rowLinkConfig, onClose,\n}) => {\n const tableConfig = useTableConfig();\n const t = useMemo(() => tableConfig?.t ?? ((key: string) => key), [tableConfig]);\n const menuRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ left: number; top: number } | null>(null);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [copyState, setCopyState] = useState<{ key: string; isCopied: boolean } | null>(null);\n const [rowOptionsFilter, setRowOptionsFilter] = useState<TRowOptionsFilter>({ status: 'off' });\n const closeTimer = useRef<ReturnType<typeof setTimeout>>();\n\n const context = useMemo<ICellContextMenuContext | null>(\n () => (state ? { ...state.target, close: onClose } : null),\n [state, onClose],\n );\n\n const handleCopy = useCallback(\n async (key: string, text: string, menuContext: ICellContextMenuContext) => {\n if (copyState) return;\n\n const isCopied = await writeToClipboard(text);\n\n if (isCopied) {\n config?.onCopy?.(text, menuContext);\n tableConfig?.showNotification?.('success', t('Copied to clipboard'));\n } else {\n tableConfig?.showNotification?.('error', t('Could not copy to clipboard'));\n }\n\n // Confirmed inline instead of with a toast, so the menu owns its own feedback.\n setCopyState({ key, isCopied });\n closeTimer.current = setTimeout(() => onClose(), COPY_FEEDBACK_DURATION);\n },\n [config, tableConfig, t, onClose, copyState],\n );\n\n const buildCopyItem = useCallback(\n (key: string, label: string, text: string, icon?: React.ReactNode): ICellContextMenuItem => {\n const isDone = copyState?.key === key;\n\n return {\n key,\n label: !isDone ? label : copyState?.isCopied ? t('Copied') : t('Copy failed'),\n icon:\n isDone && copyState?.isCopied ? (\n <CheckIcon size={16} className='text-success-600 dark:text-success-400' />\n ) : (\n icon ?? <ContentCopyIcon size={16} />\n ),\n isDisabled: !text,\n keepOpenOnClick: true,\n onClick: (menuContext) => handleCopy(key, text, menuContext),\n };\n },\n [copyState, handleCopy, t],\n );\n\n const rowJson = useMemo(() => getRowJson(state?.target.rowData, columns), [state?.target.rowData, columns]);\n // Only while the menu is open — otherwise every checkbox tick would serialize the selection.\n const selectedRowsJson = useMemo(() => (state ? getSelectedRowsJson(rows, columns, checkedIds) : ''), [state, rows, columns, checkedIds]);\n const selectedCount = checkedIds?.length ?? 0;\n\n /** The row link as an absolute URL — empty unless the table opted in, and never on a cell that opts out of the row link. */\n const rowLinkHref = useMemo(() => {\n if (!state || !rowLinkConfig?.isEnabled || !rowLinkConfig.linkTo || state.target.column?.disableRowClick) return '';\n\n return toAbsoluteUrl(rowLinkConfig.linkTo(String(state.target.rowId), state.target.rowData));\n }, [state, rowLinkConfig]);\n\n const openInNewTab = useCallback(() => {\n if (rowLinkHref) window.open(rowLinkHref, '_blank', 'noopener,noreferrer');\n }, [rowLinkHref]);\n\n const items = useMemo<ICellContextMenuItem[]>(() => {\n if (!context) return [];\n\n const defaultItems: ICellContextMenuItem[] = config?.hideDefaultItems\n ? []\n : [\n buildCopyItem('copy-cell', config?.copyLabel ?? t('Copy Cell'), context.text),\n buildCopyItem('copy-row', t('Copy Row'), rowJson),\n ...(selectedCount > 0\n ? [\n buildCopyItem(\n 'copy-selected-rows',\n selectedCount === 1 ? t('Copy Selected Row') : `${t('Copy Selected Rows')} (${selectedCount})`,\n selectedRowsJson,\n ),\n ]\n : []),\n ...(rowLinkHref && !config?.hideLinkItems\n ? [\n {\n ...buildCopyItem('copy-link', t('Copy Link'), rowLinkHref, <LinkIcon size={16} />),\n withDividerBefore: true,\n },\n {\n key: 'open-in-new-tab',\n label: t('Open in New Tab'),\n icon: <OpenInNewIcon size={16} />,\n onClick: openInNewTab,\n },\n ]\n : []),\n ];\n\n const extraItems = typeof config?.items === 'function' ? config.items(context) : config?.items ?? [];\n\n return [...defaultItems, ...extraItems].filter((item) => resolveFlag(item.isVisible, context, true));\n }, [config, context, buildCopyItem, selectedCount, rowJson, selectedRowsJson, rowLinkHref, openInNewTab, t]);\n\n /** The table's own row actions, resolved for the right-clicked row. */\n const resolvedRowOptions = useMemo<TRowOption[]>(() => {\n if (!state || config?.includeRowOptions === false || !rowOptions) return [];\n\n const list = typeof rowOptions === 'function' ? rowOptions(state.target.rowData) : rowOptions;\n\n return (list ?? []).filter((option) => option.isVisible !== false);\n }, [state, rowOptions, config?.includeRowOptions]);\n\n const hasRowOptions = resolvedRowOptions.length > 0;\n\n /** Row actions can be gated per row by the API — ask before showing them, exactly as the three-dot cell does. */\n useEffect(() => {\n if (!state || !hasRowOptions || !asyncRowOptionsFilter) {\n setRowOptionsFilter({ status: 'off' });\n return;\n }\n\n let isCancelled = false;\n setRowOptionsFilter({ status: 'loading' });\n\n asyncRowOptionsFilter(String(state.target.rowId))\n .then((available) => !isCancelled && setRowOptionsFilter({ status: 'ready', available }))\n .catch(() => !isCancelled && setRowOptionsFilter({ status: 'failed' }));\n\n return () => {\n isCancelled = true;\n };\n }, [state, hasRowOptions, asyncRowOptionsFilter]);\n\n const allowedRowOptions = useMemo<TRowOption[]>(() => {\n if (rowOptionsFilter.status === 'off') return resolvedRowOptions;\n if (rowOptionsFilter.status !== 'ready') return [];\n\n const { available } = rowOptionsFilter;\n\n return resolvedRowOptions.filter((option) => available[option.key] ?? true);\n }, [resolvedRowOptions, rowOptionsFilter]);\n\n const menuRows = useMemo<TMenuRow[]>(() => {\n const itemRows: TMenuRow[] = items.map((item) => ({ kind: 'item', key: item.key, item }));\n const needsDivider = itemRows.length > 0;\n\n if (rowOptionsFilter.status === 'loading') {\n return [...itemRows, { kind: 'skeleton', key: 'row-options-loading', withDividerBefore: needsDivider }];\n }\n\n return [\n ...itemRows,\n ...allowedRowOptions.map<TMenuRow>((option, index) => ({\n kind: 'node',\n key: `row-option-${option.key}`,\n node: option.label,\n withDividerBefore: needsDivider && index === 0,\n })),\n ];\n }, [items, allowedRowOptions, rowOptionsFilter.status]);\n\n const isRowNavigable = useCallback(\n (row: TMenuRow): boolean => (row.kind === 'item' ? !(context && resolveFlag(row.item.isDisabled, context, false)) : row.kind === 'node'),\n [context],\n );\n\n const firstNavigableIndex = useMemo(() => menuRows.findIndex(isRowNavigable), [menuRows, isRowNavigable]);\n\n /** Clamp into the viewport once the menu has been measured; row actions can arrive after the first paint. */\n useLayoutEffect(() => {\n if (!state || !menuRef.current) {\n setPosition(null);\n return;\n }\n\n const { width, height } = menuRef.current.getBoundingClientRect();\n const margin = CELL_CONTEXT_MENU_VIEWPORT_MARGIN;\n const offset = CELL_CONTEXT_MENU_CURSOR_OFFSET;\n\n // Flip to the other side of the cursor when there is no room, then clamp.\n const left = state.x + width + margin > window.innerWidth ? state.x - width - offset : state.x + offset;\n const top = state.y + height + margin > window.innerHeight ? state.y - height - offset : state.y + offset;\n\n setPosition({\n left: Math.max(margin, Math.min(left, window.innerWidth - width - margin)),\n top: Math.max(margin, Math.min(top, window.innerHeight - height - margin)),\n });\n }, [state, menuRows.length]);\n\n useEffect(() => {\n setCopyState(null);\n return () => clearTimeout(closeTimer.current);\n }, [state]);\n\n useEffect(() => {\n if (!state) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex(firstNavigableIndex);\n }, [state, firstNavigableIndex]);\n\n /** Focus follows the active row so the menu is keyboard operable; row actions bring their own button. */\n useEffect(() => {\n if (!state || activeIndex < 0) return;\n\n const row = menuRef.current?.querySelectorAll<HTMLElement>('[data-menu-item]')[activeIndex];\n const focusTarget = row?.matches('button') ? row : row?.querySelector('button') ?? row;\n\n // preventScroll: a focus-driven scroll would immediately close the menu.\n focusTarget?.focus({ preventScroll: true });\n }, [state, activeIndex]);\n\n const moveActiveIndex = useCallback(\n (direction: 1 | -1) => {\n if (menuRows.length === 0) return;\n setActiveIndex((current) => {\n let next = current;\n for (let step = 0; step < menuRows.length; step += 1) {\n next = (next + direction + menuRows.length) % menuRows.length;\n if (isRowNavigable(menuRows[next])) return next;\n }\n return current;\n });\n },\n [menuRows, isRowNavigable],\n );\n\n useEffect(() => {\n if (!state) return;\n\n const handlePointerDown = (event: MouseEvent | TouchEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n moveActiveIndex(event.key === 'ArrowDown' ? 1 : -1);\n }\n };\n // Any scroll (table viewport included) detaches the menu from its cell, so close it.\n const handleScroll = () => onClose();\n\n // Deferred so the right click that opened the menu does not immediately close it.\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handlePointerDown);\n document.addEventListener('touchstart', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('scroll', handleScroll, true);\n window.addEventListener('resize', handleScroll);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handlePointerDown);\n document.removeEventListener('touchstart', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('scroll', handleScroll, true);\n window.removeEventListener('resize', handleScroll);\n };\n }, [state, onClose, moveActiveIndex]);\n\n if (!state || !context || menuRows.length === 0) return null;\n\n if (tableConfig?.renderCellContextMenu) {\n return tableConfig.renderCellContextMenu({ state, context, items, rowOptions: allowedRowOptions, onClose }) as JSX.Element;\n }\n\n const handleItemClick = async (item: ICellContextMenuItem): Promise<void> => {\n if (resolveFlag(item.isDisabled, context, false)) return;\n if (!item.keepOpenOnClick) onClose();\n await item.onClick?.(context);\n };\n\n return createPortal(\n <div\n ref={menuRef}\n role='menu'\n aria-label={t('Cell actions')}\n data-testid='cell-context-menu'\n className={cn(\n 'fixed min-w-[180px] max-w-[280px] py-1 rounded-lg font-inter',\n 'bg-white dark:bg-black-700',\n 'border border-neutral-200 dark:border-black-600',\n 'shadow-lg dark:shadow-black/40',\n config?.className,\n )}\n style={{\n left: position?.left ?? state.x,\n top: position?.top ?? state.y,\n zIndex: CELL_CONTEXT_MENU_Z_INDEX,\n // Hidden until measured so the flip/clamp never flashes at the wrong spot.\n visibility: position ? 'visible' : 'hidden',\n }}\n onContextMenu={(event) => event.preventDefault()}\n >\n {menuRows.map((row, index) => (\n <React.Fragment key={row.key}>\n {(row.kind === 'item' ? row.item.withDividerBefore && index > 0 : row.withDividerBefore) ? (\n <div className='my-1 h-px bg-neutral-200 dark:bg-black-600' />\n ) : null}\n {row.kind === 'item' ? (\n <MenuItemButton\n item={row.item}\n isDisabled={resolveFlag(row.item.isDisabled, context, false)}\n isActive={index === activeIndex}\n onSelect={() => void handleItemClick(row.item)}\n onHover={() => setActiveIndex(index)}\n />\n ) : row.kind === 'skeleton' ? (\n <div className='px-3 py-2' data-testid='cell-context-menu-loading'>\n <div className='h-3.5 w-full animate-pulse rounded bg-neutral-200 dark:bg-black-600' />\n </div>\n ) : (\n /* Row actions are rendered as the table supplied them — they carry their own button and handler. */\n <div data-menu-item tabIndex={-1} className='outline-none [&_button]:w-full' onClick={onClose} onMouseEnter={() => setActiveIndex(index)}>\n {row.node}\n </div>\n )}\n </React.Fragment>\n ))}\n </div>,\n document.body,\n );\n};\n"],"names":["writeToClipboard","text","textarea","copied","toAbsoluteUrl","path","resolveFlag","flag","context","fallback","MenuItemButton","item","isDisabled","isActive","onSelect","onHover","jsxs","cn","jsx","CellContextMenuPortal","state","config","rowOptions","asyncRowOptionsFilter","checkedIds","rows","columns","rowLinkConfig","onClose","tableConfig","useTableConfig","t","useMemo","key","menuRef","useRef","position","setPosition","useState","activeIndex","setActiveIndex","copyState","setCopyState","rowOptionsFilter","setRowOptionsFilter","closeTimer","handleCopy","useCallback","menuContext","isCopied","COPY_FEEDBACK_DURATION","buildCopyItem","label","icon","isDone","CheckIcon","ContentCopyIcon","rowJson","getRowJson","selectedRowsJson","getSelectedRowsJson","selectedCount","rowLinkHref","openInNewTab","items","defaultItems","LinkIcon","OpenInNewIcon","extraItems","resolvedRowOptions","option","hasRowOptions","useEffect","isCancelled","available","allowedRowOptions","menuRows","itemRows","needsDivider","index","isRowNavigable","row","firstNavigableIndex","useLayoutEffect","width","height","margin","CELL_CONTEXT_MENU_VIEWPORT_MARGIN","offset","CELL_CONTEXT_MENU_CURSOR_OFFSET","left","top","moveActiveIndex","direction","current","next","step","handlePointerDown","event","handleKeyDown","handleScroll","timeoutId","handleItemClick","createPortal","CELL_CONTEXT_MENU_Z_INDEX","React"],"mappings":"8XAwDMA,EAAmB,MAAOC,GAAmC,CACjE,GAAI,CACF,GAAI,WAAW,WAAW,UACxB,aAAM,UAAU,UAAU,UAAUA,CAAI,EACjC,EAEX,MAAQ,CAER,CAEA,GAAI,CACF,MAAMC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQD,EACjBC,EAAS,aAAa,WAAY,EAAE,EACpCA,EAAS,MAAM,SAAW,QAC1BA,EAAS,MAAM,QAAU,IACzB,SAAS,KAAK,YAAYA,CAAQ,EAClCA,EAAS,OAAA,EACT,MAAMC,EAAS,SAAS,YAAY,MAAM,EAC1C,gBAAS,KAAK,YAAYD,CAAQ,EAC3BC,CACT,MAAQ,CACN,MAAO,EACT,CACF,EAGMC,GAAiBC,GAAyB,CAC9C,GAAI,CAACA,EAAM,MAAO,GAElB,GAAI,CACF,OAAO,IAAI,IAAIA,EAAM,OAAO,SAAS,IAAI,EAAE,IAC7C,MAAQ,CACN,MAAO,EACT,CACF,EAEMC,EAAc,CAClBC,EACAC,EACAC,IAEIF,IAAS,OAAkBE,EACxB,OAAOF,GAAS,WAAaA,EAAKC,CAAO,EAAID,EAGhDG,GAMD,CAAC,CAAE,KAAAC,EAAM,WAAAC,EAAY,SAAAC,EAAU,SAAAC,EAAU,QAAAC,KAC5CC,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,KAAK,WACL,iBAAc,GACd,SAAUJ,EACV,gBAAeA,EACf,SAAUC,EAAW,EAAI,GACzB,UAAWI,EACT,sFACAL,EACI,gCACAK,EACE,iBACAN,EAAK,SACD,yIACA,4IAAA,CACN,EAEN,QAASG,EACT,aAAc,IAAM,CAACF,GAAcG,EAAA,EAElC,SAAA,CAAAJ,EAAK,KACJO,MAAC,OAAA,CAAK,UAAWD,EAAG,6BAA8BN,EAAK,SAAW,qCAAuC,sCAAsC,EAC5I,SAAAA,EAAK,KACR,EACE,KACJO,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAmB,WAAK,MAAM,EAC7CP,EAAK,SAAWO,MAAC,OAAA,CAAK,UAAU,wDAAyD,SAAAP,EAAK,SAAS,EAAU,IAAA,CAAA,CACpH,EAOWQ,GAA8D,CAAC,CAC1E,MAAAC,EAAO,OAAAC,EAAQ,WAAAC,EAAY,sBAAAC,EAAuB,WAAAC,EAAY,KAAAC,EAAM,QAAAC,EAAS,cAAAC,EAAe,QAAAC,CAC9F,IAAM,CACJ,MAAMC,EAAcC,EAAAA,eAAA,EACdC,EAAIC,UAAQ,IAAMH,GAAa,IAAOI,GAAgBA,GAAM,CAACJ,CAAW,CAAC,EACzEK,EAAUC,EAAAA,OAAuB,IAAI,EACrC,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAA+C,IAAI,EAC7E,CAACC,EAAaC,CAAc,EAAIF,EAAAA,SAAS,EAAE,EAC3C,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAoD,IAAI,EACpF,CAACK,EAAkBC,CAAmB,EAAIN,EAAAA,SAA4B,CAAE,OAAQ,MAAO,EACvFO,EAAaV,EAAAA,OAAA,EAEb3B,EAAUwB,EAAAA,QACd,IAAOZ,EAAQ,CAAE,GAAGA,EAAM,OAAQ,MAAOQ,GAAY,KACrD,CAACR,EAAOQ,CAAO,CAAA,EAGXkB,EAAaC,EAAAA,YACjB,MAAOd,EAAahC,EAAc+C,IAAyC,CACzE,GAAIP,EAAW,OAEf,MAAMQ,EAAW,MAAMjD,EAAiBC,CAAI,EAExCgD,GACF5B,GAAQ,SAASpB,EAAM+C,CAAW,EAClCnB,GAAa,mBAAmB,UAAWE,EAAE,qBAAqB,CAAC,GAEnEF,GAAa,mBAAmB,QAASE,EAAE,6BAA6B,CAAC,EAI3EW,EAAa,CAAE,IAAAT,EAAK,SAAAgB,EAAU,EAC9BJ,EAAW,QAAU,WAAW,IAAMjB,EAAA,EAAWsB,EAAAA,sBAAsB,CACzE,EACA,CAAC7B,EAAQQ,EAAaE,EAAGH,EAASa,CAAS,CAAA,EAGvCU,EAAgBJ,EAAAA,YACpB,CAACd,EAAamB,EAAenD,EAAcoD,IAAiD,CAC1F,MAAMC,EAASb,GAAW,MAAQR,EAElC,MAAO,CACL,IAAAA,EACA,MAAQqB,EAAiBb,GAAW,SAAWV,EAAE,QAAQ,EAAIA,EAAE,aAAa,EAA3DqB,EACjB,KACEE,GAAUb,GAAW,eAClBc,EAAAA,UAAA,CAAU,KAAM,GAAI,UAAU,yCAAyC,EAExEF,GAAQnC,EAAAA,IAACsC,EAAAA,gBAAA,CAAgB,KAAM,GAAI,EAEvC,WAAY,CAACvD,EACb,gBAAiB,GACjB,QAAU+C,GAAgBF,EAAWb,EAAKhC,EAAM+C,CAAW,CAAA,CAE/D,EACA,CAACP,EAAWK,EAAYf,CAAC,CAAA,EAGrB0B,EAAUzB,EAAAA,QAAQ,IAAM0B,EAAAA,WAAWtC,GAAO,OAAO,QAASM,CAAO,EAAG,CAACN,GAAO,OAAO,QAASM,CAAO,CAAC,EAEpGiC,EAAmB3B,EAAAA,QAAQ,IAAOZ,EAAQwC,EAAAA,oBAAoBnC,EAAMC,EAASF,CAAU,EAAI,GAAK,CAACJ,EAAOK,EAAMC,EAASF,CAAU,CAAC,EAClIqC,EAAgBrC,GAAY,QAAU,EAGtCsC,EAAc9B,EAAAA,QAAQ,IACtB,CAACZ,GAAS,CAACO,GAAe,WAAa,CAACA,EAAc,QAAUP,EAAM,OAAO,QAAQ,gBAAwB,GAE1GhB,GAAcuB,EAAc,OAAO,OAAOP,EAAM,OAAO,KAAK,EAAGA,EAAM,OAAO,OAAO,CAAC,EAC1F,CAACA,EAAOO,CAAa,CAAC,EAEnBoC,EAAehB,EAAAA,YAAY,IAAM,CACjCe,GAAa,OAAO,KAAKA,EAAa,SAAU,qBAAqB,CAC3E,EAAG,CAACA,CAAW,CAAC,EAEVE,EAAQhC,EAAAA,QAAgC,IAAM,CAClD,GAAI,CAACxB,EAAS,MAAO,CAAA,EAErB,MAAMyD,EAAuC5C,GAAQ,iBACjD,GACA,CACE8B,EAAc,YAAa9B,GAAQ,WAAaU,EAAE,WAAW,EAAGvB,EAAQ,IAAI,EAC5E2C,EAAc,WAAYpB,EAAE,UAAU,EAAG0B,CAAO,EAChD,GAAII,EAAgB,EAChB,CACEV,EACE,qBACAU,IAAkB,EAAI9B,EAAE,mBAAmB,EAAI,GAAGA,EAAE,oBAAoB,CAAC,KAAK8B,CAAa,IAC3FF,CAAA,CACF,EAEF,CAAA,EACJ,GAAIG,GAAe,CAACzC,GAAQ,cACxB,CACE,CACE,GAAG8B,EAAc,YAAapB,EAAE,WAAW,EAAG+B,EAAa5C,EAAAA,IAACgD,WAAA,CAAS,KAAM,EAAA,CAAI,CAAE,EACjF,kBAAmB,EAAA,EAErB,CACE,IAAK,kBACL,MAAOnC,EAAE,iBAAiB,EAC1B,KAAMb,EAAAA,IAACiD,EAAAA,cAAA,CAAc,KAAM,EAAA,CAAI,EAC/B,QAASJ,CAAA,CACX,EAEF,CAAA,CAAC,EAGLK,EAAa,OAAO/C,GAAQ,OAAU,WAAaA,EAAO,MAAMb,CAAO,EAAIa,GAAQ,OAAS,CAAA,EAElG,MAAO,CAAC,GAAG4C,EAAc,GAAGG,CAAU,EAAE,OAAQzD,GAASL,EAAYK,EAAK,UAAWH,EAAS,EAAI,CAAC,CACrG,EAAG,CAACa,EAAQb,EAAS2C,EAAeU,EAAeJ,EAASE,EAAkBG,EAAaC,EAAchC,CAAC,CAAC,EAGrGsC,EAAqBrC,EAAAA,QAAsB,IAC3C,CAACZ,GAASC,GAAQ,oBAAsB,IAAS,CAACC,EAAmB,CAAA,IAE5D,OAAOA,GAAe,WAAaA,EAAWF,EAAM,OAAO,OAAO,EAAIE,IAEnE,CAAA,GAAI,OAAQgD,GAAWA,EAAO,YAAc,EAAK,EAChE,CAAClD,EAAOE,EAAYD,GAAQ,iBAAiB,CAAC,EAE3CkD,EAAgBF,EAAmB,OAAS,EAGlDG,EAAAA,UAAU,IAAM,CACd,GAAI,CAACpD,GAAS,CAACmD,GAAiB,CAAChD,EAAuB,CACtDqB,EAAoB,CAAE,OAAQ,MAAO,EACrC,MACF,CAEA,IAAI6B,EAAc,GAClB,OAAA7B,EAAoB,CAAE,OAAQ,UAAW,EAEzCrB,EAAsB,OAAOH,EAAM,OAAO,KAAK,CAAC,EAC7C,KAAMsD,GAAc,CAACD,GAAe7B,EAAoB,CAAE,OAAQ,QAAS,UAAA8B,CAAA,CAAW,CAAC,EACvF,MAAM,IAAM,CAACD,GAAe7B,EAAoB,CAAE,OAAQ,QAAA,CAAU,CAAC,EAEjE,IAAM,CACX6B,EAAc,EAChB,CACF,EAAG,CAACrD,EAAOmD,EAAehD,CAAqB,CAAC,EAEhD,MAAMoD,EAAoB3C,EAAAA,QAAsB,IAAM,CACpD,GAAIW,EAAiB,SAAW,MAAO,OAAO0B,EAC9C,GAAI1B,EAAiB,SAAW,QAAS,MAAO,CAAA,EAEhD,KAAM,CAAE,UAAA+B,GAAc/B,EAEtB,OAAO0B,EAAmB,OAAQC,GAAWI,EAAUJ,EAAO,GAAG,GAAK,EAAI,CAC5E,EAAG,CAACD,EAAoB1B,CAAgB,CAAC,EAEnCiC,EAAW5C,EAAAA,QAAoB,IAAM,CACzC,MAAM6C,EAAuBb,EAAM,IAAKrD,IAAU,CAAE,KAAM,OAAQ,IAAKA,EAAK,IAAK,KAAAA,CAAA,EAAO,EAClFmE,EAAeD,EAAS,OAAS,EAEvC,OAAIlC,EAAiB,SAAW,UACvB,CAAC,GAAGkC,EAAU,CAAE,KAAM,WAAY,IAAK,sBAAuB,kBAAmBC,EAAc,EAGjG,CACL,GAAGD,EACH,GAAGF,EAAkB,IAAc,CAACL,EAAQS,KAAW,CACrD,KAAM,OACN,IAAK,cAAcT,EAAO,GAAG,GAC7B,KAAMA,EAAO,MACb,kBAAmBQ,GAAgBC,IAAU,CAAA,EAC7C,CAAA,CAEN,EAAG,CAACf,EAAOW,EAAmBhC,EAAiB,MAAM,CAAC,EAEhDqC,EAAiBjC,EAAAA,YACpBkC,GAA4BA,EAAI,OAAS,OAAS,EAAEzE,GAAWF,EAAY2E,EAAI,KAAK,WAAYzE,EAAS,EAAK,GAAKyE,EAAI,OAAS,OACjI,CAACzE,CAAO,CAAA,EAGJ0E,EAAsBlD,UAAQ,IAAM4C,EAAS,UAAUI,CAAc,EAAG,CAACJ,EAAUI,CAAc,CAAC,EAGxGG,EAAAA,gBAAgB,IAAM,CACpB,GAAI,CAAC/D,GAAS,CAACc,EAAQ,QAAS,CAC9BG,EAAY,IAAI,EAChB,MACF,CAEA,KAAM,CAAE,MAAA+C,EAAO,OAAAC,CAAA,EAAWnD,EAAQ,QAAQ,sBAAA,EACpCoD,EAASC,EAAAA,kCACTC,EAASC,EAAAA,gCAGTC,EAAOtE,EAAM,EAAIgE,EAAQE,EAAS,OAAO,WAAalE,EAAM,EAAIgE,EAAQI,EAASpE,EAAM,EAAIoE,EAC3FG,EAAMvE,EAAM,EAAIiE,EAASC,EAAS,OAAO,YAAclE,EAAM,EAAIiE,EAASG,EAASpE,EAAM,EAAIoE,EAEnGnD,EAAY,CACV,KAAM,KAAK,IAAIiD,EAAQ,KAAK,IAAII,EAAM,OAAO,WAAaN,EAAQE,CAAM,CAAC,EACzE,IAAK,KAAK,IAAIA,EAAQ,KAAK,IAAIK,EAAK,OAAO,YAAcN,EAASC,CAAM,CAAC,CAAA,CAC1E,CACH,EAAG,CAAClE,EAAOwD,EAAS,MAAM,CAAC,EAE3BJ,EAAAA,UAAU,KACR9B,EAAa,IAAI,EACV,IAAM,aAAaG,EAAW,OAAO,GAC3C,CAACzB,CAAK,CAAC,EAEVoD,EAAAA,UAAU,IAAM,CACd,GAAI,CAACpD,EAAO,CACVoB,EAAe,EAAE,EACjB,MACF,CACAA,EAAe0C,CAAmB,CACpC,EAAG,CAAC9D,EAAO8D,CAAmB,CAAC,EAG/BV,EAAAA,UAAU,IAAM,CACd,GAAI,CAACpD,GAASmB,EAAc,EAAG,OAE/B,MAAM0C,EAAM/C,EAAQ,SAAS,iBAA8B,kBAAkB,EAAEK,CAAW,GACtE0C,GAAK,QAAQ,QAAQ,EAAIA,EAAMA,GAAK,cAAc,QAAQ,GAAKA,IAGtE,MAAM,CAAE,cAAe,EAAA,CAAM,CAC5C,EAAG,CAAC7D,EAAOmB,CAAW,CAAC,EAEvB,MAAMqD,EAAkB7C,EAAAA,YACrB8C,GAAsB,CACjBjB,EAAS,SAAW,GACxBpC,EAAgBsD,GAAY,CAC1B,IAAIC,EAAOD,EACX,QAASE,EAAO,EAAGA,EAAOpB,EAAS,OAAQoB,GAAQ,EAEjD,GADAD,GAAQA,EAAOF,EAAYjB,EAAS,QAAUA,EAAS,OACnDI,EAAeJ,EAASmB,CAAI,CAAC,EAAG,OAAOA,EAE7C,OAAOD,CACT,CAAC,CACH,EACA,CAAClB,EAAUI,CAAc,CAAA,EA0C3B,GAvCAR,EAAAA,UAAU,IAAM,CACd,GAAI,CAACpD,EAAO,OAEZ,MAAM6E,EAAqBC,GAAmC,CACxDhE,EAAQ,SAAW,CAACA,EAAQ,QAAQ,SAASgE,EAAM,MAAc,GAAGtE,EAAA,CAC1E,EACMuE,EAAiBD,GAAyB,CAC9C,GAAIA,EAAM,MAAQ,SAAU,CAC1BA,EAAM,gBAAA,EACNtE,EAAA,EACA,MACF,EACIsE,EAAM,MAAQ,aAAeA,EAAM,MAAQ,aAC7CA,EAAM,eAAA,EACNN,EAAgBM,EAAM,MAAQ,YAAc,EAAI,EAAE,EAEtD,EAEME,EAAe,IAAMxE,EAAA,EAGrByE,EAAY,WAAW,IAAM,CACjC,SAAS,iBAAiB,YAAaJ,CAAiB,EACxD,SAAS,iBAAiB,aAAcA,CAAiB,EACzD,SAAS,iBAAiB,UAAWE,CAAa,EAClD,SAAS,iBAAiB,SAAUC,EAAc,EAAI,EACtD,OAAO,iBAAiB,SAAUA,CAAY,CAChD,EAAG,CAAC,EAEJ,MAAO,IAAM,CACX,aAAaC,CAAS,EACtB,SAAS,oBAAoB,YAAaJ,CAAiB,EAC3D,SAAS,oBAAoB,aAAcA,CAAiB,EAC5D,SAAS,oBAAoB,UAAWE,CAAa,EACrD,SAAS,oBAAoB,SAAUC,EAAc,EAAI,EACzD,OAAO,oBAAoB,SAAUA,CAAY,CACnD,CACF,EAAG,CAAChF,EAAOQ,EAASgE,CAAe,CAAC,EAEhC,CAACxE,GAAS,CAACZ,GAAWoE,EAAS,SAAW,EAAG,OAAO,KAExD,GAAI/C,GAAa,sBACf,OAAOA,EAAY,sBAAsB,CAAE,MAAAT,EAAO,QAAAZ,EAAS,MAAAwD,EAAO,WAAYW,EAAmB,QAAA/C,EAAS,EAG5G,MAAM0E,EAAkB,MAAO3F,GAA8C,CACvEL,EAAYK,EAAK,WAAYH,EAAS,EAAK,IAC1CG,EAAK,iBAAiBiB,EAAA,EAC3B,MAAMjB,EAAK,UAAUH,CAAO,EAC9B,EAEA,OAAO+F,EAAAA,aACLrF,EAAAA,IAAC,MAAA,CACC,IAAKgB,EACL,KAAK,OACL,aAAYH,EAAE,cAAc,EAC5B,cAAY,oBACZ,UAAWd,EACT,+DACA,6BACA,kDACA,iCACAI,GAAQ,SAAA,EAEV,MAAO,CACL,KAAMe,GAAU,MAAQhB,EAAM,EAC9B,IAAKgB,GAAU,KAAOhB,EAAM,EAC5B,OAAQoF,EAAAA,0BAER,WAAYpE,EAAW,UAAY,QAAA,EAErC,cAAgB8D,GAAUA,EAAM,eAAA,EAE/B,SAAAtB,EAAS,IAAI,CAACK,EAAKF,IAClB/D,EAAAA,KAACyF,EAAM,SAAN,CACG,SAAA,EAAAxB,EAAI,OAAS,OAASA,EAAI,KAAK,mBAAqBF,EAAQ,EAAIE,EAAI,mBACpE/D,EAAAA,IAAC,MAAA,CAAI,UAAU,6CAA6C,EAC1D,KACH+D,EAAI,OAAS,OACZ/D,EAAAA,IAACR,GAAA,CACC,KAAMuE,EAAI,KACV,WAAY3E,EAAY2E,EAAI,KAAK,WAAYzE,EAAS,EAAK,EAC3D,SAAUuE,IAAUxC,EACpB,SAAU,IAAM,KAAK+D,EAAgBrB,EAAI,IAAI,EAC7C,QAAS,IAAMzC,EAAeuC,CAAK,CAAA,CAAA,EAEnCE,EAAI,OAAS,iBACd,MAAA,CAAI,UAAU,YAAY,cAAY,4BACrC,SAAA/D,MAAC,MAAA,CAAI,UAAU,sEAAsE,EACvF,QAGC,MAAA,CAAI,iBAAc,GAAC,SAAU,GAAI,UAAU,iCAAiC,QAASU,EAAS,aAAc,IAAMY,EAAeuC,CAAK,EACpI,WAAI,IAAA,CACP,CAAA,CAAA,EApBiBE,EAAI,GAsBzB,CACD,CAAA,CAAA,EAEH,SAAS,IAAA,CAEb"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ICellContextMenuConfig, ICellContextMenuState, IColumn, IRowLinkConfig } from './types';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
type TRowOption = {
|
|
4
|
-
key: string;
|
|
5
|
-
label: React.ReactNode;
|
|
6
|
-
isVisible?: boolean;
|
|
7
|
-
};
|
|
8
|
-
interface CellContextMenuPortalProps {
|
|
9
|
-
state: ICellContextMenuState | null;
|
|
10
|
-
config?: ICellContextMenuConfig | null;
|
|
11
|
-
/** The table's row actions, appended to the menu — same list the three-dot cell renders. */
|
|
12
|
-
rowOptions?: TRowOption[] | ((rowData: Record<string, unknown>) => TRowOption[] | null) | null;
|
|
13
|
-
/** Per-row availability check for `rowOptions`, mirroring the three-dot cell so both menus agree. */
|
|
14
|
-
asyncRowOptionsFilter?: ((rowId: string) => Promise<Record<string, boolean>>) | null;
|
|
15
|
-
/** Checked row ids, enabling the "Copy selected rows" item. */
|
|
16
|
-
checkedIds?: (string | number)[];
|
|
17
|
-
/** Table rows, used to build the text for selected rows that are scrolled out of view. */
|
|
18
|
-
rows?: Record<string, unknown>[];
|
|
19
|
-
/** Visible columns in display order, used to order the copied values. */
|
|
20
|
-
columns?: IColumn[];
|
|
21
|
-
/** The table's row link, enabling the "Copy Link" / "Open in New Tab" items. */
|
|
22
|
-
rowLinkConfig?: IRowLinkConfig | null;
|
|
23
|
-
onClose: () => void;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Right-click menu for data cells. Rendered once per table and positioned at the
|
|
27
|
-
* cursor; `DataCell` opens it through `openCellContextMenu` on the table context.
|
|
28
|
-
*/
|
|
29
|
-
export declare const CellContextMenuPortal: React.FC<CellContextMenuPortalProps>;
|
|
30
|
-
export {};
|