@ckeditor/ckeditor5-ui 40.0.0 → 40.1.0

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.
Files changed (165) hide show
  1. package/LICENSE.md +3 -3
  2. package/lang/translations/pt-br.po +1 -1
  3. package/lang/translations/ug.po +26 -26
  4. package/package.json +3 -3
  5. package/src/arialiveannouncer.d.ts +94 -0
  6. package/src/arialiveannouncer.js +113 -0
  7. package/src/augmentation.d.ts +86 -86
  8. package/src/augmentation.js +5 -5
  9. package/src/autocomplete/autocompleteview.d.ts +81 -81
  10. package/src/autocomplete/autocompleteview.js +153 -146
  11. package/src/bindings/addkeyboardhandlingforgrid.d.ts +27 -27
  12. package/src/bindings/addkeyboardhandlingforgrid.js +107 -107
  13. package/src/bindings/clickoutsidehandler.d.ts +28 -28
  14. package/src/bindings/clickoutsidehandler.js +36 -36
  15. package/src/bindings/csstransitiondisablermixin.d.ts +40 -40
  16. package/src/bindings/csstransitiondisablermixin.js +55 -55
  17. package/src/bindings/injectcsstransitiondisabler.d.ts +59 -59
  18. package/src/bindings/injectcsstransitiondisabler.js +71 -71
  19. package/src/bindings/preventdefault.d.ts +33 -33
  20. package/src/bindings/preventdefault.js +34 -34
  21. package/src/bindings/submithandler.d.ts +57 -57
  22. package/src/bindings/submithandler.js +47 -47
  23. package/src/button/button.d.ts +172 -178
  24. package/src/button/button.js +5 -5
  25. package/src/button/buttonlabel.d.ts +34 -34
  26. package/src/button/buttonlabel.js +5 -5
  27. package/src/button/buttonlabelview.d.ts +31 -31
  28. package/src/button/buttonlabelview.js +42 -42
  29. package/src/button/buttonview.d.ts +181 -185
  30. package/src/button/buttonview.js +217 -219
  31. package/src/button/switchbuttonview.d.ts +45 -45
  32. package/src/button/switchbuttonview.js +75 -75
  33. package/src/colorgrid/colorgridview.d.ts +132 -132
  34. package/src/colorgrid/colorgridview.js +124 -124
  35. package/src/colorgrid/colortileview.d.ts +28 -28
  36. package/src/colorgrid/colortileview.js +40 -40
  37. package/src/colorgrid/utils.d.ts +47 -47
  38. package/src/colorgrid/utils.js +84 -84
  39. package/src/colorpicker/colorpickerview.d.ts +137 -137
  40. package/src/colorpicker/colorpickerview.js +270 -270
  41. package/src/colorpicker/utils.d.ts +43 -43
  42. package/src/colorpicker/utils.js +99 -99
  43. package/src/colorselector/colorgridsfragmentview.d.ts +194 -194
  44. package/src/colorselector/colorgridsfragmentview.js +289 -289
  45. package/src/colorselector/colorpickerfragmentview.d.ts +128 -128
  46. package/src/colorselector/colorpickerfragmentview.js +205 -205
  47. package/src/colorselector/colorselectorview.d.ts +242 -242
  48. package/src/colorselector/colorselectorview.js +256 -256
  49. package/src/colorselector/documentcolorcollection.d.ts +70 -70
  50. package/src/colorselector/documentcolorcollection.js +42 -42
  51. package/src/componentfactory.d.ts +81 -81
  52. package/src/componentfactory.js +104 -104
  53. package/src/dropdown/button/dropdownbutton.d.ts +25 -25
  54. package/src/dropdown/button/dropdownbutton.js +5 -5
  55. package/src/dropdown/button/dropdownbuttonview.d.ts +48 -48
  56. package/src/dropdown/button/dropdownbuttonview.js +66 -66
  57. package/src/dropdown/button/splitbuttonview.d.ts +161 -161
  58. package/src/dropdown/button/splitbuttonview.js +152 -152
  59. package/src/dropdown/dropdownpanelfocusable.d.ts +21 -21
  60. package/src/dropdown/dropdownpanelfocusable.js +5 -5
  61. package/src/dropdown/dropdownpanelview.d.ts +62 -62
  62. package/src/dropdown/dropdownpanelview.js +97 -97
  63. package/src/dropdown/dropdownview.d.ts +315 -315
  64. package/src/dropdown/dropdownview.js +379 -379
  65. package/src/dropdown/utils.d.ts +235 -235
  66. package/src/dropdown/utils.js +463 -458
  67. package/src/editableui/editableuiview.d.ts +72 -72
  68. package/src/editableui/editableuiview.js +112 -112
  69. package/src/editableui/inline/inlineeditableuiview.d.ts +40 -40
  70. package/src/editableui/inline/inlineeditableuiview.js +48 -48
  71. package/src/editorui/bodycollection.d.ts +55 -55
  72. package/src/editorui/bodycollection.js +84 -84
  73. package/src/editorui/boxed/boxededitoruiview.d.ts +40 -40
  74. package/src/editorui/boxed/boxededitoruiview.js +81 -81
  75. package/src/editorui/editorui.d.ts +288 -282
  76. package/src/editorui/editorui.js +412 -410
  77. package/src/editorui/editoruiview.d.ts +39 -39
  78. package/src/editorui/editoruiview.js +38 -38
  79. package/src/editorui/poweredby.d.ts +71 -71
  80. package/src/editorui/poweredby.js +276 -276
  81. package/src/focuscycler.d.ts +226 -226
  82. package/src/focuscycler.js +245 -245
  83. package/src/formheader/formheaderview.d.ts +59 -59
  84. package/src/formheader/formheaderview.js +69 -69
  85. package/src/highlightedtext/highlightedtextview.d.ts +38 -38
  86. package/src/highlightedtext/highlightedtextview.js +102 -102
  87. package/src/icon/iconview.d.ts +85 -85
  88. package/src/icon/iconview.js +114 -114
  89. package/src/iframe/iframeview.d.ts +50 -50
  90. package/src/iframe/iframeview.js +63 -63
  91. package/src/index.d.ts +73 -73
  92. package/src/index.js +70 -70
  93. package/src/input/inputbase.d.ts +107 -107
  94. package/src/input/inputbase.js +110 -110
  95. package/src/input/inputview.d.ts +36 -36
  96. package/src/input/inputview.js +24 -24
  97. package/src/inputnumber/inputnumberview.d.ts +49 -49
  98. package/src/inputnumber/inputnumberview.js +40 -40
  99. package/src/inputtext/inputtextview.d.ts +18 -18
  100. package/src/inputtext/inputtextview.js +27 -27
  101. package/src/label/labelview.d.ts +36 -36
  102. package/src/label/labelview.js +41 -41
  103. package/src/labeledfield/labeledfieldview.d.ts +187 -187
  104. package/src/labeledfield/labeledfieldview.js +157 -157
  105. package/src/labeledfield/utils.d.ts +123 -123
  106. package/src/labeledfield/utils.js +176 -176
  107. package/src/labeledinput/labeledinputview.d.ts +125 -125
  108. package/src/labeledinput/labeledinputview.js +125 -125
  109. package/src/list/listitemgroupview.d.ts +59 -51
  110. package/src/list/listitemgroupview.js +63 -75
  111. package/src/list/listitemview.d.ts +36 -36
  112. package/src/list/listitemview.js +42 -42
  113. package/src/list/listseparatorview.d.ts +18 -18
  114. package/src/list/listseparatorview.js +28 -28
  115. package/src/list/listview.d.ts +122 -122
  116. package/src/list/listview.js +187 -187
  117. package/src/model.d.ts +22 -22
  118. package/src/model.js +31 -31
  119. package/src/notification/notification.d.ts +211 -211
  120. package/src/notification/notification.js +187 -187
  121. package/src/panel/balloon/balloonpanelview.d.ts +685 -685
  122. package/src/panel/balloon/balloonpanelview.js +1010 -1010
  123. package/src/panel/balloon/contextualballoon.d.ts +299 -299
  124. package/src/panel/balloon/contextualballoon.js +572 -572
  125. package/src/panel/sticky/stickypanelview.d.ts +156 -156
  126. package/src/panel/sticky/stickypanelview.js +234 -234
  127. package/src/search/filteredview.d.ts +31 -31
  128. package/src/search/filteredview.js +5 -5
  129. package/src/search/searchinfoview.d.ts +45 -45
  130. package/src/search/searchinfoview.js +59 -59
  131. package/src/search/searchresultsview.d.ts +54 -54
  132. package/src/search/searchresultsview.js +65 -65
  133. package/src/search/text/searchtextqueryview.d.ts +76 -76
  134. package/src/search/text/searchtextqueryview.js +75 -75
  135. package/src/search/text/searchtextview.d.ts +219 -219
  136. package/src/search/text/searchtextview.js +201 -201
  137. package/src/spinner/spinnerview.d.ts +25 -25
  138. package/src/spinner/spinnerview.js +38 -38
  139. package/src/template.d.ts +942 -942
  140. package/src/template.js +1294 -1294
  141. package/src/textarea/textareaview.d.ts +88 -88
  142. package/src/textarea/textareaview.js +142 -140
  143. package/src/toolbar/balloon/balloontoolbar.d.ts +122 -122
  144. package/src/toolbar/balloon/balloontoolbar.js +300 -300
  145. package/src/toolbar/block/blockbuttonview.d.ts +35 -35
  146. package/src/toolbar/block/blockbuttonview.js +41 -41
  147. package/src/toolbar/block/blocktoolbar.d.ts +161 -161
  148. package/src/toolbar/block/blocktoolbar.js +395 -395
  149. package/src/toolbar/normalizetoolbarconfig.d.ts +40 -40
  150. package/src/toolbar/normalizetoolbarconfig.js +52 -51
  151. package/src/toolbar/toolbarlinebreakview.d.ts +18 -18
  152. package/src/toolbar/toolbarlinebreakview.js +28 -28
  153. package/src/toolbar/toolbarseparatorview.d.ts +18 -18
  154. package/src/toolbar/toolbarseparatorview.js +28 -28
  155. package/src/toolbar/toolbarview.d.ts +266 -266
  156. package/src/toolbar/toolbarview.js +719 -719
  157. package/src/tooltipmanager.d.ts +180 -180
  158. package/src/tooltipmanager.js +353 -353
  159. package/src/view.d.ts +422 -422
  160. package/src/view.js +396 -396
  161. package/src/viewcollection.d.ts +139 -139
  162. package/src/viewcollection.js +206 -206
  163. package/theme/components/arialiveannouncer/arialiveannouncer.css +10 -0
  164. package/theme/components/button/button.css +9 -1
  165. package/theme/components/formheader/formheader.css +0 -4
@@ -1,88 +1,88 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module ui/textarea/textareaview
7
- */
8
- import { type Locale } from '@ckeditor/ckeditor5-utils';
9
- import InputBase from '../input/inputbase';
10
- import '../../theme/components/input/input.css';
11
- import '../../theme/components/textarea/textarea.css';
12
- /**
13
- * The textarea view class.
14
- *
15
- * ```ts
16
- * const textareaView = new TextareaView();
17
- *
18
- * textareaView.minRows = 2;
19
- * textareaView.maxRows = 10;
20
- *
21
- * textareaView.render();
22
- *
23
- * document.body.append( textareaView.element );
24
- * ```
25
- */
26
- export default class TextareaView extends InputBase<HTMLTextAreaElement> {
27
- /**
28
- * Specifies the visible height of a text area, in lines.
29
- *
30
- * @observable
31
- * @default 2
32
- */
33
- minRows: number;
34
- /**
35
- * Specifies the maximum number of rows.
36
- *
37
- * @observable
38
- * @default 5
39
- */
40
- maxRows: number;
41
- /**
42
- * Specifies the value of HTML attribute that indicates whether the user can resize the element.
43
- *
44
- * @observable
45
- * @default 'none'
46
- */
47
- resize: 'both' | 'horizontal' | 'vertical' | 'none';
48
- /**
49
- * An internal property that stores the current height of the textarea. Used for the DOM binding.
50
- *
51
- * @observable
52
- * @default null
53
- * @internal
54
- */
55
- _height: number | null;
56
- /**
57
- * @inheritDoc
58
- */
59
- constructor(locale?: Locale);
60
- /**
61
- * @inheritDoc
62
- */
63
- render(): void;
64
- /**
65
- * @inheritDoc
66
- */
67
- reset(): void;
68
- /**
69
- * Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
70
- *
71
- * **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
72
- */
73
- private _updateAutoGrowHeight;
74
- /**
75
- * Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
76
- */
77
- private _validateMinMaxRows;
78
- }
79
- /**
80
- * Fired every time the layout of the {@link module:ui/textarea/textareaview~TextareaView} possibly changed as a result
81
- * of the user input or the value change via {@link module:ui/textarea/textareaview~TextareaView#value}.
82
- *
83
- * @eventName ~TextareaView#update
84
- */
85
- export type TextareaViewUpdateEvent = {
86
- name: 'update';
87
- args: [];
88
- };
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module ui/textarea/textareaview
7
+ */
8
+ import { type Locale } from '@ckeditor/ckeditor5-utils';
9
+ import InputBase from '../input/inputbase';
10
+ import '../../theme/components/input/input.css';
11
+ import '../../theme/components/textarea/textarea.css';
12
+ /**
13
+ * The textarea view class.
14
+ *
15
+ * ```ts
16
+ * const textareaView = new TextareaView();
17
+ *
18
+ * textareaView.minRows = 2;
19
+ * textareaView.maxRows = 10;
20
+ *
21
+ * textareaView.render();
22
+ *
23
+ * document.body.append( textareaView.element );
24
+ * ```
25
+ */
26
+ export default class TextareaView extends InputBase<HTMLTextAreaElement> {
27
+ /**
28
+ * Specifies the visible height of a text area, in lines.
29
+ *
30
+ * @observable
31
+ * @default 2
32
+ */
33
+ minRows: number;
34
+ /**
35
+ * Specifies the maximum number of rows.
36
+ *
37
+ * @observable
38
+ * @default 5
39
+ */
40
+ maxRows: number;
41
+ /**
42
+ * Specifies the value of HTML attribute that indicates whether the user can resize the element.
43
+ *
44
+ * @observable
45
+ * @default 'none'
46
+ */
47
+ resize: 'both' | 'horizontal' | 'vertical' | 'none';
48
+ /**
49
+ * An internal property that stores the current height of the textarea. Used for the DOM binding.
50
+ *
51
+ * @observable
52
+ * @default null
53
+ * @internal
54
+ */
55
+ _height: number | null;
56
+ /**
57
+ * @inheritDoc
58
+ */
59
+ constructor(locale?: Locale);
60
+ /**
61
+ * @inheritDoc
62
+ */
63
+ render(): void;
64
+ /**
65
+ * @inheritDoc
66
+ */
67
+ reset(): void;
68
+ /**
69
+ * Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
70
+ *
71
+ * **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
72
+ */
73
+ private _updateAutoGrowHeight;
74
+ /**
75
+ * Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
76
+ */
77
+ private _validateMinMaxRows;
78
+ }
79
+ /**
80
+ * Fired every time the layout of the {@link module:ui/textarea/textareaview~TextareaView} possibly changed as a result
81
+ * of the user input or the value change via {@link module:ui/textarea/textareaview~TextareaView#value}.
82
+ *
83
+ * @eventName ~TextareaView#update
84
+ */
85
+ export type TextareaViewUpdateEvent = {
86
+ name: 'update';
87
+ args: [];
88
+ };
@@ -1,140 +1,142 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module ui/textarea/textareaview
7
- */
8
- import { Rect, toUnit, getBorderWidths, global, CKEditorError } from '@ckeditor/ckeditor5-utils';
9
- import InputBase from '../input/inputbase';
10
- import '../../theme/components/input/input.css';
11
- import '../../theme/components/textarea/textarea.css';
12
- /**
13
- * The textarea view class.
14
- *
15
- * ```ts
16
- * const textareaView = new TextareaView();
17
- *
18
- * textareaView.minRows = 2;
19
- * textareaView.maxRows = 10;
20
- *
21
- * textareaView.render();
22
- *
23
- * document.body.append( textareaView.element );
24
- * ```
25
- */
26
- export default class TextareaView extends InputBase {
27
- /**
28
- * @inheritDoc
29
- */
30
- constructor(locale) {
31
- super(locale);
32
- const toPx = toUnit('px');
33
- this.set('minRows', 2);
34
- this.set('maxRows', 5);
35
- this.set('_height', null);
36
- this.set('resize', 'none');
37
- this.on('change:minRows', this._validateMinMaxRows.bind(this));
38
- this.on('change:maxRows', this._validateMinMaxRows.bind(this));
39
- const bind = this.bindTemplate;
40
- this.template.tag = 'textarea';
41
- this.extendTemplate({
42
- attributes: {
43
- class: ['ck-textarea'],
44
- style: {
45
- height: bind.to('_height', height => height ? toPx(height) : null),
46
- resize: bind.to('resize')
47
- },
48
- rows: bind.to('minRows')
49
- }
50
- });
51
- }
52
- /**
53
- * @inheritDoc
54
- */
55
- render() {
56
- super.render();
57
- this.on('input', () => {
58
- this._updateAutoGrowHeight(true);
59
- this.fire('update');
60
- });
61
- this.on('change:value', () => {
62
- // The content needs to be updated by the browser after the value is changed. It takes a few ms.
63
- global.window.requestAnimationFrame(() => {
64
- this._updateAutoGrowHeight();
65
- this.fire('update');
66
- });
67
- });
68
- }
69
- /**
70
- * @inheritDoc
71
- */
72
- reset() {
73
- super.reset();
74
- this._updateAutoGrowHeight();
75
- this.fire('update');
76
- }
77
- /**
78
- * Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
79
- *
80
- * **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
81
- */
82
- _updateAutoGrowHeight(shouldScroll) {
83
- const viewElement = this.element;
84
- const singleLineContentClone = getTextareaElementClone(viewElement, '1');
85
- const fullTextValueClone = getTextareaElementClone(viewElement, viewElement.value);
86
- const singleLineContentStyles = singleLineContentClone.ownerDocument.defaultView.getComputedStyle(singleLineContentClone);
87
- const verticalPaddings = parseFloat(singleLineContentStyles.paddingTop) + parseFloat(singleLineContentStyles.paddingBottom);
88
- const borders = getBorderWidths(singleLineContentClone);
89
- const lineHeight = parseFloat(singleLineContentStyles.lineHeight);
90
- const verticalBorder = borders.top + borders.bottom;
91
- const singleLineAreaDefaultHeight = new Rect(singleLineContentClone).height;
92
- const numberOfLines = Math.round((fullTextValueClone.scrollHeight - verticalPaddings) / lineHeight);
93
- const maxHeight = this.maxRows * lineHeight + verticalPaddings + verticalBorder;
94
- // There's a --ck-ui-component-min-height CSS custom property that enforces min height of the component.
95
- // This min-height is relevant only when there's one line of text. Other than that, we can rely on line-height.
96
- const minHeight = numberOfLines === 1 ? singleLineAreaDefaultHeight : this.minRows * lineHeight + verticalPaddings + verticalBorder;
97
- // The size of textarea is controlled by height style instead of rows attribute because event though it is
98
- // a more complex solution, it is immune to the layout textarea has been rendered in (gird, flex).
99
- this._height = Math.min(Math.max(Math.max(numberOfLines, this.minRows) * lineHeight + verticalPaddings + verticalBorder, minHeight), maxHeight);
100
- if (shouldScroll) {
101
- viewElement.scrollTop = viewElement.scrollHeight;
102
- }
103
- singleLineContentClone.remove();
104
- fullTextValueClone.remove();
105
- }
106
- /**
107
- * Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
108
- */
109
- _validateMinMaxRows() {
110
- if (this.minRows > this.maxRows) {
111
- /**
112
- * The minimum number of rows is greater than the maximum number of rows.
113
- *
114
- * @error ui-textarea-view-min-rows-greater-than-max-rows
115
- * @param textareaView The misconfigured textarea view instance.
116
- * @param minRows The value of `minRows` property.
117
- * @param maxRows The value of `maxRows` property.
118
- */
119
- throw new CKEditorError('ui-textarea-view-min-rows-greater-than-max-rows', {
120
- textareaView: this,
121
- minRows: this.minRows,
122
- maxRows: this.maxRows
123
- });
124
- }
125
- }
126
- }
127
- function getTextareaElementClone(element, value) {
128
- const clone = element.cloneNode();
129
- clone.style.position = 'absolute';
130
- clone.style.top = '-99999px';
131
- clone.style.left = '-99999px';
132
- clone.style.height = 'auto';
133
- clone.style.overflow = 'hidden';
134
- clone.style.width = element.ownerDocument.defaultView.getComputedStyle(element).width;
135
- clone.tabIndex = -1;
136
- clone.rows = 1;
137
- clone.value = value;
138
- element.parentNode.insertBefore(clone, element);
139
- return clone;
140
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module ui/textarea/textareaview
7
+ */
8
+ import { Rect, toUnit, getBorderWidths, global, CKEditorError, isVisible } from '@ckeditor/ckeditor5-utils';
9
+ import InputBase from '../input/inputbase';
10
+ import '../../theme/components/input/input.css';
11
+ import '../../theme/components/textarea/textarea.css';
12
+ /**
13
+ * The textarea view class.
14
+ *
15
+ * ```ts
16
+ * const textareaView = new TextareaView();
17
+ *
18
+ * textareaView.minRows = 2;
19
+ * textareaView.maxRows = 10;
20
+ *
21
+ * textareaView.render();
22
+ *
23
+ * document.body.append( textareaView.element );
24
+ * ```
25
+ */
26
+ export default class TextareaView extends InputBase {
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ constructor(locale) {
31
+ super(locale);
32
+ const toPx = toUnit('px');
33
+ this.set('minRows', 2);
34
+ this.set('maxRows', 5);
35
+ this.set('_height', null);
36
+ this.set('resize', 'none');
37
+ this.on('change:minRows', this._validateMinMaxRows.bind(this));
38
+ this.on('change:maxRows', this._validateMinMaxRows.bind(this));
39
+ const bind = this.bindTemplate;
40
+ this.template.tag = 'textarea';
41
+ this.extendTemplate({
42
+ attributes: {
43
+ class: ['ck-textarea'],
44
+ style: {
45
+ height: bind.to('_height', height => height ? toPx(height) : null),
46
+ resize: bind.to('resize')
47
+ },
48
+ rows: bind.to('minRows')
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * @inheritDoc
54
+ */
55
+ render() {
56
+ super.render();
57
+ this.on('input', () => {
58
+ this._updateAutoGrowHeight(true);
59
+ this.fire('update');
60
+ });
61
+ this.on('change:value', () => {
62
+ // The content needs to be updated by the browser after the value is changed. It takes a few ms.
63
+ global.window.requestAnimationFrame(() => {
64
+ if (isVisible(this.element)) {
65
+ this._updateAutoGrowHeight();
66
+ this.fire('update');
67
+ }
68
+ });
69
+ });
70
+ }
71
+ /**
72
+ * @inheritDoc
73
+ */
74
+ reset() {
75
+ super.reset();
76
+ this._updateAutoGrowHeight();
77
+ this.fire('update');
78
+ }
79
+ /**
80
+ * Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
81
+ *
82
+ * **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
83
+ */
84
+ _updateAutoGrowHeight(shouldScroll) {
85
+ const viewElement = this.element;
86
+ const singleLineContentClone = getTextareaElementClone(viewElement, '1');
87
+ const fullTextValueClone = getTextareaElementClone(viewElement, viewElement.value);
88
+ const singleLineContentStyles = singleLineContentClone.ownerDocument.defaultView.getComputedStyle(singleLineContentClone);
89
+ const verticalPaddings = parseFloat(singleLineContentStyles.paddingTop) + parseFloat(singleLineContentStyles.paddingBottom);
90
+ const borders = getBorderWidths(singleLineContentClone);
91
+ const lineHeight = parseFloat(singleLineContentStyles.lineHeight);
92
+ const verticalBorder = borders.top + borders.bottom;
93
+ const singleLineAreaDefaultHeight = new Rect(singleLineContentClone).height;
94
+ const numberOfLines = Math.round((fullTextValueClone.scrollHeight - verticalPaddings) / lineHeight);
95
+ const maxHeight = this.maxRows * lineHeight + verticalPaddings + verticalBorder;
96
+ // There's a --ck-ui-component-min-height CSS custom property that enforces min height of the component.
97
+ // This min-height is relevant only when there's one line of text. Other than that, we can rely on line-height.
98
+ const minHeight = numberOfLines === 1 ? singleLineAreaDefaultHeight : this.minRows * lineHeight + verticalPaddings + verticalBorder;
99
+ // The size of textarea is controlled by height style instead of rows attribute because event though it is
100
+ // a more complex solution, it is immune to the layout textarea has been rendered in (gird, flex).
101
+ this._height = Math.min(Math.max(Math.max(numberOfLines, this.minRows) * lineHeight + verticalPaddings + verticalBorder, minHeight), maxHeight);
102
+ if (shouldScroll) {
103
+ viewElement.scrollTop = viewElement.scrollHeight;
104
+ }
105
+ singleLineContentClone.remove();
106
+ fullTextValueClone.remove();
107
+ }
108
+ /**
109
+ * Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
110
+ */
111
+ _validateMinMaxRows() {
112
+ if (this.minRows > this.maxRows) {
113
+ /**
114
+ * The minimum number of rows is greater than the maximum number of rows.
115
+ *
116
+ * @error ui-textarea-view-min-rows-greater-than-max-rows
117
+ * @param textareaView The misconfigured textarea view instance.
118
+ * @param minRows The value of `minRows` property.
119
+ * @param maxRows The value of `maxRows` property.
120
+ */
121
+ throw new CKEditorError('ui-textarea-view-min-rows-greater-than-max-rows', {
122
+ textareaView: this,
123
+ minRows: this.minRows,
124
+ maxRows: this.maxRows
125
+ });
126
+ }
127
+ }
128
+ }
129
+ function getTextareaElementClone(element, value) {
130
+ const clone = element.cloneNode();
131
+ clone.style.position = 'absolute';
132
+ clone.style.top = '-99999px';
133
+ clone.style.left = '-99999px';
134
+ clone.style.height = 'auto';
135
+ clone.style.overflow = 'hidden';
136
+ clone.style.width = element.ownerDocument.defaultView.getComputedStyle(element).width;
137
+ clone.tabIndex = -1;
138
+ clone.rows = 1;
139
+ clone.value = value;
140
+ element.parentNode.insertBefore(clone, element);
141
+ return clone;
142
+ }