@ionic/core 8.7.17-dev.11771870864.19b2cde1 → 8.7.17-dev.11771959013.18adabe2

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 (525) hide show
  1. package/components/action-sheet.js +1 -561
  2. package/components/alert.js +1 -610
  3. package/components/animation.js +1 -817
  4. package/components/backdrop.js +1 -72
  5. package/components/button-active.js +1 -64
  6. package/components/button.js +1 -303
  7. package/components/buttons.js +1 -56
  8. package/components/capacitor.js +1 -10
  9. package/components/checkbox.js +1 -261
  10. package/components/config.js +1 -192
  11. package/components/content.js +1 -475
  12. package/components/cubic-bezier.js +1 -87
  13. package/components/data.js +1 -1635
  14. package/components/dir.js +1 -15
  15. package/components/focus-visible.js +1 -72
  16. package/components/framework-delegate.js +1 -137
  17. package/components/gesture-controller.js +1 -192
  18. package/components/haptic.js +1 -155
  19. package/components/hardware-back-button.js +1 -112
  20. package/components/header.js +1 -417
  21. package/components/helpers.js +1 -336
  22. package/components/icon.js +1 -456
  23. package/components/index.d.ts +2 -0
  24. package/components/index.js +1 -115
  25. package/components/index2.js +1 -416
  26. package/components/index3.js +1 -452
  27. package/components/index4.js +1 -118
  28. package/components/index5.js +1 -303
  29. package/components/index6.js +1 -29
  30. package/components/index7.js +1 -164
  31. package/components/index8.js +1 -125
  32. package/components/index9.js +1 -4
  33. package/components/input-shims.js +1 -624
  34. package/components/input.utils.js +1 -144
  35. package/components/ion-accordion-group.js +1 -269
  36. package/components/ion-accordion.js +1 -457
  37. package/components/ion-action-sheet.js +1 -6
  38. package/components/ion-alert.js +1 -6
  39. package/components/ion-app.js +1 -128
  40. package/components/ion-avatar.js +1 -41
  41. package/components/ion-back-button.js +1 -131
  42. package/components/ion-backdrop.js +1 -6
  43. package/components/ion-badge.js +1 -47
  44. package/components/ion-breadcrumb.js +1 -137
  45. package/components/ion-breadcrumbs.js +1 -164
  46. package/components/ion-button.js +1 -6
  47. package/components/ion-buttons.js +1 -6
  48. package/components/ion-card-content.js +1 -45
  49. package/components/ion-card-header.js +1 -56
  50. package/components/ion-card-subtitle.js +1 -48
  51. package/components/ion-card-title.js +1 -48
  52. package/components/ion-card.js +1 -107
  53. package/components/ion-checkbox.js +1 -6
  54. package/components/ion-chip.js +1 -66
  55. package/components/ion-col.js +1 -163
  56. package/components/ion-content.js +1 -6
  57. package/components/ion-datetime-button.js +1 -384
  58. package/components/ion-datetime.js +1 -2046
  59. package/components/ion-fab-button.js +1 -151
  60. package/components/ion-fab-list.js +1 -66
  61. package/components/ion-fab.js +1 -101
  62. package/components/ion-footer.js +1 -159
  63. package/components/ion-grid.js +1 -46
  64. package/components/ion-header.js +1 -6
  65. package/components/ion-icon.js +1 -6
  66. package/components/ion-img.js +1 -124
  67. package/components/ion-infinite-scroll-content.js +1 -70
  68. package/components/ion-infinite-scroll.js +1 -236
  69. package/components/ion-input-otp.js +1 -683
  70. package/components/ion-input-password-toggle.js +1 -129
  71. package/components/ion-input.js +1 -617
  72. package/components/ion-item-divider.js +1 -59
  73. package/components/ion-item-group.js +1 -46
  74. package/components/ion-item-option.js +1 -91
  75. package/components/ion-item-options.js +1 -73
  76. package/components/ion-item-sliding.js +1 -458
  77. package/components/ion-item.js +1 -6
  78. package/components/ion-label.js +1 -6
  79. package/components/ion-list-header.js +1 -6
  80. package/components/ion-list.js +1 -6
  81. package/components/ion-loading.js +1 -344
  82. package/components/ion-menu-button.js +1 -110
  83. package/components/ion-menu-toggle.js +1 -64
  84. package/components/ion-menu.js +1 -745
  85. package/components/ion-modal.js +1 -6
  86. package/components/ion-nav-link.js +1 -64
  87. package/components/ion-nav.js +1 -956
  88. package/components/ion-note.js +1 -47
  89. package/components/ion-picker-column-option.js +1 -6
  90. package/components/ion-picker-column.js +1 -6
  91. package/components/ion-picker-legacy-column.js +1 -6
  92. package/components/ion-picker-legacy.js +1 -343
  93. package/components/ion-picker.js +1 -6
  94. package/components/ion-popover.js +1 -6
  95. package/components/ion-progress-bar.js +1 -101
  96. package/components/ion-radio-group.js +1 -6
  97. package/components/ion-radio.js +1 -6
  98. package/components/ion-range.js +1 -853
  99. package/components/ion-refresher-content.js +1 -89
  100. package/components/ion-refresher.js +1 -751
  101. package/components/ion-reorder-group.js +1 -322
  102. package/components/ion-reorder.js +1 -60
  103. package/components/ion-ripple-effect.js +1 -6
  104. package/components/ion-route-redirect.js +1 -45
  105. package/components/ion-route.js +1 -74
  106. package/components/ion-router-link.js +1 -61
  107. package/components/ion-router-outlet.js +1 -227
  108. package/components/ion-router.js +1 -841
  109. package/components/ion-row.js +1 -36
  110. package/components/ion-searchbar.js +1 -530
  111. package/components/ion-segment-button.js +1 -174
  112. package/components/ion-segment-content.js +1 -35
  113. package/components/ion-segment-view.js +1 -148
  114. package/components/ion-segment.js +1 -602
  115. package/components/ion-select-modal.js +1 -6
  116. package/components/ion-select-option.js +1 -46
  117. package/components/ion-select-popover.js +1 -6
  118. package/components/ion-select.js +1 -1037
  119. package/components/ion-skeleton-text.js +1 -65
  120. package/components/ion-spinner.js +1 -6
  121. package/components/ion-split-pane.js +1 -197
  122. package/components/ion-tab-bar.js +1 -115
  123. package/components/ion-tab-button.js +1 -128
  124. package/components/ion-tab.js +1 -91
  125. package/components/ion-tabs.js +1 -205
  126. package/components/ion-text.js +1 -42
  127. package/components/ion-textarea.js +1 -554
  128. package/components/ion-thumbnail.js +1 -36
  129. package/components/ion-title.js +1 -6
  130. package/components/ion-toast.js +1 -941
  131. package/components/ion-toggle.js +1 -361
  132. package/components/ion-toolbar.js +1 -6
  133. package/components/ionic-global.js +1 -144
  134. package/components/ios.transition.js +1 -672
  135. package/components/item.js +1 -302
  136. package/components/keyboard-controller.js +1 -162
  137. package/components/keyboard.js +1 -141
  138. package/components/keyboard2.js +1 -76
  139. package/components/label.js +1 -100
  140. package/components/list-header.js +1 -47
  141. package/components/list.js +1 -68
  142. package/components/lock-controller.js +1 -35
  143. package/components/md.transition.js +1 -51
  144. package/components/menu-toggle-util.js +1 -9
  145. package/components/modal.js +1 -2674
  146. package/components/notch-controller.js +1 -150
  147. package/components/overlays.js +1 -912
  148. package/components/picker-column-option.js +1 -136
  149. package/components/picker-column.js +1 -595
  150. package/components/picker-column2.js +1 -377
  151. package/components/picker.js +1 -498
  152. package/components/popover.js +1 -1502
  153. package/components/radio-group.js +1 -287
  154. package/components/radio.js +1 -229
  155. package/components/refresher.utils.js +1 -193
  156. package/components/ripple-effect.js +1 -109
  157. package/components/select-modal.js +1 -196
  158. package/components/select-popover.js +1 -189
  159. package/components/spinner.js +1 -224
  160. package/components/status-tap.js +1 -36
  161. package/components/swipe-back.js +1 -75
  162. package/components/theme.js +1 -40
  163. package/components/title.js +1 -70
  164. package/components/toolbar.js +1 -89
  165. package/components/validity.js +1 -14
  166. package/components/watch-options.js +1 -44
  167. package/dist/cjs/{animation-Bt3H9L1C.js → animation-Dg4yiuR2.js} +1 -1
  168. package/dist/cjs/app-globals-CLI8xCmk.js +11 -0
  169. package/dist/cjs/{button-active-CMc8cD90.js → button-active-FscMI17-.js} +1 -1
  170. package/dist/cjs/{config-C5fsO43a.js → config-BukYi_pW.js} +1 -1
  171. package/dist/cjs/{data-JwZKaIQB.js → data-BYlBjkMU.js} +1 -1
  172. package/dist/cjs/{framework-delegate-DMJRBuDi.js → framework-delegate-CRgp8o_p.js} +1 -1
  173. package/dist/cjs/{hardware-back-button-VCK4V3mG.js → hardware-back-button-C4rMJ5uI.js} +1 -1
  174. package/dist/cjs/{helpers-DrTqNghc.js → helpers-CxTYJdbT.js} +1 -1
  175. package/dist/cjs/{index-094mMFB-.js → index-C845Ti6K.js} +4 -4
  176. package/dist/cjs/{index-DrMUZJj6.js → index-CFUwM5x_.js} +5 -5
  177. package/dist/cjs/{index-D6Wc6v08.js → index-CqT-2gKy.js} +503 -382
  178. package/dist/cjs/{index-CO6eryBo.js → index-MbaBbWXk.js} +2 -2
  179. package/dist/cjs/{index-C534ULug.js → index-YcSftOMz.js} +2 -2
  180. package/dist/cjs/index.cjs.js +12 -12
  181. package/dist/cjs/{input-shims-CW0KUFTQ.js → input-shims-DlFhYYTs.js} +3 -3
  182. package/dist/cjs/{input.utils-B_QROI2g.js → input.utils-DmeJ8dmo.js} +2 -2
  183. package/dist/cjs/ion-accordion_2.cjs.entry.js +23 -15
  184. package/dist/cjs/ion-action-sheet.cjs.entry.js +21 -15
  185. package/dist/cjs/ion-alert.cjs.entry.js +25 -17
  186. package/dist/cjs/ion-app_8.cjs.entry.js +44 -40
  187. package/dist/cjs/ion-avatar_3.cjs.entry.js +12 -12
  188. package/dist/cjs/ion-back-button.cjs.entry.js +7 -7
  189. package/dist/cjs/ion-backdrop.cjs.entry.js +6 -6
  190. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +20 -14
  191. package/dist/cjs/ion-button_2.cjs.entry.js +36 -18
  192. package/dist/cjs/ion-card_5.cjs.entry.js +23 -23
  193. package/dist/cjs/ion-checkbox.cjs.entry.js +7 -7
  194. package/dist/cjs/ion-chip.cjs.entry.js +6 -6
  195. package/dist/cjs/ion-col_3.cjs.entry.js +8 -8
  196. package/dist/cjs/ion-datetime-button.cjs.entry.js +8 -8
  197. package/dist/cjs/ion-datetime_3.cjs.entry.js +67 -39
  198. package/dist/cjs/ion-fab_3.cjs.entry.js +17 -13
  199. package/dist/cjs/ion-img.cjs.entry.js +8 -6
  200. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +17 -13
  201. package/dist/cjs/ion-input-otp.cjs.entry.js +16 -10
  202. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +9 -7
  203. package/dist/cjs/ion-input.cjs.entry.js +21 -13
  204. package/dist/cjs/ion-item-option_3.cjs.entry.js +17 -15
  205. package/dist/cjs/ion-item_8.cjs.entry.js +42 -36
  206. package/dist/cjs/ion-loading.cjs.entry.js +18 -14
  207. package/dist/cjs/ion-menu_3.cjs.entry.js +30 -22
  208. package/dist/cjs/ion-modal.cjs.entry.js +62 -221
  209. package/dist/cjs/ion-nav_2.cjs.entry.js +14 -10
  210. package/dist/cjs/ion-picker-column-option.cjs.entry.js +10 -8
  211. package/dist/cjs/ion-picker-column.cjs.entry.js +11 -7
  212. package/dist/cjs/ion-picker.cjs.entry.js +6 -6
  213. package/dist/cjs/ion-popover.cjs.entry.js +21 -15
  214. package/dist/cjs/ion-progress-bar.cjs.entry.js +7 -7
  215. package/dist/cjs/ion-radio_2.cjs.entry.js +17 -13
  216. package/dist/cjs/ion-range.cjs.entry.js +180 -54
  217. package/dist/cjs/ion-refresher_2.cjs.entry.js +45 -14
  218. package/dist/cjs/ion-reorder_2.cjs.entry.js +13 -11
  219. package/dist/cjs/ion-ripple-effect.cjs.entry.js +4 -4
  220. package/dist/cjs/ion-route_4.cjs.entry.js +20 -10
  221. package/dist/cjs/ion-searchbar.cjs.entry.js +22 -12
  222. package/dist/cjs/ion-segment-content.cjs.entry.js +3 -3
  223. package/dist/cjs/ion-segment-view.cjs.entry.js +5 -5
  224. package/dist/cjs/ion-segment_2.cjs.entry.js +26 -16
  225. package/dist/cjs/ion-select-modal.cjs.entry.js +12 -12
  226. package/dist/cjs/ion-select_3.cjs.entry.js +29 -21
  227. package/dist/cjs/ion-spinner.cjs.entry.js +4 -4
  228. package/dist/cjs/ion-split-pane.cjs.entry.js +15 -9
  229. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +14 -12
  230. package/dist/cjs/ion-tab_2.cjs.entry.js +10 -8
  231. package/dist/cjs/ion-text.cjs.entry.js +4 -4
  232. package/dist/cjs/ion-textarea.cjs.entry.js +18 -12
  233. package/dist/cjs/ion-toast.cjs.entry.js +21 -15
  234. package/dist/cjs/ion-toggle.cjs.entry.js +10 -8
  235. package/dist/cjs/{ionic-global-HMVqOFGO.js → ionic-global-Bc3kJi1Z.js} +1 -1
  236. package/dist/cjs/ionic.cjs.js +5 -5
  237. package/dist/cjs/{ios.transition-BOt_uW73.js → ios.transition-trBiC95R.js} +4 -4
  238. package/dist/cjs/loader.cjs.js +4 -4
  239. package/dist/cjs/{md.transition-Dt968VXB.js → md.transition-CUQECuvD.js} +4 -4
  240. package/dist/cjs/{notch-controller-Bzqhjm4f.js → notch-controller-sD-lTpdc.js} +1 -1
  241. package/dist/cjs/{overlays-B2b-TTbl.js → overlays-C2jiBSNQ.js} +5 -5
  242. package/dist/cjs/{status-tap-g0sWWkXk.js → status-tap-CCJk5VgT.js} +3 -3
  243. package/dist/cjs/{swipe-back-BIayeNOD.js → swipe-back-BGhTQ1CU.js} +2 -2
  244. package/dist/collection/collection-manifest.json +2 -2
  245. package/dist/collection/components/accordion-group/accordion-group.js +4 -2
  246. package/dist/collection/components/action-sheet/action-sheet.js +20 -10
  247. package/dist/collection/components/alert/alert.js +24 -12
  248. package/dist/collection/components/back-button/back-button.js +4 -2
  249. package/dist/collection/components/badge/badge.js +2 -1
  250. package/dist/collection/components/breadcrumb/breadcrumb.js +8 -4
  251. package/dist/collection/components/breadcrumbs/breadcrumbs.js +4 -2
  252. package/dist/collection/components/button/button.js +6 -3
  253. package/dist/collection/components/card/card.js +6 -3
  254. package/dist/collection/components/card-header/card-header.js +2 -1
  255. package/dist/collection/components/card-subtitle/card-subtitle.js +2 -1
  256. package/dist/collection/components/card-title/card-title.js +2 -1
  257. package/dist/collection/components/checkbox/checkbox.js +4 -2
  258. package/dist/collection/components/chip/chip.js +2 -1
  259. package/dist/collection/components/content/content.js +8 -4
  260. package/dist/collection/components/datetime/datetime.js +34 -15
  261. package/dist/collection/components/datetime-button/datetime-button.js +2 -1
  262. package/dist/collection/components/fab-button/fab-button.js +6 -3
  263. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +4 -2
  264. package/dist/collection/components/input/input.js +11 -6
  265. package/dist/collection/components/input-otp/input-otp.js +8 -4
  266. package/dist/collection/components/input-password-toggle/input-password-toggle.js +4 -2
  267. package/dist/collection/components/item/item.js +6 -3
  268. package/dist/collection/components/item-divider/item-divider.js +2 -1
  269. package/dist/collection/components/item-option/item-option.js +2 -1
  270. package/dist/collection/components/item-options/item-options.js +2 -1
  271. package/dist/collection/components/item-sliding/item-sliding.js +2 -1
  272. package/dist/collection/components/label/label.js +6 -3
  273. package/dist/collection/components/list-header/list-header.js +2 -1
  274. package/dist/collection/components/loading/loading.js +22 -11
  275. package/dist/collection/components/menu/menu.js +10 -5
  276. package/dist/collection/components/menu-button/menu-button.js +2 -1
  277. package/dist/collection/components/modal/gestures/sheet.js +11 -108
  278. package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -54
  279. package/dist/collection/components/modal/modal.js +58 -112
  280. package/dist/collection/components/nav/nav.js +89 -45
  281. package/dist/collection/components/nav-link/nav-link.js +9 -5
  282. package/dist/collection/components/note/note.js +2 -1
  283. package/dist/collection/components/picker/picker.js +2 -1
  284. package/dist/collection/components/picker-column/picker-column.js +6 -3
  285. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -1
  286. package/dist/collection/components/picker-legacy/picker.js +24 -12
  287. package/dist/collection/components/picker-legacy-column/picker-column.js +4 -2
  288. package/dist/collection/components/popover/popover.js +33 -17
  289. package/dist/collection/components/progress-bar/progress-bar.js +2 -1
  290. package/dist/collection/components/radio/radio.js +2 -1
  291. package/dist/collection/components/radio-group/radio-group.js +6 -3
  292. package/dist/collection/components/range/range.js +189 -50
  293. package/dist/collection/components/refresher/refresher.js +73 -5
  294. package/dist/collection/components/refresher-content/refresher-content.js +8 -4
  295. package/dist/collection/components/reorder-group/reorder-group.js +6 -3
  296. package/dist/collection/components/route/route.js +4 -2
  297. package/dist/collection/components/router/router.js +10 -5
  298. package/dist/collection/components/router-link/router-link.js +6 -3
  299. package/dist/collection/components/router-outlet/router-outlet.js +18 -9
  300. package/dist/collection/components/searchbar/searchbar.js +11 -6
  301. package/dist/collection/components/segment/segment.js +10 -5
  302. package/dist/collection/components/segment-button/segment-button.js +4 -2
  303. package/dist/collection/components/segment-view/segment-view.js +2 -1
  304. package/dist/collection/components/select/select.js +10 -5
  305. package/dist/collection/components/select-modal/select-modal.js +2 -1
  306. package/dist/collection/components/select-popover/select-popover.js +2 -1
  307. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -1
  308. package/dist/collection/components/spinner/spinner.js +4 -2
  309. package/dist/collection/components/tab/tab.js +4 -2
  310. package/dist/collection/components/tab-bar/tab-bar.js +4 -2
  311. package/dist/collection/components/tab-button/tab-button.js +4 -2
  312. package/dist/collection/components/tabs/tabs.js +4 -2
  313. package/dist/collection/components/text/text.js +2 -1
  314. package/dist/collection/components/textarea/textarea.js +6 -3
  315. package/dist/collection/components/title/title.js +4 -2
  316. package/dist/collection/components/toast/toast.js +34 -17
  317. package/dist/collection/components/toggle/toggle.js +4 -2
  318. package/dist/collection/components/toolbar/toolbar.js +2 -1
  319. package/dist/docs.d.ts +37 -0
  320. package/dist/docs.json +971 -442
  321. package/dist/esm/{animation-Dt8bGnA-.js → animation-CnGMT4ji.js} +1 -1
  322. package/dist/esm/app-globals-DhZjtldk.js +9 -0
  323. package/dist/esm/{button-active-L570Swow.js → button-active-BBx21brx.js} +1 -1
  324. package/dist/esm/{config-mCdtaoPe.js → config-TO1rZH52.js} +1 -1
  325. package/dist/esm/{data-DCORV9FH.js → data-B9iGR5YO.js} +1 -1
  326. package/dist/esm/{framework-delegate-BYawdMXj.js → framework-delegate-CyxE1S_P.js} +1 -1
  327. package/dist/esm/{hardware-back-button-CPLxO-Ev.js → hardware-back-button-CTe4XmL7.js} +1 -1
  328. package/dist/esm/{helpers-DEn3pfjm.js → helpers-Tl8jw6S2.js} +1 -1
  329. package/dist/esm/{index-r2D9DEro.js → index-B-hkiOUh.js} +4 -4
  330. package/dist/esm/{index-CvDIirVx.js → index-B2KwgBLx.js} +5 -5
  331. package/dist/esm/{index-ceb5RaMT.js → index-BtUdxPjv.js} +2 -2
  332. package/dist/esm/{index-C8IsBmNU.js → index-IGIE5vDm.js} +503 -382
  333. package/dist/esm/{index-Bs3kT4bc.js → index-hW6eNZ3o.js} +2 -2
  334. package/dist/esm/index.js +12 -12
  335. package/dist/esm/{input-shims-DyOpfTg6.js → input-shims-C1hAaHcP.js} +3 -3
  336. package/dist/esm/{input.utils-DrvTa8gz.js → input.utils-Bxa_DQ7-.js} +2 -2
  337. package/dist/esm/ion-accordion_2.entry.js +23 -15
  338. package/dist/esm/ion-action-sheet.entry.js +21 -15
  339. package/dist/esm/ion-alert.entry.js +25 -17
  340. package/dist/esm/ion-app_8.entry.js +44 -40
  341. package/dist/esm/ion-avatar_3.entry.js +12 -12
  342. package/dist/esm/ion-back-button.entry.js +7 -7
  343. package/dist/esm/ion-backdrop.entry.js +6 -6
  344. package/dist/esm/ion-breadcrumb_2.entry.js +20 -14
  345. package/dist/esm/ion-button_2.entry.js +36 -18
  346. package/dist/esm/ion-card_5.entry.js +23 -23
  347. package/dist/esm/ion-checkbox.entry.js +7 -7
  348. package/dist/esm/ion-chip.entry.js +6 -6
  349. package/dist/esm/ion-col_3.entry.js +8 -8
  350. package/dist/esm/ion-datetime-button.entry.js +8 -8
  351. package/dist/esm/ion-datetime_3.entry.js +67 -39
  352. package/dist/esm/ion-fab_3.entry.js +17 -13
  353. package/dist/esm/ion-img.entry.js +8 -6
  354. package/dist/esm/ion-infinite-scroll_2.entry.js +17 -13
  355. package/dist/esm/ion-input-otp.entry.js +16 -10
  356. package/dist/esm/ion-input-password-toggle.entry.js +9 -7
  357. package/dist/esm/ion-input.entry.js +21 -13
  358. package/dist/esm/ion-item-option_3.entry.js +17 -15
  359. package/dist/esm/ion-item_8.entry.js +42 -36
  360. package/dist/esm/ion-loading.entry.js +18 -14
  361. package/dist/esm/ion-menu_3.entry.js +30 -22
  362. package/dist/esm/ion-modal.entry.js +62 -221
  363. package/dist/esm/ion-nav_2.entry.js +14 -10
  364. package/dist/esm/ion-picker-column-option.entry.js +10 -8
  365. package/dist/esm/ion-picker-column.entry.js +11 -7
  366. package/dist/esm/ion-picker.entry.js +6 -6
  367. package/dist/esm/ion-popover.entry.js +21 -15
  368. package/dist/esm/ion-progress-bar.entry.js +7 -7
  369. package/dist/esm/ion-radio_2.entry.js +17 -13
  370. package/dist/esm/ion-range.entry.js +180 -54
  371. package/dist/esm/ion-refresher_2.entry.js +45 -14
  372. package/dist/esm/ion-reorder_2.entry.js +13 -11
  373. package/dist/esm/ion-ripple-effect.entry.js +4 -4
  374. package/dist/esm/ion-route_4.entry.js +20 -10
  375. package/dist/esm/ion-searchbar.entry.js +22 -12
  376. package/dist/esm/ion-segment-content.entry.js +3 -3
  377. package/dist/esm/ion-segment-view.entry.js +5 -5
  378. package/dist/esm/ion-segment_2.entry.js +26 -16
  379. package/dist/esm/ion-select-modal.entry.js +12 -12
  380. package/dist/esm/ion-select_3.entry.js +29 -21
  381. package/dist/esm/ion-spinner.entry.js +4 -4
  382. package/dist/esm/ion-split-pane.entry.js +15 -9
  383. package/dist/esm/ion-tab-bar_2.entry.js +14 -12
  384. package/dist/esm/ion-tab_2.entry.js +10 -8
  385. package/dist/esm/ion-text.entry.js +4 -4
  386. package/dist/esm/ion-textarea.entry.js +18 -12
  387. package/dist/esm/ion-toast.entry.js +21 -15
  388. package/dist/esm/ion-toggle.entry.js +10 -8
  389. package/dist/esm/{ionic-global-CDrldh-5.js → ionic-global-DfbeLwcV.js} +1 -1
  390. package/dist/esm/ionic.js +6 -6
  391. package/dist/esm/{ios.transition-BDzw0_Hm.js → ios.transition--aMF-pDH.js} +4 -4
  392. package/dist/esm/loader.js +5 -5
  393. package/dist/esm/{md.transition-BzDYi3qq.js → md.transition-BEVbfm8j.js} +4 -4
  394. package/dist/esm/{notch-controller-BwelN_JM.js → notch-controller-DAcvKU57.js} +1 -1
  395. package/dist/esm/{overlays-D5YkFThA.js → overlays-F8GHPo-e.js} +5 -5
  396. package/dist/esm/{status-tap-5DQ7Fc4V.js → status-tap-BfJqFSLF.js} +3 -3
  397. package/dist/esm/{swipe-back-BKw2CAHc.js → swipe-back-BZBFwTQV.js} +2 -2
  398. package/dist/html.html-data.json +109 -109
  399. package/dist/ionic/index.esm.js +1 -1
  400. package/dist/ionic/ionic.esm.js +1 -1
  401. package/dist/ionic/{p-316c0420.entry.js → p-025d2d32.entry.js} +1 -1
  402. package/dist/ionic/p-02acdef4.entry.js +4 -0
  403. package/dist/ionic/p-04e2c388.entry.js +4 -0
  404. package/dist/ionic/{p-370e4237.entry.js → p-074344b8.entry.js} +1 -1
  405. package/dist/ionic/p-13ade5c8.entry.js +4 -0
  406. package/dist/ionic/p-1b02923f.entry.js +4 -0
  407. package/dist/ionic/p-1bd477a9.entry.js +4 -0
  408. package/dist/ionic/{p-d2489bf2.entry.js → p-1fa1406c.entry.js} +1 -1
  409. package/dist/ionic/{p-46d74291.entry.js → p-1fd588a7.entry.js} +1 -1
  410. package/dist/ionic/p-239a27a4.entry.js +4 -0
  411. package/dist/ionic/{p-94de5cfa.entry.js → p-277abec1.entry.js} +1 -1
  412. package/dist/ionic/{p-dd1aef77.entry.js → p-28d7852f.entry.js} +1 -1
  413. package/dist/ionic/{p-49d06882.entry.js → p-301c43f8.entry.js} +1 -1
  414. package/dist/ionic/{p-79bd78f9.entry.js → p-370a60ee.entry.js} +1 -1
  415. package/dist/ionic/p-3e143d1d.entry.js +4 -0
  416. package/dist/ionic/p-4431ef7e.entry.js +4 -0
  417. package/dist/ionic/p-463767ce.entry.js +4 -0
  418. package/dist/ionic/p-4f888343.entry.js +4 -0
  419. package/dist/ionic/p-51c11c47.entry.js +4 -0
  420. package/dist/ionic/p-56050077.entry.js +4 -0
  421. package/dist/ionic/p-6a3a5aae.entry.js +4 -0
  422. package/dist/ionic/p-6b97f2a3.entry.js +4 -0
  423. package/dist/ionic/p-77de9c60.entry.js +4 -0
  424. package/dist/ionic/{p-51a60e0f.entry.js → p-7c72d482.entry.js} +1 -1
  425. package/dist/ionic/p-7d20f4f8.entry.js +4 -0
  426. package/dist/ionic/{p-11aa58d6.entry.js → p-80cac7a2.entry.js} +1 -1
  427. package/dist/ionic/p-91fc7352.entry.js +4 -0
  428. package/dist/ionic/p-93845421.entry.js +4 -0
  429. package/dist/ionic/{p-3a6caca9.entry.js → p-964090ef.entry.js} +1 -1
  430. package/dist/ionic/p-96a2e768.entry.js +4 -0
  431. package/dist/ionic/{p-d126e8d3.entry.js → p-9745651b.entry.js} +1 -1
  432. package/dist/ionic/{p-f9061316.entry.js → p-9802c88e.entry.js} +1 -1
  433. package/dist/ionic/{p-582824c5.entry.js → p-9833cf63.entry.js} +1 -1
  434. package/dist/ionic/p-9d1676bb.entry.js +4 -0
  435. package/dist/ionic/{p-675b1a31.entry.js → p-9fae83d8.entry.js} +1 -1
  436. package/dist/ionic/{p-CwgG81ZD.js → p-B8xlpH8p.js} +1 -1
  437. package/dist/ionic/{p-C7hRNDhM.js → p-BAt5H1ac.js} +1 -1
  438. package/dist/ionic/p-BW_TRJm8.js +4 -0
  439. package/dist/ionic/{p-DDb5r57F.js → p-Bum7H1fw.js} +1 -1
  440. package/dist/ionic/{p-D0dMcSkw.js → p-BvFYtOdE.js} +1 -1
  441. package/dist/ionic/{p-Dc45iWE4.js → p-BxIcPWoV.js} +1 -1
  442. package/dist/ionic/{p-BYEqWnSg.js → p-C0JvVFMv.js} +1 -1
  443. package/dist/ionic/{p-CTfR9YZG.js → p-CGmVTdWh.js} +1 -1
  444. package/dist/ionic/{p-BOVrCkpJ.js → p-CYbRmDdy.js} +1 -1
  445. package/dist/ionic/{p-D-eFFUkA.js → p-CmFz1Mjc.js} +1 -1
  446. package/dist/ionic/p-CtA-yJYy.js +4 -0
  447. package/dist/ionic/p-D8HJQ1qq.js +4 -0
  448. package/dist/ionic/{p-B0q1YL7N.js → p-DB_iPQC-.js} +1 -1
  449. package/dist/ionic/{p-DNcfiJwE.js → p-DLbbmF9h.js} +1 -1
  450. package/dist/ionic/{p-DdR6rpbR.js → p-DTPR1Wpn.js} +1 -1
  451. package/dist/ionic/{p-DCv9sLH2.js → p-DjriolRs.js} +1 -1
  452. package/dist/ionic/p-DtVZDHlS.js +4 -0
  453. package/dist/ionic/{p-QHYY4sjU.js → p-GWUGgWx6.js} +1 -1
  454. package/dist/ionic/p-IGIE5vDm.js +5 -0
  455. package/dist/ionic/{p-BFvmZNyx.js → p-NFFyoJ4Q.js} +1 -1
  456. package/dist/ionic/{p-86f53961.entry.js → p-a287e18e.entry.js} +1 -1
  457. package/dist/ionic/p-a805674e.entry.js +4 -0
  458. package/dist/ionic/p-a81ae2cd.entry.js +4 -0
  459. package/dist/ionic/{p-da7d04cc.entry.js → p-a84f2d21.entry.js} +1 -1
  460. package/dist/ionic/{p-dbbe606a.entry.js → p-b2d5238b.entry.js} +1 -1
  461. package/dist/ionic/{p-d1f54e28.entry.js → p-b440381f.entry.js} +1 -1
  462. package/dist/ionic/{p-72c38b88.entry.js → p-b4d52b58.entry.js} +1 -1
  463. package/dist/ionic/{p-2a939845.entry.js → p-b67a2114.entry.js} +1 -1
  464. package/dist/ionic/{p-c73627c8.entry.js → p-bced1f3e.entry.js} +1 -1
  465. package/dist/ionic/{p-9a2d390d.entry.js → p-c1c9b2bb.entry.js} +1 -1
  466. package/dist/ionic/{p-f8f22cc0.entry.js → p-c3e65e45.entry.js} +1 -1
  467. package/dist/ionic/{p-b0a7585c.entry.js → p-ca31010f.entry.js} +1 -1
  468. package/dist/ionic/p-cbf245b5.entry.js +4 -0
  469. package/dist/ionic/p-d68b665a.entry.js +4 -0
  470. package/dist/ionic/{p-9575b654.entry.js → p-e663bc5a.entry.js} +1 -1
  471. package/dist/ionic/p-efe86ed9.entry.js +4 -0
  472. package/dist/ionic/{p-ac4eb91d.entry.js → p-f5dfb9a3.entry.js} +1 -1
  473. package/dist/ionic/{p-DbQ5QkTP.js → p-gbVXD275.js} +1 -1
  474. package/dist/ionic/p-hNN3VvaC.js +4 -0
  475. package/dist/types/components/datetime/datetime.d.ts +9 -0
  476. package/dist/types/components/header/header.utils.d.ts +2 -1
  477. package/dist/types/components/modal/gestures/sheet.d.ts +2 -2
  478. package/dist/types/components/modal/gestures/swipe-to-close.d.ts +2 -2
  479. package/dist/types/components/modal/modal-interface.d.ts +0 -7
  480. package/dist/types/components/modal/modal.d.ts +1 -17
  481. package/dist/types/components/range/range-interface.d.ts +1 -0
  482. package/dist/types/components/range/range.d.ts +33 -4
  483. package/dist/types/components/refresher/refresher-interface.d.ts +7 -0
  484. package/dist/types/components/refresher/refresher.d.ts +16 -3
  485. package/dist/types/components.d.ts +929 -206
  486. package/dist/types/interface.d.ts +1 -1
  487. package/dist/types/stencil-public-runtime.d.ts +126 -14
  488. package/dist/types/utils/gesture/listener.d.ts +2 -1
  489. package/hydrate/index.d.ts +12 -0
  490. package/hydrate/index.js +5375 -1550
  491. package/hydrate/index.mjs +5374 -1551
  492. package/package.json +2 -2
  493. package/dist/cjs/app-globals-Ciccnk9_.js +0 -10
  494. package/dist/esm/app-globals-BDSf8fOA.js +0 -8
  495. package/dist/ionic/p-012212e4.entry.js +0 -4
  496. package/dist/ionic/p-074839fc.entry.js +0 -4
  497. package/dist/ionic/p-0dfa5a37.entry.js +0 -4
  498. package/dist/ionic/p-0f418a37.entry.js +0 -4
  499. package/dist/ionic/p-11518b31.entry.js +0 -4
  500. package/dist/ionic/p-1838bed5.entry.js +0 -4
  501. package/dist/ionic/p-29721c43.entry.js +0 -4
  502. package/dist/ionic/p-31f7095f.entry.js +0 -4
  503. package/dist/ionic/p-34642fa1.entry.js +0 -4
  504. package/dist/ionic/p-35696017.entry.js +0 -4
  505. package/dist/ionic/p-40c261a3.entry.js +0 -4
  506. package/dist/ionic/p-4e41ea20.entry.js +0 -4
  507. package/dist/ionic/p-6241ce47.entry.js +0 -4
  508. package/dist/ionic/p-639dd543.entry.js +0 -4
  509. package/dist/ionic/p-6444c606.entry.js +0 -4
  510. package/dist/ionic/p-6d070558.entry.js +0 -4
  511. package/dist/ionic/p-7268efa5.entry.js +0 -4
  512. package/dist/ionic/p-7babec72.entry.js +0 -4
  513. package/dist/ionic/p-BKc55Xev.js +0 -4
  514. package/dist/ionic/p-Bmgaetn_.js +0 -4
  515. package/dist/ionic/p-C8IsBmNU.js +0 -5
  516. package/dist/ionic/p-CJxh_yLS.js +0 -4
  517. package/dist/ionic/p-DUt5fQmA.js +0 -4
  518. package/dist/ionic/p-DZRJwG4S.js +0 -4
  519. package/dist/ionic/p-a127bee2.entry.js +0 -4
  520. package/dist/ionic/p-b3d44509.entry.js +0 -4
  521. package/dist/ionic/p-cc45bcbc.entry.js +0 -4
  522. package/dist/ionic/p-d0a2a1ab.entry.js +0 -4
  523. package/dist/ionic/p-d3014190.entry.js +0 -4
  524. package/dist/ionic/p-db82892c.entry.js +0 -4
  525. package/dist/ionic/p-e1d1f3cc.entry.js +0 -4
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { Host, h } from "@stencil/core";
4
+ import { Build, Host, h } from "@stencil/core";
5
5
  import { findClosestIonContent, disableContentScrollY, resetContentScrollY } from "../../utils/content/index";
6
6
  import { inheritAriaAttributes, clamp, debounceEvent, renderHiddenInput, isSafeNumber } from "../../utils/helpers";
7
7
  import { printIonWarning } from "../../utils/logging/index";
@@ -17,13 +17,30 @@ import { roundToMaxDecimalPlaces } from "../../utils/floating-point";
17
17
  * @slot start - Content is placed to the left of the range slider in LTR, and to the right in RTL.
18
18
  * @slot end - Content is placed to the right of the range slider in LTR, and to the left in RTL.
19
19
  *
20
+ * @part label - The label text describing the range.
20
21
  * @part tick - An inactive tick mark.
21
22
  * @part tick-active - An active tick mark.
22
- * @part pin - The counter that appears above a knob.
23
- * @part knob - The handle that is used to drag the range.
24
23
  * @part bar - The inactive part of the bar.
25
24
  * @part bar-active - The active part of the bar.
26
- * @part label - The label text describing the range.
25
+ * @part knob-handle - The container element that wraps the knob and handles drag interactions.
26
+ * @part knob-handle-a - The container element for the first knob. Only available when `dualKnobs` is `true`.
27
+ * @part knob-handle-b - The container element for the second knob. Only available when `dualKnobs` is `true`.
28
+ * @part knob-handle-lower - The container element for the lower knob. Only available when `dualKnobs` is `true`.
29
+ * @part knob-handle-upper - The container element for the upper knob. Only available when `dualKnobs` is `true`.
30
+ * @part pin - The counter that appears above a knob.
31
+ * @part pin-a - The counter that appears above the first knob. Only available when `dualKnobs` is `true`.
32
+ * @part pin-b - The counter that appears above the second knob. Only available when `dualKnobs` is `true`.
33
+ * @part pin-lower - The counter that appears above the lower knob. Only available when `dualKnobs` is `true`.
34
+ * @part pin-upper - The counter that appears above the upper knob. Only available when `dualKnobs` is `true`.
35
+ * @part knob - The visual knob element that appears on the range track.
36
+ * @part knob-a - The visual knob element for the first knob. Only available when `dualKnobs` is `true`.
37
+ * @part knob-b - The visual knob element for the second knob. Only available when `dualKnobs` is `true`.
38
+ * @part knob-lower - The visual knob element for the lower knob. Only available when `dualKnobs` is `true`.
39
+ * @part knob-upper - The visual knob element for the upper knob. Only available when `dualKnobs` is `true`.
40
+ * @part activated - Added to the knob-handle, knob, and pin when the knob is activated (has the `ion-activated` class). Only one set has this part at a time when `dualKnobs` is `true`.
41
+ * @part focused - Added to the knob-handle, knob, and pin that currently has focus. Only one set has this part at a time when `dualKnobs` is `true`.
42
+ * @part hover - Added to the knob-handle, knob, and pin when the knob has hover. Only one set has this part at a time when `dualKnobs` is `true`.
43
+ * @part pressed - Added to the knob-handle, knob, and pin that is currently being pressed to drag. Only one set has this part at a time when `dualKnobs` is `true`.
27
44
  */
28
45
  export class Range {
29
46
  constructor() {
@@ -34,6 +51,7 @@ export class Range {
34
51
  this.inheritedAttributes = {};
35
52
  this.contentEl = null;
36
53
  this.initialContentScrollY = true;
54
+ this.focusFromPointer = false;
37
55
  this.ratioA = 0;
38
56
  this.ratioB = 0;
39
57
  /**
@@ -143,6 +161,31 @@ export class Range {
143
161
  this.gesture.enable(!this.disabled);
144
162
  }
145
163
  };
164
+ /**
165
+ * Observes the knob handles for the ion-activated class and syncs
166
+ * activatedKnob so the activated part is correctly set on the handle,
167
+ * knob, and pin.
168
+ */
169
+ this.setupActivatedObserver = () => {
170
+ const knobHandleA = this.el.shadowRoot.querySelector('.range-knob-handle-a');
171
+ const knobHandleB = this.el.shadowRoot.querySelector('.range-knob-handle-b');
172
+ const syncActivated = () => {
173
+ this.activatedKnob = (knobHandleA === null || knobHandleA === void 0 ? void 0 : knobHandleA.classList.contains('ion-activated'))
174
+ ? 'A'
175
+ : (knobHandleB === null || knobHandleB === void 0 ? void 0 : knobHandleB.classList.contains('ion-activated'))
176
+ ? 'B'
177
+ : undefined;
178
+ };
179
+ if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
180
+ this.activatedObserver = new MutationObserver(syncActivated);
181
+ this.activatedObserver.observe(this.el.shadowRoot, {
182
+ attributes: true,
183
+ attributeFilter: ['class'],
184
+ subtree: true,
185
+ });
186
+ }
187
+ syncActivated();
188
+ };
146
189
  this.handleKeyboard = (knob, isIncrease) => {
147
190
  const { ensureValueInBounds } = this;
148
191
  let step = this.step;
@@ -165,6 +208,7 @@ export class Range {
165
208
  this.onBlur = () => {
166
209
  if (this.hasFocus) {
167
210
  this.hasFocus = false;
211
+ this.focusedKnob = undefined;
168
212
  this.ionBlur.emit();
169
213
  }
170
214
  };
@@ -175,21 +219,20 @@ export class Range {
175
219
  }
176
220
  };
177
221
  this.onKnobFocus = (knob) => {
222
+ // Clicking focuses the range which is needed for the keyboard,
223
+ // but we only want to add the ion-focused class when focused via Tab.
224
+ if (!this.focusFromPointer) {
225
+ this.focusedKnob = knob;
226
+ }
227
+ else {
228
+ this.focusFromPointer = false;
229
+ this.focusedKnob = undefined;
230
+ }
231
+ // If the knob was not already focused, emit the focus event
178
232
  if (!this.hasFocus) {
179
233
  this.hasFocus = true;
180
234
  this.ionFocus.emit();
181
235
  }
182
- // Manually manage ion-focused class for dual knobs
183
- if (this.dualKnobs && this.el.shadowRoot) {
184
- const knobA = this.el.shadowRoot.querySelector('.range-knob-a');
185
- const knobB = this.el.shadowRoot.querySelector('.range-knob-b');
186
- // Remove ion-focused from both knobs first
187
- knobA === null || knobA === void 0 ? void 0 : knobA.classList.remove('ion-focused');
188
- knobB === null || knobB === void 0 ? void 0 : knobB.classList.remove('ion-focused');
189
- // Add ion-focused only to the focused knob
190
- const focusedKnobEl = knob === 'A' ? knobA : knobB;
191
- focusedKnobEl === null || focusedKnobEl === void 0 ? void 0 : focusedKnobEl.classList.add('ion-focused');
192
- }
193
236
  };
194
237
  this.onKnobBlur = () => {
195
238
  // Check if focus is moving to another knob within the same range
@@ -201,18 +244,18 @@ export class Range {
201
244
  if (!isStillFocusedOnKnob) {
202
245
  if (this.hasFocus) {
203
246
  this.hasFocus = false;
247
+ this.focusedKnob = undefined;
204
248
  this.ionBlur.emit();
205
249
  }
206
- // Remove ion-focused from both knobs when focus leaves the range
207
- if (this.dualKnobs && this.el.shadowRoot) {
208
- const knobA = this.el.shadowRoot.querySelector('.range-knob-a');
209
- const knobB = this.el.shadowRoot.querySelector('.range-knob-b');
210
- knobA === null || knobA === void 0 ? void 0 : knobA.classList.remove('ion-focused');
211
- knobB === null || knobB === void 0 ? void 0 : knobB.classList.remove('ion-focused');
212
- }
213
250
  }
214
251
  }, 0);
215
252
  };
253
+ this.onKnobMouseEnter = (knob) => {
254
+ this.hoveredKnob = knob;
255
+ };
256
+ this.onKnobMouseLeave = () => {
257
+ this.hoveredKnob = undefined;
258
+ };
216
259
  }
217
260
  debounceChanged() {
218
261
  const { ionInput, debounce, originalIonInput } = this;
@@ -289,6 +332,7 @@ export class Range {
289
332
  this.originalIonInput = this.ionInput;
290
333
  this.setupGesture();
291
334
  this.updateRatio();
335
+ this.setupActivatedObserver();
292
336
  this.didLoad = true;
293
337
  }
294
338
  connectedCallback() {
@@ -314,6 +358,10 @@ export class Range {
314
358
  this.gesture.destroy();
315
359
  this.gesture = undefined;
316
360
  }
361
+ if (this.activatedObserver) {
362
+ this.activatedObserver.disconnect();
363
+ this.activatedObserver = undefined;
364
+ }
317
365
  }
318
366
  getValue() {
319
367
  var _a;
@@ -466,7 +514,6 @@ export class Range {
466
514
  ratio = 1 - ratio;
467
515
  }
468
516
  this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
469
- this.setFocus(this.pressedKnob);
470
517
  }
471
518
  get valA() {
472
519
  return ratioToValue(this.ratioA, this.min, this.max, this.step);
@@ -493,9 +540,23 @@ export class Range {
493
540
  updateRatio() {
494
541
  const value = this.getValue();
495
542
  const { min, max } = this;
543
+ /**
544
+ * For dual knobs, value gives lower/upper but not which is A vs B.
545
+ * Assign (lowerRatio, upperRatio) to (ratioA, ratioB) in the way that
546
+ * minimizes change from the current ratios so the knobs don't swap.
547
+ */
496
548
  if (this.dualKnobs) {
497
- this.ratioA = valueToRatio(value.lower, min, max);
498
- this.ratioB = valueToRatio(value.upper, min, max);
549
+ const lowerRatio = valueToRatio(value.lower, min, max);
550
+ const upperRatio = valueToRatio(value.upper, min, max);
551
+ if (Math.abs(this.ratioA - lowerRatio) + Math.abs(this.ratioB - upperRatio) <=
552
+ Math.abs(this.ratioA - upperRatio) + Math.abs(this.ratioB - lowerRatio)) {
553
+ this.ratioA = lowerRatio;
554
+ this.ratioB = upperRatio;
555
+ }
556
+ else {
557
+ this.ratioA = upperRatio;
558
+ this.ratioB = lowerRatio;
559
+ }
499
560
  }
500
561
  else {
501
562
  this.ratioA = valueToRatio(value, min, max);
@@ -512,14 +573,6 @@ export class Range {
512
573
  };
513
574
  this.noUpdate = false;
514
575
  }
515
- setFocus(knob) {
516
- if (this.el.shadowRoot) {
517
- const knobEl = this.el.shadowRoot.querySelector(knob === 'A' ? '.range-knob-a' : '.range-knob-b');
518
- if (knobEl) {
519
- knobEl.focus();
520
- }
521
- }
522
- }
523
576
  /**
524
577
  * Returns true if content was passed to the "start" slot
525
578
  */
@@ -537,7 +590,7 @@ export class Range {
537
590
  }
538
591
  renderRangeSlider() {
539
592
  var _a;
540
- const { min, max, step, handleKeyboard, pressedKnob, disabled, pin, ratioLower, ratioUpper, pinFormatter, inheritedAttributes, } = this;
593
+ const { min, max, step, handleKeyboard, activatedKnob, focusedKnob, hoveredKnob, pressedKnob, disabled, pin, ratioLower, ratioUpper, pinFormatter, inheritedAttributes, } = this;
541
594
  let barStart = `${ratioLower * 100}%`;
542
595
  let barEnd = `${100 - ratioUpper * 100}%`;
543
596
  const rtl = isRTL(this.el);
@@ -597,7 +650,9 @@ export class Range {
597
650
  ticks.push(tick);
598
651
  }
599
652
  }
600
- return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl),
653
+ return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl), onPointerDown: () => {
654
+ this.focusFromPointer = true;
655
+ },
601
656
  /**
602
657
  * Since the gesture has a threshold, the value
603
658
  * won't change until the user has dragged past
@@ -610,6 +665,7 @@ export class Range {
610
665
  * we need to listen for the "pointerUp" event.
611
666
  */
612
667
  onPointerUp: (ev) => {
668
+ this.focusFromPointer = false;
613
669
  /**
614
670
  * If the user drags the knob on the web
615
671
  * version (does not occur on mobile),
@@ -635,6 +691,11 @@ export class Range {
635
691
  'has-ticks': ticks.length > 0,
636
692
  }, role: "presentation", style: barStyle, part: "bar-active" })), renderKnob(rtl, {
637
693
  knob: 'A',
694
+ position: getKnobPosition('A', this.ratioA, this.ratioB, this.dualKnobs),
695
+ dualKnobs: this.dualKnobs,
696
+ activated: activatedKnob === 'A',
697
+ focused: focusedKnob === 'A',
698
+ hovered: hoveredKnob === 'A',
638
699
  pressed: pressedKnob === 'A',
639
700
  value: this.valA,
640
701
  ratio: this.ratioA,
@@ -647,9 +708,16 @@ export class Range {
647
708
  inheritedAttributes,
648
709
  onKnobFocus: this.onKnobFocus,
649
710
  onKnobBlur: this.onKnobBlur,
711
+ onKnobMouseEnter: this.onKnobMouseEnter,
712
+ onKnobMouseLeave: this.onKnobMouseLeave,
650
713
  }), this.dualKnobs &&
651
714
  renderKnob(rtl, {
652
715
  knob: 'B',
716
+ position: getKnobPosition('B', this.ratioA, this.ratioB, this.dualKnobs),
717
+ dualKnobs: this.dualKnobs,
718
+ activated: activatedKnob === 'B',
719
+ focused: focusedKnob === 'B',
720
+ hovered: hoveredKnob === 'B',
653
721
  pressed: pressedKnob === 'B',
654
722
  value: this.valB,
655
723
  ratio: this.ratioB,
@@ -662,6 +730,8 @@ export class Range {
662
730
  inheritedAttributes,
663
731
  onKnobFocus: this.onKnobFocus,
664
732
  onKnobBlur: this.onKnobBlur,
733
+ onKnobMouseEnter: this.onKnobMouseEnter,
734
+ onKnobMouseLeave: this.onKnobMouseLeave,
665
735
  })));
666
736
  }
667
737
  render() {
@@ -680,6 +750,12 @@ export class Range {
680
750
  const hasEndContent = (hasLabel && labelPlacement === 'end') || this.hasEndSlotContent;
681
751
  const needsEndAdjustment = inItem && !hasEndContent;
682
752
  const mode = getIonMode(this);
753
+ /**
754
+ * Determine the name and position of the pressed knob to apply
755
+ * Host classes for styling.
756
+ */
757
+ const pressedKnobName = dualKnobs ? pressedKnob === null || pressedKnob === void 0 ? void 0 : pressedKnob.toLowerCase() : undefined;
758
+ const pressedKnobPosition = dualKnobs && pressedKnob ? getKnobPosition(pressedKnob, this.ratioA, this.ratioB, dualKnobs) : undefined;
683
759
  /**
684
760
  * Determine if any knob is at the min or max value to
685
761
  * apply Host classes for styling.
@@ -687,21 +763,24 @@ export class Range {
687
763
  const valueAtMin = dualKnobs ? this.valA === min || this.valB === min : this.valA === min;
688
764
  const valueAtMax = dualKnobs ? this.valA === max || this.valB === max : this.valA === max;
689
765
  renderHiddenInput(true, el, this.name, JSON.stringify(this.getValue()), disabled);
690
- return (h(Host, { key: 'ed646a42d51b8fe22012198c354cbcf5a389c108', onFocusin: this.onFocus, onFocusout: this.onBlur, id: rangeId, class: createColorClasses(this.color, {
766
+ return (h(Host, { key: '3d87901f6acf5848e1891e387f9042e2a1e3f91e', onFocusin: this.onFocus, onFocusout: this.onBlur, id: rangeId, class: createColorClasses(this.color, {
691
767
  [mode]: true,
692
768
  'in-item': inItem,
693
769
  'range-disabled': disabled,
770
+ 'range-dual-knobs': dualKnobs,
694
771
  'range-pressed': pressedKnob !== undefined,
772
+ [`range-pressed-${pressedKnobName}`]: pressedKnob !== undefined && pressedKnobName !== undefined,
773
+ [`range-pressed-${pressedKnobPosition}`]: pressedKnob !== undefined && pressedKnobPosition !== undefined,
695
774
  'range-has-pin': pin,
696
775
  [`range-label-placement-${labelPlacement}`]: true,
697
776
  'range-item-start-adjustment': needsStartAdjustment,
698
777
  'range-item-end-adjustment': needsEndAdjustment,
699
778
  'range-value-min': valueAtMin,
700
779
  'range-value-max': valueAtMax,
701
- }) }, h("label", { key: '3083e4f2a624e3b268396acb4415f7c6ac44d851', class: "range-wrapper", id: "range-label" }, h("div", { key: '47b92f94d2a0381dd7c5cd3dda54ed2942096715', class: {
780
+ }) }, h("label", { key: '33a3fa985121811828dcfa4244edd73c28d18182', class: "range-wrapper", id: "range-label" }, h("div", { key: '36cd13d03e67fee8c92ade30ac1d3c6ae7a32126', class: {
702
781
  'label-text-wrapper': true,
703
782
  'label-text-wrapper-hidden': !hasLabel,
704
- }, part: "label" }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { key: '5341da8d19eb29091df680978a0e20cc8f2eec65', class: "native-wrapper" }, h("slot", { key: '09f1437078032676695442d8c827a16faa7dffe2', name: "start" }), this.renderRangeSlider(), h("slot", { key: '02b7781970ea4d44f10b5f4627a2ca36eca45f85', name: "end" })))));
783
+ }, part: "label" }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { key: '1650c180246f80340f0313b16dbdd8eae7451fb5', class: "native-wrapper" }, h("slot", { key: 'ca73ff66e30a49056d76cbd3007ece207ca5261d', name: "start" }), this.renderRangeSlider(), h("slot", { key: '59a90b1f4fd4a6879c90bb46d20f8df53d8456f6', name: "end" })))));
705
784
  }
706
785
  static get is() { return "ion-range"; }
707
786
  static get encapsulation() { return "shadow"; }
@@ -729,7 +808,8 @@ export class Range {
729
808
  "Color": {
730
809
  "location": "import",
731
810
  "path": "../../interface",
732
- "id": "src/interface.d.ts::Color"
811
+ "id": "src/interface.d.ts::Color",
812
+ "referenceLocation": "Color"
733
813
  }
734
814
  }
735
815
  },
@@ -892,7 +972,8 @@ export class Range {
892
972
  "PinFormatter": {
893
973
  "location": "import",
894
974
  "path": "./range-interface",
895
- "id": "src/components/range/range-interface.ts::PinFormatter"
975
+ "id": "src/components/range/range-interface.ts::PinFormatter",
976
+ "referenceLocation": "PinFormatter"
896
977
  }
897
978
  }
898
979
  },
@@ -1015,7 +1096,8 @@ export class Range {
1015
1096
  "RangeValue": {
1016
1097
  "location": "import",
1017
1098
  "path": "./range-interface",
1018
- "id": "src/components/range/range-interface.ts::RangeValue"
1099
+ "id": "src/components/range/range-interface.ts::RangeValue",
1100
+ "referenceLocation": "RangeValue"
1019
1101
  }
1020
1102
  }
1021
1103
  },
@@ -1057,6 +1139,9 @@ export class Range {
1057
1139
  return {
1058
1140
  "ratioA": {},
1059
1141
  "ratioB": {},
1142
+ "activatedKnob": {},
1143
+ "focusedKnob": {},
1144
+ "hoveredKnob": {},
1060
1145
  "pressedKnob": {}
1061
1146
  };
1062
1147
  }
@@ -1078,7 +1163,8 @@ export class Range {
1078
1163
  "RangeChangeEventDetail": {
1079
1164
  "location": "import",
1080
1165
  "path": "./range-interface",
1081
- "id": "src/components/range/range-interface.ts::RangeChangeEventDetail"
1166
+ "id": "src/components/range/range-interface.ts::RangeChangeEventDetail",
1167
+ "referenceLocation": "RangeChangeEventDetail"
1082
1168
  }
1083
1169
  }
1084
1170
  }
@@ -1099,7 +1185,8 @@ export class Range {
1099
1185
  "RangeChangeEventDetail": {
1100
1186
  "location": "import",
1101
1187
  "path": "./range-interface",
1102
- "id": "src/components/range/range-interface.ts::RangeChangeEventDetail"
1188
+ "id": "src/components/range/range-interface.ts::RangeChangeEventDetail",
1189
+ "referenceLocation": "RangeChangeEventDetail"
1103
1190
  }
1104
1191
  }
1105
1192
  }
@@ -1150,7 +1237,8 @@ export class Range {
1150
1237
  "RangeKnobMoveStartEventDetail": {
1151
1238
  "location": "import",
1152
1239
  "path": "./range-interface",
1153
- "id": "src/components/range/range-interface.ts::RangeKnobMoveStartEventDetail"
1240
+ "id": "src/components/range/range-interface.ts::RangeKnobMoveStartEventDetail",
1241
+ "referenceLocation": "RangeKnobMoveStartEventDetail"
1154
1242
  }
1155
1243
  }
1156
1244
  }
@@ -1171,7 +1259,8 @@ export class Range {
1171
1259
  "RangeKnobMoveEndEventDetail": {
1172
1260
  "location": "import",
1173
1261
  "path": "./range-interface",
1174
- "id": "src/components/range/range-interface.ts::RangeKnobMoveEndEventDetail"
1262
+ "id": "src/components/range/range-interface.ts::RangeKnobMoveEndEventDetail",
1263
+ "referenceLocation": "RangeKnobMoveEndEventDetail"
1175
1264
  }
1176
1265
  }
1177
1266
  }
@@ -1203,7 +1292,7 @@ export class Range {
1203
1292
  }];
1204
1293
  }
1205
1294
  }
1206
- const renderKnob = (rtl, { knob, value, ratio, min, max, disabled, pressed, pin, handleKeyboard, pinFormatter, inheritedAttributes, onKnobFocus, onKnobBlur, }) => {
1295
+ const renderKnob = (rtl, { knob, position, dualKnobs, value, ratio, min, max, disabled, activated, focused, hovered, pressed, pin, handleKeyboard, pinFormatter, inheritedAttributes, onKnobFocus, onKnobBlur, onKnobMouseEnter, onKnobMouseLeave, }) => {
1207
1296
  const start = rtl ? 'right' : 'left';
1208
1297
  const knobStyle = () => {
1209
1298
  const style = {};
@@ -1224,16 +1313,66 @@ const renderKnob = (rtl, { knob, value, ratio, min, max, disabled, pressed, pin,
1224
1313
  ev.preventDefault();
1225
1314
  ev.stopPropagation();
1226
1315
  }
1227
- }, onFocus: () => onKnobFocus(knob), onBlur: onKnobBlur, class: {
1316
+ }, onFocus: () => onKnobFocus(knob), onBlur: onKnobBlur, onMouseEnter: () => onKnobMouseEnter(knob), onMouseLeave: onKnobMouseLeave, class: {
1228
1317
  'range-knob-handle': true,
1229
- 'range-knob-a': knob === 'A',
1230
- 'range-knob-b': knob === 'B',
1318
+ 'range-knob-handle-a': knob === 'A',
1319
+ 'range-knob-handle-b': knob === 'B',
1231
1320
  'range-knob-pressed': pressed,
1232
1321
  'range-knob-min': value === min,
1233
1322
  'range-knob-max': value === max,
1234
1323
  'ion-activatable': true,
1235
1324
  'ion-focusable': true,
1236
- }, style: knobStyle(), role: "slider", tabindex: disabled ? -1 : 0, "aria-label": ariaLabel !== undefined ? ariaLabel : null, "aria-labelledby": ariaLabel === undefined ? 'range-label' : null, "aria-valuemin": min, "aria-valuemax": max, "aria-disabled": disabled ? 'true' : null, "aria-valuenow": value }, pin && (h("div", { class: "range-pin", role: "presentation", part: "pin" }, pinFormatter(value))), h("div", { class: "range-knob", role: "presentation", part: "knob" })));
1325
+ 'ion-focused': focused,
1326
+ }, part: [
1327
+ 'knob-handle',
1328
+ dualKnobs && knob === 'A' && 'knob-handle-a',
1329
+ dualKnobs && knob === 'B' && 'knob-handle-b',
1330
+ dualKnobs && position === 'lower' && 'knob-handle-lower',
1331
+ dualKnobs && position === 'upper' && 'knob-handle-upper',
1332
+ pressed && 'pressed',
1333
+ focused && 'focused',
1334
+ hovered && 'hover',
1335
+ activated && 'activated',
1336
+ ]
1337
+ .filter(Boolean)
1338
+ .join(' '), style: knobStyle(), role: "slider", tabindex: disabled ? -1 : 0, "aria-label": ariaLabel !== undefined ? ariaLabel : null, "aria-labelledby": ariaLabel === undefined ? 'range-label' : null, "aria-valuemin": min, "aria-valuemax": max, "aria-disabled": disabled ? 'true' : null, "aria-valuenow": value }, pin && (h("div", { class: "range-pin", role: "presentation", part: [
1339
+ 'pin',
1340
+ dualKnobs && knob === 'A' && 'pin-a',
1341
+ dualKnobs && knob === 'B' && 'pin-b',
1342
+ dualKnobs && position === 'lower' && 'pin-lower',
1343
+ dualKnobs && position === 'upper' && 'pin-upper',
1344
+ pressed && 'pressed',
1345
+ focused && 'focused',
1346
+ hovered && 'hover',
1347
+ activated && 'activated',
1348
+ ]
1349
+ .filter(Boolean)
1350
+ .join(' ') }, pinFormatter(value))), h("div", { class: "range-knob", role: "presentation", part: [
1351
+ 'knob',
1352
+ dualKnobs && knob === 'A' && 'knob-a',
1353
+ dualKnobs && knob === 'B' && 'knob-b',
1354
+ dualKnobs && position === 'lower' && 'knob-lower',
1355
+ dualKnobs && position === 'upper' && 'knob-upper',
1356
+ pressed && 'pressed',
1357
+ focused && 'focused',
1358
+ hovered && 'hover',
1359
+ activated && 'activated',
1360
+ ]
1361
+ .filter(Boolean)
1362
+ .join(' ') })));
1363
+ };
1364
+ /**
1365
+ * Returns whether the given knob is at the lower or upper position based
1366
+ * on current ratios for the given knob.
1367
+ */
1368
+ const getKnobPosition = (knob, ratioA, ratioB, dualKnobs) => {
1369
+ if (dualKnobs) {
1370
+ if (knob === 'A') {
1371
+ return ratioA <= ratioB ? 'lower' : 'upper';
1372
+ }
1373
+ return ratioB <= ratioA ? 'lower' : 'upper';
1374
+ }
1375
+ return 'lower';
1237
1376
  };
1238
1377
  const ratioToValue = (ratio, min, max, step) => {
1239
1378
  let value = (max - min) * ratio;
@@ -68,8 +68,8 @@ export class Refresher {
68
68
  * than `1`. The default value is `1` which is equal to the speed of the cursor.
69
69
  * If a negative value is passed in, the factor will be `1` instead.
70
70
  *
71
- * For example: If the value passed is `1.2` and the content is dragged by
72
- * `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels
71
+ * For example, If the value passed is `1.2` and the content is dragged by
72
+ * `10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels
73
73
  * (an increase of 20 percent). If the value passed is `0.8`, the dragged amount
74
74
  * will be `8` pixels, less than the amount the cursor has moved.
75
75
  *
@@ -119,6 +119,9 @@ export class Refresher {
119
119
  this.animations = [];
120
120
  this.progress = 0;
121
121
  this.state = 1 /* RefresherState.Inactive */;
122
+ this.ionPullEnd.emit({
123
+ reason: state === 32 /* RefresherState.Completing */ ? 'complete' : 'cancel',
124
+ });
122
125
  }
123
126
  async setupiOSNativeRefresher(pullingSpinner, refreshingSpinner) {
124
127
  this.elementToTransform = this.scrollEl;
@@ -151,6 +154,7 @@ export class Refresher {
151
154
  if (!this.didStart) {
152
155
  this.didStart = true;
153
156
  this.ionStart.emit();
157
+ this.ionPullStart.emit();
154
158
  }
155
159
  // emit "pulling" on every move
156
160
  if (this.pointerDown) {
@@ -226,6 +230,7 @@ export class Refresher {
226
230
  this.lastVelocityY = ev.velocityY;
227
231
  },
228
232
  onEnd: () => {
233
+ const hadStarted = this.didStart;
229
234
  this.pointerDown = false;
230
235
  this.didStart = false;
231
236
  if (this.needsCompletion) {
@@ -235,6 +240,13 @@ export class Refresher {
235
240
  else if (this.didRefresh) {
236
241
  readTask(() => translateElement(this.elementToTransform, `${this.el.clientHeight}px`));
237
242
  }
243
+ else if (hadStarted) {
244
+ /**
245
+ * User started pulling but released before reaching the refresh threshold.
246
+ * Emit ionPullEnd to complete the event pair.
247
+ */
248
+ this.ionPullEnd.emit({ reason: 'cancel' });
249
+ }
238
250
  },
239
251
  });
240
252
  this.disabledChanged();
@@ -281,6 +293,7 @@ export class Refresher {
281
293
  ev.data.animation = animation;
282
294
  animation.progressStart(false, 0);
283
295
  this.ionStart.emit();
296
+ this.ionPullStart.emit();
284
297
  this.animations.push(animation);
285
298
  return;
286
299
  }
@@ -303,6 +316,7 @@ export class Refresher {
303
316
  this.animations = [];
304
317
  this.gesture.enable(true);
305
318
  this.state = 1 /* RefresherState.Inactive */;
319
+ this.ionPullEnd.emit({ reason: 'cancel' });
306
320
  });
307
321
  return;
308
322
  }
@@ -547,6 +561,7 @@ export class Refresher {
547
561
  if (!this.didStart) {
548
562
  this.didStart = true;
549
563
  this.ionStart.emit();
564
+ this.ionPullStart.emit();
550
565
  }
551
566
  // emit "pulling" on every move
552
567
  this.ionPull.emit();
@@ -590,6 +605,15 @@ export class Refresher {
590
605
  * available right away.
591
606
  */
592
607
  this.restoreOverflowStyle();
608
+ /**
609
+ * If ionPullStart was emitted, we need to emit ionPullEnd
610
+ * even though the gesture was aborted before reaching the
611
+ * pulling threshold.
612
+ */
613
+ if (this.didStart) {
614
+ this.didStart = false;
615
+ this.ionPullEnd.emit({ reason: 'cancel' });
616
+ }
593
617
  }
594
618
  }
595
619
  beginRefresh() {
@@ -636,6 +660,9 @@ export class Refresher {
636
660
  if (this.contentFullscreen && this.backgroundContentEl) {
637
661
  (_a = this.backgroundContentEl) === null || _a === void 0 ? void 0 : _a.style.removeProperty('--offset-top');
638
662
  }
663
+ this.ionPullEnd.emit({
664
+ reason: state === 32 /* RefresherState.Completing */ ? 'complete' : 'cancel',
665
+ });
639
666
  }, 600);
640
667
  // reset the styles on the scroll element
641
668
  // set that the refresh is actively cancelling/completing
@@ -689,7 +716,7 @@ export class Refresher {
689
716
  }
690
717
  render() {
691
718
  const mode = getIonMode(this);
692
- return (h(Host, { key: '2d1bd880877b698604542ab2d602d38b9504d975', slot: "fixed", class: {
719
+ return (h(Host, { key: 'bed0c2f44c32ecac24b7d8326ac7c7ef1d12c44f', slot: "fixed", class: {
693
720
  [mode]: true,
694
721
  // Used internally for styling
695
722
  [`refresher-${mode}`]: true,
@@ -809,7 +836,7 @@ export class Refresher {
809
836
  "optional": false,
810
837
  "docs": {
811
838
  "tags": [],
812
- "text": "How much to multiply the pull speed by. To slow the pull animation down,\npass a number less than `1`. To speed up the pull, pass a number greater\nthan `1`. The default value is `1` which is equal to the speed of the cursor.\nIf a negative value is passed in, the factor will be `1` instead.\n\nFor example: If the value passed is `1.2` and the content is dragged by\n`10` pixels, instead of `10` pixels the content will be pulled by `12` pixels\n(an increase of 20 percent). If the value passed is `0.8`, the dragged amount\nwill be `8` pixels, less than the amount the cursor has moved.\n\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher."
839
+ "text": "How much to multiply the pull speed by. To slow the pull animation down,\npass a number less than `1`. To speed up the pull, pass a number greater\nthan `1`. The default value is `1` which is equal to the speed of the cursor.\nIf a negative value is passed in, the factor will be `1` instead.\n\nFor example, If the value passed is `1.2` and the content is dragged by\n`10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels\n(an increase of 20 percent). If the value passed is `0.8`, the dragged amount\nwill be `8` pixels, less than the amount the cursor has moved.\n\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher."
813
840
  },
814
841
  "getter": false,
815
842
  "setter": false,
@@ -863,7 +890,8 @@ export class Refresher {
863
890
  "RefresherEventDetail": {
864
891
  "location": "import",
865
892
  "path": "./refresher-interface",
866
- "id": "src/components/refresher/refresher-interface.ts::RefresherEventDetail"
893
+ "id": "src/components/refresher/refresher-interface.ts::RefresherEventDetail",
894
+ "referenceLocation": "RefresherEventDetail"
867
895
  }
868
896
  }
869
897
  }
@@ -888,6 +916,24 @@ export class Refresher {
888
916
  "bubbles": true,
889
917
  "cancelable": true,
890
918
  "composed": true,
919
+ "docs": {
920
+ "tags": [{
921
+ "name": "deprecated",
922
+ "text": "Use `ionPullStart` instead."
923
+ }],
924
+ "text": "Emitted when the user begins to start pulling down.\nTODO(FW-7044): Remove this in a major release"
925
+ },
926
+ "complexType": {
927
+ "original": "void",
928
+ "resolved": "void",
929
+ "references": {}
930
+ }
931
+ }, {
932
+ "method": "ionPullStart",
933
+ "name": "ionPullStart",
934
+ "bubbles": true,
935
+ "cancelable": true,
936
+ "composed": true,
891
937
  "docs": {
892
938
  "tags": [],
893
939
  "text": "Emitted when the user begins to start pulling down."
@@ -897,6 +943,28 @@ export class Refresher {
897
943
  "resolved": "void",
898
944
  "references": {}
899
945
  }
946
+ }, {
947
+ "method": "ionPullEnd",
948
+ "name": "ionPullEnd",
949
+ "bubbles": true,
950
+ "cancelable": true,
951
+ "composed": true,
952
+ "docs": {
953
+ "tags": [],
954
+ "text": "Emitted when the refresher has returned to the inactive state\nafter a pull gesture. This fires whether the refresh completed\nsuccessfully or was canceled."
955
+ },
956
+ "complexType": {
957
+ "original": "RefresherPullEndEventDetail",
958
+ "resolved": "RefresherPullEndEventDetail",
959
+ "references": {
960
+ "RefresherPullEndEventDetail": {
961
+ "location": "import",
962
+ "path": "./refresher-interface",
963
+ "id": "src/components/refresher/refresher-interface.ts::RefresherPullEndEventDetail",
964
+ "referenceLocation": "RefresherPullEndEventDetail"
965
+ }
966
+ }
967
+ }
900
968
  }];
901
969
  }
902
970
  static get methods() {