bug(cdk/text-field): cdkTextareaAutosize caches line height before matInput applies `font: inherit`, so min/max rows are wrong
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 57/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- angular, typescript
- Área
- frontend
Línea de trabajo
Start with CdkTextareaAutosize and its first ngDoCheck measurement path (resizeToFitContent and _cacheTextareaLineHeight), then compare it with the MatInput host binding that applies mat-mdc-form-field-input-control. Reproduce the issue in the official CDK text-field autosizing example and inspect the cached line height before and after resizing. Done means min/max heights use the textarea's actual line height on first render, without a window resize.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Is this a regression?
- Yes, this behavior used to work in the previous version
The previous version in which this bug was not present was
14.x (verified on v14.material.angular.dev, Angular 14.0.0)
Description
When cdkTextareaAutosize is used on a matInput textarea inside mat-form-field, the cached line height used for cdkAutosizeMinRows / cdkAutosizeMaxRows is measured with the browser's default textarea font instead of the form field's font. As a result, min-height / max-height are too small until the window is resized.
Cause (as far as I can tell):
CdkTextareaAutosizemeasures and caches the line height on the firstngDoCheck(resizeToFitContent→_cacheTextareaLineHeight, cloning the textarea withrows=1).MatInputappliesfont: inheritvia the classmat-mdc-form-field-input-control, which is a dynamic host binding ('[class.mat-mdc-form-field-input-control]': '_isInFormField').- Host bindings are applied after
ngDoCheckin the first change detection pass. So at measuring time the textarea (and its clone) still uses the UA default textarea font (Chrome: monospace 13.33px,line-height: normal≈ 15px). - The wrong value stays cached until a window
resizeclears it.
Measured on the official docs example (cdkAutosizeMaxRows="5", actual line height 24px):
| Docs | Angular | measured line height | max-height |
|---|---|---|---|
| v14 | 14.0.0 | 18px (correct) | 90px |
| v15 | 15.1.1 | 15px | 75px |
| v17 | 17.3.0 | 15px | 75px |
| v19 | 19.2.6 | 15px | 75px |
| v21 | 21.2.11 | 15px | 75px |
| current | 22.2.1 | 15px | 75px (expected 120px) |
It started with v15, i.e. the switch to the MDC-based form field.
Workaround: a global style so the textarea inherits the font before the first measurement:
textarea.cdk-textarea-autosize { font: inherit; letter-spacing: inherit; }
Reproduction
No StackBlitz needed – the official docs example reproduces it:
https://material.angular.dev/cdk/text-field/examples ("Auto-resizing textarea")
Steps to reproduce:
- Open the page above (fresh load, don't resize the window).
- Select the textarea in DevTools and run:
→({ minHeight: $0.style.minHeight, maxHeight: $0.style.maxHeight, lineHeight: getComputedStyle($0).lineHeight })minHeight: "15px",maxHeight: "75px",lineHeight: "24px" - Type more than 3 lines: the textarea starts scrolling after ~3 lines instead of 5.
- Resize the browser window and run the snippet again →
minHeight: "24px",maxHeight: "120px"(correct).
For comparison, the same example on https://v14.material.angular.dev/cdk/text-field/examples measures correctly on first load.
Expected Behavior
min-height / max-height are based on the actual line height of the textarea (24px → max-height: 120px for 5 rows) right after the first render.
Actual Behavior
They are based on the UA default textarea font (15px → max-height: 75px) until the window is resized.
Environment
- Angular 22.2.1
- CDK/Material 22.2.x
- Chrome (Version 154.0.8037.95 (64-Bit))
- Windows 11
- Lenguaje dominante
- TypeScript
- Estrellas
- 25k
- Forks
- 6.9k
- Merge medio
- 2 d 7 h
- PR fusionados (30 d)
- 83
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de angular/components
-
bug(mat-slider): on Firefox, slider thumb is not aligned with cursorPosiblemente ocupada @Devyalamaddi la tomó hace 3 días. Abiertoarea: material/slider P4
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
angular/components#34094 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug(material/sort): hover hint arrow on an unsorted header shows the active sort direction, not the resulting direction after click.Posiblemente ocupada @abdul-karim-mia la tomó hace 2 días. Abiertoarea: material/sort P3
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
angular/components#33933 ·
Los mantenedores suelen responder en 1 día
-
bug(mat-date-picker): month shown twice in date pickerPosiblemente ocupada @PreethiPantangi la tomó hace 54 días. Abiertoarea: material/datepicker P4
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
angular/components#33763 · 2 comentarios · 3 reacciones ·
Los mantenedores suelen responder en 1 día
-
Bug in table.scss footer cell height: unset instead of footer row height unsetPosiblemente ocupada @minwookshin la tomó hace 41 días. Abiertoarea: material/table P4
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
angular/components#33709 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug(date-adapter): Misleading JSDoc for createDate returns typePosiblemente ocupada @BHUVANSH855 la tomó hace 171 días. Abiertoarea: material/core P3
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
angular/components#33059 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de angular/components
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
jeanibarz/knowledge-base-mcp-server#1268 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
Koenkk/zigbee-herdsman-converters#13820 ·
Los mantenedores suelen responder en 2 días
-
[prefer-expect-resolves] autofix leaves a stray ")" when the awaited expression is parenthesizedAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
jest-community/eslint-plugin-jest#2052 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Wallet functions throws TypeError when the wallet has no account IDPosiblemente ocupada @Medhansh-741 la tomó hoy. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
hiero-ledger/hiero-sdk-js#4781 · 1 comentario ·
Los mantenedores suelen responder en 1 día