@@ -45,29 +45,54 @@ if (!CSS.supports('field-sizing', 'content')) {
4545 const textareaBounding = useElementBounding (textareaRef )
4646 const getSizingStyles = () => {
4747 const width = textareaRef .value ?.offsetWidth
48- const baseStyleCss = ` position: absolute; top: 100px; left: 100px; opacity: 1; max-height: 0; overflow-wrap: anywhere; width: ${width }px; scrollbar-width: none `
48+ const widthRule = typeof width === ' number' && width > 0 ? ` width: ${width }px; ` : ' '
49+ const baseStyleCss = ` position: absolute; top: 100px; left: 100px; opacity: 1; max-height: 0; overflow-wrap: anywhere; scrollbar-width: none; ${widthRule } `
4950 if (! textareaRef .value ) return baseStyleCss
5051 const el = textareaRef .value
5152 const styles = window .getComputedStyle (el )
5253 const sizingStyles = [' width' , ' padding-left' , ' padding-right' , ' border-left' , ' border-right' , ' box-sizing' , ' font-family' , ' font-size' ]
53- return sizingStyles .filter ((prop ) => !! styles .getPropertyValue (prop )).map ((prop ) => ` ${prop }: ${styles .getPropertyValue (prop )} ` ).join (' ; ' ) + ' ;' + baseStyleCss
54+ return sizingStyles
55+ .filter ((prop ) => !! styles .getPropertyValue (prop ))
56+ .map ((prop ) => ` ${prop }: ${styles .getPropertyValue (prop )} ` )
57+ .join (' ; ' ) + ' ;' + baseStyleCss
5458 }
5559 const { element : measureEl } = useTempElement (' textarea' , { attributes: { style: getSizingStyles (), id: ` nm-textarea-measure-${generateRandomId ()} ` } })
5660
57- watch (() => [ textareaBounding . width . value ], ([ width ] ) => {
61+ const syncMeasureStyles = ( width ? : number ) => {
5862 measureEl .style .cssText = getSizingStyles ()
59- measureEl .style .width = ` ${width }px `
60- })
63+ if (typeof width === ' number' && width > 0 ) {
64+ measureEl .style .width = ` ${width }px `
65+ }
66+ }
6167
62- watch (inputValue , async (v ) => {
63- measureEl .value = v ?? ' '
64- if (! textareaRef .value ) return
68+ const resizeTextarea = () => {
6569 const textarea = textareaRef .value
70+ if (! textarea ) return
71+ const width = textareaBounding .width .value
72+ if (width <= 0 ) return
73+ syncMeasureStyles (width )
74+ measureEl .value = inputValue .value ?? ' '
6675 // force a reflow to ensure the height is recalculated
6776 const _ = measureEl .offsetHeight
6877 const scrollHeight = measureEl .scrollHeight
6978 const height = Math .max (props .minHeight || 0 , scrollHeight )
70- textarea .style .height = ` ${height }px ` // Set height to scrollHeight to expand
71- })
79+ textarea .style .height = ` ${height }px `
80+ }
81+
82+ watch (
83+ () => textareaBounding .width .value ,
84+ () => {
85+ resizeTextarea ()
86+ },
87+ { immediate: true , flush: ' post' },
88+ )
89+
90+ watch (
91+ inputValue ,
92+ () => {
93+ resizeTextarea ()
94+ },
95+ { immediate: true , flush: ' post' },
96+ )
7297}
7398 </script >
0 commit comments