@mieweb/ui 0.11.0-dev.32 → 0.11.0-dev.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-INMDLVUB.cjs → chunk-6UYMO3PF.cjs} +7 -2
- package/dist/chunk-6UYMO3PF.cjs.map +1 -0
- package/dist/{chunk-YG7BR76Y.js → chunk-GMNF4E7B.js} +3 -42
- package/dist/chunk-GMNF4E7B.js.map +1 -0
- package/dist/chunk-HTZ27DGZ.js +46 -0
- package/dist/chunk-HTZ27DGZ.js.map +1 -0
- package/dist/{chunk-JQAGNAY2.js → chunk-IBEQ54XW.js} +4 -4
- package/dist/{chunk-JQAGNAY2.js.map → chunk-IBEQ54XW.js.map} +1 -1
- package/dist/{chunk-SNAMNKFH.js → chunk-JEXEFWEM.js} +7 -2
- package/dist/chunk-JEXEFWEM.js.map +1 -0
- package/dist/{chunk-FQUSSPXX.cjs → chunk-LJ4CCM3V.cjs} +22 -4
- package/dist/chunk-LJ4CCM3V.cjs.map +1 -0
- package/dist/{chunk-KIVEYQGA.cjs → chunk-MSX2P5JE.cjs} +2 -48
- package/dist/chunk-MSX2P5JE.cjs.map +1 -0
- package/dist/{chunk-L52HKEUD.js → chunk-NAQMIFUF.js} +3 -3
- package/dist/{chunk-L52HKEUD.js.map → chunk-NAQMIFUF.js.map} +1 -1
- package/dist/chunk-PHYQSCP6.cjs +54 -0
- package/dist/chunk-PHYQSCP6.cjs.map +1 -0
- package/dist/{chunk-DG3CXR24.js → chunk-PYAK7XXD.js} +3 -3
- package/dist/{chunk-DG3CXR24.js.map → chunk-PYAK7XXD.js.map} +1 -1
- package/dist/{chunk-JN2CL7MK.js → chunk-WEGKY2LY.js} +22 -4
- package/dist/chunk-WEGKY2LY.js.map +1 -0
- package/dist/{chunk-SCYLVQWA.cjs → chunk-X6HEWIYP.cjs} +11 -11
- package/dist/{chunk-SCYLVQWA.cjs.map → chunk-X6HEWIYP.cjs.map} +1 -1
- package/dist/{chunk-2Z2GFDRS.cjs → chunk-ZNYBLM4O.cjs} +4 -4
- package/dist/{chunk-2Z2GFDRS.cjs.map → chunk-ZNYBLM4O.cjs.map} +1 -1
- package/dist/{chunk-BP4LXRC6.cjs → chunk-ZPPMEUGR.cjs} +7 -7
- package/dist/{chunk-BP4LXRC6.cjs.map → chunk-ZPPMEUGR.cjs.map} +1 -1
- package/dist/components/EmailEditor/index.cjs +14 -12
- package/dist/components/EmailEditor/index.js +5 -3
- package/dist/components/RichTextEditor/index.cjs +6 -4
- package/dist/components/RichTextEditor/index.js +3 -1
- package/dist/components/Textarea/index.cjs +7 -5
- package/dist/components/Textarea/index.js +4 -2
- package/dist/esheet.cjs +614 -117
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.d.cts +209 -2
- package/dist/esheet.d.ts +209 -2
- package/dist/esheet.js +573 -95
- package/dist/esheet.js.map +1 -1
- package/dist/hooks/index.cjs +41 -40
- package/dist/hooks/index.js +2 -1
- package/dist/index.cjs +110 -109
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-FQUSSPXX.cjs.map +0 -1
- package/dist/chunk-INMDLVUB.cjs.map +0 -1
- package/dist/chunk-JN2CL7MK.js.map +0 -1
- package/dist/chunk-KIVEYQGA.cjs.map +0 -1
- package/dist/chunk-SNAMNKFH.js.map +0 -1
- package/dist/chunk-YG7BR76Y.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkLJ4CCM3V_cjs = require('./chunk-LJ4CCM3V.cjs');
|
|
4
4
|
var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
|
|
5
5
|
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
6
6
|
var React2 = require('react');
|
|
@@ -29,7 +29,7 @@ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
|
|
|
29
29
|
|
|
30
30
|
var TextAreaRich = React2__namespace.forwardRef(
|
|
31
31
|
({ className, markdownShortcuts = true, defaultToolbar = "hidden", ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
32
|
-
|
|
32
|
+
chunkLJ4CCM3V_cjs.RichTextEditor,
|
|
33
33
|
{
|
|
34
34
|
ref,
|
|
35
35
|
chromeless: true,
|
|
@@ -825,5 +825,5 @@ exports.Textarea = Textarea;
|
|
|
825
825
|
exports.htmlToPlain = htmlToPlain;
|
|
826
826
|
exports.plainToHtml = plainToHtml;
|
|
827
827
|
exports.textareaVariants = textareaVariants;
|
|
828
|
-
//# sourceMappingURL=chunk-
|
|
829
|
-
//# sourceMappingURL=chunk-
|
|
828
|
+
//# sourceMappingURL=chunk-ZNYBLM4O.cjs.map
|
|
829
|
+
//# sourceMappingURL=chunk-ZNYBLM4O.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/TextAreaRich/TextAreaRich.tsx","../src/components/TextAreaPlain/TextAreaPlain.tsx","../src/components/Textarea/Textarea.tsx"],"names":["React","jsx","RichTextEditor","cn","cva","React2","RequiredMark","jsxs","React3"],"mappings":"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","file":"chunk-2Z2GFDRS.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { RichTextEditor, type RichTextEditorProps } from '../RichTextEditor';\n\nexport interface TextAreaRichProps extends Omit<\n RichTextEditorProps,\n 'chromeless' | 'blockMenu' | 'defaultToolbar'\n> {\n /**\n * Initial toolbar visibility when `toolbar` is uncontrolled. TextAreaRich\n * is chromeless, so this defaults to `'hidden'`; the block gutter menu's\n * \"Show toolbar\" reveals it on demand.\n */\n defaultToolbar?: 'visible' | 'hidden';\n}\n\n/**\n * A textarea-like rich text surface: looks like the auto-growing `Textarea`\n * (bordered, single Input row tall, grows with content) but is\n * `RichTextEditor` underneath — toolbar hidden until requested, markdown\n * block shortcuts (`##` + space → heading…), the Notion-style block gutter\n * menu, and `.shortcut` macro expansion when `macros` is provided.\n *\n * The value contract is `RichTextEditor`'s: `value`/`onChange` carry **HTML**,\n * not plain text. Need plain text for form posts or native bindings — use\n * `Textarea`. Need the full always-on toolbar — use `RichTextEditor`.\n */\nconst TextAreaRich = React.forwardRef<HTMLDivElement, TextAreaRichProps>(\n (\n { className, markdownShortcuts = true, defaultToolbar = 'hidden', ...rest },\n ref\n ) => (\n <RichTextEditor\n ref={ref}\n chromeless\n blockMenu\n markdownShortcuts={markdownShortcuts}\n defaultToolbar={defaultToolbar}\n className={cn(\n // Textarea's chrome: border, radius, focus ring (on the wrapper via\n // focus-within since the editable sits inside it).\n 'border-input rounded-lg border',\n 'transition-colors duration-200',\n 'focus-within:ring-ring focus-within:border-transparent focus-within:ring-2',\n className\n )}\n {...rest}\n />\n )\n);\n\nTextAreaRich.displayName = 'TextAreaRich';\n\nexport { TextAreaRich };\n","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 { TextAreaRich } from '../TextAreaRich';\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-edit resync. When a controlled parent refuses an edit, the\n // committed value never changes — the optimistic state above is reverted\n // during the same render — so the editor's [value]-gated sync never\n // fires and its DOM would keep the rejected text. Compare *plain* text\n // (not HTML) so accepted edits keep the user's rich formatting.\n React.useEffect(() => {\n const editable =\n editorWrapperRef.current?.querySelector<HTMLElement>(\n '[role=\"textbox\"]'\n );\n if (editable && htmlToPlain(editable.innerHTML) !== state.plain) {\n editable.innerHTML = state.html;\n }\n });\n\n const focusEditor = React.useCallback(() => {\n editorWrapperRef.current\n ?.querySelector<HTMLElement>('[role=\"textbox\"]')\n ?.focus();\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 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 (RichTextEditor pins `text-base` and a\n // one-row min-height): `size` restyles the font, `rows` restores the\n // size-aware growth floor a native textarea got for free.\n const lineHeightPx = size === 'sm' ? 20 : size === 'lg' ? 28 : 24;\n const editorStyle = rows\n ? // 7px block padding each side, matching the editable's py-[7px].\n { minHeight: `${rows * lineHeightPx + 14}px` }\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 <TextAreaRich\n value={state.html}\n onChange={handleHtmlChange}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\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 'whitespace-pre-wrap',\n size === 'sm' && 'text-sm',\n size === 'lg' && 'text-lg'\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/TextAreaRich/TextAreaRich.tsx","../src/components/TextAreaPlain/TextAreaPlain.tsx","../src/components/Textarea/Textarea.tsx"],"names":["React","jsx","RichTextEditor","cn","cva","React2","RequiredMark","jsxs","React3"],"mappings":"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","file":"chunk-ZNYBLM4O.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { RichTextEditor, type RichTextEditorProps } from '../RichTextEditor';\n\nexport interface TextAreaRichProps extends Omit<\n RichTextEditorProps,\n 'chromeless' | 'blockMenu' | 'defaultToolbar'\n> {\n /**\n * Initial toolbar visibility when `toolbar` is uncontrolled. TextAreaRich\n * is chromeless, so this defaults to `'hidden'`; the block gutter menu's\n * \"Show toolbar\" reveals it on demand.\n */\n defaultToolbar?: 'visible' | 'hidden';\n}\n\n/**\n * A textarea-like rich text surface: looks like the auto-growing `Textarea`\n * (bordered, single Input row tall, grows with content) but is\n * `RichTextEditor` underneath — toolbar hidden until requested, markdown\n * block shortcuts (`##` + space → heading…), the Notion-style block gutter\n * menu, and `.shortcut` macro expansion when `macros` is provided.\n *\n * The value contract is `RichTextEditor`'s: `value`/`onChange` carry **HTML**,\n * not plain text. Need plain text for form posts or native bindings — use\n * `Textarea`. Need the full always-on toolbar — use `RichTextEditor`.\n */\nconst TextAreaRich = React.forwardRef<HTMLDivElement, TextAreaRichProps>(\n (\n { className, markdownShortcuts = true, defaultToolbar = 'hidden', ...rest },\n ref\n ) => (\n <RichTextEditor\n ref={ref}\n chromeless\n blockMenu\n markdownShortcuts={markdownShortcuts}\n defaultToolbar={defaultToolbar}\n className={cn(\n // Textarea's chrome: border, radius, focus ring (on the wrapper via\n // focus-within since the editable sits inside it).\n 'border-input rounded-lg border',\n 'transition-colors duration-200',\n 'focus-within:ring-ring focus-within:border-transparent focus-within:ring-2',\n className\n )}\n {...rest}\n />\n )\n);\n\nTextAreaRich.displayName = 'TextAreaRich';\n\nexport { TextAreaRich };\n","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 { TextAreaRich } from '../TextAreaRich';\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-edit resync. When a controlled parent refuses an edit, the\n // committed value never changes — the optimistic state above is reverted\n // during the same render — so the editor's [value]-gated sync never\n // fires and its DOM would keep the rejected text. Compare *plain* text\n // (not HTML) so accepted edits keep the user's rich formatting.\n React.useEffect(() => {\n const editable =\n editorWrapperRef.current?.querySelector<HTMLElement>(\n '[role=\"textbox\"]'\n );\n if (editable && htmlToPlain(editable.innerHTML) !== state.plain) {\n editable.innerHTML = state.html;\n }\n });\n\n const focusEditor = React.useCallback(() => {\n editorWrapperRef.current\n ?.querySelector<HTMLElement>('[role=\"textbox\"]')\n ?.focus();\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 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 (RichTextEditor pins `text-base` and a\n // one-row min-height): `size` restyles the font, `rows` restores the\n // size-aware growth floor a native textarea got for free.\n const lineHeightPx = size === 'sm' ? 20 : size === 'lg' ? 28 : 24;\n const editorStyle = rows\n ? // 7px block padding each side, matching the editable's py-[7px].\n { minHeight: `${rows * lineHeightPx + 14}px` }\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 <TextAreaRich\n value={state.html}\n onChange={handleHtmlChange}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\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 'whitespace-pre-wrap',\n size === 'sm' && 'text-sm',\n size === 'lg' && 'text-lg'\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"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkS7AMZ4RD_cjs = require('./chunk-S7AMZ4RD.cjs');
|
|
4
4
|
var chunkPLMXN23Q_cjs = require('./chunk-PLMXN23Q.cjs');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var chunkZNYBLM4O_cjs = require('./chunk-ZNYBLM4O.cjs');
|
|
6
|
+
var chunkLJ4CCM3V_cjs = require('./chunk-LJ4CCM3V.cjs');
|
|
7
7
|
var chunkUPWIJC6I_cjs = require('./chunk-UPWIJC6I.cjs');
|
|
8
8
|
var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
|
|
9
9
|
var chunkCPDNX3LS_cjs = require('./chunk-CPDNX3LS.cjs');
|
|
@@ -800,7 +800,7 @@ function TextField({
|
|
|
800
800
|
multiline,
|
|
801
801
|
...props
|
|
802
802
|
}) {
|
|
803
|
-
const Control = multiline ?
|
|
803
|
+
const Control = multiline ? chunkZNYBLM4O_cjs.Textarea : chunkZ5S5JEJD_cjs.Input;
|
|
804
804
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
805
805
|
Control,
|
|
806
806
|
{
|
|
@@ -985,7 +985,7 @@ function EmailBlockSettings({
|
|
|
985
985
|
case "text":
|
|
986
986
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
987
987
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
988
|
-
|
|
988
|
+
chunkLJ4CCM3V_cjs.RichTextEditor,
|
|
989
989
|
{
|
|
990
990
|
"aria-label": f.content,
|
|
991
991
|
value: block.content === emitted.current ? block.content : sanitizeEmailHtml(block.content) ?? "",
|
|
@@ -1271,7 +1271,7 @@ function EmailBlockSettings({
|
|
|
1271
1271
|
] });
|
|
1272
1272
|
case "html":
|
|
1273
1273
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1274
|
-
|
|
1274
|
+
chunkZNYBLM4O_cjs.Textarea,
|
|
1275
1275
|
{
|
|
1276
1276
|
label: f.html,
|
|
1277
1277
|
value: block.html,
|
|
@@ -2569,5 +2569,5 @@ exports.createEmptyEmailContentTree = createEmptyEmailContentTree;
|
|
|
2569
2569
|
exports.defaultEmailEditorLabels = defaultEmailEditorLabels;
|
|
2570
2570
|
exports.generateEmailBlockId = generateEmailBlockId;
|
|
2571
2571
|
exports.renderEmailMjml = renderEmailMjml;
|
|
2572
|
-
//# sourceMappingURL=chunk-
|
|
2573
|
-
//# sourceMappingURL=chunk-
|
|
2572
|
+
//# sourceMappingURL=chunk-ZPPMEUGR.cjs.map
|
|
2573
|
+
//# sourceMappingURL=chunk-ZPPMEUGR.cjs.map
|