@hh.ru/magritte-ui-textarea 3.3.54 → 3.3.55
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/TextArea.d.ts +2 -2
- package/TextArea.js +244 -135
- package/TextArea.js.map +1 -1
- package/TextAreaGrowLimiter.d.ts +2 -2
- package/TextAreaGrowLimiter.js +67 -55
- package/TextAreaGrowLimiter.js.map +1 -1
- package/UncontrolledTextArea.d.ts +2 -2
- package/UncontrolledTextArea.js +11 -8
- package/UncontrolledTextArea.js.map +1 -1
- package/index.css +283 -283
- package/index.d.ts +3 -3
- package/package.json +8 -8
- package/types.js +3 -3
- package/types.js.map +1 -1
- package/useFocus.js +16 -10
- package/useFocus.js.map +1 -1
- package/useHeightObserver.d.ts +1 -1
- package/useHeightObserver.js +40 -34
- package/useHeightObserver.js.map +1 -1
- package/useLimitGrow.d.ts +1 -1
- package/useLimitGrow.js +47 -66
- package/useLimitGrow.js.map +1 -1
package/TextAreaGrowLimiter.js
CHANGED
|
@@ -5,76 +5,88 @@ import { debounce } from '@hh.ru/magritte-common-func-utils';
|
|
|
5
5
|
import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
|
|
6
6
|
|
|
7
7
|
const GrowLimiterContext = createContext({
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
getHeightDiff: () => 0,
|
|
9
|
+
onHeightChange: () => void 0,
|
|
10
|
+
offHeightChange: () => void 0,
|
|
11
|
+
heightUpdated: () => void 0,
|
|
12
|
+
hasLimit: false
|
|
13
13
|
});
|
|
14
|
-
const TextAreaGrowLimiter = forwardRef(
|
|
14
|
+
const TextAreaGrowLimiter = forwardRef(
|
|
15
|
+
({ children, containerRef, preMeasurement, postMeasurement, debounce: debounce$1 = false, ...rest }, ref) => {
|
|
15
16
|
const wrapperRef = useRef(null);
|
|
16
17
|
const refMultiplexer = useMultipleRefs(ref, wrapperRef);
|
|
17
|
-
const [heightChangeHandlers, _] = useState(() => new Set());
|
|
18
|
+
const [heightChangeHandlers, _] = useState(() => /* @__PURE__ */ new Set());
|
|
18
19
|
const heightDiffCache = useRef(null);
|
|
19
|
-
const contextValue = useMemo(
|
|
20
|
+
const contextValue = useMemo(
|
|
21
|
+
() => ({
|
|
20
22
|
getHeightDiff: () => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
// запоминаем позицию скролла в контейнере, отключаем скролл, вызываем preMeasurement если задан
|
|
27
|
-
// в BottomSheet например он отключает ограничение height на внешнем контейнере, чтобы была
|
|
28
|
-
// возможность узнать реальный максимальный размер контейнера
|
|
29
|
-
const scrollTop = currentContainer.scrollTop;
|
|
30
|
-
const overflow = currentContainer.style.overflowY;
|
|
31
|
-
currentContainer.style.overflowY = 'hidden';
|
|
32
|
-
preMeasurement?.();
|
|
33
|
-
// Устанавливаем толщину нижней рамки равно 20000 пикселей, чтобы размер обертки гарантированно
|
|
34
|
-
// превысил размер контейнера. После этого сравниваем offsetHeight и scrollHeight контейнера
|
|
35
|
-
// чтобы вычислить сколько доступно свободного пространства до появления в контейнере скролла
|
|
36
|
-
wrapperRef.current.style.borderBottomWidth = '20000px';
|
|
37
|
-
heightDiffCache.current = currentContainer.clientHeight - currentContainer.scrollHeight + 20000;
|
|
38
|
-
// Вызываем postMeasurement если задан, в BottomSheet он возвращает ограничение height к
|
|
39
|
-
// изначальному значению
|
|
40
|
-
postMeasurement?.();
|
|
41
|
-
// Возвращаем настройки контейнера и обретки к изначальным значениям
|
|
42
|
-
currentContainer.style.overflowY = overflow;
|
|
43
|
-
wrapperRef.current.style.borderBottomWidth = '0';
|
|
44
|
-
currentContainer.scrollTop = scrollTop;
|
|
23
|
+
if (heightDiffCache.current === null) {
|
|
24
|
+
const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;
|
|
25
|
+
if (!wrapperRef.current || !currentContainer) {
|
|
26
|
+
return 0;
|
|
45
27
|
}
|
|
46
|
-
|
|
28
|
+
const scrollTop = currentContainer.scrollTop;
|
|
29
|
+
const overflow = currentContainer.style.overflowY;
|
|
30
|
+
currentContainer.style.overflowY = "hidden";
|
|
31
|
+
preMeasurement?.();
|
|
32
|
+
wrapperRef.current.style.borderBottomWidth = "20000px";
|
|
33
|
+
heightDiffCache.current = currentContainer.clientHeight - currentContainer.scrollHeight + 2e4;
|
|
34
|
+
postMeasurement?.();
|
|
35
|
+
currentContainer.style.overflowY = overflow;
|
|
36
|
+
wrapperRef.current.style.borderBottomWidth = "0";
|
|
37
|
+
currentContainer.scrollTop = scrollTop;
|
|
38
|
+
}
|
|
39
|
+
return heightDiffCache.current;
|
|
47
40
|
},
|
|
48
41
|
onHeightChange: (callback) => heightChangeHandlers.add(callback),
|
|
49
42
|
offHeightChange: (callback) => heightChangeHandlers.delete(callback),
|
|
50
|
-
heightUpdated: () =>
|
|
51
|
-
hasLimit: true
|
|
52
|
-
|
|
53
|
-
|
|
43
|
+
heightUpdated: () => heightDiffCache.current = null,
|
|
44
|
+
hasLimit: true
|
|
45
|
+
}),
|
|
46
|
+
[heightChangeHandlers, containerRef, wrapperRef, preMeasurement, postMeasurement]
|
|
47
|
+
);
|
|
48
|
+
useEffect(
|
|
49
|
+
() => {
|
|
54
50
|
const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;
|
|
55
51
|
if (!wrapperRef.current || !currentContainer) {
|
|
56
|
-
|
|
52
|
+
return void 0;
|
|
57
53
|
}
|
|
58
54
|
const observerCallback = () => {
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
heightDiffCache.current = null;
|
|
56
|
+
heightChangeHandlers.forEach((callback) => callback());
|
|
61
57
|
};
|
|
62
|
-
const observer = new ResizeObserver(
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
const observer = new ResizeObserver(
|
|
59
|
+
debounce$1 ? debounce(
|
|
60
|
+
observerCallback,
|
|
61
|
+
17
|
|
62
|
+
/* ~= 1000ms / 60fps */
|
|
63
|
+
) : observerCallback
|
|
64
|
+
);
|
|
65
|
+
observer.observe(wrapperRef.current, { box: "content-box" });
|
|
66
|
+
observer.observe(currentContainer, { box: "content-box" });
|
|
65
67
|
return () => observer.disconnect();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
68
|
+
},
|
|
69
|
+
// eslint считает что containerRef?.current лишняя зависимость, но эффект должен реагировать если
|
|
70
|
+
// значение в рефе изменилось, т.к. обзервер должен переподписаться на другой элемент
|
|
71
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
|
+
[heightChangeHandlers, containerRef, containerRef?.current, wrapperRef]
|
|
73
|
+
);
|
|
74
|
+
return /* @__PURE__ */ jsx(
|
|
75
|
+
"div",
|
|
76
|
+
{
|
|
77
|
+
ref: refMultiplexer,
|
|
78
|
+
...rest,
|
|
79
|
+
style: {
|
|
80
|
+
...rest.style || {},
|
|
81
|
+
borderBottomStyle: "solid",
|
|
82
|
+
borderBottomColor: "transparent"
|
|
83
|
+
},
|
|
84
|
+
children: /* @__PURE__ */ jsx(GrowLimiterContext.Provider, { value: contextValue, children })
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
TextAreaGrowLimiter.displayName = "TextAreaGrowLimiter";
|
|
78
90
|
|
|
79
91
|
export { GrowLimiterContext, TextAreaGrowLimiter };
|
|
80
92
|
//# sourceMappingURL=TextAreaGrowLimiter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextAreaGrowLimiter.js","sources":["src/TextAreaGrowLimiter.tsx"],"sourcesContent":["import { createContext, useRef, forwardRef, useEffect, useState, useMemo } from 'react';\n\nimport { debounce as debounceFunc } from '@hh.ru/magritte-common-func-utils';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport type { TextAreaGrowLimiterProps } from '@hh.ru/magritte-ui-textarea/types';\n\nexport interface GrowLimiterContextValue {\n getHeightDiff: () => number;\n onHeightChange: (callback: VoidFunction) => void;\n offHeightChange: (callback: VoidFunction) => void;\n heightUpdated: VoidFunction;\n hasLimit: boolean;\n}\n\nexport const GrowLimiterContext = createContext<GrowLimiterContextValue>({\n getHeightDiff: () => 0,\n onHeightChange: () => void 0,\n offHeightChange: () => void 0,\n heightUpdated: () => void 0,\n hasLimit: false,\n});\n\nexport const TextAreaGrowLimiter = forwardRef<HTMLDivElement, TextAreaGrowLimiterProps>(\n ({ children, containerRef, preMeasurement, postMeasurement, debounce = false, ...rest }, ref) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const refMultiplexer = useMultipleRefs(ref, wrapperRef);\n const [heightChangeHandlers, _] = useState(() => new Set<VoidFunction>());\n const heightDiffCache = useRef<number | null>(null);\n\n const contextValue = useMemo<GrowLimiterContextValue>(\n () => ({\n getHeightDiff: () => {\n if (heightDiffCache.current === null) {\n const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;\n\n if (!wrapperRef.current || !currentContainer) {\n return 0;\n }\n\n // запоминаем позицию скролла в контейнере, отключаем скролл, вызываем preMeasurement если задан\n // в BottomSheet например он отключает ограничение height на внешнем контейнере, чтобы была\n // возможность узнать реальный максимальный размер контейнера\n const scrollTop = currentContainer.scrollTop;\n const overflow = currentContainer.style.overflowY;\n currentContainer.style.overflowY = 'hidden';\n preMeasurement?.();\n\n // Устанавливаем толщину нижней рамки равно 20000 пикселей, чтобы размер обертки гарантированно\n // превысил размер контейнера. После этого сравниваем offsetHeight и scrollHeight контейнера\n // чтобы вычислить сколько доступно свободного пространства до появления в контейнере скролла\n wrapperRef.current.style.borderBottomWidth = '20000px';\n heightDiffCache.current = currentContainer.clientHeight - currentContainer.scrollHeight + 20000;\n // Вызываем postMeasurement если задан, в BottomSheet он возвращает ограничение height к\n // изначальному значению\n postMeasurement?.();\n\n // Возвращаем настройки контейнера и обретки к изначальным значениям\n currentContainer.style.overflowY = overflow;\n wrapperRef.current.style.borderBottomWidth = '0';\n currentContainer.scrollTop = scrollTop;\n }\n return heightDiffCache.current;\n },\n onHeightChange: (callback) => heightChangeHandlers.add(callback),\n offHeightChange: (callback) => heightChangeHandlers.delete(callback),\n heightUpdated: () => (heightDiffCache.current = null),\n hasLimit: true,\n }),\n [heightChangeHandlers, containerRef, wrapperRef, preMeasurement, postMeasurement]\n );\n\n useEffect(\n () => {\n const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;\n\n if (!wrapperRef.current || !currentContainer) {\n return void 0;\n }\n\n const observerCallback = () => {\n heightDiffCache.current = null;\n heightChangeHandlers.forEach((callback) => callback());\n };\n\n const observer = new ResizeObserver(\n debounce ? debounceFunc(observerCallback, 17 /* ~= 1000ms / 60fps */) : observerCallback\n );\n observer.observe(wrapperRef.current, { box: 'content-box' });\n observer.observe(currentContainer, { box: 'content-box' });\n\n return () => observer.disconnect();\n },\n // eslint считает что containerRef?.current лишняя зависимость, но эффект должен реагировать если\n // значение в рефе изменилось, т.к. обзервер должен переподписаться на другой элемент\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [heightChangeHandlers, containerRef, containerRef?.current, wrapperRef]\n );\n\n return (\n <div\n ref={refMultiplexer}\n {...rest}\n style={{\n ...(rest.style || {}),\n borderBottomStyle: 'solid',\n borderBottomColor: 'transparent',\n }}\n >\n <GrowLimiterContext.Provider value={contextValue}>{children}</GrowLimiterContext.Provider>\n </div>\n );\n }\n);\n\nTextAreaGrowLimiter.displayName = 'TextAreaGrowLimiter';\n"],"names":["debounce","debounceFunc"
|
|
1
|
+
{"version":3,"file":"TextAreaGrowLimiter.js","sources":["src/TextAreaGrowLimiter.tsx"],"sourcesContent":["import { createContext, useRef, forwardRef, useEffect, useState, useMemo } from 'react';\n\nimport { debounce as debounceFunc } from '@hh.ru/magritte-common-func-utils';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport type { TextAreaGrowLimiterProps } from '@hh.ru/magritte-ui-textarea/types';\n\nexport interface GrowLimiterContextValue {\n getHeightDiff: () => number;\n onHeightChange: (callback: VoidFunction) => void;\n offHeightChange: (callback: VoidFunction) => void;\n heightUpdated: VoidFunction;\n hasLimit: boolean;\n}\n\nexport const GrowLimiterContext = createContext<GrowLimiterContextValue>({\n getHeightDiff: () => 0,\n onHeightChange: () => void 0,\n offHeightChange: () => void 0,\n heightUpdated: () => void 0,\n hasLimit: false,\n});\n\nexport const TextAreaGrowLimiter = forwardRef<HTMLDivElement, TextAreaGrowLimiterProps>(\n ({ children, containerRef, preMeasurement, postMeasurement, debounce = false, ...rest }, ref) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const refMultiplexer = useMultipleRefs(ref, wrapperRef);\n const [heightChangeHandlers, _] = useState(() => new Set<VoidFunction>());\n const heightDiffCache = useRef<number | null>(null);\n\n const contextValue = useMemo<GrowLimiterContextValue>(\n () => ({\n getHeightDiff: () => {\n if (heightDiffCache.current === null) {\n const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;\n\n if (!wrapperRef.current || !currentContainer) {\n return 0;\n }\n\n // запоминаем позицию скролла в контейнере, отключаем скролл, вызываем preMeasurement если задан\n // в BottomSheet например он отключает ограничение height на внешнем контейнере, чтобы была\n // возможность узнать реальный максимальный размер контейнера\n const scrollTop = currentContainer.scrollTop;\n const overflow = currentContainer.style.overflowY;\n currentContainer.style.overflowY = 'hidden';\n preMeasurement?.();\n\n // Устанавливаем толщину нижней рамки равно 20000 пикселей, чтобы размер обертки гарантированно\n // превысил размер контейнера. После этого сравниваем offsetHeight и scrollHeight контейнера\n // чтобы вычислить сколько доступно свободного пространства до появления в контейнере скролла\n wrapperRef.current.style.borderBottomWidth = '20000px';\n heightDiffCache.current = currentContainer.clientHeight - currentContainer.scrollHeight + 20000;\n // Вызываем postMeasurement если задан, в BottomSheet он возвращает ограничение height к\n // изначальному значению\n postMeasurement?.();\n\n // Возвращаем настройки контейнера и обретки к изначальным значениям\n currentContainer.style.overflowY = overflow;\n wrapperRef.current.style.borderBottomWidth = '0';\n currentContainer.scrollTop = scrollTop;\n }\n return heightDiffCache.current;\n },\n onHeightChange: (callback) => heightChangeHandlers.add(callback),\n offHeightChange: (callback) => heightChangeHandlers.delete(callback),\n heightUpdated: () => (heightDiffCache.current = null),\n hasLimit: true,\n }),\n [heightChangeHandlers, containerRef, wrapperRef, preMeasurement, postMeasurement]\n );\n\n useEffect(\n () => {\n const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;\n\n if (!wrapperRef.current || !currentContainer) {\n return void 0;\n }\n\n const observerCallback = () => {\n heightDiffCache.current = null;\n heightChangeHandlers.forEach((callback) => callback());\n };\n\n const observer = new ResizeObserver(\n debounce ? debounceFunc(observerCallback, 17 /* ~= 1000ms / 60fps */) : observerCallback\n );\n observer.observe(wrapperRef.current, { box: 'content-box' });\n observer.observe(currentContainer, { box: 'content-box' });\n\n return () => observer.disconnect();\n },\n // eslint считает что containerRef?.current лишняя зависимость, но эффект должен реагировать если\n // значение в рефе изменилось, т.к. обзервер должен переподписаться на другой элемент\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [heightChangeHandlers, containerRef, containerRef?.current, wrapperRef]\n );\n\n return (\n <div\n ref={refMultiplexer}\n {...rest}\n style={{\n ...(rest.style || {}),\n borderBottomStyle: 'solid',\n borderBottomColor: 'transparent',\n }}\n >\n <GrowLimiterContext.Provider value={contextValue}>{children}</GrowLimiterContext.Provider>\n </div>\n );\n }\n);\n\nTextAreaGrowLimiter.displayName = 'TextAreaGrowLimiter';\n"],"names":["debounce","debounceFunc"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ReactElement } from 'react';
|
|
2
|
-
import type { TextAreaLayout, UncontrolledTextAreaProps } from '
|
|
3
|
-
export declare const UncontrolledTextArea: (<Layout extends TextAreaLayout>(props: UncontrolledTextAreaProps<Layout> & Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, keyof UncontrolledTextAreaProps<
|
|
2
|
+
import type { TextAreaLayout, UncontrolledTextAreaProps } from './types';
|
|
3
|
+
export declare const UncontrolledTextArea: (<Layout extends TextAreaLayout>(props: UncontrolledTextAreaProps<Layout> & Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, keyof UncontrolledTextAreaProps<'fixed'>> & {
|
|
4
4
|
ref?: React.ForwardedRef<HTMLTextAreaElement>;
|
|
5
5
|
}) => ReactElement | null) & {
|
|
6
6
|
displayName: string;
|
package/UncontrolledTextArea.js
CHANGED
|
@@ -20,16 +20,19 @@ import './TextAreaGrowLimiter.js';
|
|
|
20
20
|
import '@hh.ru/magritte-common-func-utils';
|
|
21
21
|
import '@hh.ru/magritte-ui-typography';
|
|
22
22
|
|
|
23
|
-
const UncontrolledTextAreaComponent = ({ value =
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
const UncontrolledTextAreaComponent = ({ value = "", onChange, ...restProps }, ref) => {
|
|
24
|
+
const [defaultValue, setDefaultValue] = useState(value);
|
|
25
|
+
const changeHandler = useCallback(
|
|
26
|
+
(event) => {
|
|
27
|
+
setDefaultValue(event.target.value);
|
|
28
|
+
onChange?.(event);
|
|
29
|
+
},
|
|
30
|
+
[onChange]
|
|
31
|
+
);
|
|
32
|
+
return /* @__PURE__ */ jsx(TextArea, { ...restProps, value: defaultValue, onChange: changeHandler, ref });
|
|
30
33
|
};
|
|
31
34
|
const UncontrolledTextArea = forwardRef(UncontrolledTextAreaComponent);
|
|
32
|
-
UncontrolledTextArea.displayName =
|
|
35
|
+
UncontrolledTextArea.displayName = "UncontrolledTextArea";
|
|
33
36
|
|
|
34
37
|
export { UncontrolledTextArea };
|
|
35
38
|
//# sourceMappingURL=UncontrolledTextArea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UncontrolledTextArea.js","sources":["src/UncontrolledTextArea.tsx"],"sourcesContent":["import { forwardRef, type ReactElement, useCallback, useState, type ChangeEvent } from 'react';\n\nimport { TextArea } from '@hh.ru/magritte-ui-textarea/TextArea';\nimport type { TextAreaLayout, UncontrolledTextAreaProps } from '@hh.ru/magritte-ui-textarea/types';\n\nconst UncontrolledTextAreaComponent = <Layout extends TextAreaLayout>(\n { value = '', onChange, ...restProps }: UncontrolledTextAreaProps<Layout>,\n ref: React.ForwardedRef<HTMLTextAreaElement>\n) => {\n const [defaultValue, setDefaultValue] = useState(value);\n const changeHandler = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n setDefaultValue(event.target.value);\n onChange?.(event);\n },\n [onChange]\n );\n\n return <TextArea {...restProps} value={defaultValue} onChange={changeHandler} ref={ref} />;\n};\n\nexport const UncontrolledTextArea = forwardRef(UncontrolledTextAreaComponent) as (<Layout extends TextAreaLayout>(\n props: UncontrolledTextAreaProps<Layout> &\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, keyof UncontrolledTextAreaProps<'fixed'>> & {\n ref?: React.ForwardedRef<HTMLTextAreaElement>;\n }\n) => ReactElement | null) & { displayName: string };\nUncontrolledTextArea.displayName = 'UncontrolledTextArea';\n"],"names":[
|
|
1
|
+
{"version":3,"file":"UncontrolledTextArea.js","sources":["src/UncontrolledTextArea.tsx"],"sourcesContent":["import { forwardRef, type ReactElement, useCallback, useState, type ChangeEvent } from 'react';\n\nimport { TextArea } from '@hh.ru/magritte-ui-textarea/TextArea';\nimport type { TextAreaLayout, UncontrolledTextAreaProps } from '@hh.ru/magritte-ui-textarea/types';\n\nconst UncontrolledTextAreaComponent = <Layout extends TextAreaLayout>(\n { value = '', onChange, ...restProps }: UncontrolledTextAreaProps<Layout>,\n ref: React.ForwardedRef<HTMLTextAreaElement>\n) => {\n const [defaultValue, setDefaultValue] = useState(value);\n const changeHandler = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n setDefaultValue(event.target.value);\n onChange?.(event);\n },\n [onChange]\n );\n\n return <TextArea {...restProps} value={defaultValue} onChange={changeHandler} ref={ref} />;\n};\n\nexport const UncontrolledTextArea = forwardRef(UncontrolledTextAreaComponent) as (<Layout extends TextAreaLayout>(\n props: UncontrolledTextAreaProps<Layout> &\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, keyof UncontrolledTextAreaProps<'fixed'>> & {\n ref?: React.ForwardedRef<HTMLTextAreaElement>;\n }\n) => ReactElement | null) & { displayName: string };\nUncontrolledTextArea.displayName = 'UncontrolledTextArea';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAKA,MAAM,6BAAA,GAAgC,CAClC,EAAE,KAAA,GAAQ,IAAI,QAAU,EAAA,GAAG,SAAU,EAAA,EACrC,GACC,KAAA;AACD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IAClB,CAAC,KAA4C,KAAA;AACzC,MAAgB,eAAA,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA,CAAA;AAClC,MAAA,QAAA,GAAW,KAAK,CAAA,CAAA;AAAA,KACpB;AAAA,IACA,CAAC,QAAQ,CAAA;AAAA,GACb,CAAA;AAEA,EAAO,uBAAA,GAAA,CAAC,YAAU,GAAG,SAAA,EAAW,OAAO,YAAc,EAAA,QAAA,EAAU,eAAe,GAAU,EAAA,CAAA,CAAA;AAC5F,CAAA,CAAA;AAEa,MAAA,oBAAA,GAAuB,WAAW,6BAA6B,EAAA;AAM5E,oBAAA,CAAqB,WAAc,GAAA,sBAAA;;;;"}
|