@kirbydesign/designsystem 11.11.4 → 12.0.0-dev-286cdc0

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 (291) hide show
  1. package/README.md +7 -0
  2. package/fesm2022/kirbydesign-designsystem-accordion.mjs +246 -135
  3. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  4. package/fesm2022/kirbydesign-designsystem-action-group.mjs +229 -134
  5. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  6. package/fesm2022/kirbydesign-designsystem-avatar.mjs +102 -55
  7. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  8. package/fesm2022/kirbydesign-designsystem-badge.mjs +85 -42
  9. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  10. package/fesm2022/kirbydesign-designsystem-button.mjs +203 -170
  11. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  12. package/fesm2022/kirbydesign-designsystem-calendar.mjs +524 -516
  13. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  14. package/fesm2022/kirbydesign-designsystem-card.mjs +439 -205
  15. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  16. package/fesm2022/kirbydesign-designsystem-chart.mjs +1388 -1469
  17. package/fesm2022/kirbydesign-designsystem-chart.mjs.map +1 -1
  18. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +223 -176
  19. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  20. package/fesm2022/kirbydesign-designsystem-config.mjs +50 -96
  21. package/fesm2022/kirbydesign-designsystem-config.mjs.map +1 -1
  22. package/fesm2022/kirbydesign-designsystem-data-table.mjs +180 -83
  23. package/fesm2022/kirbydesign-designsystem-data-table.mjs.map +1 -1
  24. package/fesm2022/kirbydesign-designsystem-divider.mjs +46 -19
  25. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  26. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +878 -752
  27. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  28. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +175 -91
  29. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  30. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +213 -85
  31. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
  32. package/fesm2022/kirbydesign-designsystem-flag.mjs +67 -33
  33. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  34. package/fesm2022/kirbydesign-designsystem-form-field.mjs +1260 -891
  35. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  36. package/fesm2022/kirbydesign-designsystem-gesture.mjs +38 -23
  37. package/fesm2022/kirbydesign-designsystem-gesture.mjs.map +1 -1
  38. package/fesm2022/kirbydesign-designsystem-header.mjs +422 -182
  39. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  40. package/fesm2022/kirbydesign-designsystem-helpers-scss.mjs +16 -14
  41. package/fesm2022/kirbydesign-designsystem-helpers-scss.mjs.map +1 -1
  42. package/fesm2022/kirbydesign-designsystem-helpers.mjs +251 -361
  43. package/fesm2022/kirbydesign-designsystem-helpers.mjs.map +1 -1
  44. package/fesm2022/kirbydesign-designsystem-icon.mjs +881 -296
  45. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  46. package/fesm2022/kirbydesign-designsystem-item-group.mjs +52 -23
  47. package/fesm2022/kirbydesign-designsystem-item-group.mjs.map +1 -1
  48. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +147 -43
  49. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
  50. package/fesm2022/kirbydesign-designsystem-item.mjs +395 -151
  51. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  52. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +136 -54
  53. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs.map +1 -1
  54. package/fesm2022/kirbydesign-designsystem-list.mjs +1188 -697
  55. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  56. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +166 -76
  57. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  58. package/fesm2022/kirbydesign-designsystem-menu.mjs +420 -311
  59. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  60. package/fesm2022/kirbydesign-designsystem-modal.mjs +2476 -1912
  61. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  62. package/fesm2022/kirbydesign-designsystem-page.mjs +1526 -905
  63. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  64. package/fesm2022/kirbydesign-designsystem-popover.mjs +204 -169
  65. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  66. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +209 -158
  67. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
  68. package/fesm2022/kirbydesign-designsystem-radio.mjs +537 -365
  69. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  70. package/fesm2022/kirbydesign-designsystem-range.mjs +207 -150
  71. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  72. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +217 -104
  73. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  74. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +113 -38
  75. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
  76. package/fesm2022/kirbydesign-designsystem-section-header.mjs +56 -18
  77. package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
  78. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs +276 -232
  79. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs.map +1 -1
  80. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +328 -382
  81. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs.map +1 -1
  82. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +73 -84
  83. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs.map +1 -1
  84. package/fesm2022/kirbydesign-designsystem-shared.mjs +665 -531
  85. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  86. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +140 -91
  87. package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
  88. package/fesm2022/kirbydesign-designsystem-slide.mjs +360 -158
  89. package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
  90. package/fesm2022/kirbydesign-designsystem-spinner.mjs +90 -32
  91. package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
  92. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +348 -181
  93. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  94. package/fesm2022/kirbydesign-designsystem-tabs.mjs +286 -121
  95. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  96. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +6234 -3164
  97. package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  98. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +118 -95
  99. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs.map +1 -1
  100. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +128 -101
  101. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs.map +1 -1
  102. package/fesm2022/kirbydesign-designsystem-testing.mjs +236 -243
  103. package/fesm2022/kirbydesign-designsystem-testing.mjs.map +1 -1
  104. package/fesm2022/kirbydesign-designsystem-toast.mjs +98 -62
  105. package/fesm2022/kirbydesign-designsystem-toast.mjs.map +1 -1
  106. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +155 -127
  107. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs.map +1 -1
  108. package/fesm2022/kirbydesign-designsystem-toggle.mjs +180 -150
  109. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  110. package/fesm2022/kirbydesign-designsystem-types.mjs +39 -24
  111. package/fesm2022/kirbydesign-designsystem-types.mjs.map +1 -1
  112. package/fesm2022/kirbydesign-designsystem.mjs +516 -407
  113. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  114. package/icons/svg/megaphone.svg +3 -0
  115. package/icons/svg/person-blocked.svg +3 -0
  116. package/icons/svg/person-check.svg +3 -0
  117. package/icons/svg/person-close.svg +3 -0
  118. package/icons/svg/person-cloud.svg +3 -0
  119. package/icons/svg/person-power.svg +3 -0
  120. package/icons/svg/person-warning.svg +3 -0
  121. package/icons/svg/phone-device-pin.svg +3 -0
  122. package/icons/svg/phone-device.svg +3 -2
  123. package/package.json +10 -10
  124. package/readme.md +37 -0
  125. package/types/kirbydesign-designsystem-accordion.d.ts +72 -39
  126. package/types/kirbydesign-designsystem-accordion.d.ts.map +1 -1
  127. package/types/kirbydesign-designsystem-action-group.d.ts +46 -39
  128. package/types/kirbydesign-designsystem-action-group.d.ts.map +1 -1
  129. package/types/kirbydesign-designsystem-avatar.d.ts +62 -26
  130. package/types/kirbydesign-designsystem-avatar.d.ts.map +1 -1
  131. package/types/kirbydesign-designsystem-badge.d.ts +30 -19
  132. package/types/kirbydesign-designsystem-badge.d.ts.map +1 -1
  133. package/types/kirbydesign-designsystem-button.d.ts +70 -45
  134. package/types/kirbydesign-designsystem-button.d.ts.map +1 -1
  135. package/types/kirbydesign-designsystem-calendar.d.ts +193 -132
  136. package/types/kirbydesign-designsystem-calendar.d.ts.map +1 -1
  137. package/types/kirbydesign-designsystem-card.d.ts +130 -66
  138. package/types/kirbydesign-designsystem-card.d.ts.map +1 -1
  139. package/types/kirbydesign-designsystem-chart.d.ts +198 -172
  140. package/types/kirbydesign-designsystem-chart.d.ts.map +1 -1
  141. package/types/kirbydesign-designsystem-checkbox.d.ts +102 -68
  142. package/types/kirbydesign-designsystem-checkbox.d.ts.map +1 -1
  143. package/types/kirbydesign-designsystem-config.d.ts +17 -21
  144. package/types/kirbydesign-designsystem-config.d.ts.map +1 -1
  145. package/types/kirbydesign-designsystem-data-table.d.ts +46 -26
  146. package/types/kirbydesign-designsystem-data-table.d.ts.map +1 -1
  147. package/types/kirbydesign-designsystem-divider.d.ts +11 -9
  148. package/types/kirbydesign-designsystem-divider.d.ts.map +1 -1
  149. package/types/kirbydesign-designsystem-dropdown.d.ts +219 -166
  150. package/types/kirbydesign-designsystem-dropdown.d.ts.map +1 -1
  151. package/types/kirbydesign-designsystem-empty-state.d.ts +58 -35
  152. package/types/kirbydesign-designsystem-empty-state.d.ts.map +1 -1
  153. package/types/kirbydesign-designsystem-fab-sheet.d.ts +34 -28
  154. package/types/kirbydesign-designsystem-fab-sheet.d.ts.map +1 -1
  155. package/types/kirbydesign-designsystem-flag.d.ts +18 -13
  156. package/types/kirbydesign-designsystem-flag.d.ts.map +1 -1
  157. package/types/kirbydesign-designsystem-form-field.d.ts +409 -242
  158. package/types/kirbydesign-designsystem-form-field.d.ts.map +1 -1
  159. package/types/kirbydesign-designsystem-gesture.d.ts +41 -46
  160. package/types/kirbydesign-designsystem-gesture.d.ts.map +1 -1
  161. package/types/kirbydesign-designsystem-header.d.ts +102 -64
  162. package/types/kirbydesign-designsystem-header.d.ts.map +1 -1
  163. package/types/kirbydesign-designsystem-helpers-scss.d.ts +6 -8
  164. package/types/kirbydesign-designsystem-helpers-scss.d.ts.map +1 -1
  165. package/types/kirbydesign-designsystem-helpers.d.ts +83 -97
  166. package/types/kirbydesign-designsystem-helpers.d.ts.map +1 -1
  167. package/types/kirbydesign-designsystem-icon.d.ts +63 -59
  168. package/types/kirbydesign-designsystem-icon.d.ts.map +1 -1
  169. package/types/kirbydesign-designsystem-item-group.d.ts +6 -9
  170. package/types/kirbydesign-designsystem-item-group.d.ts.map +1 -1
  171. package/types/kirbydesign-designsystem-item-sliding.d.ts +30 -26
  172. package/types/kirbydesign-designsystem-item-sliding.d.ts.map +1 -1
  173. package/types/kirbydesign-designsystem-item.d.ts +93 -54
  174. package/types/kirbydesign-designsystem-item.d.ts.map +1 -1
  175. package/types/kirbydesign-designsystem-kirby-app.d.ts +18 -19
  176. package/types/kirbydesign-designsystem-kirby-app.d.ts.map +1 -1
  177. package/types/kirbydesign-designsystem-list.d.ts +392 -263
  178. package/types/kirbydesign-designsystem-list.d.ts.map +1 -1
  179. package/types/kirbydesign-designsystem-loading-overlay.d.ts +35 -24
  180. package/types/kirbydesign-designsystem-loading-overlay.d.ts.map +1 -1
  181. package/types/kirbydesign-designsystem-menu.d.ts +119 -69
  182. package/types/kirbydesign-designsystem-menu.d.ts.map +1 -1
  183. package/types/kirbydesign-designsystem-modal.d.ts +578 -455
  184. package/types/kirbydesign-designsystem-modal.d.ts.map +1 -1
  185. package/types/kirbydesign-designsystem-page.d.ts +308 -226
  186. package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
  187. package/types/kirbydesign-designsystem-popover.d.ts +48 -40
  188. package/types/kirbydesign-designsystem-popover.d.ts.map +1 -1
  189. package/types/kirbydesign-designsystem-progress-circle.d.ts +59 -61
  190. package/types/kirbydesign-designsystem-progress-circle.d.ts.map +1 -1
  191. package/types/kirbydesign-designsystem-radio.d.ts +147 -98
  192. package/types/kirbydesign-designsystem-radio.d.ts.map +1 -1
  193. package/types/kirbydesign-designsystem-range.d.ts +90 -45
  194. package/types/kirbydesign-designsystem-range.d.ts.map +1 -1
  195. package/types/kirbydesign-designsystem-reorder-list.d.ts +44 -32
  196. package/types/kirbydesign-designsystem-reorder-list.d.ts.map +1 -1
  197. package/types/kirbydesign-designsystem-router-outlet.d.ts +23 -18
  198. package/types/kirbydesign-designsystem-router-outlet.d.ts.map +1 -1
  199. package/types/kirbydesign-designsystem-section-header.d.ts +5 -8
  200. package/types/kirbydesign-designsystem-section-header.d.ts.map +1 -1
  201. package/types/kirbydesign-designsystem-segmented-control.d.ts +123 -100
  202. package/types/kirbydesign-designsystem-segmented-control.d.ts.map +1 -1
  203. package/types/kirbydesign-designsystem-shared-floating.d.ts +183 -128
  204. package/types/kirbydesign-designsystem-shared-floating.d.ts.map +1 -1
  205. package/types/kirbydesign-designsystem-shared-portal.d.ts +29 -28
  206. package/types/kirbydesign-designsystem-shared-portal.d.ts.map +1 -1
  207. package/types/kirbydesign-designsystem-shared.d.ts +143 -139
  208. package/types/kirbydesign-designsystem-shared.d.ts.map +1 -1
  209. package/types/kirbydesign-designsystem-slide-button.d.ts +43 -34
  210. package/types/kirbydesign-designsystem-slide-button.d.ts.map +1 -1
  211. package/types/kirbydesign-designsystem-slide.d.ts +80 -59
  212. package/types/kirbydesign-designsystem-slide.d.ts.map +1 -1
  213. package/types/kirbydesign-designsystem-spinner.d.ts +13 -14
  214. package/types/kirbydesign-designsystem-spinner.d.ts.map +1 -1
  215. package/types/kirbydesign-designsystem-tab-navigation.d.ts +78 -55
  216. package/types/kirbydesign-designsystem-tab-navigation.d.ts.map +1 -1
  217. package/types/kirbydesign-designsystem-tabs.d.ts +50 -45
  218. package/types/kirbydesign-designsystem-tabs.d.ts.map +1 -1
  219. package/types/kirbydesign-designsystem-testing-base.d.ts +2435 -815
  220. package/types/kirbydesign-designsystem-testing-base.d.ts.map +1 -1
  221. package/types/kirbydesign-designsystem-testing-jasmine.d.ts +9 -10
  222. package/types/kirbydesign-designsystem-testing-jasmine.d.ts.map +1 -1
  223. package/types/kirbydesign-designsystem-testing-jest.d.ts +9 -10
  224. package/types/kirbydesign-designsystem-testing-jest.d.ts.map +1 -1
  225. package/types/kirbydesign-designsystem-testing.d.ts +52 -58
  226. package/types/kirbydesign-designsystem-testing.d.ts.map +1 -1
  227. package/types/kirbydesign-designsystem-toast.d.ts +25 -31
  228. package/types/kirbydesign-designsystem-toast.d.ts.map +1 -1
  229. package/types/kirbydesign-designsystem-toggle-button.d.ts +62 -56
  230. package/types/kirbydesign-designsystem-toggle-button.d.ts.map +1 -1
  231. package/types/kirbydesign-designsystem-toggle.d.ts +71 -63
  232. package/types/kirbydesign-designsystem-toggle.d.ts.map +1 -1
  233. package/types/kirbydesign-designsystem-types.d.ts +15 -22
  234. package/types/kirbydesign-designsystem-types.d.ts.map +1 -1
  235. package/types/kirbydesign-designsystem.d.ts +135 -123
  236. package/types/kirbydesign-designsystem.d.ts.map +1 -1
  237. package/accordion/package.json +0 -4
  238. package/action-group/package.json +0 -4
  239. package/avatar/package.json +0 -4
  240. package/badge/package.json +0 -4
  241. package/button/package.json +0 -4
  242. package/calendar/package.json +0 -4
  243. package/card/package.json +0 -4
  244. package/chart/package.json +0 -4
  245. package/checkbox/package.json +0 -4
  246. package/config/package.json +0 -4
  247. package/data-table/package.json +0 -4
  248. package/divider/package.json +0 -4
  249. package/dropdown/package.json +0 -4
  250. package/empty-state/package.json +0 -4
  251. package/fab-sheet/package.json +0 -4
  252. package/flag/package.json +0 -4
  253. package/form-field/package.json +0 -4
  254. package/gesture/package.json +0 -4
  255. package/header/package.json +0 -4
  256. package/helpers/package.json +0 -4
  257. package/helpers/scss/package.json +0 -4
  258. package/icon/package.json +0 -4
  259. package/item/package.json +0 -4
  260. package/item-group/package.json +0 -4
  261. package/item-sliding/package.json +0 -4
  262. package/kirby-app/package.json +0 -4
  263. package/list/package.json +0 -4
  264. package/loading-overlay/package.json +0 -4
  265. package/menu/package.json +0 -4
  266. package/modal/package.json +0 -4
  267. package/page/package.json +0 -4
  268. package/popover/package.json +0 -4
  269. package/progress-circle/package.json +0 -4
  270. package/radio/package.json +0 -4
  271. package/range/package.json +0 -4
  272. package/reorder-list/package.json +0 -4
  273. package/router-outlet/package.json +0 -4
  274. package/section-header/package.json +0 -4
  275. package/segmented-control/package.json +0 -4
  276. package/shared/floating/package.json +0 -4
  277. package/shared/package.json +0 -4
  278. package/shared/portal/package.json +0 -4
  279. package/slide/package.json +0 -4
  280. package/slide-button/package.json +0 -4
  281. package/spinner/package.json +0 -4
  282. package/tab-navigation/package.json +0 -4
  283. package/tabs/package.json +0 -4
  284. package/testing/package.json +0 -4
  285. package/testing-base/package.json +0 -4
  286. package/testing-jasmine/package.json +0 -4
  287. package/testing-jest/package.json +0 -4
  288. package/toast/package.json +0 -4
  289. package/toggle/package.json +0 -4
  290. package/toggle-button/package.json +0 -4
  291. package/types/package.json +0 -4
@@ -1,255 +1,248 @@
1
- import { ColorHelper } from '@kirbydesign/core';
2
- import * as i0 from '@angular/core';
3
- import { NgModule } from '@angular/core';
4
- import { provideIonicAngular } from '@ionic/angular/standalone';
5
- import { componentOnReady } from '@ionic/core';
6
-
7
- class IonicTestingModule {
8
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: IonicTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.18", ngImport: i0, type: IonicTestingModule }); }
10
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: IonicTestingModule, providers: [provideIonicAngular({ mode: 'ios', _testing: true })] }); }
11
- }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: IonicTestingModule, decorators: [{
13
- type: NgModule,
14
- args: [{
15
- providers: [provideIonicAngular({ mode: 'ios', _testing: true })],
16
- }]
17
- }] });
18
- class TestHelper {
19
- static { this._init = TestHelper.muteIonicReInitializeWarning(); }
20
- static disableAnimationsInTest() {
21
- //@ts-ignore
22
- window.Ionic = {
23
- config: {
24
- _testing: true,
25
- },
26
- };
27
- }
28
- static muteIonicReInitializeWarning() {
29
- const originalWarn = console.warn;
30
- const patchedWarn = (warning, ...optionalParams) => {
31
- const suppress = `Ionic Angular was already initialized. Make sure IonicModule.forRoot() is just called once.`;
32
- if (warning !== suppress)
33
- originalWarn(warning, ...optionalParams);
34
- };
35
- console.warn = patchedWarn;
36
- }
37
- static { this.ionicModuleForTest = IonicTestingModule; }
38
- /*
39
- * Checks for the Web Component(s) being ready,
40
- * ie. the component is hydrated, styles have been applied
41
- * and the Shadow DOM is ready for query
42
- */
43
- static async whenReady(elementOrNodeList) {
44
- if (elementOrNodeList === undefined || elementOrNodeList === null)
45
- return Promise.reject('TestHelper.whenReady: Element is null or undefined');
46
- if (elementOrNodeList instanceof Element) {
47
- await TestHelper.whenDefined(elementOrNodeList);
48
- await TestHelper.ionComponentOnReady(elementOrNodeList);
49
- }
50
- else {
51
- await Promise.all(Array.from(elementOrNodeList).map(async (element) => await TestHelper.whenReady(element)));
52
- }
53
- }
54
- /* Checks for the Web Component being defined, ie. the public methods are available */
55
- static async whenDefined(element) {
56
- await customElements.whenDefined(element.localName);
57
- }
58
- /* Checks for the Ionic Web Component being ready, ie. the component is hydrated and styles applied */
59
- static async ionComponentOnReady(element) {
60
- await new Promise((resolve) => {
61
- componentOnReady(element, () => resolve());
62
- });
63
- }
64
- static async whenTrue(pollFunc, timeoutInMs = 2000, pollIntervalInMs = 5) {
65
- if (pollFunc() === true)
66
- return Promise.resolve();
67
- return new Promise((resolve, reject) => {
68
- let timeoutId, intervalId;
69
- const pollState = () => {
70
- const result = pollFunc();
71
- if (result === true) {
72
- clearTimeout(timeoutId);
73
- clearInterval(intervalId);
74
- resolve();
75
- }
76
- };
77
- timeoutId = setTimeout(() => {
78
- clearInterval(intervalId);
79
- reject(`Error: Timeout - TestHelper.whenTrue function did not complete within ${timeoutInMs}ms`);
80
- }, timeoutInMs);
81
- intervalId = setInterval(pollState, pollIntervalInMs);
82
- });
83
- }
84
- static getCssProperty(element, propertyName, pseudoElt) {
85
- return window.getComputedStyle(element, pseudoElt).getPropertyValue(propertyName).trim();
86
- }
87
- static { this.screensize = {
88
- phonesmall: { width: '320px', height: '568px' },
89
- phone: { width: '375px', height: '667px' },
90
- phablet: { width: '575px', height: '767px' },
91
- 'phablet-landscape': { width: '767px', height: '575px' },
92
- tablet: { width: '768px', height: '1024px' },
93
- desktop: { width: '1200px', height: '900px' },
94
- }; }
95
- static resizeTestWindow(size) {
96
- return new Promise((resolve, reject) => {
97
- if (!window.frameElement) {
98
- console.warn('window.frameElement is undefined. Cannot resize test window.');
99
- reject();
100
- }
101
- else {
102
- const query = [];
103
- if (size.width) {
104
- query.push(`(max-width: ${size.width})`);
105
- }
106
- if (size.height) {
107
- query.push(`(max-height: ${size.height})`);
108
- }
109
- console.log(`Set test window size to: ${JSON.stringify(size)}`);
110
- window.frameElement.style.width = size.width;
111
- window.frameElement.style.height = size.height;
112
- const mediaQuery = window.matchMedia(query.join(' and '));
113
- if (mediaQuery.matches) {
114
- resolve();
115
- }
116
- else {
117
- // Ensure window has resized before executing:
118
- mediaQuery.onchange = (ev) => {
119
- if (ev.matches) {
120
- // Stop listening for changes:
121
- mediaQuery.onchange = null;
122
- resolve();
123
- }
124
- };
125
- console.log(`Awaiting media query to match: ${mediaQuery.media}`);
126
- }
127
- }
128
- });
129
- }
130
- static resetTestWindow() {
131
- if (!window.frameElement) {
132
- console.warn('window.frameElement is undefined. Cannot resize test window.');
133
- return;
134
- }
135
- console.log('Resetting test window width');
136
- window.frameElement.style.width = null;
137
- window.frameElement.style.height = null;
138
- }
139
- static scrollMainWindowToTop() {
140
- if (window.parent &&
141
- window.parent.document &&
142
- window.parent.document.documentElement &&
143
- window.parent.document.documentElement.scrollTop > 0) {
144
- window.parent.document.documentElement.scrollTop = 0;
145
- }
146
- }
147
- static waitForResizeObserver() {
148
- return TestHelper.waitForTimeout(1);
149
- }
150
- static waitForMutationObserver() {
151
- return TestHelper.waitForTimeout(1);
152
- }
153
- static waitForTimeout(timeoutInMs) {
154
- return new Promise((resolve) => setTimeout(resolve, timeoutInMs));
155
- }
156
- }
157
-
158
- const ElementCssCustomMatchers = {
159
- toHaveComputedStyle: (util) => cssPropertyMatcher(util),
1
+ import { ColorHelper } from "@kirbydesign/core";
2
+ import * as i0 from "@angular/core";
3
+ import { NgModule } from "@angular/core";
4
+ import { provideIonicAngular } from "@ionic/angular";
5
+ import { componentOnReady } from "@ionic/core";
6
+ var IonicTestingModule = class IonicTestingModule {
7
+ static {
8
+ this.ɵfac = i0.ɵɵngDeclareFactory({
9
+ minVersion: "12.0.0",
10
+ version: "22.2.3",
11
+ ngImport: i0,
12
+ type: IonicTestingModule,
13
+ deps: [],
14
+ target: i0.ɵɵFactoryTarget.NgModule
15
+ });
16
+ }
17
+ static {
18
+ this.ɵmod = i0.ɵɵngDeclareNgModule({
19
+ minVersion: "14.0.0",
20
+ version: "22.2.3",
21
+ ngImport: i0,
22
+ type: IonicTestingModule
23
+ });
24
+ }
25
+ static {
26
+ this.ɵinj = i0.ɵɵngDeclareInjector({
27
+ minVersion: "12.0.0",
28
+ version: "22.2.3",
29
+ ngImport: i0,
30
+ type: IonicTestingModule,
31
+ providers: [provideIonicAngular({
32
+ mode: "ios",
33
+ _testing: true
34
+ })]
35
+ });
36
+ }
37
+ };
38
+ i0.ɵɵngDeclareClassMetadata({
39
+ minVersion: "12.0.0",
40
+ version: "22.2.3",
41
+ ngImport: i0,
42
+ type: IonicTestingModule,
43
+ decorators: [{
44
+ type: NgModule,
45
+ args: [{ providers: [provideIonicAngular({
46
+ mode: "ios",
47
+ _testing: true
48
+ })] }]
49
+ }]
50
+ });
51
+ var TestHelper = class TestHelper {
52
+ static {
53
+ this._init = TestHelper.muteIonicReInitializeWarning();
54
+ }
55
+ static disableAnimationsInTest() {
56
+ window.Ionic = { config: { _testing: true } };
57
+ }
58
+ static muteIonicReInitializeWarning() {
59
+ const originalWarn = console.warn;
60
+ const patchedWarn = (warning, ...optionalParams) => {
61
+ if (warning !== `Ionic Angular was already initialized. Make sure IonicModule.forRoot() is just called once.`) originalWarn(warning, ...optionalParams);
62
+ };
63
+ console.warn = patchedWarn;
64
+ }
65
+ static {
66
+ this.ionicModuleForTest = IonicTestingModule;
67
+ }
68
+ static async whenReady(elementOrNodeList) {
69
+ if (elementOrNodeList === void 0 || elementOrNodeList === null) return Promise.reject("TestHelper.whenReady: Element is null or undefined");
70
+ if (elementOrNodeList instanceof Element) {
71
+ await TestHelper.whenDefined(elementOrNodeList);
72
+ await TestHelper.ionComponentOnReady(elementOrNodeList);
73
+ } else await Promise.all(Array.from(elementOrNodeList).map(async (element) => await TestHelper.whenReady(element)));
74
+ }
75
+ static async whenDefined(element) {
76
+ await customElements.whenDefined(element.localName);
77
+ }
78
+ static async ionComponentOnReady(element) {
79
+ await new Promise((resolve) => {
80
+ componentOnReady(element, () => resolve());
81
+ });
82
+ }
83
+ static async whenTrue(pollFunc, timeoutInMs = 2e3, pollIntervalInMs = 5) {
84
+ if (pollFunc() === true) return Promise.resolve();
85
+ return new Promise((resolve, reject) => {
86
+ let timeoutId;
87
+ let intervalId;
88
+ const pollState = () => {
89
+ if (pollFunc() === true) {
90
+ clearTimeout(timeoutId);
91
+ clearInterval(intervalId);
92
+ resolve();
93
+ }
94
+ };
95
+ timeoutId = setTimeout(() => {
96
+ clearInterval(intervalId);
97
+ reject(`Error: Timeout - TestHelper.whenTrue function did not complete within ${timeoutInMs}ms`);
98
+ }, timeoutInMs);
99
+ intervalId = setInterval(pollState, pollIntervalInMs);
100
+ });
101
+ }
102
+ static getCssProperty(element, propertyName, pseudoElt) {
103
+ return window.getComputedStyle(element, pseudoElt).getPropertyValue(propertyName).trim();
104
+ }
105
+ static {
106
+ this.screensize = {
107
+ phonesmall: {
108
+ width: "320px",
109
+ height: "568px"
110
+ },
111
+ phone: {
112
+ width: "375px",
113
+ height: "667px"
114
+ },
115
+ phablet: {
116
+ width: "575px",
117
+ height: "767px"
118
+ },
119
+ "phablet-landscape": {
120
+ width: "767px",
121
+ height: "575px"
122
+ },
123
+ tablet: {
124
+ width: "768px",
125
+ height: "1024px"
126
+ },
127
+ desktop: {
128
+ width: "1200px",
129
+ height: "900px"
130
+ }
131
+ };
132
+ }
133
+ static resizeTestWindow(size) {
134
+ return new Promise((resolve, reject) => {
135
+ if (!window.frameElement) {
136
+ console.warn("window.frameElement is undefined. Cannot resize test window.");
137
+ reject();
138
+ } else {
139
+ const query = [];
140
+ if (size.width) query.push(`(max-width: ${size.width})`);
141
+ if (size.height) query.push(`(max-height: ${size.height})`);
142
+ console.log(`Set test window size to: ${JSON.stringify(size)}`);
143
+ window.frameElement.style.width = size.width ?? "";
144
+ window.frameElement.style.height = size.height ?? "";
145
+ const mediaQuery = window.matchMedia(query.join(" and "));
146
+ if (mediaQuery.matches) resolve();
147
+ else {
148
+ mediaQuery.onchange = (ev) => {
149
+ if (ev.matches) {
150
+ mediaQuery.onchange = null;
151
+ resolve();
152
+ }
153
+ };
154
+ console.log(`Awaiting media query to match: ${mediaQuery.media}`);
155
+ }
156
+ }
157
+ });
158
+ }
159
+ static resetTestWindow() {
160
+ if (!window.frameElement) {
161
+ console.warn("window.frameElement is undefined. Cannot resize test window.");
162
+ return;
163
+ }
164
+ console.log("Resetting test window width");
165
+ window.frameElement.style.width = "";
166
+ window.frameElement.style.height = "";
167
+ }
168
+ static scrollMainWindowToTop() {
169
+ if (window.parent && window.parent.document && window.parent.document.documentElement && window.parent.document.documentElement.scrollTop > 0) window.parent.document.documentElement.scrollTop = 0;
170
+ }
171
+ static waitForResizeObserver() {
172
+ return TestHelper.waitForTimeout(1);
173
+ }
174
+ static waitForMutationObserver() {
175
+ return TestHelper.waitForTimeout(1);
176
+ }
177
+ static waitForTimeout(timeoutInMs) {
178
+ return new Promise((resolve) => setTimeout(resolve, timeoutInMs));
179
+ }
160
180
  };
181
+ const ElementCssCustomMatchers = { toHaveComputedStyle: (util) => cssPropertyMatcher(util) };
161
182
  function cssPropertyMatcher(util) {
162
- return {
163
- compare: (element, expectedStyles, pseudoElt) => {
164
- let allPassed = Object.keys(expectedStyles).length !== 0;
165
- const messages = [];
166
- Object.keys(expectedStyles).forEach((cssProperty) => {
167
- const expectedValue = expectedStyles[cssProperty];
168
- const { expectedStringValue, expectedValueAlias } = getExpectedStringValueAndAlias(cssProperty, expectedValue);
169
- const { pass, message } = compareCssProperty(util, element, cssProperty, expectedStringValue, expectedValueAlias, pseudoElt);
170
- allPassed = allPassed && pass;
171
- if (message) {
172
- messages.push(message);
173
- }
174
- });
175
- const result = {
176
- pass: allPassed,
177
- message: messages.join('\n'),
178
- };
179
- return result;
180
- },
181
- };
183
+ return { compare: (element, expectedStyles, pseudoElt) => {
184
+ let allPassed = Object.keys(expectedStyles).length !== 0;
185
+ const messages = [];
186
+ Object.keys(expectedStyles).forEach((cssProperty) => {
187
+ const expectedValue = expectedStyles[cssProperty];
188
+ const { expectedStringValue, expectedValueAlias } = getExpectedStringValueAndAlias(cssProperty, expectedValue);
189
+ const { pass, message } = compareCssProperty(util, element, cssProperty, expectedStringValue, expectedValueAlias, pseudoElt);
190
+ allPassed = allPassed && pass;
191
+ if (message) messages.push(message);
192
+ });
193
+ return {
194
+ pass: allPassed,
195
+ message: messages.join("\n")
196
+ };
197
+ } };
182
198
  }
183
199
  function getExpectedStringValueAndAlias(cssProperty, expectedValue) {
184
- let expectedStringValue;
185
- let expectedValueAlias;
186
- if (typeof expectedValue === 'string') {
187
- expectedStringValue = expectedValue;
188
- // Check of css property is a color:
189
- if (cssProperty.indexOf('color') > -1 ||
190
- expectedValue.startsWith('rgb') ||
191
- expectedValue.startsWith('#')) {
192
- // Check if css property is a css variable:
193
- // Css variable values are hex when getting computed style, all other property values are rgb:
194
- if (!cssProperty.startsWith('--')) {
195
- // Not a css variable, convert color to rgb:
196
- expectedStringValue = ColorHelper.colorStringToRgbString(expectedValue);
197
- }
198
- }
199
- }
200
- else {
201
- // Check if css property is a css variable:
202
- // Css variable values are hex when getting computed style, all other property values are rgb:
203
- expectedStringValue = cssProperty.startsWith('--') ? expectedValue.hex : expectedValue.value;
204
- expectedValueAlias = expectedValue.fullname;
205
- }
206
- return {
207
- expectedStringValue,
208
- expectedValueAlias,
209
- };
200
+ let expectedStringValue = "";
201
+ let expectedValueAlias;
202
+ if (typeof expectedValue === "string") {
203
+ expectedStringValue = expectedValue;
204
+ if (cssProperty.indexOf("color") > -1 || expectedValue.startsWith("rgb") || expectedValue.startsWith("#")) {
205
+ if (!cssProperty.startsWith("--")) expectedStringValue = ColorHelper.colorStringToRgbString(expectedValue);
206
+ }
207
+ } else {
208
+ expectedStringValue = cssProperty.startsWith("--") ? expectedValue.hex ?? "" : normalizeWhitespace(expectedValue.value ?? "");
209
+ expectedValueAlias = expectedValue.fullname ?? "";
210
+ }
211
+ return {
212
+ expectedStringValue,
213
+ expectedValueAlias
214
+ };
215
+ }
216
+ function normalizeWhitespace(value) {
217
+ return value.replace(/\s+/g, " ");
210
218
  }
211
219
  function compareCssProperty(util, element, cssProperty, expectedValue, expectedValueAlias, pseudoElt) {
212
- const actualValue = TestHelper.getCssProperty(element, cssProperty, pseudoElt);
213
- const pass = util.equals(actualValue, expectedValue) || !!compareSize(actualValue, expectedValue);
214
- const message = pass
215
- ? null
216
- : getErrorMessage(element, cssProperty, actualValue, expectedValue, expectedValueAlias, pseudoElt);
217
- const result = {
218
- pass: pass,
219
- message: message,
220
- };
221
- return result;
220
+ const actualValue = TestHelper.getCssProperty(element, cssProperty, pseudoElt);
221
+ const pass = util.equals(actualValue, expectedValue) || !!compareSize(actualValue, expectedValue);
222
+ return {
223
+ pass,
224
+ message: (pass ? null : getErrorMessage(element, cssProperty, actualValue, expectedValue, expectedValueAlias, pseudoElt)) ?? void 0
225
+ };
222
226
  }
223
227
  function compareSize(actualValue, expectedValue) {
224
- if (!expectedValue.startsWith('<') && !expectedValue.startsWith('>'))
225
- return;
226
- const matches = expectedValue.match(/(?<operator>\<\=|\<|\>\=|\>)(?<value>\d*)px/);
227
- if (matches && matches.groups) {
228
- const actualValueNumber = parseInt(actualValue);
229
- const operator = matches.groups['operator'];
230
- const expectedValueNumber = parseInt(matches.groups['value']);
231
- switch (operator) {
232
- case '<':
233
- return actualValueNumber < expectedValueNumber;
234
- case '<=':
235
- return actualValueNumber <= expectedValueNumber;
236
- case '>':
237
- return actualValueNumber > expectedValueNumber;
238
- case '>=':
239
- return actualValueNumber >= expectedValueNumber;
240
- default:
241
- break;
242
- }
243
- }
228
+ if (!expectedValue.startsWith("<") && !expectedValue.startsWith(">")) return;
229
+ const matches = expectedValue.match(/(?<operator>\<\=|\<|\>\=|\>)(?<value>\d*)px/);
230
+ if (matches && matches.groups) {
231
+ const actualValueNumber = parseInt(actualValue);
232
+ const operator = matches.groups["operator"];
233
+ const expectedValueNumber = parseInt(matches.groups["value"]);
234
+ switch (operator) {
235
+ case "<": return actualValueNumber < expectedValueNumber;
236
+ case "<=": return actualValueNumber <= expectedValueNumber;
237
+ case ">": return actualValueNumber > expectedValueNumber;
238
+ case ">=": return actualValueNumber >= expectedValueNumber;
239
+ }
240
+ }
244
241
  }
245
242
  function getErrorMessage(element, cssProperty, actualValue, expectedValue, expectedValueAlias, pseudoElt) {
246
- const expectedColorNameSuffix = expectedValueAlias ? ` (${expectedValueAlias})` : '';
247
- return `Expected [${cssProperty}] of ${element.tagName}${pseudoElt ?? ''} '${actualValue}' to be '${expectedValue}'${expectedColorNameSuffix}`;
243
+ const expectedColorNameSuffix = expectedValueAlias ? ` (${expectedValueAlias})` : "";
244
+ return `Expected [${cssProperty}] of ${element.tagName}${pseudoElt ?? ""} '${actualValue}' to be '${expectedValue}'${expectedColorNameSuffix}`;
248
245
  }
249
-
250
- /**
251
- * Generated bundle index. Do not edit.
252
- */
253
-
254
246
  export { ElementCssCustomMatchers, TestHelper };
255
- //# sourceMappingURL=kirbydesign-designsystem-testing.mjs.map
247
+
248
+ //# sourceMappingURL=kirbydesign-designsystem-testing.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"kirbydesign-designsystem-testing.mjs","sources":["../../testing/src/test-helper.ts","../../testing/src/element-css-custom-matchers.ts","../../testing/src/kirbydesign-designsystem-testing.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { provideIonicAngular } from '@ionic/angular/standalone';\nimport { componentOnReady } from '@ionic/core';\n\n@NgModule({\n providers: [provideIonicAngular({ mode: 'ios', _testing: true })],\n})\nclass IonicTestingModule {}\n\nexport class TestHelper {\n public static readonly _init = TestHelper.muteIonicReInitializeWarning();\n\n public static disableAnimationsInTest() {\n //@ts-ignore\n window.Ionic = {\n config: {\n _testing: true,\n },\n };\n }\n\n public static muteIonicReInitializeWarning() {\n const originalWarn = console.warn;\n const patchedWarn = (warning: any, ...optionalParams: any[]) => {\n const suppress = `Ionic Angular was already initialized. Make sure IonicModule.forRoot() is just called once.`;\n if (warning !== suppress) originalWarn(warning, ...optionalParams);\n };\n console.warn = patchedWarn;\n }\n\n public static ionicModuleForTest = IonicTestingModule;\n\n /*\n * Checks for the Web Component(s) being ready,\n * ie. the component is hydrated, styles have been applied\n * and the Shadow DOM is ready for query\n */\n public static async whenReady(\n elementOrNodeList: Element | NodeListOf<Element> | Element[]\n ): Promise<void> {\n if (elementOrNodeList === undefined || elementOrNodeList === null)\n return Promise.reject('TestHelper.whenReady: Element is null or undefined');\n if (elementOrNodeList instanceof Element) {\n await TestHelper.whenDefined(elementOrNodeList);\n await TestHelper.ionComponentOnReady(elementOrNodeList);\n } else {\n await Promise.all(\n Array.from(elementOrNodeList).map(async (element) => await TestHelper.whenReady(element))\n );\n }\n }\n\n /* Checks for the Web Component being defined, ie. the public methods are available */\n public static async whenDefined(element: Element): Promise<void> {\n await customElements.whenDefined(element.localName);\n }\n\n /* Checks for the Ionic Web Component being ready, ie. the component is hydrated and styles applied */\n public static async ionComponentOnReady(element: Element): Promise<void> {\n await new Promise<void>((resolve) => {\n componentOnReady(element, () => resolve());\n });\n }\n\n public static async whenTrue(\n pollFunc: () => boolean,\n timeoutInMs: number = 2000,\n pollIntervalInMs: number = 5\n ): Promise<void> {\n if (pollFunc() === true) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n let timeoutId, intervalId;\n const pollState = () => {\n const result = pollFunc();\n if (result === true) {\n clearTimeout(timeoutId);\n clearInterval(intervalId);\n resolve();\n }\n };\n timeoutId = setTimeout(() => {\n clearInterval(intervalId);\n reject(\n `Error: Timeout - TestHelper.whenTrue function did not complete within ${timeoutInMs}ms`\n );\n }, timeoutInMs);\n intervalId = setInterval(pollState, pollIntervalInMs);\n });\n }\n\n public static getCssProperty(element: Element, propertyName: string, pseudoElt?: string) {\n return window.getComputedStyle(element, pseudoElt).getPropertyValue(propertyName).trim();\n }\n\n public static screensize = {\n phonesmall: { width: '320px', height: '568px' },\n phone: { width: '375px', height: '667px' },\n phablet: { width: '575px', height: '767px' },\n 'phablet-landscape': { width: '767px', height: '575px' },\n tablet: { width: '768px', height: '1024px' },\n desktop: { width: '1200px', height: '900px' },\n };\n\n public static resizeTestWindow(size: { width?: string; height?: string }): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!window.frameElement) {\n console.warn('window.frameElement is undefined. Cannot resize test window.');\n reject();\n } else {\n const query = [];\n if (size.width) {\n query.push(`(max-width: ${size.width})`);\n }\n if (size.height) {\n query.push(`(max-height: ${size.height})`);\n }\n console.log(`Set test window size to: ${JSON.stringify(size)}`);\n (window.frameElement as HTMLIFrameElement).style.width = size.width;\n (window.frameElement as HTMLIFrameElement).style.height = size.height;\n const mediaQuery = window.matchMedia(query.join(' and '));\n if (mediaQuery.matches) {\n resolve();\n } else {\n // Ensure window has resized before executing:\n mediaQuery.onchange = (ev) => {\n if (ev.matches) {\n // Stop listening for changes:\n mediaQuery.onchange = null;\n resolve();\n }\n };\n console.log(`Awaiting media query to match: ${mediaQuery.media}`);\n }\n }\n });\n }\n\n public static resetTestWindow(): void {\n if (!window.frameElement) {\n console.warn('window.frameElement is undefined. Cannot resize test window.');\n return;\n }\n console.log('Resetting test window width');\n (window.frameElement as HTMLIFrameElement).style.width = null;\n (window.frameElement as HTMLIFrameElement).style.height = null;\n }\n\n public static scrollMainWindowToTop() {\n if (\n window.parent &&\n window.parent.document &&\n window.parent.document.documentElement &&\n window.parent.document.documentElement.scrollTop > 0\n ) {\n window.parent.document.documentElement.scrollTop = 0;\n }\n }\n\n public static waitForResizeObserver(): Promise<void> {\n return TestHelper.waitForTimeout(1);\n }\n\n public static waitForMutationObserver(): Promise<void> {\n return TestHelper.waitForTimeout(1);\n }\n\n public static waitForTimeout(timeoutInMs?: number): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(resolve, timeoutInMs));\n }\n}\n\nexport type ScreenSize = keyof typeof TestHelper.screensize;\n","import { ColorHelper, ThemeColorDefinition } from '@kirbydesign/core';\nimport jasmine from 'jasmine-core';\nimport { TestHelper } from './test-helper';\n\nimport CustomMatcherFactories = jasmine.CustomMatcherFactories;\nimport CustomMatcherResult = jasmine.CustomMatcherResult;\nimport MatchersUtil = jasmine.MatchersUtil;\n\nexport const ElementCssCustomMatchers: CustomMatcherFactories = {\n toHaveComputedStyle: (util: MatchersUtil) => cssPropertyMatcher(util),\n};\n\nfunction cssPropertyMatcher(util: MatchersUtil) {\n return {\n compare: (\n element: Element,\n expectedStyles: { [cssProperty: string]: string | ThemeColorDefinition },\n pseudoElt?: string\n ) => {\n let allPassed = Object.keys(expectedStyles).length !== 0;\n const messages = [];\n Object.keys(expectedStyles).forEach((cssProperty) => {\n const expectedValue = expectedStyles[cssProperty];\n const { expectedStringValue, expectedValueAlias } = getExpectedStringValueAndAlias(\n cssProperty,\n expectedValue\n );\n const { pass, message } = compareCssProperty(\n util,\n element,\n cssProperty,\n expectedStringValue,\n expectedValueAlias,\n pseudoElt\n );\n allPassed = allPassed && pass;\n if (message) {\n messages.push(message);\n }\n });\n const result = {\n pass: allPassed,\n message: messages.join('\\n'),\n };\n return result;\n },\n };\n}\n\nfunction getExpectedStringValueAndAlias(\n cssProperty: string,\n expectedValue: string | ThemeColorDefinition\n) {\n let expectedStringValue: string;\n let expectedValueAlias: string;\n\n if (typeof expectedValue === 'string') {\n expectedStringValue = expectedValue;\n // Check of css property is a color:\n if (\n cssProperty.indexOf('color') > -1 ||\n expectedValue.startsWith('rgb') ||\n expectedValue.startsWith('#')\n ) {\n // Check if css property is a css variable:\n // Css variable values are hex when getting computed style, all other property values are rgb:\n if (!cssProperty.startsWith('--')) {\n // Not a css variable, convert color to rgb:\n expectedStringValue = ColorHelper.colorStringToRgbString(expectedValue);\n }\n }\n } else {\n // Check if css property is a css variable:\n // Css variable values are hex when getting computed style, all other property values are rgb:\n expectedStringValue = cssProperty.startsWith('--') ? expectedValue.hex : expectedValue.value;\n expectedValueAlias = expectedValue.fullname;\n }\n\n return {\n expectedStringValue,\n expectedValueAlias,\n };\n}\n\nfunction compareCssProperty(\n util: MatchersUtil,\n element: Element,\n cssProperty: string,\n expectedValue: string,\n expectedValueAlias?: string,\n pseudoElt?: string\n): CustomMatcherResult {\n const actualValue = TestHelper.getCssProperty(element, cssProperty, pseudoElt);\n const pass = util.equals(actualValue, expectedValue) || !!compareSize(actualValue, expectedValue);\n const message = pass\n ? null\n : getErrorMessage(\n element,\n cssProperty,\n actualValue,\n expectedValue,\n expectedValueAlias,\n pseudoElt\n );\n const result = {\n pass: pass,\n message: message,\n };\n return result;\n}\n\nfunction compareSize(actualValue: string, expectedValue: string): boolean | void {\n if (!expectedValue.startsWith('<') && !expectedValue.startsWith('>')) return;\n\n const matches = expectedValue.match(/(?<operator>\\<\\=|\\<|\\>\\=|\\>)(?<value>\\d*)px/);\n if (matches && matches.groups) {\n const actualValueNumber = parseInt(actualValue);\n const operator = matches.groups['operator'];\n const expectedValueNumber = parseInt(matches.groups['value']);\n switch (operator) {\n case '<':\n return actualValueNumber < expectedValueNumber;\n case '<=':\n return actualValueNumber <= expectedValueNumber;\n case '>':\n return actualValueNumber > expectedValueNumber;\n case '>=':\n return actualValueNumber >= expectedValueNumber;\n default:\n break;\n }\n }\n}\n\nfunction getErrorMessage(\n element: Element,\n cssProperty: string,\n actualValue: string,\n expectedValue: string,\n expectedValueAlias?: string,\n pseudoElt?: string\n) {\n const expectedColorNameSuffix = expectedValueAlias ? ` (${expectedValueAlias})` : '';\n return `Expected [${cssProperty}] of ${element.tagName}${\n pseudoElt ?? ''\n } '${actualValue}' to be '${expectedValue}'${expectedColorNameSuffix}`;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kirbydesign-designsystem-testing.mjs","names":[],"sources":["../../testing/src/test-helper.ts","../../testing/src/element-css-custom-matchers.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { provideIonicAngular } from '@ionic/angular';\nimport { componentOnReady } from '@ionic/core';\n\n@NgModule({\n providers: [provideIonicAngular({ mode: 'ios', _testing: true })],\n})\nclass IonicTestingModule {}\n\nexport class TestHelper {\n public static readonly _init = TestHelper.muteIonicReInitializeWarning();\n\n public static disableAnimationsInTest() {\n //@ts-ignore\n window.Ionic = {\n config: {\n _testing: true,\n },\n };\n }\n\n public static muteIonicReInitializeWarning() {\n const originalWarn = console.warn;\n const patchedWarn = (warning: any, ...optionalParams: any[]) => {\n const suppress = `Ionic Angular was already initialized. Make sure IonicModule.forRoot() is just called once.`;\n if (warning !== suppress) originalWarn(warning, ...optionalParams);\n };\n console.warn = patchedWarn;\n }\n\n public static ionicModuleForTest = IonicTestingModule;\n\n /*\n * Checks for the Web Component(s) being ready,\n * ie. the component is hydrated, styles have been applied\n * and the Shadow DOM is ready for query\n */\n public static async whenReady(\n elementOrNodeList: Element | NodeListOf<Element> | Element[]\n ): Promise<void> {\n if (elementOrNodeList === undefined || elementOrNodeList === null)\n return Promise.reject('TestHelper.whenReady: Element is null or undefined');\n if (elementOrNodeList instanceof Element) {\n await TestHelper.whenDefined(elementOrNodeList);\n await TestHelper.ionComponentOnReady(elementOrNodeList);\n } else {\n await Promise.all(\n Array.from(elementOrNodeList).map(async (element) => await TestHelper.whenReady(element))\n );\n }\n }\n\n /* Checks for the Web Component being defined, ie. the public methods are available */\n public static async whenDefined(element: Element): Promise<void> {\n await customElements.whenDefined(element.localName);\n }\n\n /* Checks for the Ionic Web Component being ready, ie. the component is hydrated and styles applied */\n public static async ionComponentOnReady(element: Element): Promise<void> {\n await new Promise<void>((resolve) => {\n componentOnReady(element, () => resolve());\n });\n }\n\n public static async whenTrue(\n pollFunc: () => boolean,\n timeoutInMs: number = 2000,\n pollIntervalInMs: number = 5\n ): Promise<void> {\n if (pollFunc() === true) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n let intervalId: ReturnType<typeof setInterval>;\n const pollState = () => {\n const result = pollFunc();\n if (result === true) {\n clearTimeout(timeoutId);\n clearInterval(intervalId);\n resolve();\n }\n };\n timeoutId = setTimeout(() => {\n clearInterval(intervalId);\n reject(\n `Error: Timeout - TestHelper.whenTrue function did not complete within ${timeoutInMs}ms`\n );\n }, timeoutInMs);\n intervalId = setInterval(pollState, pollIntervalInMs);\n });\n }\n\n public static getCssProperty(element: Element, propertyName: string, pseudoElt?: string) {\n return window.getComputedStyle(element, pseudoElt).getPropertyValue(propertyName).trim();\n }\n\n public static screensize = {\n phonesmall: { width: '320px', height: '568px' },\n phone: { width: '375px', height: '667px' },\n phablet: { width: '575px', height: '767px' },\n 'phablet-landscape': { width: '767px', height: '575px' },\n tablet: { width: '768px', height: '1024px' },\n desktop: { width: '1200px', height: '900px' },\n };\n\n public static resizeTestWindow(size: { width?: string; height?: string }): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!window.frameElement) {\n console.warn('window.frameElement is undefined. Cannot resize test window.');\n reject();\n } else {\n const query = [];\n if (size.width) {\n query.push(`(max-width: ${size.width})`);\n }\n if (size.height) {\n query.push(`(max-height: ${size.height})`);\n }\n console.log(`Set test window size to: ${JSON.stringify(size)}`);\n (window.frameElement as HTMLIFrameElement).style.width = size.width ?? '';\n (window.frameElement as HTMLIFrameElement).style.height = size.height ?? '';\n const mediaQuery = window.matchMedia(query.join(' and '));\n if (mediaQuery.matches) {\n resolve();\n } else {\n // Ensure window has resized before executing:\n mediaQuery.onchange = (ev) => {\n if (ev.matches) {\n // Stop listening for changes:\n mediaQuery.onchange = null;\n resolve();\n }\n };\n console.log(`Awaiting media query to match: ${mediaQuery.media}`);\n }\n }\n });\n }\n\n public static resetTestWindow(): void {\n if (!window.frameElement) {\n console.warn('window.frameElement is undefined. Cannot resize test window.');\n return;\n }\n console.log('Resetting test window width');\n (window.frameElement as HTMLIFrameElement).style.width = '';\n (window.frameElement as HTMLIFrameElement).style.height = '';\n }\n\n public static scrollMainWindowToTop() {\n if (\n window.parent &&\n window.parent.document &&\n window.parent.document.documentElement &&\n window.parent.document.documentElement.scrollTop > 0\n ) {\n window.parent.document.documentElement.scrollTop = 0;\n }\n }\n\n public static waitForResizeObserver(): Promise<void> {\n return TestHelper.waitForTimeout(1);\n }\n\n public static waitForMutationObserver(): Promise<void> {\n return TestHelper.waitForTimeout(1);\n }\n\n public static waitForTimeout(timeoutInMs?: number): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(resolve, timeoutInMs));\n }\n}\n\nexport type ScreenSize = keyof typeof TestHelper.screensize;\n","/// <reference types=\"jasmine\" />\n\nimport { ColorHelper, ThemeColorDefinition } from '@kirbydesign/core';\nimport { TestHelper } from './test-helper';\n\ntype CustomMatcherFactories = jasmine.CustomMatcherFactories;\ntype CustomMatcherResult = jasmine.CustomMatcherResult;\ntype MatchersUtil = jasmine.MatchersUtil;\n\nexport const ElementCssCustomMatchers: CustomMatcherFactories = {\n toHaveComputedStyle: (util: MatchersUtil) => cssPropertyMatcher(util),\n};\n\nfunction cssPropertyMatcher(util: MatchersUtil) {\n return {\n compare: (\n element: Element,\n expectedStyles: { [cssProperty: string]: string | ThemeColorDefinition },\n pseudoElt?: string\n ) => {\n let allPassed = Object.keys(expectedStyles).length !== 0;\n const messages: string[] = [];\n Object.keys(expectedStyles).forEach((cssProperty) => {\n const expectedValue = expectedStyles[cssProperty];\n const { expectedStringValue, expectedValueAlias } = getExpectedStringValueAndAlias(\n cssProperty,\n expectedValue\n );\n const { pass, message } = compareCssProperty(\n util,\n element,\n cssProperty,\n expectedStringValue,\n expectedValueAlias,\n pseudoElt\n );\n allPassed = allPassed && pass;\n if (message) {\n messages.push(message);\n }\n });\n const result = {\n pass: allPassed,\n message: messages.join('\\n'),\n };\n return result;\n },\n };\n}\n\nfunction getExpectedStringValueAndAlias(\n cssProperty: string,\n expectedValue: string | ThemeColorDefinition\n) {\n let expectedStringValue = '';\n let expectedValueAlias: string | undefined;\n\n if (typeof expectedValue === 'string') {\n expectedStringValue = expectedValue;\n // Check of css property is a color:\n if (\n cssProperty.indexOf('color') > -1 ||\n expectedValue.startsWith('rgb') ||\n expectedValue.startsWith('#')\n ) {\n // Check if css property is a css variable:\n // Css variable values are hex when getting computed style, all other property values are rgb:\n if (!cssProperty.startsWith('--')) {\n // Not a css variable, convert color to rgb:\n expectedStringValue = ColorHelper.colorStringToRgbString(expectedValue);\n }\n }\n } else {\n // Check if css property is a css variable:\n // Css variable values are hex when getting computed style, all other property values are rgb:\n // Normalize esbuild-wrapped RGB values - they are on multiple lines with extra whitespace\n expectedStringValue = cssProperty.startsWith('--')\n ? (expectedValue.hex ?? '')\n : normalizeWhitespace(expectedValue.value ?? '');\n expectedValueAlias = expectedValue.fullname ?? '';\n }\n\n return {\n expectedStringValue,\n expectedValueAlias,\n };\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, ' ');\n}\n\nfunction compareCssProperty(\n util: MatchersUtil,\n element: Element,\n cssProperty: string,\n expectedValue: string,\n expectedValueAlias?: string,\n pseudoElt?: string\n): CustomMatcherResult {\n const actualValue = TestHelper.getCssProperty(element, cssProperty, pseudoElt);\n const pass = util.equals(actualValue, expectedValue) || !!compareSize(actualValue, expectedValue);\n const message = pass\n ? null\n : getErrorMessage(\n element,\n cssProperty,\n actualValue,\n expectedValue,\n expectedValueAlias,\n pseudoElt\n );\n const result = {\n pass: pass,\n message: message ?? undefined,\n };\n return result;\n}\n\nfunction compareSize(actualValue: string, expectedValue: string): boolean | void {\n if (!expectedValue.startsWith('<') && !expectedValue.startsWith('>')) return;\n\n const matches = expectedValue.match(/(?<operator>\\<\\=|\\<|\\>\\=|\\>)(?<value>\\d*)px/);\n if (matches && matches.groups) {\n const actualValueNumber = parseInt(actualValue);\n const operator = matches.groups['operator'];\n const expectedValueNumber = parseInt(matches.groups['value']);\n switch (operator) {\n case '<':\n return actualValueNumber < expectedValueNumber;\n case '<=':\n return actualValueNumber <= expectedValueNumber;\n case '>':\n return actualValueNumber > expectedValueNumber;\n case '>=':\n return actualValueNumber >= expectedValueNumber;\n default:\n break;\n }\n }\n}\n\nfunction getErrorMessage(\n element: Element,\n cssProperty: string,\n actualValue: string,\n expectedValue: string,\n expectedValueAlias?: string,\n pseudoElt?: string\n) {\n const expectedColorNameSuffix = expectedValueAlias ? ` (${expectedValueAlias})` : '';\n return `Expected [${cssProperty}] of ${element.tagName}${\n pseudoElt ?? ''\n } '${actualValue}' to be '${expectedValue}'${expectedColorNameSuffix}`;\n}\n"],"mappings":"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"}