@ionic/core 7.5.8-dev.11701894917.1c1465bd → 7.5.8-dev.11702074871.1238046f

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 (198) hide show
  1. package/components/data.js +1 -1
  2. package/components/ion-datetime.js +39 -30
  3. package/components/ion-picker-column-option.d.ts +11 -0
  4. package/components/ion-picker-column-option.js +9 -0
  5. package/components/ion-picker-column.js +2 -2
  6. package/components/ion-picker-legacy-column.d.ts +11 -0
  7. package/components/ion-picker-legacy-column.js +9 -0
  8. package/components/{ion-picker-internal.d.ts → ion-picker-legacy.d.ts} +4 -4
  9. package/components/ion-picker-legacy.js +309 -0
  10. package/components/ion-picker.js +1 -309
  11. package/components/overlays.js +6 -3
  12. package/components/picker-column-option.js +122 -0
  13. package/components/picker-column.js +351 -322
  14. package/components/picker-column2.js +379 -0
  15. package/components/{picker-internal.js → picker.js} +29 -22
  16. package/dist/cjs/{data-36b9094e.js → data-e7526b58.js} +1 -1
  17. package/dist/cjs/index.cjs.js +1 -1
  18. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  19. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  20. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  21. package/dist/cjs/ion-datetime_3.cjs.entry.js +29 -35
  22. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  23. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  24. package/dist/cjs/ion-modal.cjs.entry.js +1 -1
  25. package/dist/cjs/ion-picker-column-option.cjs.entry.js +104 -0
  26. package/dist/cjs/{ion-picker-column-internal.cjs.entry.js → ion-picker-column.cjs.entry.js} +104 -87
  27. package/dist/cjs/{ion-picker-internal.cjs.entry.js → ion-picker.cjs.entry.js} +26 -19
  28. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  29. package/dist/cjs/ion-select_3.cjs.entry.js +1 -1
  30. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  31. package/dist/cjs/ionic.cjs.js +1 -1
  32. package/dist/cjs/loader.cjs.js +1 -1
  33. package/dist/cjs/{overlays-2c6b1072.js → overlays-e8e05b0e.js} +6 -3
  34. package/dist/collection/collection-manifest.json +7 -6
  35. package/dist/collection/components/datetime/datetime.ios.css +8 -13
  36. package/dist/collection/components/datetime/datetime.js +19 -16
  37. package/dist/collection/components/datetime/datetime.md.css +8 -13
  38. package/dist/collection/components/datetime/test/datetime.e2e.js +2 -2
  39. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  40. package/dist/collection/components/datetime/test/locale/datetime.e2e.js +2 -2
  41. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +6 -6
  42. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +43 -41
  43. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  44. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
  45. package/dist/collection/components/datetime/test/values/datetime.e2e.js +15 -12
  46. package/dist/collection/components/datetime/utils/data.js +1 -1
  47. package/dist/collection/components/picker/picker.ios.css +113 -211
  48. package/dist/collection/components/picker/picker.js +468 -743
  49. package/dist/collection/components/picker/picker.md.css +109 -198
  50. package/dist/collection/components/{picker-internal/test/a11y/picker-internal.e2e.js → picker/test/a11y/picker.e2e.js} +2 -2
  51. package/dist/collection/components/picker/test/basic/picker.e2e.js +99 -13
  52. package/dist/collection/components/picker/test/custom/picker.e2e.js +85 -0
  53. package/dist/collection/components/{picker-internal/test/keyboard-entry/picker-internal.e2e.js → picker/test/keyboard-entry/picker.e2e.js} +63 -32
  54. package/dist/collection/components/{picker-column-internal/picker-column-internal.md.css → picker-column/picker-column.css} +96 -83
  55. package/dist/collection/components/picker-column/picker-column.js +497 -335
  56. package/dist/collection/components/{picker-column-internal/test/basic/picker-column-internal.e2e.js → picker-column/test/basic/picker-column.e2e.js} +8 -8
  57. package/dist/collection/components/picker-column/test/disabled/picker-column.e2e.js +91 -0
  58. package/dist/collection/components/picker-column/test/slots/picker-column.e2e.js +39 -0
  59. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +87 -0
  60. package/dist/collection/components/picker-column-option/picker-column-option.js +173 -0
  61. package/dist/collection/components/{picker-column-internal/picker-column-internal.ios.css → picker-column-option/picker-column-option.md.css} +6 -53
  62. package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +18 -0
  63. package/dist/collection/components/picker-column-option/test/basic/picker-column-option.e2e.js +37 -0
  64. package/dist/collection/components/picker-column-option/test/picker-column-option.spec.js +29 -0
  65. package/dist/collection/components/{picker-internal/picker-internal.md.css → picker-legacy/picker.ios.css} +207 -98
  66. package/dist/collection/components/picker-legacy/picker.js +817 -0
  67. package/dist/collection/components/{picker-internal/picker-internal.ios.css → picker-legacy/picker.md.css} +192 -100
  68. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +25 -0
  69. package/dist/collection/components/{picker → picker-legacy}/test/is-open/picker.e2e.js +4 -4
  70. package/dist/collection/components/{picker → picker-legacy}/test/picker-id.spec.js +5 -5
  71. package/dist/collection/components/{picker → picker-legacy}/test/trigger/picker.e2e.js +1 -1
  72. package/dist/collection/components/picker-legacy-column/picker-column.js +419 -0
  73. package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column-aria.spec.js +3 -3
  74. package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column-dynamic.spec.js +2 -2
  75. package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column.spec.js +2 -2
  76. package/dist/collection/components/{picker-column → picker-legacy-column}/test/standalone/picker-column.e2e.js +3 -3
  77. package/dist/collection/utils/overlays.js +6 -3
  78. package/dist/docs.json +493 -24
  79. package/dist/esm/{data-f5c75b4e.js → data-4b9508c9.js} +1 -1
  80. package/dist/esm/index.js +1 -1
  81. package/dist/esm/ion-action-sheet.entry.js +1 -1
  82. package/dist/esm/ion-alert.entry.js +1 -1
  83. package/dist/esm/ion-datetime-button.entry.js +1 -1
  84. package/dist/esm/ion-datetime_3.entry.js +28 -34
  85. package/dist/esm/ion-loading.entry.js +1 -1
  86. package/dist/esm/ion-menu_3.entry.js +1 -1
  87. package/dist/esm/ion-modal.entry.js +1 -1
  88. package/dist/esm/ion-picker-column-option.entry.js +100 -0
  89. package/dist/esm/{ion-picker-column-internal.entry.js → ion-picker-column.entry.js} +104 -87
  90. package/dist/esm/{ion-picker-internal.entry.js → ion-picker.entry.js} +26 -19
  91. package/dist/esm/ion-popover.entry.js +1 -1
  92. package/dist/esm/ion-select_3.entry.js +1 -1
  93. package/dist/esm/ion-toast.entry.js +1 -1
  94. package/dist/esm/ionic.js +1 -1
  95. package/dist/esm/loader.js +1 -1
  96. package/dist/esm/{overlays-d23ea6e1.js → overlays-fbc5cab5.js} +6 -3
  97. package/dist/esm-es5/index.js +1 -1
  98. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  99. package/dist/esm-es5/ion-alert.entry.js +1 -1
  100. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  101. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  102. package/dist/esm-es5/ion-loading.entry.js +1 -1
  103. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  104. package/dist/esm-es5/ion-modal.entry.js +1 -1
  105. package/dist/esm-es5/ion-picker-column-option.entry.js +4 -0
  106. package/dist/esm-es5/ion-picker-column.entry.js +4 -0
  107. package/dist/esm-es5/ion-picker.entry.js +4 -0
  108. package/dist/esm-es5/ion-popover.entry.js +1 -1
  109. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  110. package/dist/esm-es5/ion-toast.entry.js +1 -1
  111. package/dist/esm-es5/ionic.js +1 -1
  112. package/dist/esm-es5/loader.js +1 -1
  113. package/dist/esm-es5/overlays-fbc5cab5.js +4 -0
  114. package/dist/html.html-data.json +152 -1
  115. package/dist/ionic/index.esm.js +1 -1
  116. package/dist/ionic/ionic.esm.js +1 -1
  117. package/dist/ionic/{p-2f300cca.entry.js → p-21c3515a.entry.js} +1 -1
  118. package/dist/ionic/{p-1f620cd4.system.entry.js → p-26798a7b.system.entry.js} +1 -1
  119. package/dist/ionic/{p-e1e5afe1.system.entry.js → p-27bcbbc7.system.entry.js} +1 -1
  120. package/dist/ionic/p-36d194c5.entry.js +4 -0
  121. package/dist/ionic/{p-3b568d18.entry.js → p-4a081ea9.entry.js} +1 -1
  122. package/dist/ionic/{p-2f2293da.system.entry.js → p-4a36430f.system.entry.js} +1 -1
  123. package/dist/ionic/{p-fff7a57e.system.js → p-54dfc9b5.system.js} +1 -1
  124. package/dist/ionic/{p-60b386c9.system.entry.js → p-563c41f0.system.entry.js} +1 -1
  125. package/dist/ionic/p-5a1aac13.system.entry.js +4 -0
  126. package/dist/ionic/{p-27ea6f4e.entry.js → p-5d42b6b4.entry.js} +1 -1
  127. package/dist/ionic/{p-2dc43d20.entry.js → p-6b7c55cd.entry.js} +1 -1
  128. package/dist/ionic/{p-f78efbd1.entry.js → p-73190c5f.entry.js} +1 -1
  129. package/dist/ionic/{p-af19a573.entry.js → p-73aa7604.entry.js} +1 -1
  130. package/dist/ionic/{p-39a335b6.system.entry.js → p-8017aad2.system.entry.js} +1 -1
  131. package/dist/ionic/{p-1e57bd24.entry.js → p-846ee227.entry.js} +1 -1
  132. package/dist/ionic/p-8e42850f.entry.js +4 -0
  133. package/dist/ionic/p-8fa6583d.system.js +4 -0
  134. package/dist/ionic/{p-4df97e3c.system.entry.js → p-96dbbac1.system.entry.js} +1 -1
  135. package/dist/ionic/p-9f1b2214.entry.js +4 -0
  136. package/dist/ionic/{p-8780cc2a.entry.js → p-a8baa23e.entry.js} +1 -1
  137. package/dist/ionic/p-afcf4620.entry.js +4 -0
  138. package/dist/ionic/{p-ddb30596.entry.js → p-b133e9b4.entry.js} +1 -1
  139. package/dist/ionic/{p-3e3d06a6.system.entry.js → p-c18de88a.system.entry.js} +1 -1
  140. package/dist/ionic/p-c41bff4e.system.entry.js +4 -0
  141. package/dist/ionic/p-ca846d0b.system.entry.js +4 -0
  142. package/dist/ionic/p-ca8938f4.js +4 -0
  143. package/dist/ionic/p-e3584231.system.js +1 -1
  144. package/dist/ionic/{p-9eec42cc.system.entry.js → p-f910cc73.system.entry.js} +1 -1
  145. package/dist/ionic/{p-e3ad9607.system.entry.js → p-fbf3a689.system.entry.js} +1 -1
  146. package/dist/ionic/p-ffd5dba4.system.entry.js +4 -0
  147. package/dist/types/components/datetime/utils/data.d.ts +11 -7
  148. package/dist/types/components/picker/picker-interfaces.d.ts +8 -0
  149. package/dist/types/components/picker/picker.d.ts +74 -131
  150. package/dist/types/components/picker-column/picker-column-interfaces.d.ts +4 -0
  151. package/dist/types/components/picker-column/picker-column.d.ts +99 -39
  152. package/dist/types/components/picker-column-option/picker-column-option.d.ts +66 -0
  153. package/dist/types/components/picker-legacy/picker.d.ts +158 -0
  154. package/dist/types/components/picker-legacy-column/picker-column.d.ts +46 -0
  155. package/dist/types/components.d.ts +155 -122
  156. package/dist/types/interface.d.ts +1 -1
  157. package/dist/types/utils/config.d.ts +2 -2
  158. package/dist/types/utils/overlays.d.ts +5 -2
  159. package/hydrate/index.js +1486 -1362
  160. package/package.json +1 -1
  161. package/components/ion-picker-column-internal.d.ts +0 -11
  162. package/components/ion-picker-column-internal.js +0 -9
  163. package/components/ion-picker-internal.js +0 -9
  164. package/components/picker-column-internal.js +0 -390
  165. package/dist/collection/components/picker-column-internal/picker-column-internal.js +0 -565
  166. package/dist/collection/components/picker-column-internal/test/disabled/picker-column-internal.e2e.js +0 -162
  167. package/dist/collection/components/picker-internal/picker-internal.js +0 -544
  168. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +0 -118
  169. package/dist/esm-es5/ion-picker-column-internal.entry.js +0 -4
  170. package/dist/esm-es5/ion-picker-internal.entry.js +0 -4
  171. package/dist/esm-es5/overlays-d23ea6e1.js +0 -4
  172. package/dist/ionic/p-60502e3f.system.entry.js +0 -4
  173. package/dist/ionic/p-67da080d.entry.js +0 -4
  174. package/dist/ionic/p-73ea8f82.system.entry.js +0 -4
  175. package/dist/ionic/p-80fa068e.entry.js +0 -4
  176. package/dist/ionic/p-ab11130c.system.js +0 -4
  177. package/dist/ionic/p-af16fe62.entry.js +0 -4
  178. package/dist/ionic/p-c14f8ac8.js +0 -4
  179. package/dist/ionic/p-cce9f61a.system.entry.js +0 -4
  180. package/dist/types/components/picker-column-internal/picker-column-internal-interfaces.d.ts +0 -5
  181. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +0 -102
  182. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +0 -8
  183. package/dist/types/components/picker-internal/picker-internal.d.ts +0 -102
  184. /package/dist/collection/components/{picker-internal/picker-internal-interfaces.js → picker/picker-interfaces.js} +0 -0
  185. /package/dist/collection/components/{picker-column-internal/picker-column-internal-interfaces.js → picker-column/picker-column-interfaces.js} +0 -0
  186. /package/dist/collection/components/{picker → picker-legacy}/animations/ios.enter.js +0 -0
  187. /package/dist/collection/components/{picker → picker-legacy}/animations/ios.leave.js +0 -0
  188. /package/dist/collection/components/{picker → picker-legacy}/picker-interface.js +0 -0
  189. /package/dist/collection/components/{picker-column → picker-legacy-column}/picker-column.ios.css +0 -0
  190. /package/dist/collection/components/{picker-column → picker-legacy-column}/picker-column.md.css +0 -0
  191. /package/dist/collection/components/{picker-column → picker-legacy-column}/test/test.utils.js +0 -0
  192. /package/dist/esm-es5/{data-f5c75b4e.js → data-4b9508c9.js} +0 -0
  193. /package/dist/ionic/{p-2aea8b1e.js → p-368f5215.js} +0 -0
  194. /package/dist/ionic/{p-82e3d633.system.js → p-f58981c2.system.js} +0 -0
  195. /package/dist/types/components/{picker → picker-legacy}/animations/ios.enter.d.ts +0 -0
  196. /package/dist/types/components/{picker → picker-legacy}/animations/ios.leave.d.ts +0 -0
  197. /package/dist/types/components/{picker → picker-legacy}/picker-interface.d.ts +0 -0
  198. /package/dist/types/components/{picker-column → picker-legacy-column}/test/test.utils.d.ts +0 -0
@@ -53,134 +53,6 @@
53
53
  * }
54
54
  * }
55
55
  */
56
- :host {
57
- /**
58
- * @prop --background: Background of the picker
59
- * @prop --background-rgb: Background of the picker in rgb format
60
- *
61
- * @prop --border-radius: Border radius of the picker
62
- * @prop --border-color: Border color of the picker
63
- * @prop --border-width: Border width of the picker
64
- * @prop --border-style: Border style of the picker
65
- *
66
- * @prop --min-width: Minimum width of the picker
67
- * @prop --width: Width of the picker
68
- * @prop --max-width: Maximum width of the picker
69
- *
70
- * @prop --min-height: Minimum height of the picker
71
- * @prop --height: Height of the picker
72
- * @prop --max-height: Maximum height of the picker
73
- *
74
- * @prop --backdrop-opacity: Opacity of the backdrop
75
- */
76
- --border-radius: 0;
77
- --border-style: solid;
78
- --min-width: auto;
79
- --width: 100%;
80
- --max-width: 500px;
81
- --min-height: auto;
82
- --max-height: auto;
83
- -moz-osx-font-smoothing: grayscale;
84
- -webkit-font-smoothing: antialiased;
85
- top: 0;
86
- display: block;
87
- position: absolute;
88
- width: 100%;
89
- height: 100%;
90
- outline: none;
91
- font-family: var(--ion-font-family, inherit);
92
- contain: strict;
93
- user-select: none;
94
- z-index: 1001;
95
- }
96
- @supports (inset-inline-start: 0) {
97
- :host {
98
- inset-inline-start: 0;
99
- }
100
- }
101
- @supports not (inset-inline-start: 0) {
102
- :host {
103
- left: 0;
104
- }
105
- :host-context([dir=rtl]) {
106
- left: unset;
107
- right: unset;
108
- right: 0;
109
- }
110
- @supports selector(:dir(rtl)) {
111
- :host(:dir(rtl)) {
112
- left: unset;
113
- right: unset;
114
- right: 0;
115
- }
116
- }
117
- }
118
-
119
- :host(.overlay-hidden) {
120
- display: none;
121
- }
122
-
123
- .picker-wrapper {
124
- border-radius: var(--border-radius);
125
- left: 0;
126
- right: 0;
127
- bottom: 0;
128
- -webkit-margin-start: auto;
129
- margin-inline-start: auto;
130
- -webkit-margin-end: auto;
131
- margin-inline-end: auto;
132
- margin-top: auto;
133
- margin-bottom: auto;
134
- transform: translate3d(0, 100%, 0);
135
- display: flex;
136
- position: absolute;
137
- flex-direction: column;
138
- width: var(--width);
139
- min-width: var(--min-width);
140
- max-width: var(--max-width);
141
- height: var(--height);
142
- min-height: var(--min-height);
143
- max-height: var(--max-height);
144
- border-width: var(--border-width);
145
- border-style: var(--border-style);
146
- border-color: var(--border-color);
147
- background: var(--background);
148
- contain: strict;
149
- overflow: hidden;
150
- z-index: 10;
151
- }
152
-
153
- .picker-toolbar {
154
- width: 100%;
155
- background: transparent;
156
- contain: strict;
157
- z-index: 1;
158
- }
159
-
160
- .picker-button {
161
- border: 0;
162
- font-family: inherit;
163
- }
164
-
165
- .picker-button:active, .picker-button:focus {
166
- outline: none;
167
- }
168
-
169
- .picker-columns {
170
- display: flex;
171
- position: relative;
172
- justify-content: center;
173
- margin-bottom: var(--ion-safe-area-bottom, 0);
174
- contain: strict;
175
- overflow: hidden;
176
- }
177
-
178
- .picker-above-highlight,
179
- .picker-below-highlight {
180
- display: none;
181
- pointer-events: none;
182
- }
183
-
184
56
  /**
185
57
  * Convert a font size to a dynamic font size.
186
58
  * Fonts that participate in Dynamic Type should use
@@ -237,77 +109,68 @@
237
109
  * }
238
110
  */
239
111
  :host {
240
- --background: var(--ion-background-color, #fff);
241
- --border-width: 0.55px 0 0;
242
- --border-color: var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));
243
- --height: 260px;
244
- --backdrop-opacity: var(--ion-backdrop-opacity, 0.26);
245
- color: var(--ion-item-color, var(--ion-text-color, #000));
246
- }
247
-
248
- .picker-toolbar {
112
+ /**
113
+ * @prop --highlight-background: Background of the picker highlight for the selected item
114
+ * @prop --highlight-border-radius: Border radius of the picker highlight for the selected item
115
+ *
116
+ * @prop --fade-background-rgb: Background of the gradient covering non-selected items in rgb format
117
+ */
118
+ --highlight-border-radius: 8px;
249
119
  display: flex;
250
- justify-content: flex-end;
251
- height: 44px;
252
- }
253
-
254
- .picker-button,
255
- .picker-button.ion-activated {
256
- margin-left: 0;
257
- margin-right: 0;
258
- margin-top: 0;
259
- margin-bottom: 0;
260
- -webkit-padding-start: 1.1em;
261
- padding-inline-start: 1.1em;
262
- -webkit-padding-end: 1.1em;
263
- padding-inline-end: 1.1em;
264
- padding-top: 0;
265
- padding-bottom: 0;
266
- height: 44px;
267
- background: transparent;
268
- color: var(--ion-color-primary, #3880ff);
269
- font-size: 14px;
270
- font-weight: 500;
271
- text-transform: uppercase;
272
- box-shadow: none;
120
+ position: relative;
121
+ align-items: center;
122
+ justify-content: center;
123
+ width: 100%;
124
+ height: 200px;
125
+ /**
126
+ * Picker columns should display
127
+ * in the order in which developers
128
+ * added them and should ignore
129
+ * LTR vs RTL directions.
130
+ */
131
+ direction: ltr;
132
+ /**
133
+ * This is required otherwise the
134
+ * highlight will appear behind
135
+ * the picker when used inline.
136
+ */
137
+ z-index: 0;
273
138
  }
274
139
 
275
- .picker-columns {
276
- height: 216px;
277
- perspective: 1800px;
140
+ :host .picker-before,
141
+ :host .picker-after {
142
+ position: absolute;
143
+ width: 100%;
144
+ /**
145
+ * The transform and z-index
146
+ * are needed for WebKit otherwise
147
+ * the fade will appear underneath the picker.
148
+ */
149
+ transform: translateZ(0);
150
+ z-index: 1;
151
+ pointer-events: none;
278
152
  }
279
153
 
280
- .picker-above-highlight {
154
+ :host .picker-before {
281
155
  top: 0;
282
- transform: translate3d(0, 0, 90px);
283
- position: absolute;
284
- width: 100%;
285
- height: 81px;
286
- border-bottom: 1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));
287
- background: linear-gradient(to bottom, var(--ion-background-color, #fff) 20%, rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8) 100%);
288
- z-index: 10;
156
+ height: 83px;
289
157
  }
290
158
  @supports (inset-inline-start: 0) {
291
- .picker-above-highlight {
159
+ :host .picker-before {
292
160
  inset-inline-start: 0;
293
161
  }
294
162
  }
295
163
  @supports not (inset-inline-start: 0) {
296
- .picker-above-highlight {
164
+ :host .picker-before {
297
165
  left: 0;
298
166
  }
299
- :host-context([dir=rtl]) .picker-above-highlight {
300
- left: unset;
301
- right: unset;
302
- right: 0;
303
- }
304
- [dir=rtl] .picker-above-highlight {
167
+ :host-context([dir=rtl]) .picker-before {
305
168
  left: unset;
306
169
  right: unset;
307
170
  right: 0;
308
171
  }
309
172
  @supports selector(:dir(rtl)) {
310
- .picker-above-highlight:dir(rtl) {
173
+ :host(:dir(rtl)) .picker-before {
311
174
  left: unset;
312
175
  right: unset;
313
176
  right: 0;
@@ -315,40 +178,88 @@
315
178
  }
316
179
  }
317
180
 
318
- .picker-below-highlight {
319
- top: 115px;
320
- transform: translate3d(0, 0, 90px);
321
- position: absolute;
322
- width: 100%;
323
- height: 119px;
324
- border-top: 1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));
325
- background: linear-gradient(to top, var(--ion-background-color, #fff) 30%, rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8) 100%);
326
- z-index: 11;
181
+ :host .picker-after {
182
+ top: 116px;
183
+ height: 84px;
327
184
  }
328
185
  @supports (inset-inline-start: 0) {
329
- .picker-below-highlight {
186
+ :host .picker-after {
330
187
  inset-inline-start: 0;
331
188
  }
332
189
  }
333
190
  @supports not (inset-inline-start: 0) {
334
- .picker-below-highlight {
191
+ :host .picker-after {
335
192
  left: 0;
336
193
  }
337
- :host-context([dir=rtl]) .picker-below-highlight {
338
- left: unset;
339
- right: unset;
340
- right: 0;
341
- }
342
- [dir=rtl] .picker-below-highlight {
194
+ :host-context([dir=rtl]) .picker-after {
343
195
  left: unset;
344
196
  right: unset;
345
197
  right: 0;
346
198
  }
347
199
  @supports selector(:dir(rtl)) {
348
- .picker-below-highlight:dir(rtl) {
200
+ :host(:dir(rtl)) .picker-after {
349
201
  left: unset;
350
202
  right: unset;
351
203
  right: 0;
352
204
  }
353
205
  }
206
+ }
207
+
208
+ :host .picker-highlight {
209
+ border-radius: var(--highlight-border-radius);
210
+ left: 0;
211
+ right: 0;
212
+ top: 50%;
213
+ bottom: 0;
214
+ -webkit-margin-start: auto;
215
+ margin-inline-start: auto;
216
+ -webkit-margin-end: auto;
217
+ margin-inline-end: auto;
218
+ margin-top: 0;
219
+ margin-bottom: 0;
220
+ position: absolute;
221
+ width: calc(100% - 16px);
222
+ height: 34px;
223
+ transform: translateY(-50%);
224
+ background: var(--highlight-background);
225
+ z-index: -1;
226
+ }
227
+
228
+ :host input {
229
+ position: absolute;
230
+ top: 0;
231
+ left: 0;
232
+ right: 0;
233
+ bottom: 0;
234
+ width: 100%;
235
+ height: 100%;
236
+ margin: 0;
237
+ padding: 0;
238
+ border: 0;
239
+ outline: 0;
240
+ clip: rect(0 0 0 0);
241
+ opacity: 0;
242
+ overflow: hidden;
243
+ -webkit-appearance: none;
244
+ -moz-appearance: none;
245
+ }
246
+
247
+ :host ::slotted(ion-picker-column:first-of-type) {
248
+ text-align: start;
249
+ }
250
+
251
+ :host ::slotted(ion-picker-column:last-of-type) {
252
+ text-align: end;
253
+ }
254
+
255
+ :host ::slotted(ion-picker-column:only-child) {
256
+ text-align: center;
257
+ }
258
+
259
+ :host .picker-before {
260
+ background: linear-gradient(to bottom, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 1) 20%, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 0) 90%);
261
+ }
262
+
263
+ :host .picker-after {
264
+ background: linear-gradient(to top, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 1) 30%, rgba(var(--fade-background-rgb, var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255))), 0) 90%);
354
265
  }
@@ -5,9 +5,9 @@ import AxeBuilder from "@axe-core/playwright";
5
5
  import { expect } from "@playwright/test";
6
6
  import { configs, test } from "../../../../utils/test/playwright/index";
7
7
  configs().forEach(({ title, config }) => {
8
- test.describe(title('picker-internal: a11y'), () => {
8
+ test.describe(title('picker: a11y'), () => {
9
9
  test('should not have accessibility violations', async ({ page }) => {
10
- await page.goto(`/src/components/picker-internal/test/a11y`, config);
10
+ await page.goto(`/src/components/picker/test/a11y`, config);
11
11
  const results = await new AxeBuilder({ page }).analyze();
12
12
  expect(results.violations).toEqual([]);
13
13
  });
@@ -3,23 +3,109 @@
3
3
  */
4
4
  import { expect } from "@playwright/test";
5
5
  import { configs, test } from "../../../../utils/test/playwright/index";
6
- configs().forEach(({ title, screenshot, config }) => {
7
- test.describe(title('picker: basic'), () => {
8
- test('should not have visual regressions', async ({ page }) => {
6
+ /**
7
+ * This behavior does not vary across directions.
8
+ */
9
+ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
10
+ test.describe(title('picker: rendering'), () => {
11
+ test('inline pickers should not have visual regression', async ({ page }) => {
12
+ await page.goto(`/src/components/picker/test/basic`, config);
13
+ const fullStack = page.locator('#inline ion-picker-column-option[data-test-value="full-stack"]');
14
+ const onion = page.locator('#inline ion-picker-column-option[data-test-value="onion"]');
15
+ await expect(fullStack).toHaveClass(/option-active/);
16
+ await expect(onion).toHaveClass(/option-active/);
17
+ await page.waitForChanges();
18
+ await expect(page.locator('#inline')).toHaveScreenshot(screenshot(`picker-inline-diff`));
19
+ });
20
+ });
21
+ test.describe(title('picker: overlay rendering'), () => {
22
+ test('popover: should not have visual regression', async ({ page }) => {
23
+ await page.goto(`/src/components/picker/test/basic`, config);
24
+ const button = page.locator('#popover');
25
+ const didPresent = await page.spyOnEvent('ionPopoverDidPresent');
26
+ const picker = page.locator('ion-popover ion-picker');
27
+ await button.click();
28
+ await didPresent.next();
29
+ await expect(picker).toBeVisible();
30
+ const popoverContent = page.locator('ion-popover .ion-delegate-host');
31
+ await expect(popoverContent).toHaveScreenshot(screenshot(`picker-popover-diff`), {
32
+ /**
33
+ * Animations must be enabled to capture the screenshot.
34
+ * By default, animations are disabled with toHaveScreenshot,
35
+ * and when capturing the screenshot will call animation.finish().
36
+ * This will cause the popover to close and the screenshot capture
37
+ * to be invalid.
38
+ */
39
+ animations: 'allow',
40
+ });
41
+ });
42
+ test('modal: should not have visual regression', async ({ page }) => {
9
43
  await page.goto('/src/components/picker/test/basic', config);
10
- const didPresent = await page.spyOnEvent('ionPickerDidPresent');
11
- const didDismiss = await page.spyOnEvent('ionPickerDidDismiss');
12
- await page.click('#basic');
44
+ const button = page.locator('#modal');
45
+ const didPresent = await page.spyOnEvent('ionModalDidPresent');
46
+ const picker = page.locator('ion-modal ion-picker');
47
+ await button.click();
13
48
  await didPresent.next();
49
+ await expect(picker).toBeVisible();
50
+ const modalContent = page.locator('ion-modal .ion-delegate-host');
51
+ await expect(modalContent).toHaveScreenshot(screenshot(`picker-modal-diff`), {
52
+ /**
53
+ * Animations must be enabled to capture the screenshot.
54
+ * By default, animations are disabled with toHaveScreenshot,
55
+ * and when capturing the screenshot will call animation.finish().
56
+ * This will cause the modal to close and the screenshot capture
57
+ * to be invalid.
58
+ */
59
+ animations: 'allow',
60
+ });
61
+ });
62
+ });
63
+ });
64
+ /**
65
+ * This behavior does not vary across modes/directions.
66
+ */
67
+ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
68
+ test.describe(title('picker: focus'), () => {
69
+ test.beforeEach(async ({ page }) => {
70
+ await page.setContent(`
71
+ <ion-picker>
72
+ <ion-picker-column value="full-stack" id="first">
73
+ <ion-picker-column-option value="minified">Minified</ion-picker-column-option>
74
+ <ion-picker-column-option value="responsive">Responsive</ion-picker-column-option>
75
+ <ion-picker-column-option value="full-stack">Full Stack</ion-picker-column-option>
76
+ <ion-picker-column-option value="mobile-first">Mobile First</ion-picker-column-option>
77
+ <ion-picker-column-option value="serverless">Serverless</ion-picker-column-option>
78
+ </ion-picker-column>
79
+ <ion-picker-column value="onion" id="second">
80
+ <ion-picker-column-option value="tomato">Tomato</ion-picker-column-option>
81
+ <ion-picker-column-option value="avocado">Avocado</ion-picker-column-option>
82
+ <ion-picker-column-option value="onion">Onion</ion-picker-column-option>
83
+ <ion-picker-column-option value="potato">Potato</ion-picker-column-option>
84
+ <ion-picker-column-option value="artichoke">Artichoke</ion-picker-column-option>
85
+ </ion-picker-column>
86
+ </ion-picker>
87
+ `, config);
88
+ });
89
+ test('tabbing should correctly move focus between columns', async ({ page }) => {
90
+ const firstColumn = page.locator('ion-picker-column#first');
91
+ const secondColumn = page.locator('ion-picker-column#second');
92
+ // Focus first column
93
+ await page.keyboard.press('Tab');
94
+ await expect(firstColumn).toBeFocused();
14
95
  await page.waitForChanges();
15
- await expect(page).toHaveScreenshot(screenshot(`picker-basic`));
16
- await page.click('.picker-opt:nth-child(2)');
17
- await page.click('ion-picker .save-btn');
18
- await didDismiss.next();
19
- await page.click('#basic');
20
- await didPresent.next();
96
+ // Focus second column
97
+ await page.keyboard.press('Tab');
98
+ await expect(secondColumn).toBeFocused();
99
+ });
100
+ test('tabbing should correctly move focus back', async ({ page }) => {
101
+ const firstColumn = page.locator('ion-picker-column#first');
102
+ const secondColumn = page.locator('ion-picker-column#second');
103
+ await secondColumn.evaluate((el) => el.setFocus());
104
+ await expect(secondColumn).toBeFocused();
21
105
  await page.waitForChanges();
22
- await expect(page).toHaveScreenshot(screenshot(`picker-value-selected`));
106
+ // Focus first column
107
+ await page.keyboard.press('Shift+Tab');
108
+ await expect(firstColumn).toBeFocused();
23
109
  });
24
110
  });
25
111
  });
@@ -0,0 +1,85 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { expect } from "@playwright/test";
5
+ import { configs, test } from "../../../../utils/test/playwright/index";
6
+ const pickerElement = `
7
+ <ion-picker>
8
+ <ion-picker-column id="first"></ion-picker-column>
9
+ <ion-picker-column id="second"></ion-picker-column>
10
+ </ion-picker>
11
+
12
+ <script>
13
+ const setPickerColumn = (selector, items, value) => {
14
+ const column = document.querySelector(selector);
15
+
16
+ items.forEach((item) => {
17
+ const option = document.createElement('ion-picker-column-option');
18
+ option.value = item.value;
19
+ option.textContent = item.text;
20
+
21
+ option.setAttribute('data-test-value', item.value);
22
+
23
+ column.appendChild(option);
24
+ });
25
+
26
+ column.value = value;
27
+ };
28
+
29
+ setPickerColumn(
30
+ '#first',
31
+ [
32
+ { text: 'Minified', value: 'minified' },
33
+ { text: 'Responsive', value: 'responsive' },
34
+ { text: 'Full Stack', value: 'full-stack' },
35
+ { text: 'Mobile First', value: 'mobile-first' },
36
+ { text: 'Serverless', value: 'serverless' },
37
+ ],
38
+ 'minified'
39
+ );
40
+
41
+ setPickerColumn(
42
+ '#second',
43
+ [
44
+ { text: 'Tomato', value: 'tomato' },
45
+ { text: 'Avocado', value: 'avocado' },
46
+ { text: 'Onion', value: 'onion' },
47
+ { text: 'Potato', value: 'potato' },
48
+ { text: 'Artichoke', value: 'artichoke' },
49
+ ],
50
+ 'tomato'
51
+ );
52
+ </script>
53
+ `;
54
+ /**
55
+ * This behavior does not vary across directions.
56
+ */
57
+ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
58
+ test.describe(title('picker: custom'), () => {
59
+ test('should allow styling of the picker highlight', async ({ page }) => {
60
+ await page.setContent(`
61
+ <style>
62
+ ion-picker {
63
+ --highlight-background: rgb(0, 255, 0, 0.4);
64
+ --highlight-border-radius: 48px;
65
+ }
66
+ </style>
67
+ ${pickerElement}
68
+ `, config);
69
+ const picker = page.locator('ion-picker');
70
+ await expect(picker).toHaveScreenshot(screenshot(`picker-custom-highlight`));
71
+ });
72
+ test('should allow styling of the picker fade', async ({ page }) => {
73
+ await page.setContent(`
74
+ <style>
75
+ ion-picker {
76
+ --fade-background-rgb: 40, 40, 40;
77
+ }
78
+ </style>
79
+ ${pickerElement}
80
+ `, config);
81
+ const picker = page.locator('ion-picker');
82
+ await expect(picker).toHaveScreenshot(screenshot(`picker-custom-fade`));
83
+ });
84
+ });
85
+ });