@kirbydesign/designsystem 11.11.3-dev-e7cb27f → 12.0.0-dev-67d5287

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 (282) hide show
  1. package/fesm2022/kirbydesign-designsystem-accordion.mjs +246 -135
  2. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  3. package/fesm2022/kirbydesign-designsystem-action-group.mjs +229 -134
  4. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  5. package/fesm2022/kirbydesign-designsystem-avatar.mjs +102 -55
  6. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  7. package/fesm2022/kirbydesign-designsystem-badge.mjs +85 -42
  8. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  9. package/fesm2022/kirbydesign-designsystem-button.mjs +203 -170
  10. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  11. package/fesm2022/kirbydesign-designsystem-calendar.mjs +524 -516
  12. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  13. package/fesm2022/kirbydesign-designsystem-card.mjs +439 -205
  14. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  15. package/fesm2022/kirbydesign-designsystem-chart.mjs +1388 -1469
  16. package/fesm2022/kirbydesign-designsystem-chart.mjs.map +1 -1
  17. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +215 -176
  18. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  19. package/fesm2022/kirbydesign-designsystem-config.mjs +50 -96
  20. package/fesm2022/kirbydesign-designsystem-config.mjs.map +1 -1
  21. package/fesm2022/kirbydesign-designsystem-data-table.mjs +180 -83
  22. package/fesm2022/kirbydesign-designsystem-data-table.mjs.map +1 -1
  23. package/fesm2022/kirbydesign-designsystem-divider.mjs +46 -19
  24. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  25. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +878 -752
  26. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  27. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +164 -91
  28. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  29. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +213 -85
  30. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
  31. package/fesm2022/kirbydesign-designsystem-flag.mjs +67 -33
  32. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  33. package/fesm2022/kirbydesign-designsystem-form-field.mjs +1260 -901
  34. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  35. package/fesm2022/kirbydesign-designsystem-gesture.mjs +38 -23
  36. package/fesm2022/kirbydesign-designsystem-gesture.mjs.map +1 -1
  37. package/fesm2022/kirbydesign-designsystem-header.mjs +422 -182
  38. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  39. package/fesm2022/kirbydesign-designsystem-helpers-scss.mjs +16 -14
  40. package/fesm2022/kirbydesign-designsystem-helpers-scss.mjs.map +1 -1
  41. package/fesm2022/kirbydesign-designsystem-helpers.mjs +251 -361
  42. package/fesm2022/kirbydesign-designsystem-helpers.mjs.map +1 -1
  43. package/fesm2022/kirbydesign-designsystem-icon.mjs +881 -303
  44. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  45. package/fesm2022/kirbydesign-designsystem-item-group.mjs +52 -23
  46. package/fesm2022/kirbydesign-designsystem-item-group.mjs.map +1 -1
  47. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +147 -43
  48. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
  49. package/fesm2022/kirbydesign-designsystem-item.mjs +395 -151
  50. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  51. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +136 -54
  52. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs.map +1 -1
  53. package/fesm2022/kirbydesign-designsystem-list.mjs +1185 -697
  54. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  55. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +166 -76
  56. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  57. package/fesm2022/kirbydesign-designsystem-menu.mjs +420 -311
  58. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  59. package/fesm2022/kirbydesign-designsystem-modal.mjs +2467 -1912
  60. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  61. package/fesm2022/kirbydesign-designsystem-page.mjs +1505 -923
  62. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  63. package/fesm2022/kirbydesign-designsystem-popover.mjs +203 -183
  64. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  65. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +209 -121
  66. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
  67. package/fesm2022/kirbydesign-designsystem-radio.mjs +537 -365
  68. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  69. package/fesm2022/kirbydesign-designsystem-range.mjs +207 -150
  70. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  71. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +217 -104
  72. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  73. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +113 -38
  74. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
  75. package/fesm2022/kirbydesign-designsystem-section-header.mjs +56 -18
  76. package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
  77. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs +276 -232
  78. package/fesm2022/kirbydesign-designsystem-segmented-control.mjs.map +1 -1
  79. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +319 -382
  80. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs.map +1 -1
  81. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +73 -84
  82. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs.map +1 -1
  83. package/fesm2022/kirbydesign-designsystem-shared.mjs +665 -529
  84. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  85. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +140 -91
  86. package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
  87. package/fesm2022/kirbydesign-designsystem-slide.mjs +360 -158
  88. package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
  89. package/fesm2022/kirbydesign-designsystem-spinner.mjs +90 -32
  90. package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
  91. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +348 -181
  92. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  93. package/fesm2022/kirbydesign-designsystem-tabs.mjs +286 -121
  94. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  95. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +6232 -3164
  96. package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  97. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +118 -95
  98. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs.map +1 -1
  99. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +128 -101
  100. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs.map +1 -1
  101. package/fesm2022/kirbydesign-designsystem-testing.mjs +236 -243
  102. package/fesm2022/kirbydesign-designsystem-testing.mjs.map +1 -1
  103. package/fesm2022/kirbydesign-designsystem-toast.mjs +98 -62
  104. package/fesm2022/kirbydesign-designsystem-toast.mjs.map +1 -1
  105. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +155 -127
  106. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs.map +1 -1
  107. package/fesm2022/kirbydesign-designsystem-toggle.mjs +180 -150
  108. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  109. package/fesm2022/kirbydesign-designsystem-types.mjs +39 -24
  110. package/fesm2022/kirbydesign-designsystem-types.mjs.map +1 -1
  111. package/fesm2022/kirbydesign-designsystem.mjs +516 -407
  112. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  113. package/icons/svg/megaphone.svg +3 -0
  114. package/package.json +10 -10
  115. package/readme.md +37 -0
  116. package/types/kirbydesign-designsystem-accordion.d.ts +72 -39
  117. package/types/kirbydesign-designsystem-accordion.d.ts.map +1 -1
  118. package/types/kirbydesign-designsystem-action-group.d.ts +46 -39
  119. package/types/kirbydesign-designsystem-action-group.d.ts.map +1 -1
  120. package/types/kirbydesign-designsystem-avatar.d.ts +62 -26
  121. package/types/kirbydesign-designsystem-avatar.d.ts.map +1 -1
  122. package/types/kirbydesign-designsystem-badge.d.ts +30 -19
  123. package/types/kirbydesign-designsystem-badge.d.ts.map +1 -1
  124. package/types/kirbydesign-designsystem-button.d.ts +70 -45
  125. package/types/kirbydesign-designsystem-button.d.ts.map +1 -1
  126. package/types/kirbydesign-designsystem-calendar.d.ts +193 -132
  127. package/types/kirbydesign-designsystem-calendar.d.ts.map +1 -1
  128. package/types/kirbydesign-designsystem-card.d.ts +130 -66
  129. package/types/kirbydesign-designsystem-card.d.ts.map +1 -1
  130. package/types/kirbydesign-designsystem-chart.d.ts +198 -172
  131. package/types/kirbydesign-designsystem-chart.d.ts.map +1 -1
  132. package/types/kirbydesign-designsystem-checkbox.d.ts +96 -68
  133. package/types/kirbydesign-designsystem-checkbox.d.ts.map +1 -1
  134. package/types/kirbydesign-designsystem-config.d.ts +17 -21
  135. package/types/kirbydesign-designsystem-config.d.ts.map +1 -1
  136. package/types/kirbydesign-designsystem-data-table.d.ts +46 -26
  137. package/types/kirbydesign-designsystem-data-table.d.ts.map +1 -1
  138. package/types/kirbydesign-designsystem-divider.d.ts +11 -9
  139. package/types/kirbydesign-designsystem-divider.d.ts.map +1 -1
  140. package/types/kirbydesign-designsystem-dropdown.d.ts +219 -166
  141. package/types/kirbydesign-designsystem-dropdown.d.ts.map +1 -1
  142. package/types/kirbydesign-designsystem-empty-state.d.ts +47 -35
  143. package/types/kirbydesign-designsystem-empty-state.d.ts.map +1 -1
  144. package/types/kirbydesign-designsystem-fab-sheet.d.ts +34 -28
  145. package/types/kirbydesign-designsystem-fab-sheet.d.ts.map +1 -1
  146. package/types/kirbydesign-designsystem-flag.d.ts +18 -13
  147. package/types/kirbydesign-designsystem-flag.d.ts.map +1 -1
  148. package/types/kirbydesign-designsystem-form-field.d.ts +409 -242
  149. package/types/kirbydesign-designsystem-form-field.d.ts.map +1 -1
  150. package/types/kirbydesign-designsystem-gesture.d.ts +41 -46
  151. package/types/kirbydesign-designsystem-gesture.d.ts.map +1 -1
  152. package/types/kirbydesign-designsystem-header.d.ts +102 -64
  153. package/types/kirbydesign-designsystem-header.d.ts.map +1 -1
  154. package/types/kirbydesign-designsystem-helpers-scss.d.ts +6 -8
  155. package/types/kirbydesign-designsystem-helpers-scss.d.ts.map +1 -1
  156. package/types/kirbydesign-designsystem-helpers.d.ts +83 -97
  157. package/types/kirbydesign-designsystem-helpers.d.ts.map +1 -1
  158. package/types/kirbydesign-designsystem-icon.d.ts +63 -59
  159. package/types/kirbydesign-designsystem-icon.d.ts.map +1 -1
  160. package/types/kirbydesign-designsystem-item-group.d.ts +6 -9
  161. package/types/kirbydesign-designsystem-item-group.d.ts.map +1 -1
  162. package/types/kirbydesign-designsystem-item-sliding.d.ts +30 -26
  163. package/types/kirbydesign-designsystem-item-sliding.d.ts.map +1 -1
  164. package/types/kirbydesign-designsystem-item.d.ts +93 -54
  165. package/types/kirbydesign-designsystem-item.d.ts.map +1 -1
  166. package/types/kirbydesign-designsystem-kirby-app.d.ts +18 -19
  167. package/types/kirbydesign-designsystem-kirby-app.d.ts.map +1 -1
  168. package/types/kirbydesign-designsystem-list.d.ts +387 -263
  169. package/types/kirbydesign-designsystem-list.d.ts.map +1 -1
  170. package/types/kirbydesign-designsystem-loading-overlay.d.ts +35 -24
  171. package/types/kirbydesign-designsystem-loading-overlay.d.ts.map +1 -1
  172. package/types/kirbydesign-designsystem-menu.d.ts +119 -69
  173. package/types/kirbydesign-designsystem-menu.d.ts.map +1 -1
  174. package/types/kirbydesign-designsystem-modal.d.ts +577 -455
  175. package/types/kirbydesign-designsystem-modal.d.ts.map +1 -1
  176. package/types/kirbydesign-designsystem-page.d.ts +304 -229
  177. package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
  178. package/types/kirbydesign-designsystem-popover.d.ts +48 -40
  179. package/types/kirbydesign-designsystem-popover.d.ts.map +1 -1
  180. package/types/kirbydesign-designsystem-progress-circle.d.ts +60 -38
  181. package/types/kirbydesign-designsystem-progress-circle.d.ts.map +1 -1
  182. package/types/kirbydesign-designsystem-radio.d.ts +147 -98
  183. package/types/kirbydesign-designsystem-radio.d.ts.map +1 -1
  184. package/types/kirbydesign-designsystem-range.d.ts +90 -45
  185. package/types/kirbydesign-designsystem-range.d.ts.map +1 -1
  186. package/types/kirbydesign-designsystem-reorder-list.d.ts +44 -32
  187. package/types/kirbydesign-designsystem-reorder-list.d.ts.map +1 -1
  188. package/types/kirbydesign-designsystem-router-outlet.d.ts +23 -18
  189. package/types/kirbydesign-designsystem-router-outlet.d.ts.map +1 -1
  190. package/types/kirbydesign-designsystem-section-header.d.ts +5 -8
  191. package/types/kirbydesign-designsystem-section-header.d.ts.map +1 -1
  192. package/types/kirbydesign-designsystem-segmented-control.d.ts +123 -100
  193. package/types/kirbydesign-designsystem-segmented-control.d.ts.map +1 -1
  194. package/types/kirbydesign-designsystem-shared-floating.d.ts +183 -128
  195. package/types/kirbydesign-designsystem-shared-floating.d.ts.map +1 -1
  196. package/types/kirbydesign-designsystem-shared-portal.d.ts +29 -28
  197. package/types/kirbydesign-designsystem-shared-portal.d.ts.map +1 -1
  198. package/types/kirbydesign-designsystem-shared.d.ts +143 -139
  199. package/types/kirbydesign-designsystem-shared.d.ts.map +1 -1
  200. package/types/kirbydesign-designsystem-slide-button.d.ts +43 -34
  201. package/types/kirbydesign-designsystem-slide-button.d.ts.map +1 -1
  202. package/types/kirbydesign-designsystem-slide.d.ts +80 -59
  203. package/types/kirbydesign-designsystem-slide.d.ts.map +1 -1
  204. package/types/kirbydesign-designsystem-spinner.d.ts +13 -14
  205. package/types/kirbydesign-designsystem-spinner.d.ts.map +1 -1
  206. package/types/kirbydesign-designsystem-tab-navigation.d.ts +78 -55
  207. package/types/kirbydesign-designsystem-tab-navigation.d.ts.map +1 -1
  208. package/types/kirbydesign-designsystem-tabs.d.ts +50 -45
  209. package/types/kirbydesign-designsystem-tabs.d.ts.map +1 -1
  210. package/types/kirbydesign-designsystem-testing-base.d.ts +2430 -815
  211. package/types/kirbydesign-designsystem-testing-base.d.ts.map +1 -1
  212. package/types/kirbydesign-designsystem-testing-jasmine.d.ts +9 -10
  213. package/types/kirbydesign-designsystem-testing-jasmine.d.ts.map +1 -1
  214. package/types/kirbydesign-designsystem-testing-jest.d.ts +9 -10
  215. package/types/kirbydesign-designsystem-testing-jest.d.ts.map +1 -1
  216. package/types/kirbydesign-designsystem-testing.d.ts +52 -58
  217. package/types/kirbydesign-designsystem-testing.d.ts.map +1 -1
  218. package/types/kirbydesign-designsystem-toast.d.ts +25 -31
  219. package/types/kirbydesign-designsystem-toast.d.ts.map +1 -1
  220. package/types/kirbydesign-designsystem-toggle-button.d.ts +62 -56
  221. package/types/kirbydesign-designsystem-toggle-button.d.ts.map +1 -1
  222. package/types/kirbydesign-designsystem-toggle.d.ts +71 -63
  223. package/types/kirbydesign-designsystem-toggle.d.ts.map +1 -1
  224. package/types/kirbydesign-designsystem-types.d.ts +15 -22
  225. package/types/kirbydesign-designsystem-types.d.ts.map +1 -1
  226. package/types/kirbydesign-designsystem.d.ts +135 -123
  227. package/types/kirbydesign-designsystem.d.ts.map +1 -1
  228. package/accordion/package.json +0 -4
  229. package/action-group/package.json +0 -4
  230. package/avatar/package.json +0 -4
  231. package/badge/package.json +0 -4
  232. package/button/package.json +0 -4
  233. package/calendar/package.json +0 -4
  234. package/card/package.json +0 -4
  235. package/chart/package.json +0 -4
  236. package/checkbox/package.json +0 -4
  237. package/config/package.json +0 -4
  238. package/data-table/package.json +0 -4
  239. package/divider/package.json +0 -4
  240. package/dropdown/package.json +0 -4
  241. package/empty-state/package.json +0 -4
  242. package/fab-sheet/package.json +0 -4
  243. package/flag/package.json +0 -4
  244. package/form-field/package.json +0 -4
  245. package/gesture/package.json +0 -4
  246. package/header/package.json +0 -4
  247. package/helpers/package.json +0 -4
  248. package/helpers/scss/package.json +0 -4
  249. package/icon/package.json +0 -4
  250. package/item/package.json +0 -4
  251. package/item-group/package.json +0 -4
  252. package/item-sliding/package.json +0 -4
  253. package/kirby-app/package.json +0 -4
  254. package/list/package.json +0 -4
  255. package/loading-overlay/package.json +0 -4
  256. package/menu/package.json +0 -4
  257. package/modal/package.json +0 -4
  258. package/page/package.json +0 -4
  259. package/popover/package.json +0 -4
  260. package/progress-circle/package.json +0 -4
  261. package/radio/package.json +0 -4
  262. package/range/package.json +0 -4
  263. package/reorder-list/package.json +0 -4
  264. package/router-outlet/package.json +0 -4
  265. package/section-header/package.json +0 -4
  266. package/segmented-control/package.json +0 -4
  267. package/shared/floating/package.json +0 -4
  268. package/shared/package.json +0 -4
  269. package/shared/portal/package.json +0 -4
  270. package/slide/package.json +0 -4
  271. package/slide-button/package.json +0 -4
  272. package/spinner/package.json +0 -4
  273. package/tab-navigation/package.json +0 -4
  274. package/tabs/package.json +0 -4
  275. package/testing/package.json +0 -4
  276. package/testing-base/package.json +0 -4
  277. package/testing-jasmine/package.json +0 -4
  278. package/testing-jest/package.json +0 -4
  279. package/toast/package.json +0 -4
  280. package/toggle/package.json +0 -4
  281. package/toggle-button/package.json +0 -4
  282. 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';
5
- import { componentOnReady } from '@ionic/core';
6
-
7
- class IonicTestingModule {
8
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: IonicTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.23", ngImport: i0, type: IonicTestingModule }); }
10
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: IonicTestingModule, providers: [provideIonicAngular({ mode: 'ios', _testing: true })] }); }
11
- }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", 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.2",
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.2",
21
+ ngImport: i0,
22
+ type: IonicTestingModule
23
+ });
24
+ }
25
+ static {
26
+ this.ɵinj = i0.ɵɵngDeclareInjector({
27
+ minVersion: "12.0.0",
28
+ version: "22.2.2",
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.2",
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';\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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"}