@ionic/core 8.2.3-dev.11724326037.1eacfaff → 8.2.3-dev.11724345963.10ca6051

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 (80) hide show
  1. package/components/ion-input-password-toggle.js +7 -11
  2. package/components/ion-textarea.js +20 -7
  3. package/components/ion-thumbnail.js +2 -2
  4. package/components/ion-title.js +2 -2
  5. package/components/ion-toast.js +2 -2
  6. package/components/ion-toggle.js +3 -3
  7. package/components/ion-toolbar.js +2 -2
  8. package/css/core.css +1 -1
  9. package/css/core.css.map +1 -1
  10. package/css/ionic/bundle.ionic.css +1 -1
  11. package/css/ionic/bundle.ionic.css.map +1 -1
  12. package/css/ionic/core.ionic.css +1 -1
  13. package/css/ionic/core.ionic.css.map +1 -1
  14. package/css/ionic.bundle.css +1 -1
  15. package/css/ionic.bundle.css.map +1 -1
  16. package/dist/cjs/ion-app_8.cjs.entry.js +4 -4
  17. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  18. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +7 -11
  19. package/dist/cjs/ion-textarea.cjs.entry.js +19 -7
  20. package/dist/cjs/ion-toast.cjs.entry.js +2 -2
  21. package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
  22. package/dist/cjs/ionic.cjs.js +1 -1
  23. package/dist/cjs/loader.cjs.js +1 -1
  24. package/dist/collection/components/input-password-toggle/input-password-toggle.css +0 -0
  25. package/dist/collection/components/input-password-toggle/input-password-toggle.js +7 -9
  26. package/dist/collection/components/input-password-toggle/test/basic/input-password-toggle.e2e.js +1 -1
  27. package/dist/collection/components/textarea/test/size/textarea.e2e.js +123 -0
  28. package/dist/collection/components/textarea/textarea.ionic.css +790 -0
  29. package/dist/collection/components/textarea/textarea.ios.css +175 -95
  30. package/dist/collection/components/textarea/textarea.js +35 -5
  31. package/dist/collection/components/textarea/textarea.md.css +175 -95
  32. package/dist/collection/components/thumbnail/thumbnail.js +2 -2
  33. package/dist/collection/components/title/title.js +2 -2
  34. package/dist/collection/components/toast/toast.js +2 -2
  35. package/dist/collection/components/toggle/toggle.js +3 -3
  36. package/dist/collection/components/toolbar/toolbar.js +2 -2
  37. package/dist/docs.json +35 -1
  38. package/dist/esm/ion-app_8.entry.js +4 -4
  39. package/dist/esm/ion-avatar_3.entry.js +2 -2
  40. package/dist/esm/ion-input-password-toggle.entry.js +7 -11
  41. package/dist/esm/ion-textarea.entry.js +19 -7
  42. package/dist/esm/ion-toast.entry.js +2 -2
  43. package/dist/esm/ion-toggle.entry.js +3 -3
  44. package/dist/esm/ionic.js +1 -1
  45. package/dist/esm/loader.js +1 -1
  46. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  47. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  48. package/dist/esm-es5/ion-input-password-toggle.entry.js +1 -1
  49. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  50. package/dist/esm-es5/ion-toast.entry.js +1 -1
  51. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  52. package/dist/esm-es5/ionic.js +1 -1
  53. package/dist/esm-es5/loader.js +1 -1
  54. package/dist/html.html-data.json +15 -0
  55. package/dist/ionic/ionic.esm.js +1 -1
  56. package/dist/ionic/p-13405b29.entry.js +4 -0
  57. package/dist/ionic/p-1ee206ac.entry.js +4 -0
  58. package/dist/ionic/{p-7dad531c.system.entry.js → p-31692628.system.entry.js} +1 -1
  59. package/dist/ionic/{p-b4b44bf9.system.entry.js → p-35fde411.system.entry.js} +1 -1
  60. package/dist/ionic/{p-7ab9c88c.system.entry.js → p-3a2eb448.system.entry.js} +1 -1
  61. package/dist/ionic/p-6691825a.system.entry.js +4 -0
  62. package/dist/ionic/{p-39a39279.entry.js → p-6e7d4537.entry.js} +1 -1
  63. package/dist/ionic/p-7a1b640f.entry.js +4 -0
  64. package/dist/ionic/p-7b590e46.system.js +1 -1
  65. package/dist/ionic/p-8102551e.system.entry.js +4 -0
  66. package/dist/ionic/p-924deb6b.entry.js +4 -0
  67. package/dist/ionic/{p-f84ea1e9.system.entry.js → p-984e02c3.system.entry.js} +1 -1
  68. package/dist/ionic/{p-c11fdca2.entry.js → p-a971dec3.entry.js} +1 -1
  69. package/dist/types/components/textarea/textarea.d.ts +6 -0
  70. package/dist/types/components.d.ts +8 -0
  71. package/hydrate/index.js +38 -29
  72. package/package.json +1 -1
  73. package/dist/collection/components/input-password-toggle/input-password-toggle.common.css +0 -61
  74. package/dist/collection/components/input-password-toggle/input-password-toggle.ionic.css +0 -137
  75. package/dist/ionic/p-01ae1aa0.entry.js +0 -4
  76. package/dist/ionic/p-33dd8047.system.entry.js +0 -4
  77. package/dist/ionic/p-3d9c39bc.entry.js +0 -4
  78. package/dist/ionic/p-4346453b.entry.js +0 -4
  79. package/dist/ionic/p-56c72f65.system.entry.js +0 -4
  80. package/dist/ionic/p-8ac5efa9.entry.js +0 -4
@@ -0,0 +1,790 @@
1
+ /**
2
+ * Convert a pixels given value into rem
3
+ *
4
+ * @param pixels - Value in pixels to be converted (i.e. px)
5
+ * @param context (optional) - Baseline value
6
+ */
7
+ /**
8
+ * This is an auto-generated file, please do not change it directly.
9
+ * Ionic Design System
10
+ */
11
+ /**
12
+ * A heuristic that applies CSS to tablet
13
+ * viewports.
14
+ *
15
+ * Usage:
16
+ * @include tablet-viewport() {
17
+ * :host {
18
+ * background-color: green;
19
+ * }
20
+ * }
21
+ */
22
+ /**
23
+ * A heuristic that applies CSS to mobile
24
+ * viewports (i.e. phones, not tablets).
25
+ *
26
+ * Usage:
27
+ * @include mobile-viewport() {
28
+ * :host {
29
+ * background-color: blue;
30
+ * }
31
+ * }
32
+ */
33
+ /**
34
+ * Convert a font size to a dynamic font size.
35
+ * Fonts that participate in Dynamic Type should use
36
+ * dynamic font sizes.
37
+ * @param size - The initial font size including the unit (i.e. px or pt)
38
+ * @param unit (optional) - The unit to convert to. Use this if you want to
39
+ * convert to a unit other than $baselineUnit.
40
+ */
41
+ /**
42
+ * Convert a font size to a dynamic font size but impose
43
+ * a maximum font size.
44
+ * @param size - The initial font size including the unit (i.e. px or pt)
45
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
46
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
47
+ * convert to a unit other than $baselineUnit.
48
+ */
49
+ /**
50
+ * Convert a font size to a dynamic font size but impose
51
+ * a minimum font size.
52
+ * @param size - The initial font size including the unit (i.e. px or pt)
53
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
54
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
55
+ * convert to a unit other than $baselineUnit.
56
+ */
57
+ /**
58
+ * Convert a font size to a dynamic font size but impose
59
+ * maximum and minimum font sizes.
60
+ * @param size - The initial font size including the unit (i.e. px or pt)
61
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
62
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
63
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
64
+ * convert to a unit other than $baselineUnit.
65
+ */
66
+ /**
67
+ * Convert a pixels given value into rem
68
+ *
69
+ * @param pixels - Value in pixels to be converted (i.e. px)
70
+ * @param context (optional) - Baseline value
71
+ */
72
+ /**
73
+ * Convert a font size to a dynamic font size.
74
+ * Fonts that participate in Dynamic Type should use
75
+ * dynamic font sizes.
76
+ * @param size - The initial font size including the unit (i.e. px or pt)
77
+ * @param unit (optional) - The unit to convert to. Use this if you want to
78
+ * convert to a unit other than $baselineUnit.
79
+ */
80
+ /**
81
+ * Convert a font size to a dynamic font size but impose
82
+ * a maximum font size.
83
+ * @param size - The initial font size including the unit (i.e. px or pt)
84
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
85
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
86
+ * convert to a unit other than $baselineUnit.
87
+ */
88
+ /**
89
+ * Convert a font size to a dynamic font size but impose
90
+ * a minimum font size.
91
+ * @param size - The initial font size including the unit (i.e. px or pt)
92
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
93
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
94
+ * convert to a unit other than $baselineUnit.
95
+ */
96
+ /**
97
+ * Convert a font size to a dynamic font size but impose
98
+ * maximum and minimum font sizes.
99
+ * @param size - The initial font size including the unit (i.e. px or pt)
100
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
101
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
102
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
103
+ * convert to a unit other than $baselineUnit.
104
+ */
105
+ /**
106
+ * A heuristic that applies CSS to tablet
107
+ * viewports.
108
+ *
109
+ * Usage:
110
+ * @include tablet-viewport() {
111
+ * :host {
112
+ * background-color: green;
113
+ * }
114
+ * }
115
+ */
116
+ /**
117
+ * A heuristic that applies CSS to mobile
118
+ * viewports (i.e. phones, not tablets).
119
+ *
120
+ * Usage:
121
+ * @include mobile-viewport() {
122
+ * :host {
123
+ * background-color: blue;
124
+ * }
125
+ * }
126
+ */
127
+ :host {
128
+ /**
129
+ * @prop --background: Background of the textarea
130
+ *
131
+ * @prop --border-radius: Border radius of the textarea
132
+ * @prop --border-color: Color of the border below the textarea when using helper text, error text, or counter
133
+ * @prop --border-radius: Radius of the textarea border. A large radius may display unevenly when using fill="outline"; if needed, use shape="round" instead or increase --padding-start.
134
+ * @prop --border-style: Style of the border below the textarea when using helper text, error text, or counter
135
+ * @prop --border-width: Width of the border below the textarea when using helper text, error text, or counter
136
+ *
137
+ * @prop --color: Color of the text
138
+ *
139
+ * @prop --placeholder-color: Color of the placeholder text
140
+ * @prop --placeholder-font-style: Style of the placeholder text
141
+ * @prop --placeholder-font-weight: Weight of the placeholder text
142
+ * @prop --placeholder-opacity: Opacity of the placeholder text
143
+ *
144
+ * @prop --highlight-height: The height of the highlight on the textarea. Only applies to md mode.
145
+ * @prop --highlight-color-focused: The color of the highlight on the textarea when focused
146
+ * @prop --highlight-color-valid: The color of the highlight on the textarea when valid
147
+ * @prop --highlight-color-invalid: The color of the highlight on the textarea when invalid
148
+ *
149
+ * @prop --padding-top: Top padding of the textarea
150
+ * @prop --padding-end: Right padding if direction is left-to-right, and left padding if direction is right-to-left of the textarea
151
+ * @prop --padding-bottom: Bottom padding of the textarea
152
+ * @prop --padding-start: Left padding if direction is left-to-right, and right padding if direction is right-to-left of the textarea
153
+ */
154
+ --background: initial;
155
+ --color: initial;
156
+ --placeholder-color: initial;
157
+ --placeholder-font-style: initial;
158
+ --placeholder-font-weight: initial;
159
+ --placeholder-opacity: var(--ion-placeholder-opacity, 0.6);
160
+ --padding-top: 0;
161
+ --padding-end: 0;
162
+ --padding-bottom: 8px;
163
+ --padding-start: 0;
164
+ --border-radius: 0;
165
+ --border-style: solid;
166
+ --highlight-color-focused: var(--ion-color-primary, #0054e9);
167
+ --highlight-color-valid: var(--ion-color-success, #2dd55b);
168
+ --highlight-color-invalid: var(--ion-color-danger, #c5000f);
169
+ /**
170
+ * This is a private API that is used to switch
171
+ * out the highlight color based on the state
172
+ * of the component without having to write
173
+ * different selectors for different fill variants.
174
+ */
175
+ --highlight-color: var(--highlight-color-focused);
176
+ display: block;
177
+ position: relative;
178
+ width: 100%;
179
+ color: var(--color);
180
+ box-sizing: border-box;
181
+ }
182
+
183
+ /**
184
+ * When the cols property is set we should
185
+ * respect that width instead of defaulting
186
+ * to taking up the entire line.
187
+ * Requires both the cols and autoGrow
188
+ * properties to be reflected as attributes
189
+ * on the host.
190
+ *
191
+ * cols does not work with autoGrow because
192
+ * autoGrow would prevent line breaks from naturally
193
+ * occurring until the textarea takes up the entire line width.
194
+ */
195
+ :host([cols]:not([auto-grow])) {
196
+ width: fit-content;
197
+ }
198
+
199
+ :host(.ion-color) {
200
+ --highlight-color-focused: var(--ion-color-base);
201
+ background: initial;
202
+ }
203
+
204
+ :host-context(ion-item) {
205
+ align-self: baseline;
206
+ }
207
+
208
+ :host-context(ion-item)[slot=start],
209
+ :host-context(ion-item)[slot=end] {
210
+ width: auto;
211
+ }
212
+
213
+ .native-textarea {
214
+ margin-left: 0;
215
+ margin-right: 0;
216
+ margin-top: 0;
217
+ margin-bottom: 0;
218
+ padding-left: 0;
219
+ padding-right: 0;
220
+ padding-top: 0;
221
+ padding-bottom: 0;
222
+ display: block;
223
+ position: relative;
224
+ flex: 1;
225
+ width: 100%;
226
+ max-width: 100%;
227
+ max-height: 100%;
228
+ border: 0;
229
+ outline: none;
230
+ background: transparent;
231
+ white-space: pre-wrap;
232
+ /**
233
+ * This ensures the textarea
234
+ * remains on top of any decoration
235
+ * that we render (particularly the
236
+ * outline border when fill="outline").
237
+ * If we did not do this then Axe would
238
+ * be unable to determine the color
239
+ * contrast of the textarea.
240
+ */
241
+ z-index: 1;
242
+ box-sizing: border-box;
243
+ resize: none;
244
+ appearance: none;
245
+ }
246
+ .native-textarea::placeholder {
247
+ padding-left: 0;
248
+ padding-right: 0;
249
+ padding-top: 0;
250
+ padding-bottom: 0;
251
+ color: var(--placeholder-color);
252
+ font-family: inherit;
253
+ font-style: var(--placeholder-font-style);
254
+ font-weight: var(--placeholder-font-weight);
255
+ opacity: var(--placeholder-opacity);
256
+ }
257
+
258
+ .native-textarea {
259
+ color: inherit;
260
+ font-family: inherit;
261
+ font-size: inherit;
262
+ font-style: inherit;
263
+ font-weight: inherit;
264
+ letter-spacing: inherit;
265
+ text-align: inherit;
266
+ text-decoration: inherit;
267
+ text-indent: inherit;
268
+ text-overflow: inherit;
269
+ text-transform: inherit;
270
+ grid-area: 1/1/2/2;
271
+ word-break: break-word;
272
+ }
273
+
274
+ .cloned-input {
275
+ top: 0;
276
+ bottom: 0;
277
+ position: absolute;
278
+ pointer-events: none;
279
+ }
280
+ .cloned-input {
281
+ inset-inline-start: 0;
282
+ }
283
+
284
+ /**
285
+ * The cloned input needs to be disabled on
286
+ * Android otherwise the viewport will still
287
+ * shift when running scroll assist.
288
+ */
289
+ .cloned-input:disabled {
290
+ opacity: 1;
291
+ }
292
+
293
+ :host([auto-grow]) .cloned-input {
294
+ height: 100%;
295
+ }
296
+
297
+ :host([auto-grow]) .native-textarea {
298
+ overflow: hidden;
299
+ }
300
+
301
+ .textarea-wrapper {
302
+ -webkit-padding-start: var(--padding-start);
303
+ padding-inline-start: var(--padding-start);
304
+ -webkit-padding-end: var(--padding-end);
305
+ padding-inline-end: var(--padding-end);
306
+ padding-top: 0px;
307
+ padding-bottom: 0px;
308
+ border-radius: var(--border-radius);
309
+ display: flex;
310
+ position: relative;
311
+ flex-grow: 1;
312
+ align-items: flex-start;
313
+ height: inherit;
314
+ min-height: inherit;
315
+ transition: background-color 15ms linear;
316
+ background: var(--background);
317
+ line-height: normal;
318
+ }
319
+
320
+ .native-wrapper {
321
+ position: relative;
322
+ width: 100%;
323
+ height: 100%;
324
+ }
325
+
326
+ :host(.has-focus) textarea {
327
+ caret-color: var(--highlight-color);
328
+ }
329
+
330
+ .native-wrapper {
331
+ display: grid;
332
+ min-width: inherit;
333
+ max-width: inherit;
334
+ /**
335
+ * This avoids a WebKit bug where
336
+ * the height of the inner textarea
337
+ * is incorrect and flows outside the
338
+ * parent container: https://bugs.webkit.org/show_bug.cgi?id=256781
339
+ * TODO FW-4734
340
+ */
341
+ grid-auto-rows: 100%;
342
+ }
343
+ .native-wrapper::after {
344
+ white-space: pre-wrap;
345
+ content: attr(data-replicated-value) " ";
346
+ visibility: hidden;
347
+ }
348
+
349
+ .native-wrapper::after {
350
+ padding-left: 0;
351
+ padding-right: 0;
352
+ padding-top: var(--padding-top);
353
+ padding-bottom: var(--padding-bottom);
354
+ margin-left: 0;
355
+ margin-right: 0;
356
+ margin-top: 0;
357
+ margin-bottom: 0;
358
+ border-radius: var(--border-radius);
359
+ /**
360
+ * Note: Do not use @include text-inherit()
361
+ * as that sets white-space: inherit
362
+ * Instead, we use white-space: pre-wrap above.
363
+ */
364
+ color: inherit;
365
+ font-family: inherit;
366
+ font-size: inherit;
367
+ font-style: inherit;
368
+ font-weight: inherit;
369
+ letter-spacing: inherit;
370
+ text-align: inherit;
371
+ text-decoration: inherit;
372
+ text-indent: inherit;
373
+ text-overflow: inherit;
374
+ text-transform: inherit;
375
+ grid-area: 1/1/2/2;
376
+ word-break: break-word;
377
+ }
378
+
379
+ .textarea-wrapper-inner {
380
+ display: flex;
381
+ width: 100%;
382
+ min-height: inherit;
383
+ }
384
+
385
+ :host(.ion-touched.ion-invalid) {
386
+ --highlight-color: var(--highlight-color-invalid);
387
+ }
388
+
389
+ /**
390
+ * The component highlight is only shown
391
+ * on focus, so we can safely set the valid
392
+ * color state when touched/valid. If we
393
+ * set it when .has-focus is present then
394
+ * the highlight color would change
395
+ * from the valid color to the component's
396
+ * color during the transition after the
397
+ * component loses focus.
398
+ */
399
+ :host(.ion-valid) {
400
+ --highlight-color: var(--highlight-color-valid);
401
+ }
402
+
403
+ .textarea-bottom {
404
+ display: flex;
405
+ justify-content: space-between;
406
+ border-top: var(--border-width) var(--border-style) var(--border-color);
407
+ }
408
+
409
+ /**
410
+ * If the textarea has a validity state, the
411
+ * border and label should reflect that as a color.
412
+ */
413
+ :host(.has-focus.ion-valid),
414
+ :host(.ion-touched.ion-invalid) {
415
+ --border-color: var(--highlight-color);
416
+ }
417
+
418
+ /**
419
+ * Error text should only be shown when .ion-invalid is
420
+ * present on the textarea. Otherwise the helper text should
421
+ * be shown.
422
+ */
423
+ .textarea-bottom .error-text {
424
+ display: none;
425
+ color: var(--highlight-color-invalid);
426
+ }
427
+
428
+ .textarea-bottom .helper-text {
429
+ display: block;
430
+ color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
431
+ }
432
+
433
+ :host(.ion-touched.ion-invalid) .textarea-bottom .error-text {
434
+ display: block;
435
+ }
436
+
437
+ :host(.ion-touched.ion-invalid) .textarea-bottom .helper-text {
438
+ display: none;
439
+ }
440
+
441
+ .textarea-bottom .counter {
442
+ /**
443
+ * Counter should always be at
444
+ * the end of the container even
445
+ * when no helper/error texts are used.
446
+ */
447
+ -webkit-margin-start: auto;
448
+ margin-inline-start: auto;
449
+ white-space: nowrap;
450
+ }
451
+
452
+ .label-text-wrapper {
453
+ -webkit-padding-start: 0px;
454
+ padding-inline-start: 0px;
455
+ -webkit-padding-end: 0px;
456
+ padding-inline-end: 0px;
457
+ padding-top: var(--padding-top);
458
+ padding-bottom: var(--padding-bottom);
459
+ /**
460
+ * Label text should not extend
461
+ * beyond the bounds of the textarea.
462
+ * However, we do not set the max
463
+ * width to 100% because then
464
+ * only the label would show and users
465
+ * would not be able to see what they are typing.
466
+ */
467
+ max-width: 200px;
468
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
469
+ /**
470
+ * This ensures that double tapping this text
471
+ * clicks the <label> and focuses the textarea
472
+ * when a screen reader is enabled.
473
+ */
474
+ pointer-events: none;
475
+ }
476
+
477
+ /**
478
+ * We need to use two elements instead of
479
+ * one. The .label-text-wrapper is responsible
480
+ * for centering the label text vertically regardless
481
+ * of the textarea height using flexbox.
482
+ *
483
+ * The .label-text element is responsible for controlling
484
+ * overflow when label-placement="fixed".
485
+ * We want the ellipses to show up when the
486
+ * fixed label overflows, but text-overflow: ellipsis only
487
+ * works on block-level elements. A flex item is
488
+ * considered blockified (https://www.w3.org/TR/css-display-3/#blockify).
489
+ */
490
+ .label-text,
491
+ ::slotted([slot=label]) {
492
+ text-overflow: ellipsis;
493
+ white-space: nowrap;
494
+ overflow: hidden;
495
+ }
496
+
497
+ /**
498
+ * If no label text is placed into the slot
499
+ * then the element should be hidden otherwise
500
+ * there will be additional margins added.
501
+ */
502
+ .label-text-wrapper-hidden,
503
+ .textarea-outline-notch-hidden {
504
+ display: none;
505
+ }
506
+
507
+ .textarea-wrapper textarea {
508
+ /**
509
+ * When the floating label appears on top of the
510
+ * textarea, we need to fade the textarea out so that the
511
+ * label does not overlap with the placeholder.
512
+ */
513
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
514
+ }
515
+
516
+ /**
517
+ * Label is on the left of the textarea in LTR and
518
+ * on the right in RTL.
519
+ */
520
+ :host(.textarea-label-placement-start) .textarea-wrapper {
521
+ flex-direction: row;
522
+ }
523
+
524
+ /**
525
+ * Label is on the right of the textarea in LTR and
526
+ * on the left in RTL.
527
+ */
528
+ :host(.textarea-label-placement-end) .textarea-wrapper {
529
+ flex-direction: row-reverse;
530
+ }
531
+
532
+ /**
533
+ * Label is on the left of the textarea in LTR and
534
+ * on the right in RTL. Label also has a fixed width.
535
+ */
536
+ :host(.textarea-label-placement-fixed) .label-text {
537
+ flex: 0 0 100px;
538
+ width: 100px;
539
+ min-width: 100px;
540
+ max-width: 200px;
541
+ }
542
+
543
+ /**
544
+ * Stacked: Label sits above the textarea and is scaled down.
545
+ * Floating: Label sits over the textarea when the textarea has no
546
+ * value and is blurred. Label sits above the textarea and is scaled
547
+ * down when the textarea is focused or has a value.
548
+ *
549
+ */
550
+ :host(.textarea-label-placement-stacked) .textarea-wrapper,
551
+ :host(.textarea-label-placement-floating) .textarea-wrapper {
552
+ flex-direction: column;
553
+ align-items: start;
554
+ }
555
+
556
+ /**
557
+ * Ensures that the label animates
558
+ * up and to the left in LTR or
559
+ * up and to the right in RTL.
560
+ */
561
+ :host(.textarea-label-placement-stacked) .label-text-wrapper,
562
+ :host(.textarea-label-placement-floating) .label-text-wrapper {
563
+ transform-origin: left top;
564
+ -webkit-padding-start: 0px;
565
+ padding-inline-start: 0px;
566
+ -webkit-padding-end: 0px;
567
+ padding-inline-end: 0px;
568
+ padding-top: 0px;
569
+ padding-bottom: 0px;
570
+ max-width: 100%;
571
+ /**
572
+ * The 2 ensures the label
573
+ * remains on top of any browser
574
+ * autofill background too.
575
+ */
576
+ z-index: 2;
577
+ }
578
+ :host-context([dir=rtl]):host(.textarea-label-placement-stacked) .label-text-wrapper, :host-context([dir=rtl]).textarea-label-placement-stacked .label-text-wrapper, :host-context([dir=rtl]):host(.textarea-label-placement-floating) .label-text-wrapper, :host-context([dir=rtl]).textarea-label-placement-floating .label-text-wrapper {
579
+ transform-origin: right top;
580
+ }
581
+
582
+ @supports selector(:dir(rtl)) {
583
+ :host(.textarea-label-placement-stacked:dir(rtl)) .label-text-wrapper, :host(.textarea-label-placement-floating:dir(rtl)) .label-text-wrapper {
584
+ transform-origin: right top;
585
+ }
586
+ }
587
+
588
+ /**
589
+ * Ensures the textarea does not
590
+ * overlap the label.
591
+ */
592
+ :host(.textarea-label-placement-stacked) textarea,
593
+ :host(.textarea-label-placement-floating) textarea,
594
+ :host(.textarea-label-placement-stacked[auto-grow]) .native-wrapper::after,
595
+ :host(.textarea-label-placement-floating[auto-grow]) .native-wrapper::after {
596
+ -webkit-margin-start: 0px;
597
+ margin-inline-start: 0px;
598
+ -webkit-margin-end: 0px;
599
+ margin-inline-end: 0px;
600
+ margin-top: 8px;
601
+ margin-bottom: 0px;
602
+ }
603
+
604
+ /**
605
+ * This makes the label sit over the textarea
606
+ * when the textarea is blurred and has no value.
607
+ */
608
+ :host(.textarea-label-placement-floating) .label-text-wrapper {
609
+ transform: translateY(100%) scale(1);
610
+ }
611
+
612
+ /**
613
+ * The textarea should be hidden when the label
614
+ * is on top of the textarea. This prevents the label
615
+ * from overlapping any placeholder value.
616
+ */
617
+ :host(.textarea-label-placement-floating) textarea {
618
+ opacity: 0;
619
+ }
620
+
621
+ :host(.has-focus.textarea-label-placement-floating) textarea,
622
+ :host(.has-value.textarea-label-placement-floating) textarea {
623
+ opacity: 1;
624
+ }
625
+
626
+ /**
627
+ * This makes the label sit above the textarea.
628
+ */
629
+ :host(.label-floating) .label-text-wrapper {
630
+ transform: translateY(50%) scale(0.75);
631
+ /**
632
+ * Label text should not extend
633
+ * beyond the bounds of the textarea.
634
+ */
635
+ max-width: calc(100% / 0.75);
636
+ }
637
+
638
+ .start-slot-wrapper,
639
+ .end-slot-wrapper {
640
+ display: flex;
641
+ flex-shrink: 0;
642
+ align-self: start;
643
+ }
644
+
645
+ :host(.textarea-fill-outline) {
646
+ --border-width: var(--ionic-border-size-025, 1px);
647
+ --border-color: var(--ionic-color-neutral-500, #a2a2a2);
648
+ }
649
+
650
+ :host(.textarea-fill-outline) .textarea-wrapper-inner {
651
+ /**
652
+ * The border should be relative to the inner wrapper
653
+ * so that it does not include the label.
654
+ */
655
+ position: relative;
656
+ }
657
+
658
+ :host(.textarea-fill-outline) .textarea-outline {
659
+ right: 0;
660
+ left: 0;
661
+ top: 0;
662
+ bottom: 0;
663
+ border-radius: var(--border-radius);
664
+ position: absolute;
665
+ width: 100%;
666
+ height: 100%;
667
+ pointer-events: none;
668
+ border: var(--border-width) var(--border-style) var(--border-color);
669
+ }
670
+
671
+ /**
672
+ * The bottom content should never have
673
+ * a border with the outline style.
674
+ */
675
+ :host(.textarea-fill-outline) .textarea-bottom {
676
+ border-top: none;
677
+ }
678
+
679
+ :host(.textarea-fill-outline) textarea {
680
+ margin-top: var(--ionic-space-100, 4px);
681
+ }
682
+
683
+ :host {
684
+ --border-radius: var(--ionic-border-radius-400, 16px);
685
+ --color: var(--ionic-color-neutral-1200, #242424);
686
+ --highlight-color-valid: var(--ionic-color-success-base, #1ba433);
687
+ --highlight-color-invalid: var(--ionic-color-danger-base, #e52929);
688
+ --placeholder-color: var(--ionic-color-neutral-800, #626262);
689
+ --placeholder-opacity: 1;
690
+ --background: var(--ionic-color-base-white, #ffffff);
691
+ font-size: var(--ionic-font-size-350, 0.875rem);
692
+ font-weight: var(--ionic-font-weight-regular, 400);
693
+ letter-spacing: var(--ionic-letter-spacing-0, 0);
694
+ line-height: var(--ionic-line-height-600, 24px);
695
+ text-decoration: none;
696
+ text-transform: none;
697
+ }
698
+
699
+ .textarea-wrapper-inner {
700
+ height: 0;
701
+ }
702
+
703
+ :host(.textarea-size-small) .textarea-wrapper-inner {
704
+ --padding-top: var(--ionic-space-200, 8px);
705
+ --padding-end: var(--ionic-space-300, 12px);
706
+ --padding-bottom: var(--ionic-space-200, 8px);
707
+ --padding-start: var(--ionic-space-300, 12px);
708
+ min-height: var(--ionic-scale-2800, 112px);
709
+ }
710
+
711
+ :host(.textarea-size-medium) .textarea-wrapper-inner {
712
+ --padding-top: var(--ionic-space-300, 12px);
713
+ --padding-end: var(--ionic-space-400, 16px);
714
+ --padding-bottom: var(--ionic-space-300, 12px);
715
+ --padding-start: var(--ionic-space-400, 16px);
716
+ min-height: var(--ionic-scale-3400, 136px);
717
+ }
718
+
719
+ :host(.textarea-size-large) .textarea-wrapper-inner {
720
+ --padding-top: var(--ionic-space-400, 16px);
721
+ --padding-end: var(--ionic-space-500, 20px);
722
+ --padding-bottom: var(--ionic-space-400, 16px);
723
+ --padding-start: var(--ionic-space-500, 20px);
724
+ min-height: var(--ionic-scale-3600, 144px);
725
+ }
726
+
727
+ .textarea-wrapper {
728
+ gap: var(--ionic-space-100, 4px);
729
+ }
730
+
731
+ .textarea-wrapper-inner {
732
+ -webkit-padding-start: var(--padding-start);
733
+ padding-inline-start: var(--padding-start);
734
+ -webkit-padding-end: var(--padding-end);
735
+ padding-inline-end: var(--padding-end);
736
+ padding-top: var(--padding-top);
737
+ padding-bottom: var(--padding-bottom);
738
+ }
739
+
740
+ :host([auto-grow]) .textarea-wrapper-inner {
741
+ height: auto;
742
+ }
743
+
744
+ :host([auto-grow]) .native-wrapper {
745
+ min-height: inherit;
746
+ max-height: inherit;
747
+ }
748
+
749
+ .label-text-wrapper {
750
+ font-size: var(--ionic-font-size-300, 0.75rem);
751
+ font-weight: var(--ionic-font-weight-medium, 500);
752
+ letter-spacing: var(--ionic-letter-spacing-0, 0);
753
+ line-height: var(--ionic-line-height-500, 20px);
754
+ text-decoration: none;
755
+ text-transform: none;
756
+ color: var(--ionic-color-neutral-1000, #3b3b3b);
757
+ }
758
+
759
+ :host(.label-floating) .label-text-wrapper {
760
+ transform: none;
761
+ }
762
+
763
+ ion-icon {
764
+ color: var(--ionic-color-neutral-800, #626262);
765
+ font-size: var(--ionic-scale-400, 16px);
766
+ }
767
+
768
+ .start-slot-wrapper,
769
+ .end-slot-wrapper {
770
+ margin-top: var(--ionic-space-050, 2px);
771
+ }
772
+
773
+ .textarea-bottom {
774
+ -webkit-padding-start: var(--padding-start);
775
+ padding-inline-start: var(--padding-start);
776
+ -webkit-padding-end: var(--padding-end);
777
+ padding-inline-end: var(--padding-end);
778
+ padding-top: var(--ionic-space-100, 4px);
779
+ font-size: var(--ionic-font-size-300, 0.75rem);
780
+ font-weight: var(--ionic-font-weight-medium, 500);
781
+ letter-spacing: var(--ionic-letter-spacing-0, 0);
782
+ line-height: var(--ionic-line-height-500, 20px);
783
+ text-decoration: none;
784
+ text-transform: none;
785
+ }
786
+
787
+ .textarea-bottom .helper-text,
788
+ .textarea-bottom .counter {
789
+ color: var(--ionic-color-neutral-800, #626262);
790
+ }