@lax-wp/design-system 0.14.10 → 0.14.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/components/forms/md-input/MarkdownPreview.cjs.js +1 -1
  2. package/dist/components/forms/md-input/MarkdownPreview.cjs.js.map +1 -1
  3. package/dist/components/forms/md-input/MarkdownPreview.es.js +31 -25
  4. package/dist/components/forms/md-input/MarkdownPreview.es.js.map +1 -1
  5. package/dist/components/forms/md-input/RichMarkdownInput.cjs.js +1 -3
  6. package/dist/components/forms/md-input/RichMarkdownInput.cjs.js.map +1 -1
  7. package/dist/components/forms/md-input/RichMarkdownInput.d.ts +1 -0
  8. package/dist/components/forms/md-input/RichMarkdownInput.es.js +192 -191
  9. package/dist/components/forms/md-input/RichMarkdownInput.es.js.map +1 -1
  10. package/dist/components/forms/md-input/listEditing.cjs.js +13 -0
  11. package/dist/components/forms/md-input/listEditing.cjs.js.map +1 -0
  12. package/dist/components/forms/md-input/listEditing.d.ts +52 -0
  13. package/dist/components/forms/md-input/listEditing.es.js +65 -0
  14. package/dist/components/forms/md-input/listEditing.es.js.map +1 -0
  15. package/dist/components/forms/md-input/remarkSplitRestartedLists.cjs.js +3 -0
  16. package/dist/components/forms/md-input/remarkSplitRestartedLists.cjs.js.map +1 -0
  17. package/dist/components/forms/md-input/remarkSplitRestartedLists.d.ts +51 -0
  18. package/dist/components/forms/md-input/remarkSplitRestartedLists.es.js +33 -0
  19. package/dist/components/forms/md-input/remarkSplitRestartedLists.es.js.map +1 -0
  20. package/dist/index.cjs.js +1 -1
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.es.js +229 -224
  23. package/dist/index.es.js.map +1 -1
  24. package/package.json +1 -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 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 * \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 * Insert list item at cursor position\n\t\t */\n\t\tconst insertList = (prefix: 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 lines = value.split('\\n');\n\n\t\t\t// Find which line(s) are selected\n\t\t\tlet currentPos = 0;\n\t\t\tlet startLine = 0;\n\t\t\tlet endLine = 0;\n\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tif (currentPos <= start && start <= currentPos + lines[i].length + 1) {\n\t\t\t\t\tstartLine = i;\n\t\t\t\t}\n\t\t\t\tif (currentPos <= end && end <= currentPos + lines[i].length + 1) {\n\t\t\t\t\tendLine = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcurrentPos += lines[i].length + 1;\n\t\t\t}\n\n\t\t\t// Add list markers to selected lines\n\t\t\tconst newLines = lines.map((line, index) => {\n\t\t\t\tif (index >= startLine && index <= endLine) {\n\t\t\t\t\tif (line.trim() === '') return line;\n\t\t\t\t\t// Check if line already has a list marker\n\t\t\t\t\tif (prefix === '- ' && line.trim().startsWith('- ')) {\n\t\t\t\t\t\treturn line.replace(/^\\s*-\\s+/, '');\n\t\t\t\t\t}\n\t\t\t\t\tif (prefix.match(/^\\d+\\.\\s/) && line.trim().match(/^\\d+\\.\\s/)) {\n\t\t\t\t\t\treturn line.replace(/^\\s*\\d+\\.\\s+/, '');\n\t\t\t\t\t}\n\t\t\t\t\treturn prefix + line.trim();\n\t\t\t\t}\n\t\t\t\treturn line;\n\t\t\t});\n\n\t\t\tonChange(newLines.join('\\n'));\n\n\t\t\tsetTimeout(() => {\n\t\t\t\ttextarea.focus();\n\t\t\t}, 0);\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 (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\">&lt;u&gt;text&lt;/u&gt;</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\">&gt; 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('1. ')}\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('- ')}\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","prefix","lines","currentPos","startLine","endLine","i","newLines","line","index","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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"}
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\">&lt;u&gt;text&lt;/u&gt;</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\">&gt; 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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"}
@@ -0,0 +1,13 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=(e,n)=>e.slice(0,n).split(`
2
+ `).length-1,k=(e,n)=>e.slice(0,n).reduce((l,s)=>l+s.length+1,0),j=/^([ \t]*)(?:(\d+)([.)])|([-*+]))[ \t]+(\[[ xX]\][ \t]+)?(.*)$/,A=/^([ \t]*)(\d+)([.)])[ \t]+/,N=(e,n,l)=>{const s=e.lastIndexOf(`
3
+ `,n-1)+1,r=e.indexOf(`
4
+ `,n),o=r===-1?e.length:r,h=j.exec(e.slice(s,o));if(!h)return null;const[,d,u,i,L,p,g]=h;if(g.trim()==="")return{value:e.slice(0,s)+`
5
+ `+e.slice(o),caret:s+1};const c=u===void 0?null:Number(u)+1,t=c===null?`${L} ${p?"[ ] ":""}`:`${c}${i} `,$=`
6
+ ${d}${t}`,f=n+$.length;let x=e.slice(0,n)+$+e.slice(l);if(c!==null){const a=x.split(`
7
+ `),E=x.slice(0,f).split(`
8
+ `).length-1;let I=c+1;for(let m=E+1;m<a.length;m++){const R=A.exec(a[m]);if(!R||R[1]!==d)break;a[m]=a[m].replace(/^([ \t]*)\d+([.)])/,(T,M,O)=>`${M}${I++}${O}`)}x=a.join(`
9
+ `)}return{value:x,caret:f}},_=/^(?:\d+\.|[-*+])\s+/,w=(e,n,l,s)=>{const r=e.split(`
10
+ `),o=b(e,n),h=b(e,l),d=s==="ordered"?/^\s*\d+\.\s+/:/^\s*-\s+/,u=s==="ordered"?"1. ":"- ",i=[];for(let t=o;t<=h;t++)r[t].trim()!==""&&i.push(t);if(i.length===0){const t=[...r];return t[o]=u,{value:t.join(`
11
+ `),caret:k(r,o)+u.length}}const L=i.every(t=>d.test(r[t]));let p=1;const g=r.map((t,$)=>{if(!i.includes($))return t;if(L)return t.replace(d,"");const f=t.trim().replace(_,"");return s==="ordered"?`${p++}. ${f}`:`- ${f}`}),c=i[i.length-1];return{value:g.join(`
12
+ `),caret:k(g,c)+g[c].length}};exports.continueList=N;exports.toggleList=w;
13
+ //# sourceMappingURL=listEditing.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listEditing.cjs.js","sources":["../../../../src/components/forms/md-input/listEditing.ts"],"sourcesContent":["/**\n * Result of a list edit — the new markdown text and where the caret should\n * land afterwards.\n */\nexport interface ListEditResult {\n\t/** The updated markdown value */\n\tvalue: string;\n\t/** Caret position (selectionStart and selectionEnd) after the edit */\n\tcaret: number;\n}\n\n/** The kind of list a toggle applies */\nexport type ListType = \"ordered\" | \"bullet\";\n\n/**\n * Index of the line an offset falls on — the number of line breaks before it,\n * so an offset at the start of a line maps to that line rather than the one above.\n */\nconst lineIndexAt = (value: string, offset: number): number =>\n\tvalue.slice(0, offset).split(\"\\n\").length - 1;\n\n/** Character offset where the given line starts */\nconst offsetOfLine = (lines: string[], lineIndex: number): number =>\n\tlines\n\t\t.slice(0, lineIndex)\n\t\t.reduce((offset, line) => offset + line.length + 1, 0);\n\n/** Captures indent, ordered number + delimiter or bullet, optional task box, and text */\nconst LIST_ITEM = /^([ \\t]*)(?:(\\d+)([.)])|([-*+]))[ \\t]+(\\[[ xX]\\][ \\t]+)?(.*)$/;\n\n/** Matches the leading marker of an ordered item */\nconst ORDERED_MARKER = /^([ \\t]*)(\\d+)([.)])[ \\t]+/;\n\n/**\n * Compute the edit for pressing Enter inside a markdown list.\n *\n * - On an item that has content, the next marker is inserted (`2. `, `- `,\n * `- [ ] `) with the item's original indentation, and the ordered numbers of\n * the items below are bumped so the raw markdown stays sequential.\n * - On an empty item — the second Enter in a row — the marker is dropped and a\n * blank line is left behind, so following text starts a new block rather than\n * continuing the list item.\n *\n * Returns `null` when the caret is not inside a list item, meaning Enter should\n * behave normally.\n *\n * @example\n * ```ts\n * continueList(\"1. first\", 8, 8);\n * // → { value: \"1. first\\n2. \", caret: 12 }\n *\n * continueList(\"1. first\\n2. \", 12, 12);\n * // → { value: \"1. first\\n\\n\", caret: 9 }\n * ```\n */\nexport const continueList = (\n\tvalue: string,\n\tselectionStart: number,\n\tselectionEnd: number\n): ListEditResult | null => {\n\tconst lineStart = value.lastIndexOf(\"\\n\", selectionStart - 1) + 1;\n\tconst lineBreak = value.indexOf(\"\\n\", selectionStart);\n\tconst lineEnd = lineBreak === -1 ? value.length : lineBreak;\n\n\tconst match = LIST_ITEM.exec(value.slice(lineStart, lineEnd));\n\tif (!match) return null;\n\n\tconst [, indent, orderedNumber, delimiter, bullet, task, text] = match;\n\n\t// Empty item — exit the list, leaving a blank line as a block separator\n\tif (text.trim() === \"\") {\n\t\treturn {\n\t\t\tvalue: value.slice(0, lineStart) + \"\\n\" + value.slice(lineEnd),\n\t\t\tcaret: lineStart + 1,\n\t\t};\n\t}\n\n\tconst nextNumber = orderedNumber === undefined ? null : Number(orderedNumber) + 1;\n\tconst marker =\n\t\tnextNumber === null\n\t\t\t? `${bullet} ${task ? \"[ ] \" : \"\"}`\n\t\t\t: `${nextNumber}${delimiter} `;\n\n\tconst insertion = `\\n${indent}${marker}`;\n\tconst caret = selectionStart + insertion.length;\n\tlet newValue =\n\t\tvalue.slice(0, selectionStart) + insertion + value.slice(selectionEnd);\n\n\t// Renumber the items below the insertion. Nothing before the caret changes,\n\t// so the caret position stays valid.\n\tif (nextNumber !== null) {\n\t\tconst lines = newValue.split(\"\\n\");\n\t\tconst insertedLineIndex = newValue.slice(0, caret).split(\"\\n\").length - 1;\n\t\tlet counter = nextNumber + 1;\n\n\t\tfor (let i = insertedLineIndex + 1; i < lines.length; i++) {\n\t\t\tconst itemMatch = ORDERED_MARKER.exec(lines[i]);\n\t\t\t// Stop at the first line that isn't a sibling item\n\t\t\tif (!itemMatch || itemMatch[1] !== indent) break;\n\t\t\tlines[i] = lines[i].replace(\n\t\t\t\t/^([ \\t]*)\\d+([.)])/,\n\t\t\t\t(_full, itemIndent: string, itemDelimiter: string) =>\n\t\t\t\t\t`${itemIndent}${counter++}${itemDelimiter}`\n\t\t\t);\n\t\t}\n\n\t\tnewValue = lines.join(\"\\n\");\n\t}\n\n\treturn { value: newValue, caret };\n};\n\n/** Any list marker at the start of a line, used to avoid stacking markers */\nconst ANY_MARKER = /^(?:\\d+\\.|[-*+])\\s+/;\n\n/**\n * Toggle list markers across the lines the selection covers.\n *\n * - Lines with content get a marker; ordered lists are numbered sequentially so\n * the raw markdown matches what the preview renders.\n * - When every covered line already has the marker it is removed instead.\n * - When the selection covers no content at all — an empty paragraph — an empty\n * item is started on that line (`1. ` or `- `) with the caret after the\n * marker, ready to type into.\n *\n * @example\n * ```ts\n * toggleList(\"\", 0, 0, \"ordered\"); // → { value: \"1. \", caret: 3 }\n * toggleList(\"a\\nb\", 0, 3, \"bullet\"); // → { value: \"- a\\n- b\", caret: 7 }\n * ```\n */\nexport const toggleList = (\n\tvalue: string,\n\tselectionStart: number,\n\tselectionEnd: number,\n\ttype: ListType\n): ListEditResult => {\n\tconst lines = value.split(\"\\n\");\n\tconst startLine = lineIndexAt(value, selectionStart);\n\tconst endLine = lineIndexAt(value, selectionEnd);\n\n\tconst markerRegex = type === \"ordered\" ? /^\\s*\\d+\\.\\s+/ : /^\\s*-\\s+/;\n\tconst emptyMarker = type === \"ordered\" ? \"1. \" : \"- \";\n\n\t// Only lines with actual content take a marker\n\tconst targetIndexes: number[] = [];\n\tfor (let i = startLine; i <= endLine; i++) {\n\t\tif (lines[i].trim() !== \"\") targetIndexes.push(i);\n\t}\n\n\t// Nothing to mark — start an empty item so the marker is visible right away\n\tif (targetIndexes.length === 0) {\n\t\tconst newLines = [...lines];\n\t\tnewLines[startLine] = emptyMarker;\n\t\treturn {\n\t\t\tvalue: newLines.join(\"\\n\"),\n\t\t\tcaret: offsetOfLine(lines, startLine) + emptyMarker.length,\n\t\t};\n\t}\n\n\t// If every targeted line already has the marker, toggle it off\n\tconst shouldRemove = targetIndexes.every((i) => markerRegex.test(lines[i]));\n\n\tlet counter = 1;\n\tconst newLines = lines.map((line, index) => {\n\t\tif (!targetIndexes.includes(index)) return line;\n\t\tif (shouldRemove) return line.replace(markerRegex, \"\");\n\t\tconst text = line.trim().replace(ANY_MARKER, \"\");\n\t\treturn type === \"ordered\" ? `${counter++}. ${text}` : `- ${text}`;\n\t});\n\n\t// Leave the caret at the end of the last line touched\n\tconst lastLine = targetIndexes[targetIndexes.length - 1];\n\treturn {\n\t\tvalue: newLines.join(\"\\n\"),\n\t\tcaret: offsetOfLine(newLines, lastLine) + newLines[lastLine].length,\n\t};\n};\n"],"names":["lineIndexAt","value","offset","offsetOfLine","lines","lineIndex","line","LIST_ITEM","ORDERED_MARKER","continueList","selectionStart","selectionEnd","lineStart","lineBreak","lineEnd","match","indent","orderedNumber","delimiter","bullet","task","text","nextNumber","marker","insertion","caret","newValue","insertedLineIndex","counter","i","itemMatch","_full","itemIndent","itemDelimiter","ANY_MARKER","toggleList","type","startLine","endLine","markerRegex","emptyMarker","targetIndexes","newLines","shouldRemove","index","lastLine"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Result of a list edit — the new markdown text and where the caret should
3
+ * land afterwards.
4
+ */
5
+ export interface ListEditResult {
6
+ /** The updated markdown value */
7
+ value: string;
8
+ /** Caret position (selectionStart and selectionEnd) after the edit */
9
+ caret: number;
10
+ }
11
+ /** The kind of list a toggle applies */
12
+ export type ListType = "ordered" | "bullet";
13
+ /**
14
+ * Compute the edit for pressing Enter inside a markdown list.
15
+ *
16
+ * - On an item that has content, the next marker is inserted (`2. `, `- `,
17
+ * `- [ ] `) with the item's original indentation, and the ordered numbers of
18
+ * the items below are bumped so the raw markdown stays sequential.
19
+ * - On an empty item — the second Enter in a row — the marker is dropped and a
20
+ * blank line is left behind, so following text starts a new block rather than
21
+ * continuing the list item.
22
+ *
23
+ * Returns `null` when the caret is not inside a list item, meaning Enter should
24
+ * behave normally.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * continueList("1. first", 8, 8);
29
+ * // → { value: "1. first\n2. ", caret: 12 }
30
+ *
31
+ * continueList("1. first\n2. ", 12, 12);
32
+ * // → { value: "1. first\n\n", caret: 9 }
33
+ * ```
34
+ */
35
+ export declare const continueList: (value: string, selectionStart: number, selectionEnd: number) => ListEditResult | null;
36
+ /**
37
+ * Toggle list markers across the lines the selection covers.
38
+ *
39
+ * - Lines with content get a marker; ordered lists are numbered sequentially so
40
+ * the raw markdown matches what the preview renders.
41
+ * - When every covered line already has the marker it is removed instead.
42
+ * - When the selection covers no content at all — an empty paragraph — an empty
43
+ * item is started on that line (`1. ` or `- `) with the caret after the
44
+ * marker, ready to type into.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * toggleList("", 0, 0, "ordered"); // → { value: "1. ", caret: 3 }
49
+ * toggleList("a\nb", 0, 3, "bullet"); // → { value: "- a\n- b", caret: 7 }
50
+ * ```
51
+ */
52
+ export declare const toggleList: (value: string, selectionStart: number, selectionEnd: number, type: ListType) => ListEditResult;
@@ -0,0 +1,65 @@
1
+ const k = (e, t) => e.slice(0, t).split(`
2
+ `).length - 1, E = (e, t) => e.slice(0, t).reduce((l, s) => l + s.length + 1, 0), N = /^([ \t]*)(?:(\d+)([.)])|([-*+]))[ \t]+(\[[ xX]\][ \t]+)?(.*)$/, O = /^([ \t]*)(\d+)([.)])[ \t]+/, w = (e, t, l) => {
3
+ const s = e.lastIndexOf(`
4
+ `, t - 1) + 1, r = e.indexOf(`
5
+ `, t), o = r === -1 ? e.length : r, m = N.exec(e.slice(s, o));
6
+ if (!m) return null;
7
+ const [, d, u, c, L, p, f] = m;
8
+ if (f.trim() === "")
9
+ return {
10
+ value: e.slice(0, s) + `
11
+ ` + e.slice(o),
12
+ caret: s + 1
13
+ };
14
+ const i = u === void 0 ? null : Number(u) + 1, n = i === null ? `${L} ${p ? "[ ] " : ""}` : `${i}${c} `, x = `
15
+ ${d}${n}`, a = t + x.length;
16
+ let $ = e.slice(0, t) + x + e.slice(l);
17
+ if (i !== null) {
18
+ const g = $.split(`
19
+ `), I = $.slice(0, a).split(`
20
+ `).length - 1;
21
+ let b = i + 1;
22
+ for (let h = I + 1; h < g.length; h++) {
23
+ const R = O.exec(g[h]);
24
+ if (!R || R[1] !== d) break;
25
+ g[h] = g[h].replace(
26
+ /^([ \t]*)\d+([.)])/,
27
+ (j, M, A) => `${M}${b++}${A}`
28
+ );
29
+ }
30
+ $ = g.join(`
31
+ `);
32
+ }
33
+ return { value: $, caret: a };
34
+ }, _ = /^(?:\d+\.|[-*+])\s+/, D = (e, t, l, s) => {
35
+ const r = e.split(`
36
+ `), o = k(e, t), m = k(e, l), d = s === "ordered" ? /^\s*\d+\.\s+/ : /^\s*-\s+/, u = s === "ordered" ? "1. " : "- ", c = [];
37
+ for (let n = o; n <= m; n++)
38
+ r[n].trim() !== "" && c.push(n);
39
+ if (c.length === 0) {
40
+ const n = [...r];
41
+ return n[o] = u, {
42
+ value: n.join(`
43
+ `),
44
+ caret: E(r, o) + u.length
45
+ };
46
+ }
47
+ const L = c.every((n) => d.test(r[n]));
48
+ let p = 1;
49
+ const f = r.map((n, x) => {
50
+ if (!c.includes(x)) return n;
51
+ if (L) return n.replace(d, "");
52
+ const a = n.trim().replace(_, "");
53
+ return s === "ordered" ? `${p++}. ${a}` : `- ${a}`;
54
+ }), i = c[c.length - 1];
55
+ return {
56
+ value: f.join(`
57
+ `),
58
+ caret: E(f, i) + f[i].length
59
+ };
60
+ };
61
+ export {
62
+ w as continueList,
63
+ D as toggleList
64
+ };
65
+ //# sourceMappingURL=listEditing.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listEditing.es.js","sources":["../../../../src/components/forms/md-input/listEditing.ts"],"sourcesContent":["/**\n * Result of a list edit — the new markdown text and where the caret should\n * land afterwards.\n */\nexport interface ListEditResult {\n\t/** The updated markdown value */\n\tvalue: string;\n\t/** Caret position (selectionStart and selectionEnd) after the edit */\n\tcaret: number;\n}\n\n/** The kind of list a toggle applies */\nexport type ListType = \"ordered\" | \"bullet\";\n\n/**\n * Index of the line an offset falls on — the number of line breaks before it,\n * so an offset at the start of a line maps to that line rather than the one above.\n */\nconst lineIndexAt = (value: string, offset: number): number =>\n\tvalue.slice(0, offset).split(\"\\n\").length - 1;\n\n/** Character offset where the given line starts */\nconst offsetOfLine = (lines: string[], lineIndex: number): number =>\n\tlines\n\t\t.slice(0, lineIndex)\n\t\t.reduce((offset, line) => offset + line.length + 1, 0);\n\n/** Captures indent, ordered number + delimiter or bullet, optional task box, and text */\nconst LIST_ITEM = /^([ \\t]*)(?:(\\d+)([.)])|([-*+]))[ \\t]+(\\[[ xX]\\][ \\t]+)?(.*)$/;\n\n/** Matches the leading marker of an ordered item */\nconst ORDERED_MARKER = /^([ \\t]*)(\\d+)([.)])[ \\t]+/;\n\n/**\n * Compute the edit for pressing Enter inside a markdown list.\n *\n * - On an item that has content, the next marker is inserted (`2. `, `- `,\n * `- [ ] `) with the item's original indentation, and the ordered numbers of\n * the items below are bumped so the raw markdown stays sequential.\n * - On an empty item — the second Enter in a row — the marker is dropped and a\n * blank line is left behind, so following text starts a new block rather than\n * continuing the list item.\n *\n * Returns `null` when the caret is not inside a list item, meaning Enter should\n * behave normally.\n *\n * @example\n * ```ts\n * continueList(\"1. first\", 8, 8);\n * // → { value: \"1. first\\n2. \", caret: 12 }\n *\n * continueList(\"1. first\\n2. \", 12, 12);\n * // → { value: \"1. first\\n\\n\", caret: 9 }\n * ```\n */\nexport const continueList = (\n\tvalue: string,\n\tselectionStart: number,\n\tselectionEnd: number\n): ListEditResult | null => {\n\tconst lineStart = value.lastIndexOf(\"\\n\", selectionStart - 1) + 1;\n\tconst lineBreak = value.indexOf(\"\\n\", selectionStart);\n\tconst lineEnd = lineBreak === -1 ? value.length : lineBreak;\n\n\tconst match = LIST_ITEM.exec(value.slice(lineStart, lineEnd));\n\tif (!match) return null;\n\n\tconst [, indent, orderedNumber, delimiter, bullet, task, text] = match;\n\n\t// Empty item — exit the list, leaving a blank line as a block separator\n\tif (text.trim() === \"\") {\n\t\treturn {\n\t\t\tvalue: value.slice(0, lineStart) + \"\\n\" + value.slice(lineEnd),\n\t\t\tcaret: lineStart + 1,\n\t\t};\n\t}\n\n\tconst nextNumber = orderedNumber === undefined ? null : Number(orderedNumber) + 1;\n\tconst marker =\n\t\tnextNumber === null\n\t\t\t? `${bullet} ${task ? \"[ ] \" : \"\"}`\n\t\t\t: `${nextNumber}${delimiter} `;\n\n\tconst insertion = `\\n${indent}${marker}`;\n\tconst caret = selectionStart + insertion.length;\n\tlet newValue =\n\t\tvalue.slice(0, selectionStart) + insertion + value.slice(selectionEnd);\n\n\t// Renumber the items below the insertion. Nothing before the caret changes,\n\t// so the caret position stays valid.\n\tif (nextNumber !== null) {\n\t\tconst lines = newValue.split(\"\\n\");\n\t\tconst insertedLineIndex = newValue.slice(0, caret).split(\"\\n\").length - 1;\n\t\tlet counter = nextNumber + 1;\n\n\t\tfor (let i = insertedLineIndex + 1; i < lines.length; i++) {\n\t\t\tconst itemMatch = ORDERED_MARKER.exec(lines[i]);\n\t\t\t// Stop at the first line that isn't a sibling item\n\t\t\tif (!itemMatch || itemMatch[1] !== indent) break;\n\t\t\tlines[i] = lines[i].replace(\n\t\t\t\t/^([ \\t]*)\\d+([.)])/,\n\t\t\t\t(_full, itemIndent: string, itemDelimiter: string) =>\n\t\t\t\t\t`${itemIndent}${counter++}${itemDelimiter}`\n\t\t\t);\n\t\t}\n\n\t\tnewValue = lines.join(\"\\n\");\n\t}\n\n\treturn { value: newValue, caret };\n};\n\n/** Any list marker at the start of a line, used to avoid stacking markers */\nconst ANY_MARKER = /^(?:\\d+\\.|[-*+])\\s+/;\n\n/**\n * Toggle list markers across the lines the selection covers.\n *\n * - Lines with content get a marker; ordered lists are numbered sequentially so\n * the raw markdown matches what the preview renders.\n * - When every covered line already has the marker it is removed instead.\n * - When the selection covers no content at all — an empty paragraph — an empty\n * item is started on that line (`1. ` or `- `) with the caret after the\n * marker, ready to type into.\n *\n * @example\n * ```ts\n * toggleList(\"\", 0, 0, \"ordered\"); // → { value: \"1. \", caret: 3 }\n * toggleList(\"a\\nb\", 0, 3, \"bullet\"); // → { value: \"- a\\n- b\", caret: 7 }\n * ```\n */\nexport const toggleList = (\n\tvalue: string,\n\tselectionStart: number,\n\tselectionEnd: number,\n\ttype: ListType\n): ListEditResult => {\n\tconst lines = value.split(\"\\n\");\n\tconst startLine = lineIndexAt(value, selectionStart);\n\tconst endLine = lineIndexAt(value, selectionEnd);\n\n\tconst markerRegex = type === \"ordered\" ? /^\\s*\\d+\\.\\s+/ : /^\\s*-\\s+/;\n\tconst emptyMarker = type === \"ordered\" ? \"1. \" : \"- \";\n\n\t// Only lines with actual content take a marker\n\tconst targetIndexes: number[] = [];\n\tfor (let i = startLine; i <= endLine; i++) {\n\t\tif (lines[i].trim() !== \"\") targetIndexes.push(i);\n\t}\n\n\t// Nothing to mark — start an empty item so the marker is visible right away\n\tif (targetIndexes.length === 0) {\n\t\tconst newLines = [...lines];\n\t\tnewLines[startLine] = emptyMarker;\n\t\treturn {\n\t\t\tvalue: newLines.join(\"\\n\"),\n\t\t\tcaret: offsetOfLine(lines, startLine) + emptyMarker.length,\n\t\t};\n\t}\n\n\t// If every targeted line already has the marker, toggle it off\n\tconst shouldRemove = targetIndexes.every((i) => markerRegex.test(lines[i]));\n\n\tlet counter = 1;\n\tconst newLines = lines.map((line, index) => {\n\t\tif (!targetIndexes.includes(index)) return line;\n\t\tif (shouldRemove) return line.replace(markerRegex, \"\");\n\t\tconst text = line.trim().replace(ANY_MARKER, \"\");\n\t\treturn type === \"ordered\" ? `${counter++}. ${text}` : `- ${text}`;\n\t});\n\n\t// Leave the caret at the end of the last line touched\n\tconst lastLine = targetIndexes[targetIndexes.length - 1];\n\treturn {\n\t\tvalue: newLines.join(\"\\n\"),\n\t\tcaret: offsetOfLine(newLines, lastLine) + newLines[lastLine].length,\n\t};\n};\n"],"names":["lineIndexAt","value","offset","offsetOfLine","lines","lineIndex","line","LIST_ITEM","ORDERED_MARKER","continueList","selectionStart","selectionEnd","lineStart","lineBreak","lineEnd","match","indent","orderedNumber","delimiter","bullet","task","text","nextNumber","marker","insertion","caret","newValue","insertedLineIndex","counter","i","itemMatch","_full","itemIndent","itemDelimiter","ANY_MARKER","toggleList","type","startLine","endLine","markerRegex","emptyMarker","targetIndexes","newLines","shouldRemove","index","lastLine"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=/^\s*(\d+)[.)]\s/,f=(n,c)=>{const s=n.children??[];if(!n.ordered||s.length<2)return[n];const i=t=>{const o=(t.position?.start.line??0)-1,r=m.exec(c[o]??"");return r?Number.parseInt(r[1],10):null},e=[[s[0]]];for(let t=1;t<s.length;t++){const o=s[t-1],r=s[t],l=o.position?.end.line,a=r.position?.start.line,p=l!==void 0&&a!==void 0&&a-l>1,u=i(o),d=i(r),h=u===null||d===null||d===u+1;p&&!h?e.push([r]):e[e.length-1].push(r)}return e.length===1?[n]:e.map(t=>({...n,children:t,start:i(t[0])??1,position:t[0].position?{start:t[0].position.start,end:t[t.length-1].position?.end??t[0].position.end}:n.position}))},v=()=>(n,c)=>{const s=String(c?.value??"").split(`
2
+ `),i=e=>{e.children?.length&&(e.children.forEach(i),e.children=e.children.flatMap(t=>t.type==="list"?f(t,s):[t]))};i(n)};exports.remarkSplitRestartedLists=v;
3
+ //# sourceMappingURL=remarkSplitRestartedLists.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remarkSplitRestartedLists.cjs.js","sources":["../../../../src/components/forms/md-input/remarkSplitRestartedLists.ts"],"sourcesContent":["/**\n * Minimal structural subset of an mdast node used by this plugin.\n * Typed locally so the plugin needs no `unified`/`mdast` type dependency.\n */\ninterface MdastNode {\n\ttype: string;\n\tchildren?: MdastNode[];\n\tposition?: {\n\t\tstart: { line: number };\n\t\tend: { line: number };\n\t};\n\t/** Present on `list` nodes */\n\tordered?: boolean;\n\t/** Present on `list` nodes — the number the list starts counting from */\n\tstart?: number | null;\n\t[key: string]: unknown;\n}\n\n/** The vfile passed as the second transformer argument */\ninterface RemarkFile {\n\tvalue?: unknown;\n}\n\n/** Matches a leading ordered-list marker, e.g. `1. `, `12) ` */\nconst ORDERED_MARKER = /^\\s*(\\d+)[.)]\\s/;\n\n/**\n * Split an ordered `list` node into one list per numbering run.\n *\n * A new run begins when an item is separated from the previous one by a blank\n * line **and** its source number does not continue the sequence (e.g. back to\n * `1.`). Returns the original node untouched when there is nothing to split.\n */\nconst splitOrderedList = (list: MdastNode, sourceLines: string[]): MdastNode[] => {\n\tconst items = list.children ?? [];\n\tif (!list.ordered || items.length < 2) return [list];\n\n\t/** Read the literal marker number an item was authored with */\n\tconst markerNumber = (item: MdastNode): number | null => {\n\t\tconst lineIndex = (item.position?.start.line ?? 0) - 1;\n\t\tconst match = ORDERED_MARKER.exec(sourceLines[lineIndex] ?? \"\");\n\t\treturn match ? Number.parseInt(match[1], 10) : null;\n\t};\n\n\tconst groups: MdastNode[][] = [[items[0]]];\n\n\tfor (let i = 1; i < items.length; i++) {\n\t\tconst previous = items[i - 1];\n\t\tconst current = items[i];\n\n\t\tconst previousEnd = previous.position?.end.line;\n\t\tconst currentStart = current.position?.start.line;\n\t\tconst hasBlankLineBetween =\n\t\t\tpreviousEnd !== undefined &&\n\t\t\tcurrentStart !== undefined &&\n\t\t\tcurrentStart - previousEnd > 1;\n\n\t\tconst previousNumber = markerNumber(previous);\n\t\tconst currentNumber = markerNumber(current);\n\t\t// Across a blank line, only an exactly-continuing number stays in the list\n\t\tconst continuesSequence =\n\t\t\tpreviousNumber === null ||\n\t\t\tcurrentNumber === null ||\n\t\t\tcurrentNumber === previousNumber + 1;\n\n\t\tif (hasBlankLineBetween && !continuesSequence) {\n\t\t\tgroups.push([current]);\n\t\t} else {\n\t\t\tgroups[groups.length - 1].push(current);\n\t\t}\n\t}\n\n\tif (groups.length === 1) return [list];\n\n\treturn groups.map((group) => ({\n\t\t...list,\n\t\tchildren: group,\n\t\tstart: markerNumber(group[0]) ?? 1,\n\t\tposition: group[0].position\n\t\t\t? {\n\t\t\t\t\tstart: group[0].position.start,\n\t\t\t\t\tend: group[group.length - 1].position?.end ?? group[0].position.end,\n\t\t\t\t}\n\t\t\t: list.position,\n\t}));\n};\n\n/**\n * Remark plugin that keeps restarted numbered lists visually separate.\n *\n * CommonMark merges ordered list items separated only by a blank line into a\n * single list, so authoring:\n *\n * ```md\n * 1. one\n * 2. two\n *\n * 1. fresh list\n * ```\n *\n * renders as `1, 2, 3` instead of `1, 2` followed by a new `1`. This plugin\n * splits such a list back into the runs the author wrote, so the preview\n * matches the raw markdown in the editor.\n *\n * @example\n * ```tsx\n * <ReactMarkdown remarkPlugins={[remarkGfm, remarkSplitRestartedLists]}>\n * {content}\n * </ReactMarkdown>\n * ```\n */\nexport const remarkSplitRestartedLists =\n\t() =>\n\t(tree: MdastNode, file: RemarkFile): void => {\n\t\tconst sourceLines = String(file?.value ?? \"\").split(\"\\n\");\n\n\t\tconst walk = (node: MdastNode): void => {\n\t\t\tif (!node.children?.length) return;\n\n\t\t\t// Depth-first so nested lists are split before their parent is rebuilt\n\t\t\tnode.children.forEach(walk);\n\n\t\t\tnode.children = node.children.flatMap((child) =>\n\t\t\t\tchild.type === \"list\" ? splitOrderedList(child, sourceLines) : [child]\n\t\t\t);\n\t\t};\n\n\t\twalk(tree);\n\t};\n"],"names":["ORDERED_MARKER","splitOrderedList","list","sourceLines","items","markerNumber","item","lineIndex","match","groups","i","previous","current","previousEnd","currentStart","hasBlankLineBetween","previousNumber","currentNumber","continuesSequence","group","remarkSplitRestartedLists","tree","file","walk","node","child"],"mappings":"gFAwBA,MAAMA,EAAiB,kBASjBC,EAAmB,CAACC,EAAiBC,IAAuC,CACjF,MAAMC,EAAQF,EAAK,UAAY,CAAA,EAC/B,GAAI,CAACA,EAAK,SAAWE,EAAM,OAAS,EAAG,MAAO,CAACF,CAAI,EAGnD,MAAMG,EAAgBC,GAAmC,CACxD,MAAMC,GAAaD,EAAK,UAAU,MAAM,MAAQ,GAAK,EAC/CE,EAAQR,EAAe,KAAKG,EAAYI,CAAS,GAAK,EAAE,EAC9D,OAAOC,EAAQ,OAAO,SAASA,EAAM,CAAC,EAAG,EAAE,EAAI,IAChD,EAEMC,EAAwB,CAAC,CAACL,EAAM,CAAC,CAAC,CAAC,EAEzC,QAASM,EAAI,EAAGA,EAAIN,EAAM,OAAQM,IAAK,CACtC,MAAMC,EAAWP,EAAMM,EAAI,CAAC,EACtBE,EAAUR,EAAMM,CAAC,EAEjBG,EAAcF,EAAS,UAAU,IAAI,KACrCG,EAAeF,EAAQ,UAAU,MAAM,KACvCG,EACLF,IAAgB,QAChBC,IAAiB,QACjBA,EAAeD,EAAc,EAExBG,EAAiBX,EAAaM,CAAQ,EACtCM,EAAgBZ,EAAaO,CAAO,EAEpCM,EACLF,IAAmB,MACnBC,IAAkB,MAClBA,IAAkBD,EAAiB,EAEhCD,GAAuB,CAACG,EAC3BT,EAAO,KAAK,CAACG,CAAO,CAAC,EAErBH,EAAOA,EAAO,OAAS,CAAC,EAAE,KAAKG,CAAO,CAExC,CAEA,OAAIH,EAAO,SAAW,EAAU,CAACP,CAAI,EAE9BO,EAAO,IAAKU,IAAW,CAC7B,GAAGjB,EACH,SAAUiB,EACV,MAAOd,EAAac,EAAM,CAAC,CAAC,GAAK,EACjC,SAAUA,EAAM,CAAC,EAAE,SAChB,CACA,MAAOA,EAAM,CAAC,EAAE,SAAS,MACzB,IAAKA,EAAMA,EAAM,OAAS,CAAC,EAAE,UAAU,KAAOA,EAAM,CAAC,EAAE,SAAS,GAAA,EAEhEjB,EAAK,QAAA,EACP,CACH,EA0BakB,EACZ,IACA,CAACC,EAAiBC,IAA2B,CAC5C,MAAMnB,EAAc,OAAOmB,GAAM,OAAS,EAAE,EAAE,MAAM;AAAA,CAAI,EAElDC,EAAQC,GAA0B,CAClCA,EAAK,UAAU,SAGpBA,EAAK,SAAS,QAAQD,CAAI,EAE1BC,EAAK,SAAWA,EAAK,SAAS,QAASC,GACtCA,EAAM,OAAS,OAASxB,EAAiBwB,EAAOtB,CAAW,EAAI,CAACsB,CAAK,CAAA,EAEvE,EAEAF,EAAKF,CAAI,CACV"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Minimal structural subset of an mdast node used by this plugin.
3
+ * Typed locally so the plugin needs no `unified`/`mdast` type dependency.
4
+ */
5
+ interface MdastNode {
6
+ type: string;
7
+ children?: MdastNode[];
8
+ position?: {
9
+ start: {
10
+ line: number;
11
+ };
12
+ end: {
13
+ line: number;
14
+ };
15
+ };
16
+ /** Present on `list` nodes */
17
+ ordered?: boolean;
18
+ /** Present on `list` nodes — the number the list starts counting from */
19
+ start?: number | null;
20
+ [key: string]: unknown;
21
+ }
22
+ /** The vfile passed as the second transformer argument */
23
+ interface RemarkFile {
24
+ value?: unknown;
25
+ }
26
+ /**
27
+ * Remark plugin that keeps restarted numbered lists visually separate.
28
+ *
29
+ * CommonMark merges ordered list items separated only by a blank line into a
30
+ * single list, so authoring:
31
+ *
32
+ * ```md
33
+ * 1. one
34
+ * 2. two
35
+ *
36
+ * 1. fresh list
37
+ * ```
38
+ *
39
+ * renders as `1, 2, 3` instead of `1, 2` followed by a new `1`. This plugin
40
+ * splits such a list back into the runs the author wrote, so the preview
41
+ * matches the raw markdown in the editor.
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * <ReactMarkdown remarkPlugins={[remarkGfm, remarkSplitRestartedLists]}>
46
+ * {content}
47
+ * </ReactMarkdown>
48
+ * ```
49
+ */
50
+ export declare const remarkSplitRestartedLists: () => (tree: MdastNode, file: RemarkFile) => void;
51
+ export {};
@@ -0,0 +1,33 @@
1
+ const m = /^\s*(\d+)[.)]\s/, f = (e, c) => {
2
+ const s = e.children ?? [];
3
+ if (!e.ordered || s.length < 2) return [e];
4
+ const i = (n) => {
5
+ const o = (n.position?.start.line ?? 0) - 1, r = m.exec(c[o] ?? "");
6
+ return r ? Number.parseInt(r[1], 10) : null;
7
+ }, t = [[s[0]]];
8
+ for (let n = 1; n < s.length; n++) {
9
+ const o = s[n - 1], r = s[n], l = o.position?.end.line, a = r.position?.start.line, d = l !== void 0 && a !== void 0 && a - l > 1, u = i(o), p = i(r), h = u === null || p === null || p === u + 1;
10
+ d && !h ? t.push([r]) : t[t.length - 1].push(r);
11
+ }
12
+ return t.length === 1 ? [e] : t.map((n) => ({
13
+ ...e,
14
+ children: n,
15
+ start: i(n[0]) ?? 1,
16
+ position: n[0].position ? {
17
+ start: n[0].position.start,
18
+ end: n[n.length - 1].position?.end ?? n[0].position.end
19
+ } : e.position
20
+ }));
21
+ }, v = () => (e, c) => {
22
+ const s = String(c?.value ?? "").split(`
23
+ `), i = (t) => {
24
+ t.children?.length && (t.children.forEach(i), t.children = t.children.flatMap(
25
+ (n) => n.type === "list" ? f(n, s) : [n]
26
+ ));
27
+ };
28
+ i(e);
29
+ };
30
+ export {
31
+ v as remarkSplitRestartedLists
32
+ };
33
+ //# sourceMappingURL=remarkSplitRestartedLists.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remarkSplitRestartedLists.es.js","sources":["../../../../src/components/forms/md-input/remarkSplitRestartedLists.ts"],"sourcesContent":["/**\n * Minimal structural subset of an mdast node used by this plugin.\n * Typed locally so the plugin needs no `unified`/`mdast` type dependency.\n */\ninterface MdastNode {\n\ttype: string;\n\tchildren?: MdastNode[];\n\tposition?: {\n\t\tstart: { line: number };\n\t\tend: { line: number };\n\t};\n\t/** Present on `list` nodes */\n\tordered?: boolean;\n\t/** Present on `list` nodes — the number the list starts counting from */\n\tstart?: number | null;\n\t[key: string]: unknown;\n}\n\n/** The vfile passed as the second transformer argument */\ninterface RemarkFile {\n\tvalue?: unknown;\n}\n\n/** Matches a leading ordered-list marker, e.g. `1. `, `12) ` */\nconst ORDERED_MARKER = /^\\s*(\\d+)[.)]\\s/;\n\n/**\n * Split an ordered `list` node into one list per numbering run.\n *\n * A new run begins when an item is separated from the previous one by a blank\n * line **and** its source number does not continue the sequence (e.g. back to\n * `1.`). Returns the original node untouched when there is nothing to split.\n */\nconst splitOrderedList = (list: MdastNode, sourceLines: string[]): MdastNode[] => {\n\tconst items = list.children ?? [];\n\tif (!list.ordered || items.length < 2) return [list];\n\n\t/** Read the literal marker number an item was authored with */\n\tconst markerNumber = (item: MdastNode): number | null => {\n\t\tconst lineIndex = (item.position?.start.line ?? 0) - 1;\n\t\tconst match = ORDERED_MARKER.exec(sourceLines[lineIndex] ?? \"\");\n\t\treturn match ? Number.parseInt(match[1], 10) : null;\n\t};\n\n\tconst groups: MdastNode[][] = [[items[0]]];\n\n\tfor (let i = 1; i < items.length; i++) {\n\t\tconst previous = items[i - 1];\n\t\tconst current = items[i];\n\n\t\tconst previousEnd = previous.position?.end.line;\n\t\tconst currentStart = current.position?.start.line;\n\t\tconst hasBlankLineBetween =\n\t\t\tpreviousEnd !== undefined &&\n\t\t\tcurrentStart !== undefined &&\n\t\t\tcurrentStart - previousEnd > 1;\n\n\t\tconst previousNumber = markerNumber(previous);\n\t\tconst currentNumber = markerNumber(current);\n\t\t// Across a blank line, only an exactly-continuing number stays in the list\n\t\tconst continuesSequence =\n\t\t\tpreviousNumber === null ||\n\t\t\tcurrentNumber === null ||\n\t\t\tcurrentNumber === previousNumber + 1;\n\n\t\tif (hasBlankLineBetween && !continuesSequence) {\n\t\t\tgroups.push([current]);\n\t\t} else {\n\t\t\tgroups[groups.length - 1].push(current);\n\t\t}\n\t}\n\n\tif (groups.length === 1) return [list];\n\n\treturn groups.map((group) => ({\n\t\t...list,\n\t\tchildren: group,\n\t\tstart: markerNumber(group[0]) ?? 1,\n\t\tposition: group[0].position\n\t\t\t? {\n\t\t\t\t\tstart: group[0].position.start,\n\t\t\t\t\tend: group[group.length - 1].position?.end ?? group[0].position.end,\n\t\t\t\t}\n\t\t\t: list.position,\n\t}));\n};\n\n/**\n * Remark plugin that keeps restarted numbered lists visually separate.\n *\n * CommonMark merges ordered list items separated only by a blank line into a\n * single list, so authoring:\n *\n * ```md\n * 1. one\n * 2. two\n *\n * 1. fresh list\n * ```\n *\n * renders as `1, 2, 3` instead of `1, 2` followed by a new `1`. This plugin\n * splits such a list back into the runs the author wrote, so the preview\n * matches the raw markdown in the editor.\n *\n * @example\n * ```tsx\n * <ReactMarkdown remarkPlugins={[remarkGfm, remarkSplitRestartedLists]}>\n * {content}\n * </ReactMarkdown>\n * ```\n */\nexport const remarkSplitRestartedLists =\n\t() =>\n\t(tree: MdastNode, file: RemarkFile): void => {\n\t\tconst sourceLines = String(file?.value ?? \"\").split(\"\\n\");\n\n\t\tconst walk = (node: MdastNode): void => {\n\t\t\tif (!node.children?.length) return;\n\n\t\t\t// Depth-first so nested lists are split before their parent is rebuilt\n\t\t\tnode.children.forEach(walk);\n\n\t\t\tnode.children = node.children.flatMap((child) =>\n\t\t\t\tchild.type === \"list\" ? splitOrderedList(child, sourceLines) : [child]\n\t\t\t);\n\t\t};\n\n\t\twalk(tree);\n\t};\n"],"names":["ORDERED_MARKER","splitOrderedList","list","sourceLines","items","markerNumber","item","lineIndex","match","groups","i","previous","current","previousEnd","currentStart","hasBlankLineBetween","previousNumber","currentNumber","continuesSequence","group","remarkSplitRestartedLists","tree","file","walk","node","child"],"mappings":"AAwBA,MAAMA,IAAiB,mBASjBC,IAAmB,CAACC,GAAiBC,MAAuC;AACjF,QAAMC,IAAQF,EAAK,YAAY,CAAA;AAC/B,MAAI,CAACA,EAAK,WAAWE,EAAM,SAAS,EAAG,QAAO,CAACF,CAAI;AAGnD,QAAMG,IAAe,CAACC,MAAmC;AACxD,UAAMC,KAAaD,EAAK,UAAU,MAAM,QAAQ,KAAK,GAC/CE,IAAQR,EAAe,KAAKG,EAAYI,CAAS,KAAK,EAAE;AAC9D,WAAOC,IAAQ,OAAO,SAASA,EAAM,CAAC,GAAG,EAAE,IAAI;AAAA,EAChD,GAEMC,IAAwB,CAAC,CAACL,EAAM,CAAC,CAAC,CAAC;AAEzC,WAASM,IAAI,GAAGA,IAAIN,EAAM,QAAQM,KAAK;AACtC,UAAMC,IAAWP,EAAMM,IAAI,CAAC,GACtBE,IAAUR,EAAMM,CAAC,GAEjBG,IAAcF,EAAS,UAAU,IAAI,MACrCG,IAAeF,EAAQ,UAAU,MAAM,MACvCG,IACLF,MAAgB,UAChBC,MAAiB,UACjBA,IAAeD,IAAc,GAExBG,IAAiBX,EAAaM,CAAQ,GACtCM,IAAgBZ,EAAaO,CAAO,GAEpCM,IACLF,MAAmB,QACnBC,MAAkB,QAClBA,MAAkBD,IAAiB;AAEpC,IAAID,KAAuB,CAACG,IAC3BT,EAAO,KAAK,CAACG,CAAO,CAAC,IAErBH,EAAOA,EAAO,SAAS,CAAC,EAAE,KAAKG,CAAO;AAAA,EAExC;AAEA,SAAIH,EAAO,WAAW,IAAU,CAACP,CAAI,IAE9BO,EAAO,IAAI,CAACU,OAAW;AAAA,IAC7B,GAAGjB;AAAA,IACH,UAAUiB;AAAA,IACV,OAAOd,EAAac,EAAM,CAAC,CAAC,KAAK;AAAA,IACjC,UAAUA,EAAM,CAAC,EAAE,WAChB;AAAA,MACA,OAAOA,EAAM,CAAC,EAAE,SAAS;AAAA,MACzB,KAAKA,EAAMA,EAAM,SAAS,CAAC,EAAE,UAAU,OAAOA,EAAM,CAAC,EAAE,SAAS;AAAA,IAAA,IAEhEjB,EAAK;AAAA,EAAA,EACP;AACH,GA0BakB,IACZ,MACA,CAACC,GAAiBC,MAA2B;AAC5C,QAAMnB,IAAc,OAAOmB,GAAM,SAAS,EAAE,EAAE,MAAM;AAAA,CAAI,GAElDC,IAAO,CAACC,MAA0B;AACvC,IAAKA,EAAK,UAAU,WAGpBA,EAAK,SAAS,QAAQD,CAAI,GAE1BC,EAAK,WAAWA,EAAK,SAAS;AAAA,MAAQ,CAACC,MACtCA,EAAM,SAAS,SAASxB,EAAiBwB,GAAOtB,CAAW,IAAI,CAACsB,CAAK;AAAA,IAAA;AAAA,EAEvE;AAEA,EAAAF,EAAKF,CAAI;AACV;"}