@ionic/core 8.8.9-dev.11781024903.1e4268e5 → 8.8.9-dev.11781201980.1b6e8398

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 (366) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-action-sheet.js +1 -1
  3. package/components/ion-alert.js +1 -1
  4. package/components/ion-back-button.js +1 -1
  5. package/components/ion-button.js +1 -1
  6. package/components/ion-card.js +1 -1
  7. package/components/ion-chip.js +1 -1
  8. package/components/ion-datetime-button.js +1 -1
  9. package/components/ion-datetime.js +1 -1
  10. package/components/ion-fab-button.js +1 -1
  11. package/components/ion-gallery-item.d.ts +11 -0
  12. package/components/ion-gallery-item.js +4 -0
  13. package/components/ion-gallery.js +1 -1
  14. package/components/ion-grid.js +1 -1
  15. package/components/ion-header.js +1 -1
  16. package/components/ion-img.js +1 -1
  17. package/components/ion-infinite-scroll-content.js +1 -1
  18. package/components/ion-infinite-scroll.js +1 -1
  19. package/components/ion-input-otp.js +1 -1
  20. package/components/ion-input-password-toggle.js +1 -1
  21. package/components/ion-input.js +1 -1
  22. package/components/ion-item-divider.js +1 -1
  23. package/components/ion-item-group.js +1 -1
  24. package/components/ion-item-option.js +1 -1
  25. package/components/ion-item-options.js +1 -1
  26. package/components/ion-item-sliding.js +1 -1
  27. package/components/ion-item.js +1 -1
  28. package/components/ion-label.js +1 -1
  29. package/components/ion-list-header.js +1 -1
  30. package/components/ion-list.js +1 -1
  31. package/components/ion-loading.js +1 -1
  32. package/components/ion-menu-button.js +1 -1
  33. package/components/ion-menu-toggle.js +1 -1
  34. package/components/ion-menu.js +1 -1
  35. package/components/ion-modal.js +1 -1
  36. package/components/ion-nav-link.js +1 -1
  37. package/components/ion-nav.js +1 -1
  38. package/components/ion-note.js +1 -1
  39. package/components/ion-picker-column-option.js +1 -1
  40. package/components/ion-picker-legacy-column.js +1 -1
  41. package/components/ion-picker-legacy.js +1 -1
  42. package/components/ion-popover.js +1 -1
  43. package/components/ion-progress-bar.js +1 -1
  44. package/components/ion-radio-group.js +1 -1
  45. package/components/ion-radio.js +1 -1
  46. package/components/ion-range.js +1 -1
  47. package/components/ion-refresher-content.js +1 -1
  48. package/components/ion-refresher.js +1 -1
  49. package/components/ion-reorder-group.js +1 -1
  50. package/components/ion-reorder.js +1 -1
  51. package/components/ion-ripple-effect.js +1 -1
  52. package/components/ion-router-link.js +1 -1
  53. package/components/ion-router-outlet.js +1 -1
  54. package/components/ion-row.js +1 -1
  55. package/components/ion-searchbar.js +1 -1
  56. package/components/ion-segment-button.js +1 -1
  57. package/components/ion-segment-content.js +1 -1
  58. package/components/ion-segment-view.js +1 -1
  59. package/components/ion-segment.js +1 -1
  60. package/components/ion-select-modal.js +1 -1
  61. package/components/ion-select-option.js +1 -1
  62. package/components/ion-select-popover.js +1 -1
  63. package/components/ion-select.js +1 -1
  64. package/components/ion-skeleton-text.js +1 -1
  65. package/components/ion-spinner.js +1 -1
  66. package/components/ion-split-pane.js +1 -1
  67. package/components/ion-tab-bar.js +1 -1
  68. package/components/ion-tab-button.js +1 -1
  69. package/components/ion-tab.js +1 -1
  70. package/components/ion-tabs.js +1 -1
  71. package/components/ion-text.js +1 -1
  72. package/components/ion-textarea.js +1 -1
  73. package/components/ion-thumbnail.js +1 -1
  74. package/components/ion-title.js +1 -1
  75. package/components/ion-toast.js +1 -1
  76. package/components/ion-toggle.js +1 -1
  77. package/components/ion-toolbar.js +1 -1
  78. package/components/p-BFZBl0TS.js +4 -0
  79. package/components/{p-pvh0bjpw.js → p-BVi3gqm6.js} +1 -1
  80. package/components/{p-D6g8ud1e.js → p-BVk7LVs0.js} +1 -1
  81. package/components/{p-B9MABkWm.js → p-BdUtZxku.js} +1 -1
  82. package/components/{p-CzC_ZSgb.js → p-Be8tHurp.js} +1 -1
  83. package/components/p-C0U8YqYW.js +4 -0
  84. package/components/{p-C8kBejTT.js → p-CG3ZV6ON.js} +1 -1
  85. package/components/{p-CBS0sBAa.js → p-CaqTORfV.js} +1 -1
  86. package/components/{p-D2mReIu8.js → p-CkA0SI9d.js} +1 -1
  87. package/components/p-Cmql_g3_.js +4 -0
  88. package/components/p-CsakePQg.js +4 -0
  89. package/components/{p-CgSn4J7d.js → p-D1gEOh9B.js} +1 -1
  90. package/components/p-D3qBmaqi.js +4 -0
  91. package/components/{p-Do7NMUwR.js → p-DGn-jQpr.js} +1 -1
  92. package/components/p-DH4JHV73.js +4 -0
  93. package/components/p-DYK0qX7x.js +4 -0
  94. package/components/{p-Dp2x0MpA.js → p-DfV7pOtM.js} +1 -1
  95. package/components/{p-BhkGOA7t.js → p-F3N54OKJ.js} +1 -1
  96. package/components/{p-CgZLVOCc.js → p-MPREydZp.js} +1 -1
  97. package/components/{p-kKYBfhbe.js → p-OFfrVDLw.js} +1 -1
  98. package/components/p-iZO3WzZT.js +4 -0
  99. package/components/{p-LB-QPk3e.js → p-qclL-gNR.js} +1 -1
  100. package/dist/cjs/index-BJlwOs11.js +171 -0
  101. package/dist/cjs/index.cjs.js +1 -1
  102. package/dist/cjs/ion-action-sheet.cjs.entry.js +5 -5
  103. package/dist/cjs/ion-alert.cjs.entry.js +9 -25
  104. package/dist/cjs/ion-app_8.cjs.entry.js +7 -7
  105. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  106. package/dist/cjs/ion-col_3.cjs.entry.js +4 -4
  107. package/dist/cjs/ion-datetime_3.cjs.entry.js +4 -4
  108. package/dist/cjs/ion-gallery-item.cjs.entry.js +60 -0
  109. package/dist/cjs/ion-gallery.cjs.entry.js +91 -13
  110. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  111. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +4 -4
  112. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  113. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +3 -3
  114. package/dist/cjs/ion-input.cjs.entry.js +4 -4
  115. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  116. package/dist/cjs/ion-item_8.cjs.entry.js +16 -15
  117. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  118. package/dist/cjs/ion-menu_3.cjs.entry.js +6 -6
  119. package/dist/cjs/ion-modal.cjs.entry.js +4 -4
  120. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  121. package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
  122. package/dist/cjs/ion-popover.cjs.entry.js +2 -2
  123. package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
  124. package/dist/cjs/ion-radio_2.cjs.entry.js +5 -5
  125. package/dist/cjs/ion-range.cjs.entry.js +3 -3
  126. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  127. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  128. package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
  129. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  130. package/dist/cjs/ion-searchbar.cjs.entry.js +4 -4
  131. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  132. package/dist/cjs/ion-segment-view.cjs.entry.js +2 -2
  133. package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
  134. package/dist/cjs/ion-select-modal.cjs.entry.js +10 -30
  135. package/dist/cjs/ion-select_3.cjs.entry.js +43 -102
  136. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  137. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  138. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  139. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  140. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  141. package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
  142. package/dist/cjs/ion-toast.cjs.entry.js +3 -3
  143. package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
  144. package/dist/cjs/ionic.cjs.js +1 -1
  145. package/dist/cjs/loader.cjs.js +1 -1
  146. package/dist/cjs/select-option-render-C7klBX2H.js +81 -0
  147. package/dist/collection/collection-manifest.json +2 -1
  148. package/dist/collection/components/action-sheet/action-sheet.ionic.css +506 -163
  149. package/dist/collection/components/action-sheet/action-sheet.ios.css +27 -288
  150. package/dist/collection/components/action-sheet/action-sheet.md.css +27 -228
  151. package/dist/collection/components/alert/alert.ionic.css +797 -416
  152. package/dist/collection/components/alert/alert.ios.css +40 -402
  153. package/dist/collection/components/alert/alert.js +4 -20
  154. package/dist/collection/components/alert/alert.md.css +50 -385
  155. package/dist/collection/components/gallery/gallery.css +1 -86
  156. package/dist/collection/components/gallery/gallery.js +92 -13
  157. package/dist/collection/components/gallery/test/utils.js +16 -16
  158. package/dist/collection/components/gallery-item/gallery-item.css +88 -0
  159. package/dist/collection/components/gallery-item/gallery-item.js +100 -0
  160. package/dist/collection/components/grid/grid.js +2 -2
  161. package/dist/collection/components/header/header.js +2 -2
  162. package/dist/collection/components/img/img.js +2 -2
  163. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  164. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  165. package/dist/collection/components/input/input.js +4 -4
  166. package/dist/collection/components/input-otp/input-otp.js +3 -3
  167. package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
  168. package/dist/collection/components/item/item.ionic.css +17 -5
  169. package/dist/collection/components/item/item.js +3 -2
  170. package/dist/collection/components/item-divider/item-divider.js +2 -2
  171. package/dist/collection/components/item-group/item-group.js +1 -1
  172. package/dist/collection/components/item-option/item-option.js +2 -2
  173. package/dist/collection/components/item-options/item-options.js +1 -1
  174. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  175. package/dist/collection/components/label/label.js +2 -2
  176. package/dist/collection/components/list/list.js +1 -1
  177. package/dist/collection/components/list-header/list-header.js +2 -2
  178. package/dist/collection/components/loading/loading.js +2 -2
  179. package/dist/collection/components/menu/menu.js +2 -2
  180. package/dist/collection/components/menu-button/menu-button.js +2 -2
  181. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  182. package/dist/collection/components/modal/modal.js +4 -4
  183. package/dist/collection/components/nav/nav.js +1 -1
  184. package/dist/collection/components/nav-link/nav-link.js +1 -1
  185. package/dist/collection/components/note/note.js +2 -2
  186. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
  187. package/dist/collection/components/picker-legacy/picker.js +2 -2
  188. package/dist/collection/components/picker-legacy-column/picker-column.js +2 -2
  189. package/dist/collection/components/popover/popover.js +2 -2
  190. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  191. package/dist/collection/components/radio/radio.js +3 -3
  192. package/dist/collection/components/radio-group/radio-group.js +2 -2
  193. package/dist/collection/components/range/range.js +3 -3
  194. package/dist/collection/components/refresher/refresher.js +1 -1
  195. package/dist/collection/components/refresher-content/refresher-content.js +2 -2
  196. package/dist/collection/components/reorder/reorder.js +2 -2
  197. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  198. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  199. package/dist/collection/components/router-link/router-link.js +2 -2
  200. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  201. package/dist/collection/components/row/row.js +2 -2
  202. package/dist/collection/components/searchbar/searchbar.js +4 -4
  203. package/dist/collection/components/segment/segment.js +2 -2
  204. package/dist/collection/components/segment-button/segment-button.js +2 -2
  205. package/dist/collection/components/segment-content/segment-content.js +1 -1
  206. package/dist/collection/components/segment-view/segment-view.js +2 -2
  207. package/dist/collection/components/select/select.js +32 -72
  208. package/dist/collection/components/select-modal/select-modal.ionic.css +29 -139
  209. package/dist/collection/components/select-modal/select-modal.ios.css +7 -379
  210. package/dist/collection/components/select-modal/select-modal.js +5 -25
  211. package/dist/collection/components/select-modal/select-modal.md.css +7 -319
  212. package/dist/collection/components/select-option/select-option.js +1 -39
  213. package/dist/collection/components/select-popover/select-popover.ionic.css +376 -129
  214. package/dist/collection/components/select-popover/select-popover.ios.css +69 -252
  215. package/dist/collection/components/select-popover/select-popover.js +6 -25
  216. package/dist/collection/components/select-popover/select-popover.md.css +27 -273
  217. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  218. package/dist/collection/components/spinner/spinner.js +1 -1
  219. package/dist/collection/components/split-pane/split-pane.js +2 -2
  220. package/dist/collection/components/tab/tab.js +2 -2
  221. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  222. package/dist/collection/components/tab-button/tab-button.js +2 -2
  223. package/dist/collection/components/tabs/tabs.js +1 -1
  224. package/dist/collection/components/text/text.js +2 -2
  225. package/dist/collection/components/textarea/textarea.js +3 -3
  226. package/dist/collection/components/thumbnail/thumbnail.js +2 -2
  227. package/dist/collection/components/title/title.js +2 -2
  228. package/dist/collection/components/toast/toast.js +2 -2
  229. package/dist/collection/components/toggle/toggle.js +3 -3
  230. package/dist/collection/components/toolbar/toolbar.js +2 -2
  231. package/dist/collection/utils/sanitization/index.js +14 -255
  232. package/dist/collection/utils/select-option-render.js +24 -59
  233. package/dist/docs.json +87 -69
  234. package/dist/esm/index-D4ugF_sT.js +168 -0
  235. package/dist/esm/index.js +1 -1
  236. package/dist/esm/ion-action-sheet.entry.js +5 -5
  237. package/dist/esm/ion-alert.entry.js +9 -25
  238. package/dist/esm/ion-app_8.entry.js +7 -7
  239. package/dist/esm/ion-avatar_3.entry.js +2 -2
  240. package/dist/esm/ion-col_3.entry.js +4 -4
  241. package/dist/esm/ion-datetime_3.entry.js +4 -4
  242. package/dist/esm/ion-gallery-item.entry.js +58 -0
  243. package/dist/esm/ion-gallery.entry.js +91 -13
  244. package/dist/esm/ion-img.entry.js +2 -2
  245. package/dist/esm/ion-infinite-scroll_2.entry.js +4 -4
  246. package/dist/esm/ion-input-otp.entry.js +3 -3
  247. package/dist/esm/ion-input-password-toggle.entry.js +3 -3
  248. package/dist/esm/ion-input.entry.js +4 -4
  249. package/dist/esm/ion-item-option_3.entry.js +4 -4
  250. package/dist/esm/ion-item_8.entry.js +16 -15
  251. package/dist/esm/ion-loading.entry.js +3 -3
  252. package/dist/esm/ion-menu_3.entry.js +6 -6
  253. package/dist/esm/ion-modal.entry.js +4 -4
  254. package/dist/esm/ion-nav_2.entry.js +2 -2
  255. package/dist/esm/ion-picker-column-option.entry.js +2 -2
  256. package/dist/esm/ion-popover.entry.js +2 -2
  257. package/dist/esm/ion-progress-bar.entry.js +1 -1
  258. package/dist/esm/ion-radio_2.entry.js +5 -5
  259. package/dist/esm/ion-range.entry.js +3 -3
  260. package/dist/esm/ion-refresher_2.entry.js +4 -4
  261. package/dist/esm/ion-reorder_2.entry.js +3 -3
  262. package/dist/esm/ion-ripple-effect.entry.js +1 -1
  263. package/dist/esm/ion-route_4.entry.js +2 -2
  264. package/dist/esm/ion-searchbar.entry.js +4 -4
  265. package/dist/esm/ion-segment-content.entry.js +1 -1
  266. package/dist/esm/ion-segment-view.entry.js +2 -2
  267. package/dist/esm/ion-segment_2.entry.js +4 -4
  268. package/dist/esm/ion-select-modal.entry.js +10 -30
  269. package/dist/esm/ion-select_3.entry.js +43 -102
  270. package/dist/esm/ion-spinner.entry.js +1 -1
  271. package/dist/esm/ion-split-pane.entry.js +2 -2
  272. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  273. package/dist/esm/ion-tab_2.entry.js +3 -3
  274. package/dist/esm/ion-text.entry.js +2 -2
  275. package/dist/esm/ion-textarea.entry.js +3 -3
  276. package/dist/esm/ion-toast.entry.js +3 -3
  277. package/dist/esm/ion-toggle.entry.js +3 -3
  278. package/dist/esm/ionic.js +1 -1
  279. package/dist/esm/loader.js +1 -1
  280. package/dist/esm/select-option-render-B2qc5ZP7.js +79 -0
  281. package/dist/html.html-data.json +42 -27
  282. package/dist/ionic/index.esm.js +1 -1
  283. package/dist/ionic/ionic.esm.js +1 -1
  284. package/dist/ionic/{p-f52856cb.entry.js → p-0592c549.entry.js} +1 -1
  285. package/dist/ionic/{p-67c2d349.entry.js → p-0aa510cd.entry.js} +1 -1
  286. package/dist/ionic/{p-9ccfb733.entry.js → p-0cd5fd9d.entry.js} +1 -1
  287. package/dist/ionic/p-0e9d4e11.entry.js +4 -0
  288. package/dist/ionic/{p-497f6391.entry.js → p-11a38333.entry.js} +1 -1
  289. package/dist/ionic/{p-0030507d.entry.js → p-1a009a51.entry.js} +1 -1
  290. package/dist/ionic/{p-7186786e.entry.js → p-23e524f8.entry.js} +1 -1
  291. package/dist/ionic/{p-1439fecb.entry.js → p-2826761a.entry.js} +1 -1
  292. package/dist/ionic/{p-93315d96.entry.js → p-2c4170d8.entry.js} +1 -1
  293. package/dist/ionic/p-2d5a2511.entry.js +4 -0
  294. package/dist/ionic/{p-7f294078.entry.js → p-3706ea52.entry.js} +1 -1
  295. package/dist/ionic/{p-b69add0e.entry.js → p-3e376501.entry.js} +1 -1
  296. package/dist/ionic/{p-c684a3b6.entry.js → p-44597202.entry.js} +1 -1
  297. package/dist/ionic/{p-8458f1b6.entry.js → p-4a27a79a.entry.js} +1 -1
  298. package/dist/ionic/{p-b7235e85.entry.js → p-4f07113d.entry.js} +1 -1
  299. package/dist/ionic/{p-88e7f52a.entry.js → p-52b85650.entry.js} +1 -1
  300. package/dist/ionic/{p-199bffb3.entry.js → p-5a6e0ae1.entry.js} +1 -1
  301. package/dist/ionic/p-6906dca7.entry.js +4 -0
  302. package/dist/ionic/p-75a1ca50.entry.js +4 -0
  303. package/dist/ionic/{p-19a1ff9a.entry.js → p-7b09c19d.entry.js} +1 -1
  304. package/dist/ionic/{p-76c70824.entry.js → p-7b886782.entry.js} +1 -1
  305. package/dist/ionic/p-7da8b262.entry.js +4 -0
  306. package/dist/ionic/{p-89eab395.entry.js → p-82c05be2.entry.js} +1 -1
  307. package/dist/ionic/{p-b653f4c2.entry.js → p-83c0eb9b.entry.js} +1 -1
  308. package/dist/ionic/{p-b4fd91b8.entry.js → p-85ff1314.entry.js} +1 -1
  309. package/dist/ionic/p-88048796.entry.js +4 -0
  310. package/dist/ionic/{p-3f18dfe9.entry.js → p-8eca5ba1.entry.js} +1 -1
  311. package/dist/ionic/p-96f52444.entry.js +4 -0
  312. package/dist/ionic/p-CFjI63GE.js +4 -0
  313. package/dist/ionic/p-CWJdc8f_.js +4 -0
  314. package/dist/ionic/{p-f2f740aa.entry.js → p-a3b047e0.entry.js} +1 -1
  315. package/dist/ionic/{p-40d9e029.entry.js → p-a73caa5e.entry.js} +1 -1
  316. package/dist/ionic/{p-1ad16c09.entry.js → p-b0dfd018.entry.js} +1 -1
  317. package/dist/ionic/{p-a3f9be52.entry.js → p-b6130fe4.entry.js} +1 -1
  318. package/dist/ionic/p-c0558552.entry.js +4 -0
  319. package/dist/ionic/{p-084c2623.entry.js → p-c5f745b4.entry.js} +1 -1
  320. package/dist/ionic/{p-bc3d68ff.entry.js → p-c781241c.entry.js} +1 -1
  321. package/dist/ionic/p-cb154afe.entry.js +4 -0
  322. package/dist/ionic/{p-b847907d.entry.js → p-cde69f38.entry.js} +1 -1
  323. package/dist/ionic/{p-70ee89c9.entry.js → p-d6f0a698.entry.js} +1 -1
  324. package/dist/ionic/{p-dd2981d0.entry.js → p-d9804d04.entry.js} +1 -1
  325. package/dist/ionic/{p-7054a1b9.entry.js → p-e342b205.entry.js} +1 -1
  326. package/dist/ionic/{p-9dfbe98d.entry.js → p-e8916b04.entry.js} +1 -1
  327. package/dist/ionic/{p-dac1d4de.entry.js → p-f10f8f95.entry.js} +1 -1
  328. package/dist/types/components/gallery/gallery.d.ts +41 -8
  329. package/dist/types/components/gallery/test/utils.d.ts +2 -1
  330. package/dist/types/components/gallery-item/gallery-item.d.ts +33 -0
  331. package/dist/types/components/select/select-interface.d.ts +0 -8
  332. package/dist/types/components/select-option/select-option.d.ts +0 -32
  333. package/dist/types/components.d.ts +33 -18
  334. package/dist/types/utils/sanitization/index.d.ts +2 -54
  335. package/dist/types/utils/select-option-render.d.ts +0 -31
  336. package/hydrate/index.js +380 -645
  337. package/hydrate/index.mjs +380 -645
  338. package/package.json +1 -1
  339. package/components/p-BP_TU_4l.js +0 -4
  340. package/components/p-BqTwa6uT.js +0 -4
  341. package/components/p-Bxiu1dAN.js +0 -4
  342. package/components/p-C91NnY87.js +0 -4
  343. package/components/p-CODBQrPj.js +0 -4
  344. package/components/p-GElQZ38c.js +0 -4
  345. package/components/p-WdrzoonY.js +0 -4
  346. package/components/p-h64_gZrH.js +0 -4
  347. package/components/p-sehKq5RI.js +0 -4
  348. package/dist/cjs/index-Dm4Dm7Vg.js +0 -414
  349. package/dist/cjs/overlay-control-label-DnRLQR1t.js +0 -52
  350. package/dist/cjs/select-option-render-DQyZnlF5.js +0 -116
  351. package/dist/collection/utils/overlay-control-label.js +0 -47
  352. package/dist/esm/index-Bmyj8b0z.js +0 -409
  353. package/dist/esm/overlay-control-label-CODBQrPj.js +0 -49
  354. package/dist/esm/select-option-render-QGJ9tZHa.js +0 -114
  355. package/dist/ionic/p-18ed37e3.entry.js +0 -4
  356. package/dist/ionic/p-2049aa81.entry.js +0 -4
  357. package/dist/ionic/p-290778c1.entry.js +0 -4
  358. package/dist/ionic/p-2aa7567e.entry.js +0 -4
  359. package/dist/ionic/p-2e7e3da1.entry.js +0 -4
  360. package/dist/ionic/p-CODBQrPj.js +0 -4
  361. package/dist/ionic/p-CxRK9GyE.js +0 -4
  362. package/dist/ionic/p-NqPMS7BP.js +0 -4
  363. package/dist/ionic/p-c94fbdab.entry.js +0 -4
  364. package/dist/ionic/p-e89848b2.entry.js +0 -4
  365. package/dist/ionic/p-ff09d2a5.entry.js +0 -4
  366. package/dist/types/utils/overlay-control-label.d.ts +0 -34
@@ -3,22 +3,8 @@
3
3
  */
4
4
  import { printIonError } from "../logging/index";
5
5
  /**
6
- * Sanitize an untrusted HTML string.
7
- *
8
- * Parses the string into a detached DOM, removes blocked tags, strips
9
- * attributes outside the `allowedAttributes` list (refer `sanitizeElement`),
10
- * and scrubs script-scheme URLs. Returns the sanitized HTML string.
11
- *
12
- * Use this when you have an HTML string from an unknown source and need to
13
- * render it via `innerHTML`. Use `sanitizeDOMTree` instead when you already
14
- * have a DOM tree and want to sanitize it in place without a string round
15
- * trip; both apply the same attribute policy.
16
- *
17
- * @param untrustedString - The HTML string to sanitize. Pass an
18
- * `IonicSafeString` to bypass sanitization, or `undefined` to short-circuit.
19
- * @returns The sanitized HTML string, or `undefined` if the input was
20
- * `undefined`. Returns `''` if sanitization fails or the input contains
21
- * an inline `onload=` handler.
6
+ * Does a simple sanitization of all elements
7
+ * in an untrusted string
22
8
  */
23
9
  export const sanitizeDOMString = (untrustedString) => {
24
10
  try {
@@ -94,36 +80,6 @@ export const sanitizeDOMString = (untrustedString) => {
94
80
  return '';
95
81
  }
96
82
  };
97
- /**
98
- * Sanitize an entire trusted DOM tree in place.
99
- *
100
- * Removes blocked tags (`script`, `iframe`, etc.) from the subtree and
101
- * then sanitizes attributes on every remaining element using the same
102
- * allowlist policy as `sanitizeDOMString` (refer `sanitizeElement`).
103
- * Component presentational attributes (`size`, `color`, `shape`, inline
104
- * SVG, `aria-*`, `data-*`) are preserved; `style`, event handlers (`on*`),
105
- * form/navigation-hijack attributes, script-scheme URLs, and non-image
106
- * `data:` URLs are stripped.
107
- *
108
- * Use this when you have a DOM tree the developer controls (e.g.
109
- * cloned slot content from a component) and you need to render it
110
- * elsewhere safely.
111
- *
112
- * @param root - The root element whose subtree will be sanitized in
113
- * place. No-op when the sanitizer is disabled via `Ionic.config`.
114
- */
115
- export const sanitizeDOMTree = (root) => {
116
- if (!isSanitizerEnabled()) {
117
- return;
118
- }
119
- blockedTags.forEach((tag) => {
120
- const matches = root.querySelectorAll(tag);
121
- for (let i = matches.length - 1; i >= 0; i--) {
122
- matches[i].remove();
123
- }
124
- });
125
- sanitizeElement(root);
126
- };
127
83
  /**
128
84
  * Clean up current element based on allowed attributes
129
85
  * and then recursively dig down into any child elements to
@@ -145,60 +101,29 @@ const sanitizeElement = (element) => {
145
101
  element.remove();
146
102
  return;
147
103
  }
148
- /**
149
- * Always strip `style` (CSS injection, `background:url()` beaconing, UI
150
- * spoofing). It is never on the allowlist, but it is removed explicitly
151
- * here because some engines (e.g. jsdom) don't enumerate the CSSOM-backed
152
- * `style` attribute in `element.attributes`, which would let the loop
153
- * below skip over it.
154
- */
155
- element.removeAttribute('style');
156
104
  for (let i = element.attributes.length - 1; i >= 0; i--) {
157
105
  const attribute = element.attributes.item(i);
158
106
  const attributeName = attribute.name;
159
- const lowerName = attributeName.toLowerCase();
160
- /**
161
- * Remove any attribute that is not on the allowlist. This drops event
162
- * handlers (`on*`), `style`, the form/navigation-hijack attributes
163
- * (`formaction`, `action`, `target`), namespaced attributes like
164
- * `xlink:href`, and anything else not explicitly known to be safe.
165
- */
166
- if (!isAttributeAllowed(lowerName)) {
107
+ // remove non-allowed attribs
108
+ if (!allowedAttributes.includes(attributeName.toLowerCase())) {
167
109
  element.removeAttribute(attributeName);
168
110
  continue;
169
111
  }
170
112
  // clean up any allowed attribs
171
113
  // that attempt to do any JS funny-business
172
114
  const attributeValue = attribute.value;
173
- if (attributeValue == null) {
174
- continue;
175
- }
176
115
  /**
177
- * Scrub dangerous schemes from the value. The value is normalized first
178
- * (whitespace and ASCII control characters removed) so entity-obfuscated
179
- * payloads such as `java	script:`, which the parser decodes to
180
- * `java\tscript:`, are still caught. Normalizing the value also covers
181
- * namespaced attributes, where the previous `element[attributeName]`
182
- * property reflection returned `undefined` and let them slip through.
116
+ * We also need to check the property value
117
+ * as javascript: can allow special characters
118
+ * such as 	 and still be valid (i.e. java	script)
183
119
  */
184
- const normalizedValue = attributeValue.replace(controlCharactersAndWhitespace, '').toLowerCase();
185
- // Script schemes are never allowed, on any attribute.
186
- if (normalizedValue.includes('javascript:') || normalizedValue.includes('vbscript:')) {
187
- element.removeAttribute(attributeName);
188
- continue;
189
- }
190
- /**
191
- * For URL-bearing attributes, allow `data:` URIs only for raster
192
- * images. Document-bearing types (`text/html`, `image/svg+xml`,
193
- * `application/*`, etc.) can carry markup or script when navigated to
194
- * or rendered, so they are stripped, while safe image types are kept so
195
- * inline images keep working.
196
- */
197
- if (urlAttributes.includes(lowerName) &&
198
- normalizedValue.startsWith('data:') &&
199
- !safeDataImageUri.test(normalizedValue)) {
120
+ const propertyValue = element[attributeName];
121
+ /* eslint-disable */
122
+ if ((attributeValue != null && attributeValue.toLowerCase().includes('javascript:')) ||
123
+ (propertyValue != null && propertyValue.toLowerCase().includes('javascript:'))) {
200
124
  element.removeAttribute(attributeName);
201
125
  }
126
+ /* eslint-enable */
202
127
  }
203
128
  /**
204
129
  * Sanitize any nested children
@@ -231,174 +156,8 @@ const isSanitizerEnabled = () => {
231
156
  }
232
157
  return true;
233
158
  };
234
- /**
235
- * Mirror known custom-element DOM properties onto attributes so they
236
- * survive `cloneNode`. Call this on a DOM subtree before cloning it for
237
- * rendering elsewhere (e.g. cloning slotted option content into an
238
- * overlay).
239
- *
240
- * Only sets the attribute when the property holds a non-empty string
241
- * and the attribute isn't already present, so existing attributes
242
- * take precedence.
243
- *
244
- * @param root - The root element whose subtree (and itself) will be
245
- * inspected.
246
- */
247
- export const reflectPropertiesToAttributes = (root) => {
248
- const candidates = [];
249
- if (root.tagName in elementPropsToReflect) {
250
- candidates.push(root);
251
- }
252
- for (const tagName of Object.keys(elementPropsToReflect)) {
253
- candidates.push(...Array.from(root.querySelectorAll(tagName.toLowerCase())));
254
- }
255
- for (const el of candidates) {
256
- if (!(el.tagName in elementPropsToReflect)) {
257
- continue;
258
- }
259
- const props = elementPropsToReflect[el.tagName];
260
- for (const prop of props) {
261
- const value = el[prop];
262
- if (typeof value === 'string' && value.length > 0 && !el.hasAttribute(prop)) {
263
- el.setAttribute(prop, value);
264
- }
265
- }
266
- }
267
- };
268
- /**
269
- * Attribute names that are always safe to keep. Covers global HTML
270
- * attributes, the Ionic component presentational props that cloned rich
271
- * content (e.g. `ion-select-option` markup) relies on, and the inert SVG
272
- * presentation attributes used by inline icons.
273
- *
274
- * `aria-*` and `data-*` are allowed separately by prefix (refer
275
- * `allowedAttributePrefixes`) since they are inert and not worth
276
- * enumerating. URL-bearing names (`href`, `src`) are allowed here, but
277
- * their values are still scrubbed for script schemes in `sanitizeElement`.
278
- *
279
- * Notably absent: `style`, event handlers (`on*`), and the
280
- * form/navigation-hijack attributes (`formaction`, `action`, `target`),
281
- * which are therefore stripped.
282
- */
283
- const allowedAttributes = [
284
- // Global / structural
285
- 'class',
286
- 'id',
287
- 'slot',
288
- 'name',
289
- 'title',
290
- 'alt',
291
- 'lang',
292
- 'dir',
293
- 'role',
294
- 'type',
295
- 'value',
296
- 'disabled',
297
- 'width',
298
- 'height',
299
- 'href',
300
- 'src',
301
- // Ionic component presentational props
302
- 'color',
303
- 'size',
304
- 'shape',
305
- 'fill',
306
- 'expand',
307
- 'mode',
308
- 'theme',
309
- 'icon',
310
- 'label',
311
- 'label-placement',
312
- 'justify',
313
- 'inset',
314
- 'lines',
315
- 'ios',
316
- 'md',
317
- // SVG presentation attributes (compared lowercased, e.g. `viewBox`)
318
- 'xmlns',
319
- 'viewbox',
320
- 'preserveaspectratio',
321
- 'stroke',
322
- 'stroke-width',
323
- 'stroke-linecap',
324
- 'stroke-linejoin',
325
- 'stroke-opacity',
326
- 'stroke-dasharray',
327
- 'fill-rule',
328
- 'fill-opacity',
329
- 'clip-rule',
330
- 'd',
331
- 'points',
332
- 'cx',
333
- 'cy',
334
- 'r',
335
- 'rx',
336
- 'ry',
337
- 'x',
338
- 'y',
339
- 'x1',
340
- 'y1',
341
- 'x2',
342
- 'y2',
343
- 'transform',
344
- 'opacity',
345
- ];
346
- /**
347
- * Attribute-name prefixes that are always safe to keep. `aria-*` and
348
- * `data-*` attributes cannot execute script or load resources, so they are
349
- * allowed wholesale rather than enumerated by name.
350
- */
351
- const allowedAttributePrefixes = ['aria-', 'data-'];
352
- /**
353
- * Whether an attribute name (already lowercased) is safe to keep, by exact
354
- * match or by an allowed prefix.
355
- */
356
- const isAttributeAllowed = (lowerName) => {
357
- if (allowedAttributes.includes(lowerName)) {
358
- return true;
359
- }
360
- return allowedAttributePrefixes.some((prefix) => lowerName.startsWith(prefix));
361
- };
362
- /**
363
- * Matches ASCII control characters and whitespace (including the
364
- * non-breaking space). Used to normalize attribute values before matching
365
- * a URL scheme so entity-obfuscated payloads such as `java	script:`
366
- * (decoded by the parser to `java\tscript:`) can't smuggle a scheme past
367
- * the check.
368
- */
369
- // eslint-disable-next-line no-control-regex -- matching control characters is the point
370
- const controlCharactersAndWhitespace = /[\u0000-\u0020\u007f-\u00a0]/g;
371
- /**
372
- * Attributes whose values are URLs. Their values are scheme-checked in
373
- * `sanitizeElement` (e.g. `data:` filtering) beyond the script-scheme scrub
374
- * applied to every attribute.
375
- */
376
- const urlAttributes = ['href', 'src'];
377
- /**
378
- * Matches a `data:` URI for a raster image type that cannot carry script.
379
- * `image/svg+xml` is deliberately excluded (SVG can execute script), as are
380
- * document types like `text/html` and `application/*`. The value is already
381
- * lowercased and whitespace-stripped before this is tested.
382
- */
383
- const safeDataImageUri = /^data:image\/(?:png|jpe?g|gif|webp|bmp|avif|x-icon|vnd\.microsoft\.icon)[;,]/;
384
- /**
385
- * Tags removed entirely (with their subtree) before attribute sanitization.
386
- * Exported so tests can assert the set without hardcoding it.
387
- */
388
- export const blockedTags = ['script', 'style', 'iframe', 'meta', 'link', 'object', 'embed', 'base'];
389
- /**
390
- * Properties on custom elements that frameworks (Vue, Angular) often
391
- * set as DOM properties rather than attributes. `cloneNode` only copies
392
- * attributes, so these values are lost when slotted content is cloned
393
- * into an overlay. For each known custom element, we mirror the listed
394
- * properties onto attributes so the cloned copy still has the data it
395
- * needs to render.
396
- *
397
- * Keyed by uppercased tagName so the lookup matches `Element.tagName`.
398
- */
399
- const elementPropsToReflect = {
400
- 'ION-ICON': ['icon', 'name', 'src', 'ios', 'md'],
401
- };
159
+ const allowedAttributes = ['class', 'id', 'href', 'src', 'name', 'slot'];
160
+ const blockedTags = ['script', 'style', 'iframe', 'meta', 'link', 'object', 'embed'];
402
161
  export class IonicSafeString {
403
162
  constructor(value) {
404
163
  this.value = value;
@@ -2,63 +2,19 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { h } from "@stencil/core";
5
- import { sanitizeDOMTree } from "./sanitization/index";
5
+ import { sanitizeDOMString } from "./sanitization";
6
6
  /**
7
- * Converts a DOM node into a Stencil VNode (or text string) so the
8
- * resulting tree is rendered through the component's normal render
9
- * path. Rendering through Stencil ensures that scoped CSS classes
10
- * (e.g. `sc-ion-action-sheet-ionic`) are applied to every element.
11
- *
12
- * Highly recommended to pre-sanitize the source DOM (see
13
- * `getOptionContent` in select.tsx). This function performs pure
14
- * structural conversion — no security filtering.
15
- *
16
- * Preserves attributes only — properties set imperatively on the source
17
- * element (e.g. `input.value` after a user types) won't carry through.
18
- * In practice this isn't a concern: interactive controls shouldn't
19
- * appear in select-option rich content since they'd nest inside the
20
- * overlay's button/radio/checkbox wrapper, which is invalid HTML and
21
- * an accessibility issue.
22
- *
23
- * @param node - The DOM node to convert. Text nodes become strings,
24
- * element nodes become VNodes, and any other node types are skipped.
25
- * @param keyPrefix - String prefix used to build a stable VNode key,
26
- * so Stencil's diff can preserve elements across re-renders.
27
- * @param index - Position of this node among its siblings. Combined
28
- * with `keyPrefix` to form the final unique key.
29
- * @returns The converted VNode, a text string, or `null` if the node
30
- * type isn't supported.
31
- *
32
- * @internal Exported only so it can be unit tested; not part of the
33
- * public API.
7
+ * Cache that maps rendered span elements to the source HTMLElement
8
+ * they were cloned from. This prevents flickering when a user
9
+ * selects an option that has rich content, as the content will only be
10
+ * re-rendered if the source HTMLElement changes.
34
11
  */
35
- export const cloneToVNode = (node, keyPrefix, index) => {
36
- var _a;
37
- if (node.nodeType === Node.TEXT_NODE) {
38
- return (_a = node.textContent) !== null && _a !== void 0 ? _a : '';
39
- }
40
- if (node.nodeType !== Node.ELEMENT_NODE) {
41
- return null;
42
- }
43
- const el = node;
44
- const tag = el.tagName.toLowerCase();
45
- const key = `${keyPrefix}-${index}`;
46
- const attrs = { key };
47
- for (let i = 0; i < el.attributes.length; i++) {
48
- const attr = el.attributes.item(i);
49
- attrs[attr.name] = attr.value;
50
- }
51
- const children = Array.from(el.childNodes)
52
- .map((child, i) => cloneToVNode(child, key, i))
53
- .filter((c) => c !== null);
54
- return h(tag, attrs, children);
55
- };
12
+ const contentCache = new WeakMap();
56
13
  /**
57
- * Renders cloned DOM content as Stencil JSX. Walking the source DOM
58
- * into VNodes (rather than injecting it via innerHTML) keeps the
59
- * content inside Stencil's render path, so scoped CSS classes are
60
- * applied automatically and component attributes like `size` or
61
- * `color` survive intact.
14
+ * Renders cloned DOM content into an element via a ref callback.
15
+ * The content is only cloned when the source element changes,
16
+ * preventing flicker caused by destroying and recreating web
17
+ * components (e.g., ion-avatar) on every re-render cycle.
62
18
  *
63
19
  * Span elements should be used when this content renders within buttons,
64
20
  * depending on the select interface. Buttons can only have phrasing
@@ -66,14 +22,23 @@ export const cloneToVNode = (node, keyPrefix, index) => {
66
22
  *
67
23
  * @param id - Unique identifier for generating stable virtual DOM keys.
68
24
  * @param content - The HTMLElement container whose child nodes will be cloned.
69
- * @param className - CSS class applied to the wrapper element.
25
+ * @param className - CSS class applied to the wrapper span.
70
26
  * @param useSpan - Whether to use a span element instead of a div for the wrapper.
71
27
  */
72
28
  const renderClonedContent = (id, content, className, useSpan = false) => {
73
29
  const Tag = useSpan ? 'span' : 'div';
74
- const keyPrefix = `${className}-${id}`;
75
- sanitizeDOMTree(content);
76
- return (h(Tag, { class: className, key: keyPrefix }, Array.from(content.childNodes).map((child, i) => cloneToVNode(child, keyPrefix, i))));
30
+ return (h(Tag, { class: className, key: `${className}-${id}`, ref: (el) => {
31
+ if (el) {
32
+ const cached = contentCache.get(el);
33
+ // Skip if this element already has clones from the same source
34
+ if (cached === content) {
35
+ return;
36
+ }
37
+ const sanitized = sanitizeDOMString(content.innerHTML);
38
+ el.innerHTML = sanitized !== null && sanitized !== void 0 ? sanitized : '';
39
+ contentCache.set(el, content);
40
+ }
41
+ } }));
77
42
  };
78
43
  /**
79
44
  * Renders the label content for a select option within an overlay
@@ -107,5 +72,5 @@ export const renderOptionLabel = (option, className, useSpan = false) => {
107
72
  return (h(Tag, { class: className, key: `${className}-${id}` }, labelEl));
108
73
  }
109
74
  // Render label with rich content (start, end, description)
110
- return (h(Tag, { class: `${className} ${className}-has-rich-content`, key: `${className}-${id}` }, startContent && renderClonedContent(id, startContent, 'select-option-start', useSpan), h(Tag, { class: "select-option-content", key: `${className}-content-${id}` }, labelEl, description && (h(Tag, { class: "select-option-description", key: `${className}-desc-${id}` }, description))), endContent && renderClonedContent(id, endContent, 'select-option-end', useSpan)));
75
+ return (h(Tag, { class: className, key: `${className}-${id}` }, startContent && renderClonedContent(id, startContent, 'select-option-start', useSpan), h(Tag, { class: "select-option-content", key: `${className}-content-${id}` }, labelEl, description && (h(Tag, { class: "select-option-description", key: `${className}-desc-${id}` }, description))), endContent && renderClonedContent(id, endContent, 'select-option-end', useSpan)));
111
76
  };
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-06-09T17:10:52",
2
+ "timestamp": "2026-06-11T18:22:18",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.0",
@@ -14240,7 +14240,7 @@
14240
14240
  },
14241
14241
  {
14242
14242
  "name": "slot",
14243
- "text": "- Content is placed in a responsive gallery layout."
14243
+ "text": "- One or more `ion-gallery-item` components, placed in a responsive\ngallery layout."
14244
14244
  }
14245
14245
  ],
14246
14246
  "usage": {},
@@ -14460,7 +14460,91 @@
14460
14460
  "slots": [
14461
14461
  {
14462
14462
  "name": "",
14463
- "docs": "Content is placed in a responsive gallery layout."
14463
+ "docs": "One or more `ion-gallery-item` components, placed in a responsive\ngallery layout."
14464
+ }
14465
+ ],
14466
+ "parts": [],
14467
+ "states": [],
14468
+ "dependents": [],
14469
+ "dependencies": [],
14470
+ "dependencyGraph": {}
14471
+ },
14472
+ {
14473
+ "filePath": "src/components/gallery-item/gallery-item.tsx",
14474
+ "encapsulation": "shadow",
14475
+ "tag": "ion-gallery-item",
14476
+ "docs": "",
14477
+ "docsTags": [
14478
+ {
14479
+ "name": "virtualProp",
14480
+ "text": "{\"ios\" | \"md\"} mode - The mode determines the platform behaviors of the component."
14481
+ },
14482
+ {
14483
+ "name": "virtualProp",
14484
+ "text": "{\"ios\" | \"md\" | \"ionic\"} theme - The theme determines the visual appearance of the component."
14485
+ },
14486
+ {
14487
+ "name": "slot",
14488
+ "text": "- The content placed inside of the gallery item. This is typically an\n`img`, but can be any element (e.g. a `figure` wrapping an image and caption)."
14489
+ }
14490
+ ],
14491
+ "usage": {},
14492
+ "props": [
14493
+ {
14494
+ "name": "mode",
14495
+ "type": "\"ios\" | \"md\"",
14496
+ "mutable": false,
14497
+ "attr": "mode",
14498
+ "reflectToAttr": false,
14499
+ "docs": "The mode determines the platform behaviors of the component.",
14500
+ "docsTags": [],
14501
+ "values": [
14502
+ {
14503
+ "value": "ios",
14504
+ "type": "string"
14505
+ },
14506
+ {
14507
+ "value": "md",
14508
+ "type": "string"
14509
+ }
14510
+ ],
14511
+ "optional": true,
14512
+ "required": false
14513
+ },
14514
+ {
14515
+ "name": "theme",
14516
+ "type": "\"ios\" | \"md\" | \"ionic\"",
14517
+ "mutable": false,
14518
+ "attr": "theme",
14519
+ "reflectToAttr": false,
14520
+ "docs": "The theme determines the visual appearance of the component.",
14521
+ "docsTags": [],
14522
+ "values": [
14523
+ {
14524
+ "value": "ios",
14525
+ "type": "string"
14526
+ },
14527
+ {
14528
+ "value": "md",
14529
+ "type": "string"
14530
+ },
14531
+ {
14532
+ "value": "ionic",
14533
+ "type": "string"
14534
+ }
14535
+ ],
14536
+ "optional": true,
14537
+ "required": false
14538
+ }
14539
+ ],
14540
+ "methods": [],
14541
+ "events": [],
14542
+ "listeners": [],
14543
+ "styles": [],
14544
+ "slots": [
14545
+ {
14546
+ "name": "",
14547
+ "docs": "The content placed inside of the gallery item. This is typically an\n`img`, but can be any element (e.g. a `figure` wrapping an image and caption)."
14464
14548
  }
14465
14549
  ],
14466
14550
  "parts": [],
@@ -39693,72 +39777,6 @@
39693
39777
  "getter": false,
39694
39778
  "setter": false
39695
39779
  },
39696
- {
39697
- "name": "justify",
39698
- "type": "\"end\" | \"space-between\" | \"start\" | undefined",
39699
- "complexType": {
39700
- "original": "'start' | 'end' | 'space-between'",
39701
- "resolved": "\"end\" | \"space-between\" | \"start\" | undefined",
39702
- "references": {}
39703
- },
39704
- "mutable": false,
39705
- "attr": "justify",
39706
- "reflectToAttr": false,
39707
- "docs": "How to pack the label and the option's selection control within a line.\n`\"start\"`: The label and radio will appear on the left in LTR and\non the right in RTL.\n`\"end\"`: The label and radio will appear on the right in LTR and\non the left in RTL.\n`\"space-between\"`: The label and radio will appear on opposite\nends of the line with space between the two elements.\n\nApplies to the `alert`, `popover`, and `modal` interfaces, but has no\nvisible effect on radio options in `popover` or `modal` on the `md`\nand `ionic` themes (the radio control is hidden there).\n\nWhen unset, the interface picks a default based on theme and control\ntype.",
39708
- "docsTags": [],
39709
- "values": [
39710
- {
39711
- "value": "end",
39712
- "type": "string"
39713
- },
39714
- {
39715
- "value": "space-between",
39716
- "type": "string"
39717
- },
39718
- {
39719
- "value": "start",
39720
- "type": "string"
39721
- },
39722
- {
39723
- "type": "undefined"
39724
- }
39725
- ],
39726
- "optional": true,
39727
- "required": false,
39728
- "getter": false,
39729
- "setter": false
39730
- },
39731
- {
39732
- "name": "labelPlacement",
39733
- "type": "\"end\" | \"start\" | undefined",
39734
- "complexType": {
39735
- "original": "'start' | 'end'",
39736
- "resolved": "\"end\" | \"start\" | undefined",
39737
- "references": {}
39738
- },
39739
- "mutable": false,
39740
- "attr": "label-placement",
39741
- "reflectToAttr": false,
39742
- "docs": "Where the label is placed relative to the option's selection control\n(radio circle or checkbox box) when the option is rendered in an\n`alert`, `popover`, or `modal` interface.\n`\"start\"`: The label will appear to the left of the radio in LTR and to the right in RTL.\n`\"end\"`: The label will appear to the right of the radio in LTR and to the left in RTL.\n\nApplies to the `alert`, `popover`, and `modal` interfaces, but has no\nvisible effect on radio options in `popover` or `modal` on the `md`\nand `ionic` themes (the radio control is hidden there).\n\nWhen unset, the interface picks a default based on theme and control\ntype.",
39743
- "docsTags": [],
39744
- "values": [
39745
- {
39746
- "value": "end",
39747
- "type": "string"
39748
- },
39749
- {
39750
- "value": "start",
39751
- "type": "string"
39752
- },
39753
- {
39754
- "type": "undefined"
39755
- }
39756
- ],
39757
- "optional": true,
39758
- "required": false,
39759
- "getter": false,
39760
- "setter": false
39761
- },
39762
39780
  {
39763
39781
  "name": "mode",
39764
39782
  "type": "\"ios\" | \"md\"",