@mieweb/ui 0.11.0-dev.42 → 0.11.0-dev.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/evals/selection.md +3 -3
- package/agent/skills/mieweb-ui-catalog/SKILL.md +8 -8
- package/agent/skills/mieweb-ui-catalog/selection-guidance.md +13 -13
- package/dist/{chunk-6L7CTEX2.cjs → chunk-2KK4WZ7Y.cjs} +4 -4
- package/dist/{chunk-6L7CTEX2.cjs.map → chunk-2KK4WZ7Y.cjs.map} +1 -1
- package/dist/{chunk-EWPNM6OO.js → chunk-3A4N5E6P.js} +19 -4
- package/dist/chunk-3A4N5E6P.js.map +1 -0
- package/dist/{chunk-S2CJ57BX.cjs → chunk-AHT2HRHC.cjs} +19 -3
- package/dist/chunk-AHT2HRHC.cjs.map +1 -0
- package/dist/{chunk-AKC677ZF.js → chunk-DIIXY6EB.js} +5 -5
- package/dist/chunk-DIIXY6EB.js.map +1 -0
- package/dist/{chunk-LLIG4X6M.cjs → chunk-EAAVFTKI.cjs} +7 -7
- package/dist/chunk-EAAVFTKI.cjs.map +1 -0
- package/dist/{chunk-RCTIPBLU.cjs → chunk-HH7PWD5I.cjs} +173 -6
- package/dist/chunk-HH7PWD5I.cjs.map +1 -0
- package/dist/{chunk-IALTKN3Y.js → chunk-IPHJQ6CF.js} +171 -4
- package/dist/chunk-IPHJQ6CF.js.map +1 -0
- package/dist/{chunk-2OTPQPJS.js → chunk-L3CAWGBU.js} +3 -3
- package/dist/{chunk-2OTPQPJS.js.map → chunk-L3CAWGBU.js.map} +1 -1
- package/dist/{chunk-R4QWCP2T.cjs → chunk-MD55WRGN.cjs} +11 -11
- package/dist/{chunk-R4QWCP2T.cjs.map → chunk-MD55WRGN.cjs.map} +1 -1
- package/dist/{chunk-LWLHCUDP.js → chunk-ZULFKL3C.js} +3 -3
- package/dist/{chunk-LWLHCUDP.js.map → chunk-ZULFKL3C.js.map} +1 -1
- package/dist/components/EmailEditor/index.cjs +13 -13
- package/dist/components/EmailEditor/index.js +4 -4
- package/dist/components/RichTextEditor/index.cjs +4 -4
- package/dist/components/RichTextEditor/index.d.cts +9 -0
- package/dist/components/RichTextEditor/index.d.ts +9 -0
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/Textarea/index.cjs +6 -6
- package/dist/components/Textarea/index.js +3 -3
- package/dist/esheet.cjs +17 -17
- package/dist/esheet.js +4 -4
- package/dist/index.cjs +58 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +4 -4
- package/dist/kerebron.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-AKC677ZF.js.map +0 -1
- package/dist/chunk-EWPNM6OO.js.map +0 -1
- package/dist/chunk-IALTKN3Y.js.map +0 -1
- package/dist/chunk-LLIG4X6M.cjs.map +0 -1
- package/dist/chunk-RCTIPBLU.cjs.map +0 -1
- package/dist/chunk-S2CJ57BX.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/TextAreaPlain/TextAreaPlain.tsx","../src/components/Textarea/Textarea.tsx"],"names":["React","jsxs","jsx"],"mappings":"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","file":"chunk-2OTPQPJS.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { RequiredMark, type RequiredMarkVariant } from '../Input';\n\nconst textareaVariants = cva(\n [\n 'w-full px-3 py-2',\n 'border border-input rounded-lg',\n 'bg-background text-foreground',\n 'placeholder:text-muted-foreground',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'resize-y',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm min-h-[60px]',\n md: 'text-base min-h-[80px]',\n lg: 'text-lg min-h-[100px]',\n },\n hasError: {\n true: 'border-destructive focus:ring-destructive',\n false: '',\n },\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n },\n labelVariant: {\n stacked: '',\n floating: 'peer placeholder:text-transparent',\n },\n autoResize: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n // Floating labels reserve top padding so entered text always starts\n // below the floated label, plus a little extra min-height.\n {\n labelVariant: 'floating',\n size: 'sm',\n className: 'pt-5 min-h-[76px]',\n },\n {\n labelVariant: 'floating',\n size: 'md',\n className: 'pt-6 min-h-[96px]',\n },\n {\n labelVariant: 'floating',\n size: 'lg',\n className: 'pt-7 min-h-[120px]',\n },\n // Auto-growing textareas start at the same visual height as a\n // single-line Input (h-8/h-10/h-12): min-height matches the Input\n // size token and the vertical padding is tuned so one line of text\n // plus padding plus borders lands exactly on that height.\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'sm',\n className: 'min-h-8 py-[5px]',\n },\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'md',\n className: 'min-h-10 py-[7px]',\n },\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'lg',\n className: 'min-h-12 py-[9px]',\n },\n // Floating label + auto-grow: single line below the floated label.\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'sm',\n className: 'min-h-[50px]',\n },\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'md',\n className: 'min-h-[58px]',\n },\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'lg',\n className: 'min-h-[66px]',\n },\n ],\n defaultVariants: {\n size: 'md',\n hasError: false,\n resize: 'vertical',\n labelVariant: 'stacked',\n autoResize: true,\n },\n }\n);\n\nconst floatingLabelVariants = cva(\n [\n 'absolute start-3 pointer-events-none select-none',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n size: {\n sm: [\n 'text-sm top-3',\n 'peer-focus:top-1 peer-[:not(:placeholder-shown)]:top-1 peer-autofill:top-1',\n 'peer-focus:text-[0.65rem] peer-[:not(:placeholder-shown)]:text-[0.65rem] peer-autofill:text-[0.65rem]',\n ],\n md: [\n 'text-base top-4',\n 'peer-focus:top-1.5 peer-[:not(:placeholder-shown)]:top-1.5 peer-autofill:top-1.5',\n 'peer-focus:text-xs peer-[:not(:placeholder-shown)]:text-xs peer-autofill:text-xs',\n ],\n lg: [\n 'text-lg top-5',\n 'peer-focus:top-2 peer-[:not(:placeholder-shown)]:top-2 peer-autofill:top-2',\n 'peer-focus:text-sm peer-[:not(:placeholder-shown)]:text-sm peer-autofill:text-sm',\n ],\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n hasError: false,\n },\n }\n);\n\nexport interface TextAreaPlainProps\n extends\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>,\n Omit<VariantProps<typeof textareaVariants>, 'labelVariant'> {\n /** Label for the textarea */\n label?: string;\n /**\n * How the label is rendered.\n * - `stacked` (default): label above the textarea.\n * - `floating`: label rests inside the textarea like a placeholder and\n * floats to the top (staying inside it) when focused or filled.\n * Ignores `placeholder`; when `hideLabel` is set, falls back to a\n * visually-hidden stacked label.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Whether the label should be visually hidden */\n hideLabel?: boolean;\n /** Error message to display */\n error?: string;\n /** Helper text to display */\n helperText?: string;\n /** Maximum character count */\n maxLength?: number;\n /** Show character count */\n showCount?: boolean;\n /**\n * Grow and shrink with content (default). The empty control matches a\n * single-line `Input`'s height; `rows` sets a taller growth floor, and\n * dragging the native resize handle sets a new floor the same way. Set\n * `false` for a classic fixed-height textarea.\n */\n autoResize?: boolean;\n /**\n * Color of the required asterisk.\n * - `default`: destructive (hard requirement).\n * - `warning`: warning color (soft requirement / recommended).\n */\n requiredVariant?: RequiredMarkVariant;\n}\n\n/**\n * A multi-line text input component with character count and auto-resize.\n *\n * @example\n * ```tsx\n * <TextAreaPlain label=\"Description\" placeholder=\"Enter a description...\" />\n * <TextAreaPlain\n * label=\"Bio\"\n * maxLength={280}\n * showCount\n * helperText=\"Tell us about yourself\"\n * />\n * ```\n */\nconst TextAreaPlain = React.forwardRef<HTMLTextAreaElement, TextAreaPlainProps>(\n (\n {\n className,\n size,\n hasError,\n resize,\n label,\n labelVariant = 'stacked',\n hideLabel,\n error,\n helperText,\n maxLength,\n showCount = false,\n autoResize = true,\n required = false,\n requiredVariant,\n id,\n rows,\n value,\n defaultValue,\n onChange,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const internalRef = React.useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n (defaultValue as string) || ''\n );\n\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const errorId = `${textareaId}-error`;\n const helperId = `${textareaId}-helper`;\n const countId = `${textareaId}-count`;\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalRef.current!);\n\n // Get current value\n const currentValue = value !== undefined ? String(value) : internalValue;\n const characterCount = currentValue.length;\n\n // Auto-resize logic: collapse to natural height, then grow to fit\n // content. CSS min-height (single-line baseline) and rows (via\n // scrollHeight) act as floors; a consumer-configured initial height\n // (style/class) and dragging the native resize handle set a user floor;\n // a consumer max-height still caps the rendered height.\n const userFloorRef = React.useRef<number | null>(null);\n const expectedHeightRef = React.useRef<number | null>(null);\n const initialFloorCapturedRef = React.useRef(false);\n\n const adjustHeight = React.useCallback(() => {\n const textarea = internalRef.current;\n if (textarea && autoResize) {\n textarea.style.height = 'auto';\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const next = Math.max(\n textarea.scrollHeight + borders,\n userFloorRef.current ?? 0\n );\n textarea.style.height = `${next}px`;\n // Record the actual rendered height (a CSS max-height may clamp the\n // value we set) so clamping is never mistaken for a manual drag.\n expectedHeightRef.current = textarea.offsetHeight || next;\n }\n }, [autoResize]);\n\n // Measures prefilled values on mount and controlled values on update.\n // On mount, a consumer-configured initial height (inline style or a\n // height class) that exceeds the content height becomes the growth\n // floor — auto-sizing must not collapse below a configured baseline.\n React.useEffect(() => {\n const textarea = internalRef.current;\n if (textarea && autoResize && !initialFloorCapturedRef.current) {\n initialFloorCapturedRef.current = true;\n const configured = textarea.offsetHeight;\n adjustHeight();\n if (configured - textarea.offsetHeight > 1) {\n userFloorRef.current = configured;\n textarea.style.height = `${configured}px`;\n expectedHeightRef.current = textarea.offsetHeight || configured;\n }\n return;\n }\n adjustHeight();\n }, [currentValue, adjustHeight, autoResize]);\n\n // Re-measure when the available width changes (wrapping changes), and\n // detect heights we didn't set ourselves — the user dragging the native\n // resize handle — adopting the dragged height as the new growth floor.\n // The drag check runs first so a diagonal resize (width + height in one\n // notification) keeps the dragged height through the re-measure.\n React.useEffect(() => {\n const textarea = internalRef.current;\n if (!autoResize || !textarea || typeof ResizeObserver === 'undefined') {\n return;\n }\n let lastWidth = textarea.offsetWidth;\n const observer = new ResizeObserver(() => {\n const expected = expectedHeightRef.current;\n const height = textarea.offsetHeight;\n if (expected !== null && Math.abs(height - expected) > 1) {\n userFloorRef.current = height;\n expectedHeightRef.current = height;\n }\n if (textarea.offsetWidth !== lastWidth) {\n lastWidth = textarea.offsetWidth;\n adjustHeight();\n }\n });\n observer.observe(textarea);\n return () => observer.disconnect();\n }, [autoResize, adjustHeight]);\n\n // Handle change\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n adjustHeight();\n },\n [value, onChange, adjustHeight]\n );\n\n // Build aria-describedby\n const describedByIds = [\n error ? errorId : null,\n helperText && !error ? helperId : null,\n showCount ? countId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ');\n\n const isFloating = labelVariant === 'floating' && !!label && !hideLabel;\n\n const requiredMark = required && <RequiredMark variant={requiredVariant} />;\n\n const textareaElement = (\n <textarea\n data-slot=\"textarea\"\n data-auto-resize={autoResize ? 'true' : undefined}\n ref={internalRef}\n id={textareaId}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n onChange={handleChange}\n maxLength={maxLength}\n aria-invalid={hasError || !!error}\n aria-describedby={describedByIds || undefined}\n required={required}\n // Auto-grow starts at one visible line; an explicit rows raises the\n // floor (scrollHeight never reports less than the rows box).\n rows={autoResize ? (rows ?? 1) : rows}\n // A single-space placeholder keeps :placeholder-shown reliable so the\n // label can float via CSS alone.\n placeholder={isFloating ? ' ' : placeholder}\n className={cn(\n textareaVariants({\n size,\n hasError: hasError || !!error,\n resize,\n labelVariant: isFloating ? 'floating' : 'stacked',\n autoResize,\n }),\n className\n )}\n {...props}\n />\n );\n\n return (\n <div data-slot=\"textarea-wrapper\" className=\"flex flex-col gap-1.5\">\n {label && !isFloating && (\n <label\n data-slot=\"textarea-label\"\n htmlFor={textareaId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {requiredMark}\n </label>\n )}\n {isFloating ? (\n <div className=\"relative\">\n {textareaElement}\n <label\n data-slot=\"textarea-label\"\n htmlFor={textareaId}\n className={floatingLabelVariants({\n size,\n hasError: hasError || !!error,\n })}\n >\n {label}\n {requiredMark}\n </label>\n </div>\n ) : (\n textareaElement\n )}\n <div\n data-slot=\"textarea-footer\"\n className=\"flex items-center justify-between gap-2\"\n >\n <div className=\"flex-1\">\n {error && (\n <p\n id={errorId}\n data-slot=\"textarea-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !error && (\n <p\n id={helperId}\n data-slot=\"textarea-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n {showCount && (\n <p\n id={countId}\n data-slot=\"textarea-count\"\n className={cn(\n 'text-muted-foreground shrink-0 text-xs',\n maxLength && characterCount >= maxLength && 'text-destructive'\n )}\n >\n {characterCount}\n {maxLength && `/${maxLength}`}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextAreaPlain.displayName = 'TextAreaPlain';\n\nexport { TextAreaPlain, textareaVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { RequiredMark } from '../Input';\nimport { TextAreaRichKerebron } from '../TextAreaRich/TextAreaRichKerebron';\nimport { TextAreaPlain } from '../TextAreaPlain';\nimport type { TextAreaPlainProps } from '../TextAreaPlain';\n\n/**\n * `Textarea` keeps `TextAreaPlain`'s prop surface so existing call sites\n * compile unchanged while rendering `TextAreaRich` underneath.\n */\nexport interface TextareaProps extends TextAreaPlainProps {\n /**\n * Set `false` to opt out of the rich surface: renders the native\n * `TextAreaPlain` instead — no block gutter menu, no formatting, no HTML —\n * and restores every native textarea behaviour (`maxLength` enforcement,\n * `resize`, `autoResize={false}`, floating labels).\n */\n richText?: boolean;\n}\n\n// --- plain text <-> HTML (lossless round-trip for plain text) --------------\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n}\n\n/**\n * Newline normalization applied to every incoming plain value: a native\n * textarea's API value never contains CR, so CRLF/CR collapse to LF before\n * any conversion. Without this, `'a\\r\\nb'` would leave a literal CR inside a\n * paragraph and gain a blank line on the next round-trip.\n */\nfunction normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n?/g, '\\n');\n}\n\n/**\n * Converts plain text to the editor's HTML: each line becomes a paragraph,\n * empty lines become `<p><br></p>`. Newlines are normalized to LF first\n * (matching native textarea behaviour); after that,\n * `htmlToPlain(plainToHtml(text)) === text` for every string, so stored\n * plain values survive untouched.\n */\nexport function plainToHtml(text: string): string {\n if (!text) return '';\n return normalizeNewlines(text)\n .split('\\n')\n .map((line) => (line ? `<p>${escapeHtml(line)}</p>` : '<p><br></p>'))\n .join('');\n}\n\nconst BLOCK_TAGS = new Set([\n 'P',\n 'DIV',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'LI',\n 'UL',\n 'OL',\n 'BLOCKQUOTE',\n 'PRE',\n 'TABLE',\n 'CAPTION',\n 'THEAD',\n 'TBODY',\n 'TFOOT',\n 'TR',\n]);\n\n/** Table cells separate with tabs; their row supplies the newline. */\nconst CELL_TAGS = new Set(['TD', 'TH']);\n\n/**\n * Structural table tags never render text of their own — whitespace-only\n * text nodes directly under them are pretty-printing between cells/rows\n * (`<tr>\\n <td>`), not field content.\n */\nconst TABLE_STRUCTURE_TAGS = new Set([\n 'TABLE',\n 'THEAD',\n 'TBODY',\n 'TFOOT',\n 'TR',\n]);\n\n/** Tags whose text is invisible — contributing it would leak code as text. */\nconst IGNORED_TAGS = new Set(['SCRIPT', 'STYLE', 'TEMPLATE', 'NOSCRIPT']);\n\nfunction nodeListToText(nodes: Iterable<Node>): string {\n let out = '';\n // Cell separators are positional, not content-based: an empty cell still\n // owns a column, so `Drug | (blank) | Dose` must stay `Drug\\t\\tDose`.\n let afterCell = false;\n for (const node of nodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const parentTag = node.parentElement?.tagName;\n // Indentation between structural table elements is markup\n // formatting, not content — whitespace inside cells still counts.\n if (!text.trim() && parentTag && TABLE_STRUCTURE_TAGS.has(parentTag)) {\n continue;\n }\n out += text;\n // Inter-cell whitespace from pretty-printed table markup does not\n // break the cell sequence.\n if (text.trim()) afterCell = false;\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const el = node as Element;\n if (IGNORED_TAGS.has(el.tagName)) continue;\n if (el.tagName === 'BR') {\n afterCell = false;\n out += '\\n';\n continue;\n }\n if (CELL_TAGS.has(el.tagName)) {\n if (afterCell) out += '\\t';\n out += nodeListToText(el.childNodes);\n afterCell = true;\n continue;\n }\n afterCell = false;\n if (BLOCK_TAGS.has(el.tagName)) {\n // A block starts its own line — inline content before it\n // (`a<div>b</div>`) must not fuse with the block's first line.\n if (out && !out.endsWith('\\n')) out += '\\n';\n let inner = nodeListToText(el.childNodes);\n // A lone <br> inside a block is the \"empty paragraph\" convention,\n // not an extra line break.\n if (inner === '\\n') inner = '';\n out += inner;\n // A block ends its own line — but a nested block\n // (`<blockquote><p>a</p></blockquote>`) already supplied the\n // newline; adding another would fabricate a blank line.\n if (inner === '' || !inner.endsWith('\\n')) out += '\\n';\n continue;\n }\n out += nodeListToText(el.childNodes);\n }\n return out;\n}\n\n/** Extracts plain text from editor HTML: blocks and `<br>` become newlines. */\nexport function htmlToPlain(html: string): string {\n if (!html) return '';\n // A <template> is the spec's inert parser: untrusted markup (pasted HTML\n // reaches this extractor) cannot load resources or run handlers like\n // `<img onerror>` while being read — unlike a detached <div>, whose\n // subtree is still \"browsing-context connected\" enough to fetch.\n const root = document.createElement('template');\n root.innerHTML = html;\n const text = nodeListToText(root.content.childNodes);\n return text.endsWith('\\n') ? text.slice(0, -1) : text;\n}\n\n/**\n * Paste/drop insertion policy: clipboard HTML is flattened to escaped plain\n * paragraphs before it reaches the live editable, so clipboard styles, host\n * CSS classes and embedded content never become active inside a field whose\n * contract is plain text.\n */\nfunction sanitizePastedHtml(html: string): string {\n return plainToHtml(htmlToPlain(html));\n}\n\n// --- dev-only one-time warnings for dropped native behaviours ---------------\n\nconst warned = new Set<string>();\nfunction warnOnce(key: string, message: string): void {\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.warn(`[mieweb/ui Textarea] ${message}`);\n }\n}\n\n/**\n * The rich implementation behind `Textarea` (see its docs). Separate\n * component so the `richText={false}` branch never mounts these hooks.\n */\nconst RichTextarea = React.forwardRef<HTMLTextAreaElement, TextAreaPlainProps>(\n (\n {\n label,\n labelVariant = 'stacked',\n hideLabel,\n error,\n helperText,\n maxLength,\n showCount,\n autoResize = true,\n requiredVariant,\n size = 'md',\n hasError,\n resize,\n className,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n name,\n form,\n id,\n rows,\n required,\n readOnly,\n disabled,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n },\n ref\n ) => {\n // One-time upgrade notice: this surface replaced the native <textarea>\n // in 0.12.0 — reaches exactly the developers affected, in dev only.\n warnOnce(\n 'rich-upgrade',\n 'Since 0.12.0 Textarea renders a rich text surface (plain-text value ' +\n 'contract unchanged). Watch for: CSS \"textarea\" selectors, E2E ' +\n 'fill()/type(), and maxLength no longer blocking typing. Opt out per ' +\n 'field with richText={false} or use TextAreaPlain. See MIGRATION.md.'\n );\n if (labelVariant === 'floating') {\n warnOnce(\n 'floating',\n 'labelVariant=\"floating\" is not supported by the rich surface; ' +\n 'falling back to a stacked label. Use TextAreaPlain for floating labels.'\n );\n }\n if (autoResize === false) {\n warnOnce(\n 'autoResize',\n 'autoResize={false} is ignored; the rich surface always grows with ' +\n 'content. Use TextAreaPlain for a fixed-height textarea.'\n );\n }\n if (resize !== undefined) {\n warnOnce(\n 'resize',\n 'resize is ignored; the rich surface has no native resize handle. ' +\n 'Use TextAreaPlain for drag-resizing.'\n );\n }\n if (maxLength !== undefined) {\n warnOnce(\n 'maxLength',\n 'maxLength is not enforced while typing; the character count still ' +\n 'reflects it. Enforce limits in onChange or use TextAreaPlain.'\n );\n }\n\n const reactId = React.useId();\n const errorId = `${reactId}-error`;\n const helperId = `${reactId}-helper`;\n const countId = `${reactId}-count`;\n\n const controlledValue =\n value !== undefined ? normalizeNewlines(String(value)) : undefined;\n\n const [state, setState] = React.useState(() => {\n const plain =\n controlledValue ??\n (defaultValue !== undefined\n ? normalizeNewlines(String(defaultValue))\n : '');\n return { html: plainToHtml(plain), plain };\n });\n\n // Controlled resync: only when the parent hands us a value different from\n // the plain text we last reported — echoing our own value back (the usual\n // controlled round-trip) keeps the user's rich formatting intact.\n if (controlledValue !== undefined && controlledValue !== state.plain) {\n setState({ html: plainToHtml(controlledValue), plain: controlledValue });\n }\n\n const hiddenRef = React.useRef<HTMLTextAreaElement>(null);\n const editorWrapperRef = React.useRef<HTMLDivElement>(null);\n\n // Rejected edits need no DOM poking here: the Kerebron surface is\n // strictly controlled (it converges to `value` on every render — see\n // RichEditor's `strictValue`), so when a controlled parent refuses an\n // edit and the optimistic state above is reverted during the same\n // render, the editor reloads the committed HTML transaction-safely.\n\n // The ProseMirror surface mounts asynchronously, so a mount-time\n // `ref.current.focus()` (the autoFocus-era idiom) can run before\n // `[role=\"textbox\"]` exists. The request is retained and honored when\n // the editable appears — unless focus has moved on to another control\n // in the meantime, which must not have its focus stolen.\n const pendingFocusRef = React.useRef<MutationObserver | null>(null);\n React.useEffect(() => () => pendingFocusRef.current?.disconnect(), []);\n const focusEditor = React.useCallback(() => {\n const wrapper = editorWrapperRef.current;\n if (!wrapper) return;\n const editable = wrapper.querySelector<HTMLElement>('[role=\"textbox\"]');\n if (editable) {\n editable.focus();\n return;\n }\n pendingFocusRef.current?.disconnect();\n const observer = new MutationObserver(() => {\n const target = wrapper.querySelector<HTMLElement>('[role=\"textbox\"]');\n if (!target) return;\n observer.disconnect();\n pendingFocusRef.current = null;\n const active = document.activeElement;\n if (!active || active === document.body || wrapper.contains(active)) {\n target.focus();\n }\n });\n // `role=\"textbox\"` arrives as an ATTRIBUTE write in the adapter's\n // readiness effect, possibly after the node insertions — watch both.\n observer.observe(wrapper, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['role'],\n });\n pendingFocusRef.current = observer;\n }, []);\n\n // The forwarded ref is the hidden mirror <textarea> — `ref.current.value`\n // reads the current plain text — with focus/blur redirected to the editor.\n React.useImperativeHandle(ref, () => {\n const node = hiddenRef.current as HTMLTextAreaElement;\n node.focus = focusEditor;\n node.blur = () => {\n // A focus request may still be waiting for the editable to mount;\n // blur() must cancel it, or the editor grabs focus (and reopens the\n // mobile keyboard) as soon as it appears.\n pendingFocusRef.current?.disconnect();\n pendingFocusRef.current = null;\n const editable =\n editorWrapperRef.current?.querySelector<HTMLElement>(\n '[role=\"textbox\"]'\n );\n if (document.activeElement === editable) editable?.blur();\n };\n return node;\n }, [focusEditor]);\n\n // External-label bridge: existing call sites pair\n // `<Label htmlFor={id}>` with `<Textarea id={id}>`. The id now lands on a\n // contenteditable div, which `htmlFor` neither names nor focuses. Find\n // the external label, point `aria-labelledby` at it (restoring the\n // accessible name) and focus the editor when it is clicked.\n const [externalLabelId, setExternalLabelId] = React.useState<string>();\n React.useEffect(() => {\n if (!id) return;\n const externalLabel = document.querySelector<HTMLLabelElement>(\n `label[for=\"${globalThis.CSS.escape(id)}\"]`\n );\n if (!externalLabel) return;\n if (!externalLabel.id) externalLabel.id = `${reactId}-external-label`;\n setExternalLabelId(externalLabel.id);\n const handleClick = () => focusEditor();\n externalLabel.addEventListener('click', handleClick);\n return () => externalLabel.removeEventListener('click', handleClick);\n }, [id, reactId, focusEditor]);\n\n // Re-targets editor events at the mirror so legacy handlers keep reading\n // `event.target.value` as plain text, like they did on the native\n // textarea. The original event is the prototype — reads and propagation\n // state delegate to it — with only the targets overridden;\n // stopPropagation/preventDefault forward to the original so React's\n // dispatch loop (which checks the original) honours them.\n const retargetEvent = React.useCallback(\n <E extends React.SyntheticEvent>(event: E): E => {\n const node = hiddenRef.current;\n if (!node) return event;\n const retargeted = Object.create(event) as E;\n Object.defineProperties(retargeted, {\n target: { value: node, enumerable: true },\n currentTarget: { value: node, enumerable: true },\n stopPropagation: { value: () => event.stopPropagation() },\n preventDefault: { value: () => event.preventDefault() },\n });\n return retargeted;\n },\n []\n );\n\n type MirrorFocusEvent = React.FocusEvent<HTMLTextAreaElement>;\n type MirrorKeyboardEvent = React.KeyboardEvent<HTMLTextAreaElement>;\n\n // Focus boundary that includes the editor's own portals: the block\n // gutter menu mounts under `document.body` and moves focus to its first\n // item on open, so DOM containment alone would fire the host's blur\n // mid-format (a blur-to-save consumer would commit early). A portal is\n // ours when a trigger inside this wrapper `aria-controls` its menu.\n const focusStaysInside = (\n event: React.FocusEvent<HTMLDivElement>\n ): boolean => {\n const related = event.relatedTarget;\n if (!related) return false;\n if (event.currentTarget.contains(related)) return true;\n const menuId = related\n .closest('[data-slot=\"dropdown-menu\"]')\n ?.querySelector('[role=\"menu\"]')?.id;\n return (\n !!menuId &&\n !!event.currentTarget.querySelector(\n `[aria-controls=\"${globalThis.CSS.escape(menuId)}\"]`\n )\n );\n };\n\n const handleHtmlChange = (html: string) => {\n const plain = htmlToPlain(html);\n setState({ html, plain });\n const node = hiddenRef.current;\n if (onChange && node) {\n node.value = plain;\n const nativeEvent = new Event('change');\n onChange({\n target: node,\n currentTarget: node,\n type: 'change',\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isTrusted: false,\n timeStamp: Date.now(),\n nativeEvent,\n preventDefault: () => {},\n stopPropagation: () => {},\n isDefaultPrevented: () => false,\n isPropagationStopped: () => false,\n persist: () => {},\n } as React.ChangeEvent<HTMLTextAreaElement>);\n }\n };\n\n const showError = !!error;\n const invalid = hasError || showError;\n const describedByIds =\n [\n showError ? errorId : null,\n helperText && !showError ? helperId : null,\n showCount ? countId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const characterCount = state.plain.length;\n\n // The editable's own metrics: `size` restyles the font, `rows` restores\n // the size-aware growth floor a native textarea got for free. Text\n // utilities cannot size the editable — unlayered package CSS\n // (kerebron.css's `[data-slot='textarea-rich'] .kb-editor` rule and\n // Kerebron's own base.css) outranks them on both font-size and\n // line-height — so the sm/lg metrics ride CSS variables that those\n // rules read. The defaults (16px/24px) are the md pair, keeping\n // `lineHeightPx` and the 40px rest-height match with Input honest.\n const lineHeightPx = size === 'sm' ? 20 : size === 'lg' ? 28 : 24;\n const sizeVars =\n size === 'sm'\n ? {\n '--textarea-rich-font-size': '0.875rem',\n '--textarea-rich-line-height': '1.25rem',\n }\n : size === 'lg'\n ? {\n '--textarea-rich-font-size': '1.125rem',\n '--textarea-rich-line-height': '1.75rem',\n }\n : null;\n const editorStyle =\n rows || sizeVars\n ? ({\n ...(rows\n ? // 7px block padding each side, matching the editable's py-[7px].\n { minHeight: `${rows * lineHeightPx + 14}px` }\n : null),\n ...sizeVars,\n } as React.CSSProperties)\n : undefined;\n\n return (\n <div data-slot=\"textarea-wrapper\" className=\"flex flex-col gap-1.5\">\n {label && (\n <label\n data-slot=\"textarea-label\"\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {required && <RequiredMark variant={requiredVariant} />}\n </label>\n )}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions --\n not interactive itself: delegates events bubbling from the\n contenteditable textbox inside, like a native field's wrapper */}\n <div\n ref={editorWrapperRef}\n className=\"w-full\"\n // Composed like native textarea events: blur/focus only fire when\n // focus actually leaves/enters the field (moves inside the editor\n // chrome — gutter menu, toolbar — don't count), and all events are\n // re-targeted at the mirror so `event.target.value` stays plain.\n onBlur={\n onBlur &&\n ((event: React.FocusEvent<HTMLDivElement>) => {\n if (focusStaysInside(event)) return;\n onBlur(retargetEvent(event) as unknown as MirrorFocusEvent);\n })\n }\n onFocus={\n onFocus &&\n ((event: React.FocusEvent<HTMLDivElement>) => {\n if (focusStaysInside(event)) return;\n onFocus(retargetEvent(event) as unknown as MirrorFocusEvent);\n })\n }\n onKeyDown={\n onKeyDown &&\n ((event: React.KeyboardEvent<HTMLDivElement>) =>\n onKeyDown(retargetEvent(event) as unknown as MirrorKeyboardEvent))\n }\n onKeyUp={\n onKeyUp &&\n ((event: React.KeyboardEvent<HTMLDivElement>) =>\n onKeyUp(retargetEvent(event) as unknown as MirrorKeyboardEvent))\n }\n >\n <TextAreaRichKerebron\n value={state.html}\n onChange={handleHtmlChange}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n // Paste flattening: honored by the legacy engine (which the unit\n // tests stub in — see src/test/textAreaRichKerebronStub); the\n // Kerebron engine instead filters pastes through its ProseMirror\n // schema, so markup never reaches the live document raw.\n sanitizeHtml={sanitizePastedHtml}\n aria-label={ariaLabel ?? label}\n aria-labelledby={ariaLabelledBy ?? externalLabelId}\n aria-describedby={describedByIds}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n editorClassName={cn(\n // A native textarea renders repeated spaces and tabs\n // faithfully; normal HTML layout would collapse them.\n // (Font metrics ride editorStyle's CSS variables — text-sm/\n // text-lg utilities lose to unlayered package CSS here.)\n 'whitespace-pre-wrap'\n )}\n editorStyle={editorStyle}\n className={cn(\n size === 'sm' && 'text-sm',\n size === 'lg' && 'text-lg',\n invalid &&\n 'border-destructive focus-within:ring-destructive focus-within:border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n />\n </div>\n {/* Mirrors the plain value for form posts and the forwarded ref. */}\n <textarea\n data-slot=\"textarea-mirror\"\n ref={hiddenRef}\n hidden\n readOnly\n tabIndex={-1}\n aria-hidden=\"true\"\n name={name}\n form={form}\n required={required}\n disabled={disabled}\n value={state.plain}\n />\n <div\n data-slot=\"textarea-footer\"\n className=\"flex items-center justify-between gap-2\"\n >\n <div className=\"flex-1\">\n {showError && (\n <p\n id={errorId}\n data-slot=\"textarea-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !showError && (\n <p\n id={helperId}\n data-slot=\"textarea-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n {showCount && (\n <p\n id={countId}\n data-slot=\"textarea-count\"\n className={cn(\n 'text-muted-foreground shrink-0 text-xs',\n maxLength && characterCount >= maxLength && 'text-destructive'\n )}\n >\n {characterCount}\n {maxLength && `/${maxLength}`}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nRichTextarea.displayName = 'RichTextarea';\n\n/**\n * A multi-line text input that is rich text underneath. `Textarea` keeps its\n * plain-text contract — `value`, `defaultValue` and `onChange`'s\n * `event.target.value` are plain strings — while rendering `TextAreaRich`\n * (hidden toolbar, markdown shortcuts, block gutter menu) so every note\n * field gets formatting for free.\n *\n * Formatting the user applies is visible while editing but only the plain\n * text is reported through `onChange`; hosts that persist HTML should use\n * `TextAreaRich` directly. Need the native `<textarea>` element (hard\n * `maxLength`, native validation, autofill, drag-resize, floating label) —\n * pass `richText={false}` or use `TextAreaPlain`.\n *\n * A hidden `<textarea>` mirrors the plain value so `name` form posts and\n * `ref.current.value` keep working; `ref.current.focus()` focuses the editor.\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ richText = true, ...props }, ref) =>\n richText ? (\n <RichTextarea ref={ref} {...props} />\n ) : (\n <TextAreaPlain ref={ref} {...props} />\n )\n);\n\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/TextAreaPlain/TextAreaPlain.tsx","../src/components/Textarea/Textarea.tsx"],"names":["React","jsxs","jsx"],"mappings":"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","file":"chunk-L3CAWGBU.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { RequiredMark, type RequiredMarkVariant } from '../Input';\n\nconst textareaVariants = cva(\n [\n 'w-full px-3 py-2',\n 'border border-input rounded-lg',\n 'bg-background text-foreground',\n 'placeholder:text-muted-foreground',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'resize-y',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm min-h-[60px]',\n md: 'text-base min-h-[80px]',\n lg: 'text-lg min-h-[100px]',\n },\n hasError: {\n true: 'border-destructive focus:ring-destructive',\n false: '',\n },\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n },\n labelVariant: {\n stacked: '',\n floating: 'peer placeholder:text-transparent',\n },\n autoResize: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n // Floating labels reserve top padding so entered text always starts\n // below the floated label, plus a little extra min-height.\n {\n labelVariant: 'floating',\n size: 'sm',\n className: 'pt-5 min-h-[76px]',\n },\n {\n labelVariant: 'floating',\n size: 'md',\n className: 'pt-6 min-h-[96px]',\n },\n {\n labelVariant: 'floating',\n size: 'lg',\n className: 'pt-7 min-h-[120px]',\n },\n // Auto-growing textareas start at the same visual height as a\n // single-line Input (h-8/h-10/h-12): min-height matches the Input\n // size token and the vertical padding is tuned so one line of text\n // plus padding plus borders lands exactly on that height.\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'sm',\n className: 'min-h-8 py-[5px]',\n },\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'md',\n className: 'min-h-10 py-[7px]',\n },\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'lg',\n className: 'min-h-12 py-[9px]',\n },\n // Floating label + auto-grow: single line below the floated label.\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'sm',\n className: 'min-h-[50px]',\n },\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'md',\n className: 'min-h-[58px]',\n },\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'lg',\n className: 'min-h-[66px]',\n },\n ],\n defaultVariants: {\n size: 'md',\n hasError: false,\n resize: 'vertical',\n labelVariant: 'stacked',\n autoResize: true,\n },\n }\n);\n\nconst floatingLabelVariants = cva(\n [\n 'absolute start-3 pointer-events-none select-none',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n size: {\n sm: [\n 'text-sm top-3',\n 'peer-focus:top-1 peer-[:not(:placeholder-shown)]:top-1 peer-autofill:top-1',\n 'peer-focus:text-[0.65rem] peer-[:not(:placeholder-shown)]:text-[0.65rem] peer-autofill:text-[0.65rem]',\n ],\n md: [\n 'text-base top-4',\n 'peer-focus:top-1.5 peer-[:not(:placeholder-shown)]:top-1.5 peer-autofill:top-1.5',\n 'peer-focus:text-xs peer-[:not(:placeholder-shown)]:text-xs peer-autofill:text-xs',\n ],\n lg: [\n 'text-lg top-5',\n 'peer-focus:top-2 peer-[:not(:placeholder-shown)]:top-2 peer-autofill:top-2',\n 'peer-focus:text-sm peer-[:not(:placeholder-shown)]:text-sm peer-autofill:text-sm',\n ],\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n hasError: false,\n },\n }\n);\n\nexport interface TextAreaPlainProps\n extends\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>,\n Omit<VariantProps<typeof textareaVariants>, 'labelVariant'> {\n /** Label for the textarea */\n label?: string;\n /**\n * How the label is rendered.\n * - `stacked` (default): label above the textarea.\n * - `floating`: label rests inside the textarea like a placeholder and\n * floats to the top (staying inside it) when focused or filled.\n * Ignores `placeholder`; when `hideLabel` is set, falls back to a\n * visually-hidden stacked label.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Whether the label should be visually hidden */\n hideLabel?: boolean;\n /** Error message to display */\n error?: string;\n /** Helper text to display */\n helperText?: string;\n /** Maximum character count */\n maxLength?: number;\n /** Show character count */\n showCount?: boolean;\n /**\n * Grow and shrink with content (default). The empty control matches a\n * single-line `Input`'s height; `rows` sets a taller growth floor, and\n * dragging the native resize handle sets a new floor the same way. Set\n * `false` for a classic fixed-height textarea.\n */\n autoResize?: boolean;\n /**\n * Color of the required asterisk.\n * - `default`: destructive (hard requirement).\n * - `warning`: warning color (soft requirement / recommended).\n */\n requiredVariant?: RequiredMarkVariant;\n}\n\n/**\n * A multi-line text input component with character count and auto-resize.\n *\n * @example\n * ```tsx\n * <TextAreaPlain label=\"Description\" placeholder=\"Enter a description...\" />\n * <TextAreaPlain\n * label=\"Bio\"\n * maxLength={280}\n * showCount\n * helperText=\"Tell us about yourself\"\n * />\n * ```\n */\nconst TextAreaPlain = React.forwardRef<HTMLTextAreaElement, TextAreaPlainProps>(\n (\n {\n className,\n size,\n hasError,\n resize,\n label,\n labelVariant = 'stacked',\n hideLabel,\n error,\n helperText,\n maxLength,\n showCount = false,\n autoResize = true,\n required = false,\n requiredVariant,\n id,\n rows,\n value,\n defaultValue,\n onChange,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const internalRef = React.useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n (defaultValue as string) || ''\n );\n\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const errorId = `${textareaId}-error`;\n const helperId = `${textareaId}-helper`;\n const countId = `${textareaId}-count`;\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalRef.current!);\n\n // Get current value\n const currentValue = value !== undefined ? String(value) : internalValue;\n const characterCount = currentValue.length;\n\n // Auto-resize logic: collapse to natural height, then grow to fit\n // content. CSS min-height (single-line baseline) and rows (via\n // scrollHeight) act as floors; a consumer-configured initial height\n // (style/class) and dragging the native resize handle set a user floor;\n // a consumer max-height still caps the rendered height.\n const userFloorRef = React.useRef<number | null>(null);\n const expectedHeightRef = React.useRef<number | null>(null);\n const initialFloorCapturedRef = React.useRef(false);\n\n const adjustHeight = React.useCallback(() => {\n const textarea = internalRef.current;\n if (textarea && autoResize) {\n textarea.style.height = 'auto';\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const next = Math.max(\n textarea.scrollHeight + borders,\n userFloorRef.current ?? 0\n );\n textarea.style.height = `${next}px`;\n // Record the actual rendered height (a CSS max-height may clamp the\n // value we set) so clamping is never mistaken for a manual drag.\n expectedHeightRef.current = textarea.offsetHeight || next;\n }\n }, [autoResize]);\n\n // Measures prefilled values on mount and controlled values on update.\n // On mount, a consumer-configured initial height (inline style or a\n // height class) that exceeds the content height becomes the growth\n // floor — auto-sizing must not collapse below a configured baseline.\n React.useEffect(() => {\n const textarea = internalRef.current;\n if (textarea && autoResize && !initialFloorCapturedRef.current) {\n initialFloorCapturedRef.current = true;\n const configured = textarea.offsetHeight;\n adjustHeight();\n if (configured - textarea.offsetHeight > 1) {\n userFloorRef.current = configured;\n textarea.style.height = `${configured}px`;\n expectedHeightRef.current = textarea.offsetHeight || configured;\n }\n return;\n }\n adjustHeight();\n }, [currentValue, adjustHeight, autoResize]);\n\n // Re-measure when the available width changes (wrapping changes), and\n // detect heights we didn't set ourselves — the user dragging the native\n // resize handle — adopting the dragged height as the new growth floor.\n // The drag check runs first so a diagonal resize (width + height in one\n // notification) keeps the dragged height through the re-measure.\n React.useEffect(() => {\n const textarea = internalRef.current;\n if (!autoResize || !textarea || typeof ResizeObserver === 'undefined') {\n return;\n }\n let lastWidth = textarea.offsetWidth;\n const observer = new ResizeObserver(() => {\n const expected = expectedHeightRef.current;\n const height = textarea.offsetHeight;\n if (expected !== null && Math.abs(height - expected) > 1) {\n userFloorRef.current = height;\n expectedHeightRef.current = height;\n }\n if (textarea.offsetWidth !== lastWidth) {\n lastWidth = textarea.offsetWidth;\n adjustHeight();\n }\n });\n observer.observe(textarea);\n return () => observer.disconnect();\n }, [autoResize, adjustHeight]);\n\n // Handle change\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n adjustHeight();\n },\n [value, onChange, adjustHeight]\n );\n\n // Build aria-describedby\n const describedByIds = [\n error ? errorId : null,\n helperText && !error ? helperId : null,\n showCount ? countId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ');\n\n const isFloating = labelVariant === 'floating' && !!label && !hideLabel;\n\n const requiredMark = required && <RequiredMark variant={requiredVariant} />;\n\n const textareaElement = (\n <textarea\n data-slot=\"textarea\"\n data-auto-resize={autoResize ? 'true' : undefined}\n ref={internalRef}\n id={textareaId}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n onChange={handleChange}\n maxLength={maxLength}\n aria-invalid={hasError || !!error}\n aria-describedby={describedByIds || undefined}\n required={required}\n // Auto-grow starts at one visible line; an explicit rows raises the\n // floor (scrollHeight never reports less than the rows box).\n rows={autoResize ? (rows ?? 1) : rows}\n // A single-space placeholder keeps :placeholder-shown reliable so the\n // label can float via CSS alone.\n placeholder={isFloating ? ' ' : placeholder}\n className={cn(\n textareaVariants({\n size,\n hasError: hasError || !!error,\n resize,\n labelVariant: isFloating ? 'floating' : 'stacked',\n autoResize,\n }),\n className\n )}\n {...props}\n />\n );\n\n return (\n <div data-slot=\"textarea-wrapper\" className=\"flex flex-col gap-1.5\">\n {label && !isFloating && (\n <label\n data-slot=\"textarea-label\"\n htmlFor={textareaId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {requiredMark}\n </label>\n )}\n {isFloating ? (\n <div className=\"relative\">\n {textareaElement}\n <label\n data-slot=\"textarea-label\"\n htmlFor={textareaId}\n className={floatingLabelVariants({\n size,\n hasError: hasError || !!error,\n })}\n >\n {label}\n {requiredMark}\n </label>\n </div>\n ) : (\n textareaElement\n )}\n <div\n data-slot=\"textarea-footer\"\n className=\"flex items-center justify-between gap-2\"\n >\n <div className=\"flex-1\">\n {error && (\n <p\n id={errorId}\n data-slot=\"textarea-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !error && (\n <p\n id={helperId}\n data-slot=\"textarea-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n {showCount && (\n <p\n id={countId}\n data-slot=\"textarea-count\"\n className={cn(\n 'text-muted-foreground shrink-0 text-xs',\n maxLength && characterCount >= maxLength && 'text-destructive'\n )}\n >\n {characterCount}\n {maxLength && `/${maxLength}`}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextAreaPlain.displayName = 'TextAreaPlain';\n\nexport { TextAreaPlain, textareaVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { RequiredMark } from '../Input';\nimport { TextAreaRichKerebron } from '../TextAreaRich/TextAreaRichKerebron';\nimport { TextAreaPlain } from '../TextAreaPlain';\nimport type { TextAreaPlainProps } from '../TextAreaPlain';\n\n/**\n * `Textarea` keeps `TextAreaPlain`'s prop surface so existing call sites\n * compile unchanged while rendering `TextAreaRich` underneath.\n */\nexport interface TextareaProps extends TextAreaPlainProps {\n /**\n * Set `false` to opt out of the rich surface: renders the native\n * `TextAreaPlain` instead — no block gutter menu, no formatting, no HTML —\n * and restores every native textarea behaviour (`maxLength` enforcement,\n * `resize`, `autoResize={false}`, floating labels).\n */\n richText?: boolean;\n}\n\n// --- plain text <-> HTML (lossless round-trip for plain text) --------------\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n}\n\n/**\n * Newline normalization applied to every incoming plain value: a native\n * textarea's API value never contains CR, so CRLF/CR collapse to LF before\n * any conversion. Without this, `'a\\r\\nb'` would leave a literal CR inside a\n * paragraph and gain a blank line on the next round-trip.\n */\nfunction normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n?/g, '\\n');\n}\n\n/**\n * Converts plain text to the editor's HTML: each line becomes a paragraph,\n * empty lines become `<p><br></p>`. Newlines are normalized to LF first\n * (matching native textarea behaviour); after that,\n * `htmlToPlain(plainToHtml(text)) === text` for every string, so stored\n * plain values survive untouched.\n */\nexport function plainToHtml(text: string): string {\n if (!text) return '';\n return normalizeNewlines(text)\n .split('\\n')\n .map((line) => (line ? `<p>${escapeHtml(line)}</p>` : '<p><br></p>'))\n .join('');\n}\n\nconst BLOCK_TAGS = new Set([\n 'P',\n 'DIV',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'LI',\n 'UL',\n 'OL',\n 'BLOCKQUOTE',\n 'PRE',\n 'TABLE',\n 'CAPTION',\n 'THEAD',\n 'TBODY',\n 'TFOOT',\n 'TR',\n]);\n\n/** Table cells separate with tabs; their row supplies the newline. */\nconst CELL_TAGS = new Set(['TD', 'TH']);\n\n/**\n * Structural table tags never render text of their own — whitespace-only\n * text nodes directly under them are pretty-printing between cells/rows\n * (`<tr>\\n <td>`), not field content.\n */\nconst TABLE_STRUCTURE_TAGS = new Set([\n 'TABLE',\n 'THEAD',\n 'TBODY',\n 'TFOOT',\n 'TR',\n]);\n\n/** Tags whose text is invisible — contributing it would leak code as text. */\nconst IGNORED_TAGS = new Set(['SCRIPT', 'STYLE', 'TEMPLATE', 'NOSCRIPT']);\n\nfunction nodeListToText(nodes: Iterable<Node>): string {\n let out = '';\n // Cell separators are positional, not content-based: an empty cell still\n // owns a column, so `Drug | (blank) | Dose` must stay `Drug\\t\\tDose`.\n let afterCell = false;\n for (const node of nodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const parentTag = node.parentElement?.tagName;\n // Indentation between structural table elements is markup\n // formatting, not content — whitespace inside cells still counts.\n if (!text.trim() && parentTag && TABLE_STRUCTURE_TAGS.has(parentTag)) {\n continue;\n }\n out += text;\n // Inter-cell whitespace from pretty-printed table markup does not\n // break the cell sequence.\n if (text.trim()) afterCell = false;\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const el = node as Element;\n if (IGNORED_TAGS.has(el.tagName)) continue;\n if (el.tagName === 'BR') {\n afterCell = false;\n out += '\\n';\n continue;\n }\n if (CELL_TAGS.has(el.tagName)) {\n if (afterCell) out += '\\t';\n out += nodeListToText(el.childNodes);\n afterCell = true;\n continue;\n }\n afterCell = false;\n if (BLOCK_TAGS.has(el.tagName)) {\n // A block starts its own line — inline content before it\n // (`a<div>b</div>`) must not fuse with the block's first line.\n if (out && !out.endsWith('\\n')) out += '\\n';\n let inner = nodeListToText(el.childNodes);\n // A lone <br> inside a block is the \"empty paragraph\" convention,\n // not an extra line break.\n if (inner === '\\n') inner = '';\n out += inner;\n // A block ends its own line — but a nested block\n // (`<blockquote><p>a</p></blockquote>`) already supplied the\n // newline; adding another would fabricate a blank line.\n if (inner === '' || !inner.endsWith('\\n')) out += '\\n';\n continue;\n }\n out += nodeListToText(el.childNodes);\n }\n return out;\n}\n\n/** Extracts plain text from editor HTML: blocks and `<br>` become newlines. */\nexport function htmlToPlain(html: string): string {\n if (!html) return '';\n // A <template> is the spec's inert parser: untrusted markup (pasted HTML\n // reaches this extractor) cannot load resources or run handlers like\n // `<img onerror>` while being read — unlike a detached <div>, whose\n // subtree is still \"browsing-context connected\" enough to fetch.\n const root = document.createElement('template');\n root.innerHTML = html;\n const text = nodeListToText(root.content.childNodes);\n return text.endsWith('\\n') ? text.slice(0, -1) : text;\n}\n\n/**\n * Paste/drop insertion policy: clipboard HTML is flattened to escaped plain\n * paragraphs before it reaches the live editable, so clipboard styles, host\n * CSS classes and embedded content never become active inside a field whose\n * contract is plain text.\n */\nfunction sanitizePastedHtml(html: string): string {\n return plainToHtml(htmlToPlain(html));\n}\n\n// --- dev-only one-time warnings for dropped native behaviours ---------------\n\nconst warned = new Set<string>();\nfunction warnOnce(key: string, message: string): void {\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.warn(`[mieweb/ui Textarea] ${message}`);\n }\n}\n\n/**\n * The rich implementation behind `Textarea` (see its docs). Separate\n * component so the `richText={false}` branch never mounts these hooks.\n */\nconst RichTextarea = React.forwardRef<HTMLTextAreaElement, TextAreaPlainProps>(\n (\n {\n label,\n labelVariant = 'stacked',\n hideLabel,\n error,\n helperText,\n maxLength,\n showCount,\n autoResize = true,\n requiredVariant,\n size = 'md',\n hasError,\n resize,\n className,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n name,\n form,\n id,\n rows,\n required,\n readOnly,\n disabled,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n },\n ref\n ) => {\n // One-time upgrade notice: this surface replaced the native <textarea>\n // in 0.12.0 — reaches exactly the developers affected, in dev only.\n warnOnce(\n 'rich-upgrade',\n 'Since 0.12.0 Textarea renders a rich text surface (plain-text value ' +\n 'contract unchanged). Watch for: CSS \"textarea\" selectors, E2E ' +\n 'fill()/type(), and maxLength no longer blocking typing. Opt out per ' +\n 'field with richText={false} or use TextAreaPlain. See MIGRATION.md.'\n );\n if (labelVariant === 'floating') {\n warnOnce(\n 'floating',\n 'labelVariant=\"floating\" is not supported by the rich surface; ' +\n 'falling back to a stacked label. Use TextAreaPlain for floating labels.'\n );\n }\n if (autoResize === false) {\n warnOnce(\n 'autoResize',\n 'autoResize={false} is ignored; the rich surface always grows with ' +\n 'content. Use TextAreaPlain for a fixed-height textarea.'\n );\n }\n if (resize !== undefined) {\n warnOnce(\n 'resize',\n 'resize is ignored; the rich surface has no native resize handle. ' +\n 'Use TextAreaPlain for drag-resizing.'\n );\n }\n if (maxLength !== undefined) {\n warnOnce(\n 'maxLength',\n 'maxLength is not enforced while typing; the character count still ' +\n 'reflects it. Enforce limits in onChange or use TextAreaPlain.'\n );\n }\n\n const reactId = React.useId();\n const errorId = `${reactId}-error`;\n const helperId = `${reactId}-helper`;\n const countId = `${reactId}-count`;\n\n const controlledValue =\n value !== undefined ? normalizeNewlines(String(value)) : undefined;\n\n const [state, setState] = React.useState(() => {\n const plain =\n controlledValue ??\n (defaultValue !== undefined\n ? normalizeNewlines(String(defaultValue))\n : '');\n return { html: plainToHtml(plain), plain };\n });\n\n // Controlled resync: only when the parent hands us a value different from\n // the plain text we last reported — echoing our own value back (the usual\n // controlled round-trip) keeps the user's rich formatting intact.\n if (controlledValue !== undefined && controlledValue !== state.plain) {\n setState({ html: plainToHtml(controlledValue), plain: controlledValue });\n }\n\n const hiddenRef = React.useRef<HTMLTextAreaElement>(null);\n const editorWrapperRef = React.useRef<HTMLDivElement>(null);\n\n // Rejected edits need no DOM poking here: the Kerebron surface is\n // strictly controlled (it converges to `value` on every render — see\n // RichEditor's `strictValue`), so when a controlled parent refuses an\n // edit and the optimistic state above is reverted during the same\n // render, the editor reloads the committed HTML transaction-safely.\n\n // The ProseMirror surface mounts asynchronously, so a mount-time\n // `ref.current.focus()` (the autoFocus-era idiom) can run before\n // `[role=\"textbox\"]` exists. The request is retained and honored when\n // the editable appears — unless focus has moved on to another control\n // in the meantime, which must not have its focus stolen.\n const pendingFocusRef = React.useRef<MutationObserver | null>(null);\n React.useEffect(() => () => pendingFocusRef.current?.disconnect(), []);\n const focusEditor = React.useCallback(() => {\n const wrapper = editorWrapperRef.current;\n if (!wrapper) return;\n const editable = wrapper.querySelector<HTMLElement>('[role=\"textbox\"]');\n if (editable) {\n editable.focus();\n return;\n }\n pendingFocusRef.current?.disconnect();\n const observer = new MutationObserver(() => {\n const target = wrapper.querySelector<HTMLElement>('[role=\"textbox\"]');\n if (!target) return;\n observer.disconnect();\n pendingFocusRef.current = null;\n const active = document.activeElement;\n if (!active || active === document.body || wrapper.contains(active)) {\n target.focus();\n }\n });\n // `role=\"textbox\"` arrives as an ATTRIBUTE write in the adapter's\n // readiness effect, possibly after the node insertions — watch both.\n observer.observe(wrapper, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['role'],\n });\n pendingFocusRef.current = observer;\n }, []);\n\n // The forwarded ref is the hidden mirror <textarea> — `ref.current.value`\n // reads the current plain text — with focus/blur redirected to the editor.\n React.useImperativeHandle(ref, () => {\n const node = hiddenRef.current as HTMLTextAreaElement;\n node.focus = focusEditor;\n node.blur = () => {\n // A focus request may still be waiting for the editable to mount;\n // blur() must cancel it, or the editor grabs focus (and reopens the\n // mobile keyboard) as soon as it appears.\n pendingFocusRef.current?.disconnect();\n pendingFocusRef.current = null;\n const editable =\n editorWrapperRef.current?.querySelector<HTMLElement>(\n '[role=\"textbox\"]'\n );\n if (document.activeElement === editable) editable?.blur();\n };\n return node;\n }, [focusEditor]);\n\n // External-label bridge: existing call sites pair\n // `<Label htmlFor={id}>` with `<Textarea id={id}>`. The id now lands on a\n // contenteditable div, which `htmlFor` neither names nor focuses. Find\n // the external label, point `aria-labelledby` at it (restoring the\n // accessible name) and focus the editor when it is clicked.\n const [externalLabelId, setExternalLabelId] = React.useState<string>();\n React.useEffect(() => {\n if (!id) return;\n const externalLabel = document.querySelector<HTMLLabelElement>(\n `label[for=\"${globalThis.CSS.escape(id)}\"]`\n );\n if (!externalLabel) return;\n if (!externalLabel.id) externalLabel.id = `${reactId}-external-label`;\n setExternalLabelId(externalLabel.id);\n const handleClick = () => focusEditor();\n externalLabel.addEventListener('click', handleClick);\n return () => externalLabel.removeEventListener('click', handleClick);\n }, [id, reactId, focusEditor]);\n\n // Re-targets editor events at the mirror so legacy handlers keep reading\n // `event.target.value` as plain text, like they did on the native\n // textarea. The original event is the prototype — reads and propagation\n // state delegate to it — with only the targets overridden;\n // stopPropagation/preventDefault forward to the original so React's\n // dispatch loop (which checks the original) honours them.\n const retargetEvent = React.useCallback(\n <E extends React.SyntheticEvent>(event: E): E => {\n const node = hiddenRef.current;\n if (!node) return event;\n const retargeted = Object.create(event) as E;\n Object.defineProperties(retargeted, {\n target: { value: node, enumerable: true },\n currentTarget: { value: node, enumerable: true },\n stopPropagation: { value: () => event.stopPropagation() },\n preventDefault: { value: () => event.preventDefault() },\n });\n return retargeted;\n },\n []\n );\n\n type MirrorFocusEvent = React.FocusEvent<HTMLTextAreaElement>;\n type MirrorKeyboardEvent = React.KeyboardEvent<HTMLTextAreaElement>;\n\n // Focus boundary that includes the editor's own portals: the block\n // gutter menu mounts under `document.body` and moves focus to its first\n // item on open, so DOM containment alone would fire the host's blur\n // mid-format (a blur-to-save consumer would commit early). A portal is\n // ours when a trigger inside this wrapper `aria-controls` its menu.\n const focusStaysInside = (\n event: React.FocusEvent<HTMLDivElement>\n ): boolean => {\n const related = event.relatedTarget;\n if (!related) return false;\n if (event.currentTarget.contains(related)) return true;\n const menuId = related\n .closest('[data-slot=\"dropdown-menu\"]')\n ?.querySelector('[role=\"menu\"]')?.id;\n return (\n !!menuId &&\n !!event.currentTarget.querySelector(\n `[aria-controls=\"${globalThis.CSS.escape(menuId)}\"]`\n )\n );\n };\n\n const handleHtmlChange = (html: string) => {\n const plain = htmlToPlain(html);\n setState({ html, plain });\n const node = hiddenRef.current;\n if (onChange && node) {\n node.value = plain;\n const nativeEvent = new Event('change');\n onChange({\n target: node,\n currentTarget: node,\n type: 'change',\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isTrusted: false,\n timeStamp: Date.now(),\n nativeEvent,\n preventDefault: () => {},\n stopPropagation: () => {},\n isDefaultPrevented: () => false,\n isPropagationStopped: () => false,\n persist: () => {},\n } as React.ChangeEvent<HTMLTextAreaElement>);\n }\n };\n\n const showError = !!error;\n const invalid = hasError || showError;\n const describedByIds =\n [\n showError ? errorId : null,\n helperText && !showError ? helperId : null,\n showCount ? countId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const characterCount = state.plain.length;\n\n // The editable's own metrics: `size` restyles the font, `rows` restores\n // the size-aware growth floor a native textarea got for free. Text\n // utilities cannot size the editable — unlayered package CSS\n // (kerebron.css's `[data-slot='textarea-rich'] .kb-editor` rule and\n // Kerebron's own base.css) outranks them on both font-size and\n // line-height — so the sm/lg metrics ride CSS variables that those\n // rules read. The defaults (16px/24px) are the md pair, keeping\n // `lineHeightPx` and the 40px rest-height match with Input honest.\n const lineHeightPx = size === 'sm' ? 20 : size === 'lg' ? 28 : 24;\n const sizeVars =\n size === 'sm'\n ? {\n '--textarea-rich-font-size': '0.875rem',\n '--textarea-rich-line-height': '1.25rem',\n }\n : size === 'lg'\n ? {\n '--textarea-rich-font-size': '1.125rem',\n '--textarea-rich-line-height': '1.75rem',\n }\n : null;\n const editorStyle =\n rows || sizeVars\n ? ({\n ...(rows\n ? // 7px block padding each side, matching the editable's py-[7px].\n { minHeight: `${rows * lineHeightPx + 14}px` }\n : null),\n ...sizeVars,\n } as React.CSSProperties)\n : undefined;\n\n return (\n <div data-slot=\"textarea-wrapper\" className=\"flex flex-col gap-1.5\">\n {label && (\n <label\n data-slot=\"textarea-label\"\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {required && <RequiredMark variant={requiredVariant} />}\n </label>\n )}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions --\n not interactive itself: delegates events bubbling from the\n contenteditable textbox inside, like a native field's wrapper */}\n <div\n ref={editorWrapperRef}\n className=\"w-full\"\n // Composed like native textarea events: blur/focus only fire when\n // focus actually leaves/enters the field (moves inside the editor\n // chrome — gutter menu, toolbar — don't count), and all events are\n // re-targeted at the mirror so `event.target.value` stays plain.\n onBlur={\n onBlur &&\n ((event: React.FocusEvent<HTMLDivElement>) => {\n if (focusStaysInside(event)) return;\n onBlur(retargetEvent(event) as unknown as MirrorFocusEvent);\n })\n }\n onFocus={\n onFocus &&\n ((event: React.FocusEvent<HTMLDivElement>) => {\n if (focusStaysInside(event)) return;\n onFocus(retargetEvent(event) as unknown as MirrorFocusEvent);\n })\n }\n onKeyDown={\n onKeyDown &&\n ((event: React.KeyboardEvent<HTMLDivElement>) =>\n onKeyDown(retargetEvent(event) as unknown as MirrorKeyboardEvent))\n }\n onKeyUp={\n onKeyUp &&\n ((event: React.KeyboardEvent<HTMLDivElement>) =>\n onKeyUp(retargetEvent(event) as unknown as MirrorKeyboardEvent))\n }\n >\n <TextAreaRichKerebron\n value={state.html}\n onChange={handleHtmlChange}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n // Paste flattening: honored by the legacy engine (which the unit\n // tests stub in — see src/test/textAreaRichKerebronStub); the\n // Kerebron engine instead filters pastes through its ProseMirror\n // schema, so markup never reaches the live document raw.\n sanitizeHtml={sanitizePastedHtml}\n aria-label={ariaLabel ?? label}\n aria-labelledby={ariaLabelledBy ?? externalLabelId}\n aria-describedby={describedByIds}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n editorClassName={cn(\n // A native textarea renders repeated spaces and tabs\n // faithfully; normal HTML layout would collapse them.\n // (Font metrics ride editorStyle's CSS variables — text-sm/\n // text-lg utilities lose to unlayered package CSS here.)\n 'whitespace-pre-wrap'\n )}\n editorStyle={editorStyle}\n className={cn(\n size === 'sm' && 'text-sm',\n size === 'lg' && 'text-lg',\n invalid &&\n 'border-destructive focus-within:ring-destructive focus-within:border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n />\n </div>\n {/* Mirrors the plain value for form posts and the forwarded ref. */}\n <textarea\n data-slot=\"textarea-mirror\"\n ref={hiddenRef}\n hidden\n readOnly\n tabIndex={-1}\n aria-hidden=\"true\"\n name={name}\n form={form}\n required={required}\n disabled={disabled}\n value={state.plain}\n />\n <div\n data-slot=\"textarea-footer\"\n className=\"flex items-center justify-between gap-2\"\n >\n <div className=\"flex-1\">\n {showError && (\n <p\n id={errorId}\n data-slot=\"textarea-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !showError && (\n <p\n id={helperId}\n data-slot=\"textarea-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n {showCount && (\n <p\n id={countId}\n data-slot=\"textarea-count\"\n className={cn(\n 'text-muted-foreground shrink-0 text-xs',\n maxLength && characterCount >= maxLength && 'text-destructive'\n )}\n >\n {characterCount}\n {maxLength && `/${maxLength}`}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nRichTextarea.displayName = 'RichTextarea';\n\n/**\n * A multi-line text input that is rich text underneath. `Textarea` keeps its\n * plain-text contract — `value`, `defaultValue` and `onChange`'s\n * `event.target.value` are plain strings — while rendering `TextAreaRich`\n * (hidden toolbar, markdown shortcuts, block gutter menu) so every note\n * field gets formatting for free.\n *\n * Formatting the user applies is visible while editing but only the plain\n * text is reported through `onChange`; hosts that persist HTML should use\n * `TextAreaRich` directly. Need the native `<textarea>` element (hard\n * `maxLength`, native validation, autofill, drag-resize, floating label) —\n * pass `richText={false}` or use `TextAreaPlain`.\n *\n * A hidden `<textarea>` mirrors the plain value so `name` form posts and\n * `ref.current.value` keep working; `ref.current.focus()` focuses the editor.\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ richText = true, ...props }, ref) =>\n richText ? (\n <RichTextarea ref={ref} {...props} />\n ) : (\n <TextAreaPlain ref={ref} {...props} />\n )\n);\n\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n"]}
|
|
@@ -5,7 +5,7 @@ var chunkGLG6UE2H_cjs = require('./chunk-GLG6UE2H.cjs');
|
|
|
5
5
|
var chunkG7EQ3JPX_cjs = require('./chunk-G7EQ3JPX.cjs');
|
|
6
6
|
var chunkAIJAFPGJ_cjs = require('./chunk-AIJAFPGJ.cjs');
|
|
7
7
|
var chunkMXIIPFTA_cjs = require('./chunk-MXIIPFTA.cjs');
|
|
8
|
-
var
|
|
8
|
+
var chunk2KK4WZ7Y_cjs = require('./chunk-2KK4WZ7Y.cjs');
|
|
9
9
|
var chunkUPWIJC6I_cjs = require('./chunk-UPWIJC6I.cjs');
|
|
10
10
|
var chunkMJWFNV3L_cjs = require('./chunk-MJWFNV3L.cjs');
|
|
11
11
|
var chunk7AECNMYV_cjs = require('./chunk-7AECNMYV.cjs');
|
|
@@ -484,7 +484,7 @@ function AllergyEditor({
|
|
|
484
484
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
485
485
|
/* @__PURE__ */ jsxRuntime.jsx(chunkAIJAFPGJ_cjs.Label, { htmlFor: "alg-note", children: m("Note") }),
|
|
486
486
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
487
|
-
|
|
487
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
488
488
|
{
|
|
489
489
|
id: "alg-note",
|
|
490
490
|
value: draft.note ?? "",
|
|
@@ -639,7 +639,7 @@ function AllergyManager({
|
|
|
639
639
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
640
640
|
/* @__PURE__ */ jsxRuntime.jsx(chunkAIJAFPGJ_cjs.Label, { htmlFor: "alg-note-dlg", children: m("Note") }),
|
|
641
641
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
642
|
-
|
|
642
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
643
643
|
{
|
|
644
644
|
id: "alg-note-dlg",
|
|
645
645
|
value: noteDraft,
|
|
@@ -2079,7 +2079,7 @@ function ConditionEditor({
|
|
|
2079
2079
|
] }) : mode === "observe" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2080
2080
|
/* @__PURE__ */ jsxRuntime.jsx(ObservationHistory, { concern }),
|
|
2081
2081
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2082
|
-
|
|
2082
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
2083
2083
|
{
|
|
2084
2084
|
label: m("New observation"),
|
|
2085
2085
|
value: observation,
|
|
@@ -2405,7 +2405,7 @@ function ConditionEditor({
|
|
|
2405
2405
|
] })
|
|
2406
2406
|
] }),
|
|
2407
2407
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2408
|
-
|
|
2408
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
2409
2409
|
{
|
|
2410
2410
|
label: m("Note"),
|
|
2411
2411
|
value: note,
|
|
@@ -3064,7 +3064,7 @@ function MedicationEditor({
|
|
|
3064
3064
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
3065
3065
|
/* @__PURE__ */ jsxRuntime.jsx(chunkAIJAFPGJ_cjs.Label, { htmlFor: "med-sig", children: m("Sig (patient directions)") }),
|
|
3066
3066
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3067
|
-
|
|
3067
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
3068
3068
|
{
|
|
3069
3069
|
id: "med-sig",
|
|
3070
3070
|
value: draft.sig ?? "",
|
|
@@ -3123,7 +3123,7 @@ function MedicationEditor({
|
|
|
3123
3123
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
3124
3124
|
/* @__PURE__ */ jsxRuntime.jsx(chunkAIJAFPGJ_cjs.Label, { htmlFor: "med-pharmacy-notes", children: m("Pharmacy notes") }),
|
|
3125
3125
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3126
|
-
|
|
3126
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
3127
3127
|
{
|
|
3128
3128
|
id: "med-pharmacy-notes",
|
|
3129
3129
|
value: draft.pharmacyNotes ?? "",
|
|
@@ -3188,7 +3188,7 @@ function MedicationDialog({
|
|
|
3188
3188
|
dialog.kind === "note" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
3189
3189
|
/* @__PURE__ */ jsxRuntime.jsx(chunkAIJAFPGJ_cjs.Label, { htmlFor: "med-note", children: m("Note") }),
|
|
3190
3190
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3191
|
-
|
|
3191
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
3192
3192
|
{
|
|
3193
3193
|
id: "med-note",
|
|
3194
3194
|
value: form.note,
|
|
@@ -3199,7 +3199,7 @@ function MedicationDialog({
|
|
|
3199
3199
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
3200
3200
|
/* @__PURE__ */ jsxRuntime.jsx(chunkAIJAFPGJ_cjs.Label, { htmlFor: "med-task", children: m("Task") }),
|
|
3201
3201
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3202
|
-
|
|
3202
|
+
chunk2KK4WZ7Y_cjs.Textarea,
|
|
3203
3203
|
{
|
|
3204
3204
|
id: "med-task",
|
|
3205
3205
|
value: form.task,
|
|
@@ -3407,5 +3407,5 @@ exports.orderTypeForCodetype = orderTypeForCodetype;
|
|
|
3407
3407
|
exports.parseMedicationLabel = parseMedicationLabel;
|
|
3408
3408
|
exports.parseSig = parseSig;
|
|
3409
3409
|
exports.useCodeLookupConfig = useCodeLookupConfig;
|
|
3410
|
-
//# sourceMappingURL=chunk-
|
|
3411
|
-
//# sourceMappingURL=chunk-
|
|
3410
|
+
//# sourceMappingURL=chunk-MD55WRGN.cjs.map
|
|
3411
|
+
//# sourceMappingURL=chunk-MD55WRGN.cjs.map
|