@ionic/core 8.4.1-dev.11730889290.1eacfaf8 → 8.4.1-dev.11731604836.1a1f3fcc

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 (131) hide show
  1. package/components/ion-select-option.js +1 -1
  2. package/components/ion-select.js +18 -6
  3. package/components/ion-skeleton-text.js +2 -2
  4. package/components/ion-split-pane.js +2 -2
  5. package/components/ion-tab-bar.js +2 -2
  6. package/components/ion-tab-button.js +2 -2
  7. package/components/ion-tab.js +2 -2
  8. package/components/ion-tabs.js +1 -1
  9. package/components/ion-text.js +2 -2
  10. package/components/ion-textarea.js +3 -3
  11. package/components/ion-thumbnail.js +2 -2
  12. package/components/ion-toast.js +2 -2
  13. package/components/ion-toggle.js +3 -3
  14. package/components/item.js +1 -1
  15. package/components/radio.js +3 -3
  16. package/components/select-modal.js +3 -3
  17. package/components/select-popover.js +2 -2
  18. package/components/spinner.js +1 -1
  19. package/components/title.js +2 -2
  20. package/components/toolbar.js +2 -2
  21. package/dist/cjs/ion-app_8.cjs.entry.js +4 -4
  22. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  23. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  24. package/dist/cjs/ion-radio_2.cjs.entry.js +3 -3
  25. package/dist/cjs/ion-select-modal.cjs.entry.js +3 -3
  26. package/dist/cjs/ion-select_3.cjs.entry.js +21 -9
  27. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  28. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  29. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  30. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  31. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  32. package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
  33. package/dist/cjs/ion-toast.cjs.entry.js +2 -2
  34. package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
  35. package/dist/collection/components/item/item.ionic.css +0 -4
  36. package/dist/collection/components/radio/radio.ionic.css +6 -0
  37. package/dist/collection/components/radio/radio.ios.css +6 -6
  38. package/dist/collection/components/radio/radio.md.css +6 -6
  39. package/dist/collection/components/select/select.ionic.css +685 -0
  40. package/dist/collection/components/select/select.ios.css +148 -101
  41. package/dist/collection/components/select/select.js +16 -4
  42. package/dist/collection/components/select/select.md.css +140 -215
  43. package/dist/collection/components/select-modal/select-modal.ionic.css +121 -0
  44. package/dist/collection/components/select-modal/select-modal.js +3 -3
  45. package/dist/collection/components/select-option/select-option.js +1 -1
  46. package/dist/collection/components/select-popover/select-popover.js +2 -2
  47. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  48. package/dist/collection/components/spinner/spinner.js +1 -1
  49. package/dist/collection/components/split-pane/split-pane.js +2 -2
  50. package/dist/collection/components/tab/tab.js +2 -2
  51. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  52. package/dist/collection/components/tab-button/tab-button.js +2 -2
  53. package/dist/collection/components/tabs/tabs.js +1 -1
  54. package/dist/collection/components/text/text.js +2 -2
  55. package/dist/collection/components/textarea/textarea.js +3 -3
  56. package/dist/collection/components/thumbnail/thumbnail.js +2 -2
  57. package/dist/collection/components/title/title.js +2 -2
  58. package/dist/collection/components/toast/toast.js +2 -2
  59. package/dist/collection/components/toggle/toggle.js +3 -3
  60. package/dist/collection/components/toolbar/toolbar.js +2 -2
  61. package/dist/docs.json +1 -1
  62. package/dist/esm/ion-app_8.entry.js +4 -4
  63. package/dist/esm/ion-avatar_3.entry.js +2 -2
  64. package/dist/esm/ion-item_8.entry.js +3 -3
  65. package/dist/esm/ion-radio_2.entry.js +3 -3
  66. package/dist/esm/ion-select-modal.entry.js +3 -3
  67. package/dist/esm/ion-select_3.entry.js +21 -9
  68. package/dist/esm/ion-spinner.entry.js +1 -1
  69. package/dist/esm/ion-split-pane.entry.js +2 -2
  70. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  71. package/dist/esm/ion-tab_2.entry.js +3 -3
  72. package/dist/esm/ion-text.entry.js +2 -2
  73. package/dist/esm/ion-textarea.entry.js +3 -3
  74. package/dist/esm/ion-toast.entry.js +2 -2
  75. package/dist/esm/ion-toggle.entry.js +3 -3
  76. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  77. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  78. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  79. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  80. package/dist/esm-es5/ion-select-modal.entry.js +1 -1
  81. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  82. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  83. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  84. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  85. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  86. package/dist/esm-es5/ion-text.entry.js +1 -1
  87. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  88. package/dist/esm-es5/ion-toast.entry.js +1 -1
  89. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  90. package/dist/ionic/ionic.esm.js +1 -1
  91. package/dist/ionic/p-0e80425f.system.entry.js +4 -0
  92. package/dist/ionic/{p-5e9730c2.entry.js → p-18892506.entry.js} +1 -1
  93. package/dist/ionic/p-25413edd.entry.js +4 -0
  94. package/dist/ionic/{p-578a8bdf.entry.js → p-29ca4da2.entry.js} +1 -1
  95. package/dist/ionic/{p-f83d18c1.entry.js → p-2e4c7fa3.entry.js} +1 -1
  96. package/dist/ionic/{p-fc8359aa.system.entry.js → p-398b00a5.system.entry.js} +1 -1
  97. package/dist/ionic/{p-08b2ba53.system.entry.js → p-5684893b.system.entry.js} +1 -1
  98. package/dist/ionic/{p-211b0fba.system.entry.js → p-5a1979e0.system.entry.js} +1 -1
  99. package/dist/ionic/{p-430d860e.entry.js → p-67f3ed57.entry.js} +1 -1
  100. package/dist/ionic/p-6a77b55a.entry.js +4 -0
  101. package/dist/ionic/{p-055ae36e.system.entry.js → p-787c1bd0.system.entry.js} +1 -1
  102. package/dist/ionic/{p-1fba8e90.system.entry.js → p-815f649a.system.entry.js} +1 -1
  103. package/dist/ionic/p-954d0d7c.system.entry.js +4 -0
  104. package/dist/ionic/p-9ac1a506.system.js +1 -1
  105. package/dist/ionic/{p-ea0b8c64.system.entry.js → p-a58b94c6.system.entry.js} +1 -1
  106. package/dist/ionic/p-a98061d0.entry.js +4 -0
  107. package/dist/ionic/{p-699c1e19.entry.js → p-adc0276b.entry.js} +1 -1
  108. package/dist/ionic/{p-f09c06e8.entry.js → p-c3ae4bcf.entry.js} +1 -1
  109. package/dist/ionic/{p-7557a7de.system.entry.js → p-c5226e15.system.entry.js} +1 -1
  110. package/dist/ionic/{p-ce46d44a.entry.js → p-cad8a848.entry.js} +1 -1
  111. package/dist/ionic/p-cf3dad24.entry.js +4 -0
  112. package/dist/ionic/p-df9c6620.system.entry.js +4 -0
  113. package/dist/ionic/{p-3f1e20d1.system.entry.js → p-ea98a10a.system.entry.js} +1 -1
  114. package/dist/ionic/{p-2978f27e.entry.js → p-eb4ba253.entry.js} +1 -1
  115. package/dist/ionic/{p-d7894208.entry.js → p-ee17be82.entry.js} +1 -1
  116. package/dist/ionic/p-ef60ee95.entry.js +4 -0
  117. package/dist/ionic/p-f1c1b477.system.entry.js +4 -0
  118. package/dist/ionic/{p-31fa1052.system.entry.js → p-f25ad420.system.entry.js} +1 -1
  119. package/dist/ionic/{p-3fc0ba02.system.entry.js → p-fff78cd2.system.entry.js} +1 -1
  120. package/hydrate/index.js +56 -44
  121. package/hydrate/index.mjs +56 -44
  122. package/package.json +1 -1
  123. package/dist/ionic/p-043483dc.entry.js +0 -4
  124. package/dist/ionic/p-06ca2619.system.entry.js +0 -4
  125. package/dist/ionic/p-35362c9f.entry.js +0 -4
  126. package/dist/ionic/p-458a2899.entry.js +0 -4
  127. package/dist/ionic/p-4edc0fda.system.entry.js +0 -4
  128. package/dist/ionic/p-6f941957.entry.js +0 -4
  129. package/dist/ionic/p-74a20601.system.entry.js +0 -4
  130. package/dist/ionic/p-a42eccfb.entry.js +0 -4
  131. package/dist/ionic/p-ce2e8a94.system.entry.js +0 -4
@@ -0,0 +1,685 @@
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
+ Do not edit directly, this file was auto-generated.
9
+ */ /**
10
+ * A heuristic that applies CSS to tablet
11
+ * viewports.
12
+ *
13
+ * Usage:
14
+ * @include tablet-viewport() {
15
+ * :host {
16
+ * background-color: green;
17
+ * }
18
+ * }
19
+ */
20
+ /**
21
+ * A heuristic that applies CSS to mobile
22
+ * viewports (i.e. phones, not tablets).
23
+ *
24
+ * Usage:
25
+ * @include mobile-viewport() {
26
+ * :host {
27
+ * background-color: blue;
28
+ * }
29
+ * }
30
+ */
31
+ /**
32
+ * Convert a font size to a dynamic font size.
33
+ * Fonts that participate in Dynamic Type should use
34
+ * dynamic font sizes.
35
+ * @param size - The initial font size including the unit (i.e. px or pt)
36
+ * @param unit (optional) - The unit to convert to. Use this if you want to
37
+ * convert to a unit other than $baselineUnit.
38
+ */
39
+ /**
40
+ * Convert a font size to a dynamic font size but impose
41
+ * a maximum font size.
42
+ * @param size - The initial font size including the unit (i.e. px or pt)
43
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
44
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
45
+ * convert to a unit other than $baselineUnit.
46
+ */
47
+ /**
48
+ * Convert a font size to a dynamic font size but impose
49
+ * a minimum font size.
50
+ * @param size - The initial font size including the unit (i.e. px or pt)
51
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
52
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
53
+ * convert to a unit other than $baselineUnit.
54
+ */
55
+ /**
56
+ * Convert a font size to a dynamic font size but impose
57
+ * maximum and minimum font sizes.
58
+ * @param size - The initial font size including the unit (i.e. px or pt)
59
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
60
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
61
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
62
+ * convert to a unit other than $baselineUnit.
63
+ */
64
+ :host {
65
+ /**
66
+ * @prop --background: Background of the select
67
+ * @prop --padding-top: Top padding of the select
68
+ * @prop --padding-end: Right padding if direction is left-to-right, and left padding if direction is right-to-left of the select
69
+ * @prop --padding-bottom: Bottom padding of the select
70
+ * @prop --padding-start: Left padding if direction is left-to-right, and right padding if direction is right-to-left of the select
71
+ *
72
+ * @prop --placeholder-color: Color of the select placeholder text
73
+ * @prop --placeholder-opacity: Opacity of the select placeholder text
74
+ *
75
+ * @prop --highlight-height: The height of the highlight on the select. Only applies to md mode.
76
+ * @prop --highlight-color-focused: The color of the highlight on the select when focused
77
+ * @prop --highlight-color-invalid: The color of the highlight on the select when invalid
78
+ * @prop --highlight-color-valid: The color of the highlight on the select when valid
79
+ *
80
+ * @prop --border-color: Color of the select border
81
+ * @prop --border-radius: Radius of the select border. A large radius may display unevenly when using fill="outline"; if needed, use shape="round" instead or increase --padding-start.
82
+ * @prop --border-style: Style of the select border
83
+ * @prop --border-width: Width of the select border
84
+ *
85
+ * @prop --ripple-color: The color of the ripple effect on MD mode.
86
+ */
87
+ --padding-top: 0px;
88
+ --padding-end: 0px;
89
+ --padding-bottom: 0px;
90
+ --padding-start: 0px;
91
+ --placeholder-color: currentColor;
92
+ --background: transparent;
93
+ --border-style: solid;
94
+ --highlight-color-focused: ion-color(primary, base);
95
+ --highlight-color-valid: ion-color(success, base);
96
+ --highlight-color-invalid: ion-color(danger, base);
97
+ /**
98
+ * This is a private API that is used to switch
99
+ * out the highlight color based on the state
100
+ * of the component without having to write
101
+ * different selectors for different fill variants.
102
+ */
103
+ --highlight-color: var(--highlight-color-focused);
104
+ display: block;
105
+ position: relative;
106
+ width: 100%;
107
+ min-height: 44px;
108
+ white-space: nowrap;
109
+ cursor: pointer;
110
+ }
111
+
112
+ /**
113
+ * Since the label sits on top of the element,
114
+ * the component needs to be taller otherwise the
115
+ * label will appear too close to the select text.
116
+ */
117
+ :host(.select-label-placement-floating),
118
+ :host(.select-label-placement-stacked) {
119
+ min-height: 56px;
120
+ }
121
+
122
+ :host(.ion-color) {
123
+ --highlight-color-focused: current-color(base);
124
+ }
125
+
126
+ :host(.in-item) {
127
+ flex: 1 1 0;
128
+ }
129
+
130
+ :host(.select-disabled) {
131
+ pointer-events: none;
132
+ }
133
+
134
+ :host(.ion-focused) button {
135
+ border: 2px solid #5e9ed6;
136
+ }
137
+
138
+ /**
139
+ * Select can be slotted
140
+ * in components such as item and
141
+ * toolbar which is why we do not
142
+ * limit the below behavior to just ion-item.
143
+ */
144
+ :host([slot=start]),
145
+ :host([slot=end]) {
146
+ flex: initial;
147
+ width: auto;
148
+ }
149
+
150
+ .select-placeholder {
151
+ color: var(--placeholder-color);
152
+ opacity: var(--placeholder-opacity);
153
+ }
154
+
155
+ button {
156
+ position: absolute;
157
+ top: 0;
158
+ right: 0;
159
+ bottom: 0;
160
+ left: 0;
161
+ width: 100%;
162
+ height: 100%;
163
+ margin: 0;
164
+ padding: 0;
165
+ border: 0;
166
+ outline: 0;
167
+ opacity: 0;
168
+ overflow: hidden;
169
+ clip: rect(0 0 0 0);
170
+ -webkit-appearance: none;
171
+ -moz-appearance: none;
172
+ }
173
+
174
+ .select-icon {
175
+ /**
176
+ * Prevent the icon from shrinking when the label and/or
177
+ * selected item text is long enough to fill the rest of
178
+ * the container.
179
+ */
180
+ flex-shrink: 0;
181
+ }
182
+
183
+ /**
184
+ * Ensure that the select icon has
185
+ * the correct color contrast when
186
+ * used inside of an item.
187
+ */
188
+ :host(.in-item-color) .select-icon {
189
+ color: inherit;
190
+ }
191
+
192
+ /**
193
+ * This positions the icon at the correct
194
+ * edge of the component with LTR and RTL
195
+ * text directions. The position mixin cannot be
196
+ * used here because the icon is in the Shadow DOM.
197
+ */
198
+ :host(.select-ltr.select-label-placement-stacked) .select-icon,
199
+ :host(.select-ltr.select-label-placement-floating) .select-icon {
200
+ right: var(--padding-end, 0);
201
+ }
202
+
203
+ :host(.select-rtl.select-label-placement-stacked) .select-icon,
204
+ :host(.select-rtl.select-label-placement-floating) .select-icon {
205
+ left: var(--padding-start, 0);
206
+ }
207
+
208
+ .select-text {
209
+ flex: 1;
210
+ min-width: 16px;
211
+ font-size: inherit;
212
+ text-overflow: ellipsis;
213
+ white-space: inherit;
214
+ overflow: hidden;
215
+ }
216
+
217
+ .select-wrapper {
218
+ display: flex;
219
+ position: relative;
220
+ flex-grow: 1;
221
+ align-items: center;
222
+ justify-content: space-between;
223
+ height: inherit;
224
+ /**
225
+ * This allows developers to set the height
226
+ * on the host of the element but still have
227
+ * the label take up the full height
228
+ * of the parent.
229
+ */
230
+ min-height: inherit;
231
+ transition: background-color 15ms linear;
232
+ background: var(--background);
233
+ line-height: normal;
234
+ cursor: inherit;
235
+ box-sizing: border-box;
236
+ }
237
+
238
+ .select-wrapper .select-placeholder {
239
+ /**
240
+ * When the floating label appears on top of the
241
+ * select, we need to fade the text out so that the
242
+ * label does not overlap with the placeholder.
243
+ */
244
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
245
+ }
246
+
247
+ .select-wrapper-inner {
248
+ display: flex;
249
+ align-items: center;
250
+ overflow: hidden;
251
+ }
252
+
253
+ :host(.select-label-placement-stacked) .select-wrapper-inner,
254
+ :host(.select-label-placement-floating) .select-wrapper-inner {
255
+ /**
256
+ * When using a stacked/floating label, the inner wrapper is
257
+ * stacked vertically under the label container. This line
258
+ * ensures that the inner wrapper fills all the remaining height
259
+ * of the component.
260
+ */
261
+ flex-grow: 1;
262
+ }
263
+
264
+ :host(.ion-touched.ion-invalid) {
265
+ --highlight-color: var(--highlight-color-invalid);
266
+ }
267
+
268
+ /**
269
+ * The component highlight is only shown
270
+ * on focus, so we can safely set the valid
271
+ * color state when touched/valid. If we
272
+ * set it when .has-focus is present then
273
+ * the highlight color would change
274
+ * from the valid color to the component's
275
+ * color during the transition after the
276
+ * component loses focus.
277
+ */
278
+ :host(.ion-valid) {
279
+ --highlight-color: var(--highlight-color-valid);
280
+ }
281
+
282
+ .label-text-wrapper {
283
+ /**
284
+ * This causes the label to take up
285
+ * the entire height of its container
286
+ * while still keeping the text centered.
287
+ */
288
+ display: flex;
289
+ align-items: center;
290
+ /**
291
+ * Label text should not extend
292
+ * beyond the bounds of the select.
293
+ * However, we do not set the max
294
+ * width to 100% because then
295
+ * only the label would show and users
296
+ * would not be able to see what they are typing.
297
+ */
298
+ max-width: 200px;
299
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
300
+ /**
301
+ * This ensures that double tapping this text
302
+ * clicks the <label> and focuses the input
303
+ * when a screen reader is enabled.
304
+ */
305
+ pointer-events: none;
306
+ }
307
+
308
+ /**
309
+ * We need to use two elements instead of
310
+ * one. The .label-text-wrapper is responsible
311
+ * for centering the label text vertically regardless
312
+ * of the input height using flexbox.
313
+ *
314
+ * The .label-text element is responsible for controlling
315
+ * overflow when label-placement="fixed".
316
+ * We want the ellipses to show up when the
317
+ * fixed label overflows, but text-overflow: ellipsis only
318
+ * works on block-level elements. A flex item is
319
+ * considered blockified (https://www.w3.org/TR/css-display-3/#blockify).
320
+ */
321
+ .label-text,
322
+ ::slotted([slot=label]) {
323
+ text-overflow: ellipsis;
324
+ white-space: nowrap;
325
+ overflow: hidden;
326
+ }
327
+
328
+ /**
329
+ * If no label text is placed into the slot
330
+ * then the element should be hidden otherwise
331
+ * there will be additional margins added.
332
+ */
333
+ .label-text-wrapper-hidden,
334
+ .select-outline-notch-hidden {
335
+ display: none;
336
+ }
337
+
338
+ .native-wrapper {
339
+ display: flex;
340
+ align-items: center;
341
+ /**
342
+ * When the floating label appears on top of the
343
+ * input, we need to fade the input out so that the
344
+ * label does not overlap with the placeholder.
345
+ */
346
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
347
+ /**
348
+ * This ensures that the .select-text gets
349
+ * truncated with ellipses when the text is
350
+ * too long for the screen.
351
+ */
352
+ overflow: hidden;
353
+ }
354
+
355
+ :host(.select-justify-space-between) .select-wrapper {
356
+ justify-content: space-between;
357
+ }
358
+
359
+ :host(.select-justify-start) .select-wrapper {
360
+ justify-content: start;
361
+ }
362
+
363
+ :host(.select-justify-end) .select-wrapper {
364
+ justify-content: end;
365
+ }
366
+
367
+ /**
368
+ * Label is on the left of the input in LTR and
369
+ * on the right in RTL.
370
+ */
371
+ :host(.select-label-placement-start) .select-wrapper {
372
+ flex-direction: row;
373
+ }
374
+
375
+ /**
376
+ * Label is on the right of the select in LTR and
377
+ * on the left in RTL.
378
+ */
379
+ :host(.select-label-placement-end) .select-wrapper {
380
+ flex-direction: row-reverse;
381
+ }
382
+
383
+ /**
384
+ * Label is on the left of the select in LTR and
385
+ * on the right in RTL. Label also has a fixed width.
386
+ */
387
+ :host(.select-label-placement-fixed) .label-text-wrapper {
388
+ flex: 0 0 100px;
389
+ width: 100px;
390
+ min-width: 100px;
391
+ max-width: 200px;
392
+ }
393
+
394
+ /**
395
+ * Stacked: Label sits above the select and is scaled down.
396
+ * Floating: Label sits over the select when the select has no
397
+ * value and is blurred. Label sits above the input and is scaled
398
+ * down when the select is focused or has a value.
399
+ *
400
+ */
401
+ :host(.select-label-placement-stacked) .select-wrapper,
402
+ :host(.select-label-placement-floating) .select-wrapper {
403
+ flex-direction: column;
404
+ align-items: start;
405
+ }
406
+
407
+ /**
408
+ * Ensures that the label animates
409
+ * up and to the left in LTR or
410
+ * up and to the right in RTL.
411
+ */
412
+ :host(.select-label-placement-stacked) .label-text-wrapper,
413
+ :host(.select-label-placement-floating) .label-text-wrapper {
414
+ max-width: 100%;
415
+ }
416
+
417
+ :host(.select-ltr.select-label-placement-stacked) .label-text-wrapper,
418
+ :host(.select-ltr.select-label-placement-floating) .label-text-wrapper {
419
+ transform-origin: left top;
420
+ }
421
+
422
+ :host(.select-rtl.select-label-placement-stacked) .label-text-wrapper,
423
+ :host(.select-rtl.select-label-placement-floating) .label-text-wrapper {
424
+ transform-origin: right top;
425
+ }
426
+
427
+ /**
428
+ * Ensures the select does not
429
+ * overlap the label.
430
+ * Also ensure that the native wrapper
431
+ * takes up the remaining available height and width.
432
+ */
433
+ :host(.select-label-placement-stacked) .native-wrapper,
434
+ :host(.select-label-placement-floating) .native-wrapper {
435
+ flex-grow: 1;
436
+ width: 100%;
437
+ }
438
+
439
+ /**
440
+ * The placeholder should be hidden when the label
441
+ * is on top of the select. This prevents the label
442
+ * from overlapping any placeholder value.
443
+ *
444
+ * TODO(FW-5592): Remove :not(.label-floating) piece
445
+ */
446
+ :host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder {
447
+ opacity: 0;
448
+ }
449
+
450
+ /**
451
+ * We don't use .label-floating here because that would
452
+ * also include the case where the label is floating due
453
+ * to content in the start/end slot. We want the opacity
454
+ * to remain at the default in this case, since the select
455
+ * isn't being actively interacted with.
456
+ *
457
+ * TODO(FW-5592): Change entire selector to:
458
+ * :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder
459
+ */
460
+ :host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,
461
+ :host(.ion-focused.select-label-placement-floating) .native-wrapper .select-placeholder,
462
+ :host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder {
463
+ opacity: 1;
464
+ }
465
+
466
+ ::slotted([slot=start]),
467
+ ::slotted([slot=end]) {
468
+ /**
469
+ * Prevent the slots from shrinking when the label and/or
470
+ * selected item text is long enough to fill the rest of
471
+ * the container.
472
+ */
473
+ flex-shrink: 0;
474
+ }
475
+
476
+ ::slotted([slot=start]:last-of-type) {
477
+ margin-inline-start: 0;
478
+ }
479
+
480
+ ::slotted([slot=end]:first-of-type) {
481
+ margin-inline-end: 0;
482
+ }
483
+
484
+ :host(.ion-color) {
485
+ --border-color: var(--ion-color-base);
486
+ }
487
+
488
+ :host(.select-fill-outline) .label-text-wrapper {
489
+ /**
490
+ * The label should appear on top of an outline
491
+ * container that overlaps it so it is always clickable.
492
+ */
493
+ position: relative;
494
+ }
495
+
496
+ :host(.select-fill-outline) .select-wrapper-inner {
497
+ border-radius: var(--border-radius);
498
+ -webkit-padding-start: var(--padding-start);
499
+ padding-inline-start: var(--padding-start);
500
+ -webkit-padding-end: var(--padding-end);
501
+ padding-inline-end: var(--padding-end);
502
+ padding-top: var(--padding-top);
503
+ padding-bottom: var(--padding-bottom);
504
+ /**
505
+ * Apply the background to the native select
506
+ * wrapper to only style the select.
507
+ */
508
+ background: var(--background);
509
+ }
510
+
511
+ :host(.select-fill-outline) .select-outline {
512
+ right: 0;
513
+ left: 0;
514
+ top: 0;
515
+ bottom: 0;
516
+ border-radius: var(--border-radius);
517
+ position: absolute;
518
+ width: 100%;
519
+ height: 100%;
520
+ pointer-events: none;
521
+ border: var(--border-width) var(--border-style) var(--border-color);
522
+ box-sizing: border-box;
523
+ }
524
+
525
+ :host {
526
+ --background: var(--ion-primitives-base-white, #ffffff);
527
+ --border-color: var(--ion-color-neutral);
528
+ --border-radius: var(--ion-border-radius-400, 16px);
529
+ --border-width: var(--ion-border-size-025, 1px);
530
+ --padding-start: var(--ion-space-400, 16px);
531
+ --padding-end: var(--ion-space-400, 16px);
532
+ --padding-top: var(--ion-space-300, 12px);
533
+ --padding-bottom: var(--ion-space-300, 12px);
534
+ --placeholder-color: var(--ion-primitives-neutral-800, #626262);
535
+ --placeholder-opacity: 1;
536
+ }
537
+
538
+ .label-text-wrapper {
539
+ font-size: var(--ion-font-size-300, 0.75rem);
540
+ font-weight: var(--ion-font-weight-medium, 500);
541
+ letter-spacing: var(--ion-font-letter-spacing-0, 0%);
542
+ line-height: var(--ion-font-line-height-500, 20px);
543
+ text-decoration: none;
544
+ text-transform: none;
545
+ color: var(--ion-primitives-neutral-1000, #3b3b3b);
546
+ }
547
+
548
+ :host(.select-label-placement-start) .label-text-wrapper,
549
+ :host(.select-label-placement-fixed) .label-text-wrapper {
550
+ /**
551
+ * The margin between the label and
552
+ * the select should be on the end
553
+ * when the label sits at the start.
554
+ */
555
+ -webkit-margin-start: 0;
556
+ margin-inline-start: 0;
557
+ -webkit-margin-end: var(--ion-space-100, 4px);
558
+ margin-inline-end: var(--ion-space-100, 4px);
559
+ margin-top: 0;
560
+ margin-bottom: 0;
561
+ }
562
+
563
+ :host(.select-label-placement-end) .label-text-wrapper {
564
+ /**
565
+ * The margin between the label and
566
+ * the select should be on the start
567
+ * when the label sits at the end.
568
+ */
569
+ -webkit-margin-start: var(--ion-space-100, 4px);
570
+ margin-inline-start: var(--ion-space-100, 4px);
571
+ -webkit-margin-end: 0;
572
+ margin-inline-end: 0;
573
+ margin-top: 0;
574
+ margin-bottom: 0;
575
+ }
576
+
577
+ :host(.select-label-placement-stacked) .label-text-wrapper,
578
+ :host(.select-label-placement-floating) .label-text-wrapper {
579
+ /**
580
+ * The margin between the label and
581
+ * the select should be on the bottom
582
+ * when the label sits at the top.
583
+ */
584
+ margin-left: 0;
585
+ margin-right: 0;
586
+ margin-top: 0;
587
+ margin-bottom: var(--ion-space-100, 4px);
588
+ }
589
+
590
+ .select-wrapper {
591
+ min-width: var(--ion-scale-5000, 200px);
592
+ background: transparent;
593
+ }
594
+
595
+ .select-wrapper-inner {
596
+ border-radius: var(--border-radius);
597
+ -webkit-padding-start: var(--padding-start);
598
+ padding-inline-start: var(--padding-start);
599
+ -webkit-padding-end: var(--padding-end);
600
+ padding-inline-end: var(--padding-end);
601
+ padding-top: var(--padding-top);
602
+ padding-bottom: var(--padding-bottom);
603
+ position: relative;
604
+ height: var(--ion-scale-1200, 48px);
605
+ background: var(--background);
606
+ box-sizing: border-box;
607
+ gap: var(--ion-space-200, 8px);
608
+ }
609
+
610
+ :host(.select-label-placement-stacked) .select-wrapper-inner,
611
+ :host(.select-label-placement-floating) .select-wrapper-inner {
612
+ width: 100%;
613
+ }
614
+
615
+ .native-wrapper {
616
+ font-size: var(--ion-font-size-350, 0.875rem);
617
+ font-weight: var(--ion-font-weight-regular, 400);
618
+ letter-spacing: var(--ion-font-letter-spacing-0, 0%);
619
+ line-height: var(--ion-font-line-height-600, 24px);
620
+ text-decoration: none;
621
+ text-transform: none;
622
+ color: var(--ion-primitives-neutral-1200, #242424);
623
+ }
624
+
625
+ :host(.select-label-placement-stacked) .native-wrapper,
626
+ :host(.select-label-placement-floating) .native-wrapper {
627
+ /**
628
+ * Text should not extend beyond the bounds of the select.
629
+ * This is done by setting the width to the full width minus
630
+ * the icon width and the gap between the icon and the text.
631
+ */
632
+ width: calc(100% - var(--ion-scale-400, 16px) - var(--ion-space-200, 8px));
633
+ }
634
+
635
+ /**
636
+ * Slotted buttons have a lot of default padding that can
637
+ * cause them to look misaligned from other pieces such
638
+ * as the control's label, especially when using a clear
639
+ * fill. We also make them circular to ensure that non-
640
+ * clear buttons and the focus/hover state on clear ones
641
+ * don't look too crowded.
642
+ */
643
+ ::slotted(ion-button[slot=start].button-has-icon-only),
644
+ ::slotted(ion-button[slot=end].button-has-icon-only) {
645
+ --border-radius: 50%;
646
+ --padding-start: 8px;
647
+ --padding-end: 8px;
648
+ --padding-top: 8px;
649
+ --padding-bottom: 8px;
650
+ aspect-ratio: 1;
651
+ }
652
+
653
+ .select-icon,
654
+ ::slotted(ion-icon) {
655
+ width: var(--ion-scale-400, 16px);
656
+ height: var(--ion-scale-400, 16px);
657
+ }
658
+
659
+ .select-icon {
660
+ transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);
661
+ }
662
+
663
+ /**
664
+ * This rotates the chevron icon
665
+ * when the select is activated.
666
+ * This should only happen on MD.
667
+ */
668
+ :host(.select-expanded:not(.has-expanded-icon)) .select-icon {
669
+ transform: rotate(180deg);
670
+ }
671
+
672
+ .select-icon {
673
+ color: var(--ion-primitives-neutral-800, #626262);
674
+ }
675
+
676
+ :host(.select-disabled) {
677
+ --background: var(--ion-primitives-neutral-100, #f5f5f5);
678
+ --border-color: var(--ion-primitives-neutral-300, #cfcfcf);
679
+ }
680
+
681
+ :host(.select-disabled) .label-text-wrapper,
682
+ :host(.select-disabled) .select-text,
683
+ :host(.select-disabled) .select-icon {
684
+ color: var(--ion-primitives-neutral-500, #a2a2a2);
685
+ }