diff --git a/packages/ui/src/design-system/Textarea/AutoResizedTextarea.tsx b/packages/ui/src/design-system/Textarea/AutoResizedTextarea.tsx new file mode 100644 index 0000000000..f97c7b1026 --- /dev/null +++ b/packages/ui/src/design-system/Textarea/AutoResizedTextarea.tsx @@ -0,0 +1,29 @@ +import {Ref, RefObject, forwardRef, useEffect, useState} from 'react'; +import {useAutoResize} from './useAutoResize'; +import {Textarea, TextareaProps} from './Textarea'; + +export const AutoResizedTextarea = forwardRef( + (props: TextareaProps, ref?: Ref) => { + // Valeur locale, nécessaire pour le refresh des valeurs textareaRef et shadowRef + const [value, setValue] = useState(props.value); + + useEffect(() => setValue(value), [props.value]); + + const {textareaRef, shadowRef} = useAutoResize( + value?.toString(), + ref as RefObject + ); + + const handleChange = evt => { + props.onChange?.(evt.target.value); + setValue(evt.target.value); + }; + + return ( +
+
+
`; exports[`design-system/Textarea SmallVariant smoke-test 1`] = ` -
+
+
+
+`; + exports[`design-system/Textarea WithColorBorders smoke-test 1`] = `
-
+
-
+
-
+
-
+
diff --git a/packages/ui/src/design-system/Textarea/index.ts b/packages/ui/src/design-system/Textarea/index.ts index 6449a4197e..e6003e9906 100644 --- a/packages/ui/src/design-system/Textarea/index.ts +++ b/packages/ui/src/design-system/Textarea/index.ts @@ -1 +1,2 @@ export * from './Textarea'; +export * from './AutoResizedTextarea'; diff --git a/packages/ui/src/design-system/Textarea/useAutoResize.ts b/packages/ui/src/design-system/Textarea/useAutoResize.ts new file mode 100644 index 0000000000..381de2f505 --- /dev/null +++ b/packages/ui/src/design-system/Textarea/useAutoResize.ts @@ -0,0 +1,43 @@ +import {RefObject, useLayoutEffect, useRef} from 'react'; + +/** + * Rend un champ de texte avec redimensionnement automatique en fonction de son contenu + * Copié / adapté depuis: + * https://www.kindacode.com/article/react-typescript-create-an-autosize-textarea-from-scratch/ + * https://css-tricks.com/the-cleanest-trick-for-autogrowing-textareas/#comment-1794830 + */ + +export const useAutoResize = ( + value?: string, + forwardRef?: RefObject | null +) => { + // Référence locale associée à la balise