@kirbydesign/designsystem 11.11.3 → 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 -905
  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 -226
  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,521 +1,529 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, LOCALE_ID, HostBinding, Input, Output, Inject, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { isBefore, isAfter, startOfDay, format, isSameMonth, startOfMonth, eachDayOfInterval, endOfWeek, startOfWeek, isSameDay, add, isWeekend, getYear, lastDayOfWeek } from 'date-fns';
4
- import { toZonedTime, fromZonedTime } from 'date-fns-tz';
5
- import { enUS, enGB, de, da } from 'date-fns/locale';
6
- import { capitalizeFirstLetter } from '@kirbydesign/core';
7
- import { ButtonComponent } from '@kirbydesign/designsystem/button';
8
- import { DropdownComponent } from '@kirbydesign/designsystem/dropdown';
9
- import { UniqueIdGenerator } from '@kirbydesign/designsystem/helpers';
10
- import { IconComponent } from '@kirbydesign/designsystem/icon';
11
- import * as i1 from '@kirbydesign/designsystem/shared';
12
-
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Inject, Input, LOCALE_ID, Output } from "@angular/core";
3
+ import { add, eachDayOfInterval, endOfWeek, format, getYear, isAfter, isBefore, isSameDay, isSameMonth, isWeekend, lastDayOfWeek, startOfDay, startOfMonth, startOfWeek } from "date-fns";
4
+ import { fromZonedTime, toZonedTime } from "date-fns-tz";
5
+ import { da, de, enGB, enUS } from "date-fns/locale";
6
+ import { capitalizeFirstLetter } from "@kirbydesign/core";
7
+ import { ButtonComponent } from "@kirbydesign/designsystem/button";
8
+ import { DropdownComponent } from "@kirbydesign/designsystem/dropdown";
9
+ import { UniqueIdGenerator } from "@kirbydesign/designsystem/helpers";
10
+ import { IconComponent } from "@kirbydesign/designsystem/icon";
11
+ import * as i1 from "@kirbydesign/designsystem/shared";
13
12
  var TimeUnit;
14
- (function (TimeUnit) {
15
- TimeUnit["years"] = "years";
16
- TimeUnit["months"] = "months";
17
- TimeUnit["weeks"] = "weeks";
18
- TimeUnit["days"] = "days";
19
- TimeUnit["hours"] = "hours";
20
- TimeUnit["minutes"] = "minutes";
21
- TimeUnit["seconds"] = "seconds";
22
- TimeUnit["milliseconds"] = "milliseconds";
13
+ (function(TimeUnit) {
14
+ TimeUnit["years"] = "years";
15
+ TimeUnit["months"] = "months";
16
+ TimeUnit["weeks"] = "weeks";
17
+ TimeUnit["days"] = "days";
18
+ TimeUnit["hours"] = "hours";
19
+ TimeUnit["minutes"] = "minutes";
20
+ TimeUnit["seconds"] = "seconds";
21
+ TimeUnit["milliseconds"] = "milliseconds";
23
22
  })(TimeUnit || (TimeUnit = {}));
24
- class CalendarComponent {
25
- set locales(locales) {
26
- console.warn(`Supplying additional locales to the Kirby Calendar Component via an input property is deprecated and should not be used.
23
+ var CalendarComponent = class CalendarComponent {
24
+ set locales(locales) {
25
+ console.warn(`Supplying additional locales to the Kirby Calendar Component via an input property is deprecated and should not be used.
27
26
  A future update will allow injecting additional locales via a provider instead.`);
28
- }
29
- /**
30
- * @deprecated This input is no longer needed. The year selection dropdown now always uses popover positioning.
31
- * This input will be removed in a future major version.
32
- */
33
- set usePopover(_value) {
34
- console.warn(`[Kirby Calendar] The 'usePopover' input is deprecated and no longer has any effect.
27
+ }
28
+ set usePopover(_value) {
29
+ console.warn(`[Kirby Calendar] The 'usePopover' input is deprecated and no longer has any effect.
35
30
  The year selection dropdown now always uses popover positioning. This input will be removed in a future major version.`);
36
- }
37
- get selectedDate() {
38
- return this._selectedDate;
39
- }
40
- set selectedDate(valueLocalOrUTC) {
41
- const value = this.normalizeDate(valueLocalOrUTC);
42
- if (valueLocalOrUTC) {
43
- this.setActiveMonth(value);
44
- }
45
- if (this.hasDateChanged(value, this._selectedDate)) {
46
- this.onSelectedDateChange(value);
47
- this.focusDate(value);
48
- this._selectedDate = value;
49
- }
50
- }
51
- get disabledDates() {
52
- return this._disabledDates;
53
- }
54
- set disabledDates(value) {
55
- this._disabledDates = (value || []).map((date) => this.normalizeDate(date));
56
- }
57
- get enabledDates() {
58
- return this._enabledDates;
59
- }
60
- set enabledDates(value) {
61
- this._enabledDates = (value || []).map((date) => this.normalizeDate(date));
62
- }
63
- get todayDate() {
64
- return this._todayDate;
65
- }
66
- set todayDate(value) {
67
- this._todayDate = this.normalizeDate(value);
68
- }
69
- get minDate() {
70
- return this._minDate;
71
- }
72
- set minDate(value) {
73
- if (value && this.activeMonth && isBefore(this.activeMonth, value)) {
74
- this.setActiveMonth(value);
75
- }
76
- this._minDate = this.normalizeDate(value);
77
- }
78
- get maxDate() {
79
- return this._maxDate;
80
- }
81
- set maxDate(value) {
82
- if (value && this.activeMonth && isAfter(this.activeMonth, value)) {
83
- this.setActiveMonth(value);
84
- }
85
- this._maxDate = this.normalizeDate(value);
86
- }
87
- get activeMonthName() {
88
- return capitalizeFirstLetter(this.formatWithLocale(this.activeMonth, 'MMMM'));
89
- }
90
- get activeYear() {
91
- return this.formatWithLocale(this.activeMonth, 'yyyy');
92
- }
93
- /**
94
- * Gets navigable years for year navigator based on yearNavigatorOptions.
95
- */
96
- get navigableYears() {
97
- const dateOfFirstNavigableYear = this.minDate || this.getDateFromNavigableYear(this.yearNavigatorOptions.from);
98
- const dateOfLastNavigableYear = this.maxDate || this.getDateFromNavigableYear(this.yearNavigatorOptions.to);
99
- return this.getYearsBetweenDates(dateOfFirstNavigableYear, dateOfLastNavigableYear);
100
- }
101
- get navigatedYear() {
102
- return this.navigableYears.indexOf(this.activeYear);
103
- }
104
- get _hasYearNavigator() {
105
- return !!this.yearNavigatorOptions;
106
- }
107
- getTodayDate() {
108
- return startOfDay(this.todayDate ?? new Date());
109
- }
110
- constructor(locale, elementRef, cdr, translations) {
111
- this.elementRef = elementRef;
112
- this.cdr = cdr;
113
- this.translations = translations;
114
- this.dateChange = new EventEmitter();
115
- this.dateSelect = new EventEmitter();
116
- this.yearSelect = new EventEmitter();
117
- this.previousMonthClicked = new EventEmitter();
118
- this.nextMonthClicked = new EventEmitter();
119
- this.timezone = 'local';
120
- this.disableWeekends = false;
121
- this.disablePastDates = false;
122
- this.disableFutureDates = false;
123
- this.alwaysEnableToday = false;
124
- this.customLocales = {};
125
- this._tableMonthId = UniqueIdGenerator.scopedTo('kirby-calendar-month').next();
126
- this._disabledDates = [];
127
- this._enabledDates = [];
128
- this.includedLocales = { da, de, enGB, enUS };
129
- this.locale = this.mapLocale(locale);
130
- this.timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
131
- }
132
- formatWithLocale(date, formatString) {
133
- return format(date, formatString, {
134
- locale: this.locale,
135
- });
136
- }
137
- mapLocale(locale) {
138
- if (locale === 'en') {
139
- locale = 'enGB'; // if english locale is provided without region, we default to GB
140
- }
141
- locale = locale.replace('-', '');
142
- const availableLocales = { ...this.includedLocales, ...this.locales, ...this.customLocales };
143
- return availableLocales[locale] || this.includedLocales.enGB; // Default to enGB if injected locale doesnt exist
144
- }
145
- formatDateLabel() {
146
- const localeDateFormats = {
147
- da: 'd. MMMM',
148
- de: 'd. MMMM',
149
- 'en-GB': 'd MMMM',
150
- 'en-US': 'MMMM d',
151
- };
152
- const defaultDateFormat = localeDateFormats['en-US'];
153
- const dateFormat = localeDateFormats[this.locale.code] || defaultDateFormat;
154
- return dateFormat;
155
- }
156
- ngOnInit() {
157
- this.focussedDate = this.getTodayDate();
158
- this._weekDays = this.getWeekDays();
159
- this.setActiveMonth(this.selectedDate);
160
- }
161
- ngOnChanges(changes) {
162
- if (!this.activeMonth)
163
- return;
164
- if (changes.disableWeekends ||
165
- changes.disablePastDates ||
166
- changes.disableFutureDates ||
167
- changes.disabledDates ||
168
- changes.enabledDates ||
169
- changes.minDate ||
170
- changes.maxDate ||
171
- changes.todayDate ||
172
- changes.timezone) {
173
- this.refreshActiveMonth();
174
- }
175
- }
176
- setActiveMonth(date = new Date()) {
177
- if (!this.activeMonth || !isSameMonth(this.activeMonth, date)) {
178
- this.activeMonth = startOfMonth(date);
179
- this.refreshActiveMonth();
180
- }
181
- }
182
- // For leniency, the component will accept any Date that points to either UTC midnight
183
- // or to local timezone midnight although we will internally normalize the representation
184
- // of all received dates to point to local timezone midnight.
185
- // We currently log no warnings if the date doesn't match the timezone setting or
186
- // if it doesn't point to midnight.
187
- normalizeDate(dateLocalOrUTC) {
188
- if (!dateLocalOrUTC)
189
- return;
190
- if (startOfDay(dateLocalOrUTC).getTime() === dateLocalOrUTC.getTime()) {
191
- // date is local timezone midnight
192
- return dateLocalOrUTC;
193
- }
194
- if (startOfDay(toZonedTime(dateLocalOrUTC, this.timeZoneName)).getTime() ===
195
- toZonedTime(dateLocalOrUTC, this.timeZoneName).getTime()) {
196
- // the date is a UTC midnight; create the equivalent local timezone midnight date
197
- const normalizedUTCdate = toZonedTime(dateLocalOrUTC, this.timeZoneName);
198
- return normalizedUTCdate;
199
- }
200
- // does not point to midnight so we make it
201
- return startOfDay(dateLocalOrUTC);
202
- }
203
- getWeekDays() {
204
- const now = new Date();
205
- const week = eachDayOfInterval({
206
- start: startOfWeek(now, { locale: this.locale }),
207
- end: endOfWeek(now, { locale: this.locale }),
208
- });
209
- const weekdayNarrowFormat = 'EEEEE';
210
- const weekdayWideFormat = 'EEEE';
211
- return week.map((date) => ({
212
- firstLetterCapitalized: this.formatWithLocale(date, weekdayNarrowFormat),
213
- fullName: this.formatWithLocale(date, weekdayWideFormat),
214
- }));
215
- }
216
- hasDateChanged(newDate, previousDate) {
217
- if (!newDate && !previousDate) {
218
- return false;
219
- }
220
- if (newDate instanceof Date && !previousDate) {
221
- return true;
222
- }
223
- return !isSameDay(newDate, previousDate);
224
- }
225
- isDisabledDate(date) {
226
- return this.disabledDates.some((disabledDate) => isSameDay(disabledDate, date));
227
- }
228
- isEnabledDate(date) {
229
- return (this._enabledDates.length === 0 ||
230
- this.enabledDates.some((enabledDate) => isSameDay(enabledDate, date)));
231
- }
232
- refreshActiveMonth() {
233
- if (!this.activeMonth)
234
- return;
235
- const monthStart = startOfMonth(this.activeMonth);
236
- const startOfFirstWeek = startOfWeek(monthStart, { locale: this.locale });
237
- const totalNumberOfDays = 42; // Always show 42 days (6 weeks) in calendar
238
- const daysArray = Array.from(Array(totalNumberOfDays).keys());
239
- const today = this.getTodayDate();
240
- const calendarDays = daysArray.map((number) => {
241
- const dateOfCalendarDay = add(startOfFirstWeek, { [TimeUnit.days]: number });
242
- const calendarDay = {
243
- date: dateOfCalendarDay.getDate(),
244
- monthIndex: dateOfCalendarDay.getMonth(),
245
- year: dateOfCalendarDay.getFullYear(),
246
- ariaLabel: this.formatWithLocale(dateOfCalendarDay, this.formatDateLabel()),
247
- ...this.getCalendarDayMetadata(dateOfCalendarDay, today, monthStart),
248
- };
249
- if (calendarDay.isSelected) {
250
- this.selectedDay = calendarDay;
251
- }
252
- if (calendarDay.isFocussed) {
253
- this.focussedDay = calendarDay;
254
- }
255
- return calendarDay;
256
- });
257
- this._month = this.chunk(calendarDays, 7);
258
- }
259
- getCalendarDayMetadata(date, today, monthStart) {
260
- return {
261
- isToday: isSameDay(today, date),
262
- isPast: isBefore(date, today),
263
- isFuture: isAfter(date, today),
264
- isWeekend: isWeekend(date),
265
- isCurrentMonth: isSameMonth(date, monthStart),
266
- isSelectable: this.isSelectable(date, today),
267
- isFocusable: this.isWithinAllowedRange(date, today),
268
- isSelected: isSameDay(this.selectedDate, date),
269
- isFocussed: isSameDay(this.focussedDate, date),
270
- };
271
- }
272
- isSelectable(date, today) {
273
- if (this.alwaysEnableToday && isSameDay(today, date))
274
- return true;
275
- if (!this.isWithinAllowedRange(date, today))
276
- return false;
277
- if (this.isDisabledDate(date))
278
- return false;
279
- if (!this.isEnabledDate(date))
280
- return false;
281
- if (this.disableWeekends && isWeekend(date))
282
- return false;
283
- return true;
284
- }
285
- isWithinAllowedRange(date, today) {
286
- if (this.disablePastDates && isBefore(date, today))
287
- return false;
288
- if (this.disableFutureDates && isAfter(date, today))
289
- return false;
290
- if (this.minDate && isBefore(date, this.minDate))
291
- return false;
292
- if (this.maxDate && isAfter(date, this.maxDate))
293
- return false;
294
- return true;
295
- }
296
- chunk(array, size) {
297
- const results = [];
298
- while (array.length) {
299
- results.push(array.splice(0, size));
300
- }
301
- return results;
302
- }
303
- onSelectedDateChange(newDate) {
304
- if (this.selectedDay) {
305
- this.selectedDay.isSelected = false;
306
- }
307
- const newDay = this.getDay(newDate);
308
- if (newDay) {
309
- newDay.isSelected = true;
310
- this.selectedDay = newDay;
311
- }
312
- }
313
- _onDateSelected(newDay) {
314
- if (!newDay.isSelectable)
315
- return;
316
- let newDate = new Date(newDay.year, newDay.monthIndex, newDay.date);
317
- if (this.timezone === 'UTC') {
318
- newDate = fromZonedTime(this.subtractTimezoneOffset(newDate), this.timeZoneName);
319
- }
320
- const dateToEmit = newDate;
321
- if (this.hasDateChanged(newDate, this._selectedDate)) {
322
- this.setActiveMonth(newDate);
323
- this.onSelectedDateChange(newDate);
324
- this.selectedDate = newDate;
325
- this.dateChange.emit(dateToEmit);
326
- }
327
- this.dateSelect.emit(dateToEmit);
328
- }
329
- _changeMonth(index) {
330
- if (index > 0 && !this._canNavigateForward)
331
- return;
332
- if (index < 0 && !this._canNavigateBack)
333
- return;
334
- this.changeActiveView(index, TimeUnit.months);
335
- index > 0
336
- ? this.nextMonthClicked.emit(this.activeMonth)
337
- : this.previousMonthClicked.emit(this.activeMonth);
338
- }
339
- _changeYear(year) {
340
- const yearNumeric = Number(year);
341
- this.changeActiveView(yearNumeric - getYear(this.activeMonth), TimeUnit.years);
342
- this.yearSelect.emit(yearNumeric);
343
- }
344
- changeActiveView(index, unit) {
345
- if (index === 0)
346
- return;
347
- this.activeMonth = add(this.activeMonth, { [unit]: index });
348
- this.focussedDate = add(this.focussedDate, { [unit]: index });
349
- this.refreshActiveMonth();
350
- }
351
- get _canNavigateBack() {
352
- const today = this.getTodayDate();
353
- const reachedPastDatesLimit = this.disablePastDates && isSameMonth(this.activeMonth, today);
354
- const reachedOrExceededMinDate = this.minDate &&
355
- (isSameMonth(this.activeMonth, this.minDate) || isBefore(this.activeMonth, this.minDate));
356
- return !reachedPastDatesLimit && !reachedOrExceededMinDate;
357
- }
358
- get _canNavigateForward() {
359
- const today = this.getTodayDate();
360
- const reachedFutureDatesLimit = this.disableFutureDates && isSameMonth(this.activeMonth, today);
361
- const reachedOrExceededMaxDate = this.maxDate &&
362
- (isSameMonth(this.activeMonth, this.maxDate) || isAfter(this.activeMonth, this.maxDate));
363
- return !reachedFutureDatesLimit && !reachedOrExceededMaxDate;
364
- }
365
- getDay(date) {
366
- let foundDay = null;
367
- if (date) {
368
- for (const week of this._month) {
369
- foundDay = week.find((day) => {
370
- return day.isCurrentMonth && day.date === date.getDate();
371
- });
372
- if (foundDay) {
373
- break;
374
- }
375
- }
376
- }
377
- return foundDay;
378
- }
379
- subtractTimezoneOffset(date) {
380
- const timezoneOffsetInMs = date.getTimezoneOffset() * 60 * 1000;
381
- return new Date(date.getTime() - timezoneOffsetInMs);
382
- }
383
- getDateFromNavigableYear(navigableYear) {
384
- if (navigableYear instanceof Date)
385
- return navigableYear;
386
- const today = this.todayDate || new Date();
387
- return new Date(today.getFullYear() + navigableYear, 0, 1);
388
- }
389
- getYearsBetweenDates(startDate, endDate) {
390
- // Ensure years are ordered correctly if parameters are switched:
391
- const [startYear, endYear] = [startDate.getFullYear(), endDate.getFullYear()].sort();
392
- const numberOfYears = endYear - startYear;
393
- return Array.from({ length: numberOfYears + 1 }, (_, i) => (startYear + i).toString());
394
- }
395
- setFocussedDay(newDate) {
396
- const newDay = this.getDay(newDate);
397
- if (!newDay)
398
- return;
399
- if (this.focussedDay) {
400
- this.focussedDay.isFocussed = false;
401
- }
402
- newDay.isFocussed = true;
403
- this.focussedDay = newDay;
404
- }
405
- focusDate(newDate) {
406
- if (!newDate)
407
- return;
408
- newDate = this.normalizeDate(newDate);
409
- if (this.timezone === 'UTC') {
410
- newDate = fromZonedTime(this.subtractTimezoneOffset(newDate), this.timeZoneName);
411
- }
412
- const today = this.getTodayDate();
413
- if (!this.isWithinAllowedRange(newDate, today))
414
- return;
415
- if (!this.hasDateChanged(newDate, this.focussedDate))
416
- return;
417
- this.setActiveMonth(newDate);
418
- this.setFocussedDay(newDate);
419
- this.focussedDate = newDate;
420
- this.cdr.detectChanges(); //sync focussed class to template before setting focus
421
- const elementMarkedForFocus = this.elementRef.nativeElement.querySelector('.focussed');
422
- elementMarkedForFocus.focus();
423
- }
424
- _onDateKeydown(event) {
425
- const { key, shiftKey } = event;
426
- let newDate;
427
- switch (key) {
428
- case 'ArrowUp':
429
- newDate = add(this.focussedDate, { days: -7 });
430
- break;
431
- case 'ArrowDown':
432
- newDate = add(this.focussedDate, { days: 7 });
433
- break;
434
- case 'ArrowRight':
435
- newDate = add(this.focussedDate, { days: 1 });
436
- break;
437
- case 'ArrowLeft':
438
- newDate = add(this.focussedDate, { days: -1 });
439
- break;
440
- case 'Home':
441
- newDate = startOfWeek(this.focussedDate, { locale: this.locale });
442
- break;
443
- case 'End':
444
- newDate = lastDayOfWeek(this.focussedDate, { locale: this.locale });
445
- break;
446
- case 'PageUp':
447
- newDate = shiftKey
448
- ? add(this.focussedDate, { years: -1 })
449
- : add(this.focussedDate, { months: -1 });
450
- break;
451
- case 'PageDown':
452
- newDate = shiftKey
453
- ? add(this.focussedDate, { years: 1 })
454
- : add(this.focussedDate, { months: 1 });
455
- break;
456
- default:
457
- return;
458
- }
459
- event.preventDefault();
460
- this.focusDate(newDate);
461
- }
462
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: CalendarComponent, deps: [{ token: LOCALE_ID }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
463
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: CalendarComponent, isStandalone: true, selector: "kirby-calendar", inputs: { timezone: "timezone", disableWeekends: "disableWeekends", disablePastDates: "disablePastDates", disableFutureDates: "disableFutureDates", alwaysEnableToday: "alwaysEnableToday", locales: "locales", customLocales: "customLocales", usePopover: "usePopover", yearNavigatorOptions: "yearNavigatorOptions", selectedDate: "selectedDate", disabledDates: "disabledDates", enabledDates: "enabledDates", todayDate: "todayDate", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateChange: "dateChange", dateSelect: "dateSelect", yearSelect: "yearSelect", previousMonthClicked: "previousMonthClicked", nextMonthClicked: "nextMonthClicked" }, host: { properties: { "class.has-year-navigator": "this._hasYearNavigator" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('previousMonth')\"\n [attr.aria-disabled]=\"_canNavigateBack ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(-1)\"\n >\n <kirby-icon name=\"arrow-back\" aria-hidden=\"true\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\" [id]=\"_tableMonthId\" aria-live=\"polite\" aria-atomic=\"true\">\n <span class=\"month\">{{ activeMonthName }}</span>\n @if (!_hasYearNavigator) {\n <span class=\"year\">{{ activeYear }}</span>\n }\n </div>\n\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('nextMonth')\"\n [attr.aria-disabled]=\"_canNavigateForward ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(1)\"\n >\n <kirby-icon name=\"arrow-more\" aria-hidden=\"true\"></kirby-icon>\n </button>\n </div>\n @if (_hasYearNavigator) {\n <kirby-dropdown\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n }\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n @for (weekDay of _weekDays; track weekDay.fullName) {\n <th scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"kirby-visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (week of _month; track $index) {\n <tr>\n @for (day of week; track day.date + '-' + day.monthIndex + '-' + day.year) {\n <td [attr.aria-selected]=\"day.isSelected ? true : false\">\n <button\n kirby-button\n type=\"button\"\n (click)=\"_onDateSelected(day)\"\n (keydown)=\"_onDateKeydown($event)\"\n class=\"day\"\n [class.current-month]=\"day.isCurrentMonth\"\n [class.weekend]=\"day.isWeekend\"\n [class.today]=\"day.isToday\"\n [class.selectable]=\"day.isSelectable\"\n [class.selected]=\"day.isSelected\"\n [class.focussed]=\"day.isFocussed\"\n [class.past]=\"day.isPast\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-disabled]=\"day.isSelectable ? null : true\"\n [noDecoration]=\"true\"\n [disabled]=\"day.isFocusable ? null : true\"\n [tabIndex]=\"day.isFocussed ? 0 : -1\"\n >\n {{ day.date }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", styles: [":host{font-size:var(--kirby-font-size-n)}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:var(--kirby-spacing-xxs)}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:var(--kirby-spacing-xxs)}th:last-child,td:last-child{padding-right:var(--kirby-spacing-xxs)}th{height:50px;border-bottom:1px solid var(--kirby-background-color)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:var(--kirby-spacing-xxs);margin-bottom:0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-and-year{-webkit-user-select:none;user-select:none;font-weight:var(--kirby-font-weight-bold)}.month-and-year .month{margin-right:var(--kirby-spacing-xxs)}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 var(--kirby-spacing-xxs);text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:calc(var(--kirby-spacing-xl) * .5);min-width:var(--kirby-spacing-xl);min-height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);height:var(--kirby-spacing-xl);margin:var(--kirby-spacing-xxxs) 0;font-size:var(--kirby-font-size-n)}.day:focus{z-index:var(--kirby-z-index-default)}button[aria-disabled=true]{color:#b4b4b4}.day.selectable:not(.current-month,.selected){color:var(--kirby-text-color-semi-dark)}.day.today{border:1px solid var(--kirby-semi-dark)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}\n"], dependencies: [{ kind: "component", type: DropdownComponent, selector: "kirby-dropdown", inputs: ["items", "selectedIndex", "focusedIndex", "itemTextProperty", "placeholder", "popout", "attentionLevel", "expand", "disabled", "hasError", "size", "tabindex", "usePopover"], outputs: ["hasErrorChange", "change"] }, { kind: "component", type: ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "component", type: IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
464
- }
465
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: CalendarComponent, decorators: [{
466
- type: Component,
467
- args: [{ imports: [DropdownComponent, ButtonComponent, IconComponent], selector: 'kirby-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('previousMonth')\"\n [attr.aria-disabled]=\"_canNavigateBack ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(-1)\"\n >\n <kirby-icon name=\"arrow-back\" aria-hidden=\"true\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\" [id]=\"_tableMonthId\" aria-live=\"polite\" aria-atomic=\"true\">\n <span class=\"month\">{{ activeMonthName }}</span>\n @if (!_hasYearNavigator) {\n <span class=\"year\">{{ activeYear }}</span>\n }\n </div>\n\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('nextMonth')\"\n [attr.aria-disabled]=\"_canNavigateForward ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(1)\"\n >\n <kirby-icon name=\"arrow-more\" aria-hidden=\"true\"></kirby-icon>\n </button>\n </div>\n @if (_hasYearNavigator) {\n <kirby-dropdown\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n }\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n @for (weekDay of _weekDays; track weekDay.fullName) {\n <th scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"kirby-visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (week of _month; track $index) {\n <tr>\n @for (day of week; track day.date + '-' + day.monthIndex + '-' + day.year) {\n <td [attr.aria-selected]=\"day.isSelected ? true : false\">\n <button\n kirby-button\n type=\"button\"\n (click)=\"_onDateSelected(day)\"\n (keydown)=\"_onDateKeydown($event)\"\n class=\"day\"\n [class.current-month]=\"day.isCurrentMonth\"\n [class.weekend]=\"day.isWeekend\"\n [class.today]=\"day.isToday\"\n [class.selectable]=\"day.isSelectable\"\n [class.selected]=\"day.isSelected\"\n [class.focussed]=\"day.isFocussed\"\n [class.past]=\"day.isPast\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-disabled]=\"day.isSelectable ? null : true\"\n [noDecoration]=\"true\"\n [disabled]=\"day.isFocusable ? null : true\"\n [tabIndex]=\"day.isFocussed ? 0 : -1\"\n >\n {{ day.date }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", styles: [":host{font-size:var(--kirby-font-size-n)}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:var(--kirby-spacing-xxs)}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:var(--kirby-spacing-xxs)}th:last-child,td:last-child{padding-right:var(--kirby-spacing-xxs)}th{height:50px;border-bottom:1px solid var(--kirby-background-color)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:var(--kirby-spacing-xxs);margin-bottom:0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-and-year{-webkit-user-select:none;user-select:none;font-weight:var(--kirby-font-weight-bold)}.month-and-year .month{margin-right:var(--kirby-spacing-xxs)}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 var(--kirby-spacing-xxs);text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:calc(var(--kirby-spacing-xl) * .5);min-width:var(--kirby-spacing-xl);min-height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);height:var(--kirby-spacing-xl);margin:var(--kirby-spacing-xxxs) 0;font-size:var(--kirby-font-size-n)}.day:focus{z-index:var(--kirby-z-index-default)}button[aria-disabled=true]{color:#b4b4b4}.day.selectable:not(.current-month,.selected){color:var(--kirby-text-color-semi-dark)}.day.today{border:1px solid var(--kirby-semi-dark)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}\n"] }]
468
- }], ctorParameters: () => [{ type: undefined, decorators: [{
469
- type: Inject,
470
- args: [LOCALE_ID]
471
- }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.TranslationService }], propDecorators: { dateChange: [{
472
- type: Output
473
- }], dateSelect: [{
474
- type: Output
475
- }], yearSelect: [{
476
- type: Output
477
- }], previousMonthClicked: [{
478
- type: Output
479
- }], nextMonthClicked: [{
480
- type: Output
481
- }], timezone: [{
482
- type: Input
483
- }], disableWeekends: [{
484
- type: Input
485
- }], disablePastDates: [{
486
- type: Input
487
- }], disableFutureDates: [{
488
- type: Input
489
- }], alwaysEnableToday: [{
490
- type: Input
491
- }], locales: [{
492
- type: Input
493
- }], customLocales: [{
494
- type: Input
495
- }], usePopover: [{
496
- type: Input
497
- }], yearNavigatorOptions: [{
498
- type: Input
499
- }], selectedDate: [{
500
- type: Input
501
- }], disabledDates: [{
502
- type: Input
503
- }], enabledDates: [{
504
- type: Input
505
- }], todayDate: [{
506
- type: Input
507
- }], minDate: [{
508
- type: Input
509
- }], maxDate: [{
510
- type: Input
511
- }], _hasYearNavigator: [{
512
- type: HostBinding,
513
- args: ['class.has-year-navigator']
514
- }] } });
515
-
516
- /**
517
- * Generated bundle index. Do not edit.
518
- */
519
-
31
+ }
32
+ get selectedDate() {
33
+ return this._selectedDate;
34
+ }
35
+ set selectedDate(valueLocalOrUTC) {
36
+ const value = this.normalizeDate(valueLocalOrUTC);
37
+ if (valueLocalOrUTC) this.setActiveMonth(value);
38
+ if (this.hasDateChanged(value, this._selectedDate)) {
39
+ this.onSelectedDateChange(value);
40
+ this.focusDate(value);
41
+ this._selectedDate = value;
42
+ }
43
+ }
44
+ get disabledDates() {
45
+ return this._disabledDates;
46
+ }
47
+ set disabledDates(value) {
48
+ this._disabledDates = (value || []).map((date) => this.normalizeDate(date));
49
+ }
50
+ get enabledDates() {
51
+ return this._enabledDates;
52
+ }
53
+ set enabledDates(value) {
54
+ this._enabledDates = (value || []).map((date) => this.normalizeDate(date));
55
+ }
56
+ get todayDate() {
57
+ return this._todayDate;
58
+ }
59
+ set todayDate(value) {
60
+ this._todayDate = this.normalizeDate(value);
61
+ }
62
+ get minDate() {
63
+ return this._minDate;
64
+ }
65
+ set minDate(value) {
66
+ if (value && this.activeMonth && isBefore(this.activeMonth, value)) this.setActiveMonth(value);
67
+ this._minDate = this.normalizeDate(value);
68
+ }
69
+ get maxDate() {
70
+ return this._maxDate;
71
+ }
72
+ set maxDate(value) {
73
+ if (value && this.activeMonth && isAfter(this.activeMonth, value)) this.setActiveMonth(value);
74
+ this._maxDate = this.normalizeDate(value);
75
+ }
76
+ get activeMonthName() {
77
+ return capitalizeFirstLetter(this.formatWithLocale(this.activeMonth, "MMMM"));
78
+ }
79
+ get activeYear() {
80
+ return this.formatWithLocale(this.activeMonth, "yyyy");
81
+ }
82
+ get navigableYears() {
83
+ const dateOfFirstNavigableYear = this.minDate || this.getDateFromNavigableYear(this.yearNavigatorOptions.from);
84
+ const dateOfLastNavigableYear = this.maxDate || this.getDateFromNavigableYear(this.yearNavigatorOptions.to);
85
+ return this.getYearsBetweenDates(dateOfFirstNavigableYear, dateOfLastNavigableYear);
86
+ }
87
+ get navigatedYear() {
88
+ return this.navigableYears.indexOf(this.activeYear);
89
+ }
90
+ get _hasYearNavigator() {
91
+ return !!this.yearNavigatorOptions;
92
+ }
93
+ getTodayDate() {
94
+ return startOfDay(this.todayDate ?? /* @__PURE__ */ new Date());
95
+ }
96
+ constructor(locale, elementRef, cdr, translations) {
97
+ this.elementRef = elementRef;
98
+ this.cdr = cdr;
99
+ this.translations = translations;
100
+ this.dateChange = new EventEmitter();
101
+ this.dateSelect = new EventEmitter();
102
+ this.yearSelect = new EventEmitter();
103
+ this.previousMonthClicked = new EventEmitter();
104
+ this.nextMonthClicked = new EventEmitter();
105
+ this.timezone = "local";
106
+ this.disableWeekends = false;
107
+ this.disablePastDates = false;
108
+ this.disableFutureDates = false;
109
+ this.alwaysEnableToday = false;
110
+ this.customLocales = {};
111
+ this._tableMonthId = UniqueIdGenerator.scopedTo("kirby-calendar-month").next();
112
+ this._disabledDates = [];
113
+ this._enabledDates = [];
114
+ this.includedLocales = {
115
+ da,
116
+ de,
117
+ enGB,
118
+ enUS
119
+ };
120
+ this.locale = this.mapLocale(locale);
121
+ this.timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
122
+ }
123
+ formatWithLocale(date, formatString) {
124
+ return format(date, formatString, { locale: this.locale });
125
+ }
126
+ mapLocale(locale) {
127
+ if (locale === "en") locale = "enGB";
128
+ locale = locale.replace("-", "");
129
+ return {
130
+ ...this.includedLocales,
131
+ ...this.locales,
132
+ ...this.customLocales
133
+ }[locale] || this.includedLocales.enGB;
134
+ }
135
+ formatDateLabel() {
136
+ const localeDateFormats = {
137
+ da: "d. MMMM",
138
+ de: "d. MMMM",
139
+ "en-GB": "d MMMM",
140
+ "en-US": "MMMM d"
141
+ };
142
+ const defaultDateFormat = localeDateFormats["en-US"];
143
+ return localeDateFormats[this.locale.code] || defaultDateFormat;
144
+ }
145
+ ngOnInit() {
146
+ this.focussedDate = this.getTodayDate();
147
+ this._weekDays = this.getWeekDays();
148
+ this.setActiveMonth(this.selectedDate);
149
+ }
150
+ ngOnChanges(changes) {
151
+ if (!this.activeMonth) return;
152
+ if (changes.disableWeekends || changes.disablePastDates || changes.disableFutureDates || changes.disabledDates || changes.enabledDates || changes.minDate || changes.maxDate || changes.todayDate || changes.timezone) this.refreshActiveMonth();
153
+ }
154
+ setActiveMonth(date = /* @__PURE__ */ new Date()) {
155
+ if (!this.activeMonth || !isSameMonth(this.activeMonth, date)) {
156
+ this.activeMonth = startOfMonth(date);
157
+ this.refreshActiveMonth();
158
+ }
159
+ }
160
+ normalizeDate(dateLocalOrUTC) {
161
+ if (!dateLocalOrUTC) return;
162
+ if (startOfDay(dateLocalOrUTC).getTime() === dateLocalOrUTC.getTime()) return dateLocalOrUTC;
163
+ if (startOfDay(toZonedTime(dateLocalOrUTC, this.timeZoneName)).getTime() === toZonedTime(dateLocalOrUTC, this.timeZoneName).getTime()) return toZonedTime(dateLocalOrUTC, this.timeZoneName);
164
+ return startOfDay(dateLocalOrUTC);
165
+ }
166
+ getWeekDays() {
167
+ const now = /* @__PURE__ */ new Date();
168
+ const week = eachDayOfInterval({
169
+ start: startOfWeek(now, { locale: this.locale }),
170
+ end: endOfWeek(now, { locale: this.locale })
171
+ });
172
+ const weekdayNarrowFormat = "EEEEE";
173
+ const weekdayWideFormat = "EEEE";
174
+ return week.map((date) => ({
175
+ firstLetterCapitalized: this.formatWithLocale(date, weekdayNarrowFormat),
176
+ fullName: this.formatWithLocale(date, weekdayWideFormat)
177
+ }));
178
+ }
179
+ hasDateChanged(newDate, previousDate) {
180
+ if (!newDate && !previousDate) return false;
181
+ if (newDate instanceof Date && !previousDate) return true;
182
+ return !isSameDay(newDate, previousDate);
183
+ }
184
+ isDisabledDate(date) {
185
+ return this.disabledDates.some((disabledDate) => isSameDay(disabledDate, date));
186
+ }
187
+ isEnabledDate(date) {
188
+ return this._enabledDates.length === 0 || this.enabledDates.some((enabledDate) => isSameDay(enabledDate, date));
189
+ }
190
+ refreshActiveMonth() {
191
+ if (!this.activeMonth) return;
192
+ const monthStart = startOfMonth(this.activeMonth);
193
+ const startOfFirstWeek = startOfWeek(monthStart, { locale: this.locale });
194
+ const daysArray = Array.from(Array(42).keys());
195
+ const today = this.getTodayDate();
196
+ const calendarDays = daysArray.map((number) => {
197
+ const dateOfCalendarDay = add(startOfFirstWeek, { [TimeUnit.days]: number });
198
+ const calendarDay = {
199
+ date: dateOfCalendarDay.getDate(),
200
+ monthIndex: dateOfCalendarDay.getMonth(),
201
+ year: dateOfCalendarDay.getFullYear(),
202
+ ariaLabel: this.formatWithLocale(dateOfCalendarDay, this.formatDateLabel()),
203
+ ...this.getCalendarDayMetadata(dateOfCalendarDay, today, monthStart)
204
+ };
205
+ if (calendarDay.isSelected) this.selectedDay = calendarDay;
206
+ if (calendarDay.isFocussed) this.focussedDay = calendarDay;
207
+ return calendarDay;
208
+ });
209
+ this._month = this.chunk(calendarDays, 7);
210
+ }
211
+ getCalendarDayMetadata(date, today, monthStart) {
212
+ return {
213
+ isToday: isSameDay(today, date),
214
+ isPast: isBefore(date, today),
215
+ isFuture: isAfter(date, today),
216
+ isWeekend: isWeekend(date),
217
+ isCurrentMonth: isSameMonth(date, monthStart),
218
+ isSelectable: this.isSelectable(date, today),
219
+ isFocusable: this.isWithinAllowedRange(date, today),
220
+ isSelected: isSameDay(this.selectedDate, date),
221
+ isFocussed: isSameDay(this.focussedDate, date)
222
+ };
223
+ }
224
+ isSelectable(date, today) {
225
+ if (this.alwaysEnableToday && isSameDay(today, date)) return true;
226
+ if (!this.isWithinAllowedRange(date, today)) return false;
227
+ if (this.isDisabledDate(date)) return false;
228
+ if (!this.isEnabledDate(date)) return false;
229
+ if (this.disableWeekends && isWeekend(date)) return false;
230
+ return true;
231
+ }
232
+ isWithinAllowedRange(date, today) {
233
+ if (this.disablePastDates && isBefore(date, today)) return false;
234
+ if (this.disableFutureDates && isAfter(date, today)) return false;
235
+ if (this.minDate && isBefore(date, this.minDate)) return false;
236
+ if (this.maxDate && isAfter(date, this.maxDate)) return false;
237
+ return true;
238
+ }
239
+ chunk(array, size) {
240
+ const results = [];
241
+ while (array.length) results.push(array.splice(0, size));
242
+ return results;
243
+ }
244
+ onSelectedDateChange(newDate) {
245
+ if (this.selectedDay) this.selectedDay.isSelected = false;
246
+ const newDay = this.getDay(newDate);
247
+ if (newDay) {
248
+ newDay.isSelected = true;
249
+ this.selectedDay = newDay;
250
+ }
251
+ }
252
+ _onDateSelected(newDay) {
253
+ if (!newDay.isSelectable) return;
254
+ let newDate = new Date(newDay.year, newDay.monthIndex, newDay.date);
255
+ if (this.timezone === "UTC") newDate = fromZonedTime(this.subtractTimezoneOffset(newDate), this.timeZoneName);
256
+ const dateToEmit = newDate;
257
+ if (this.hasDateChanged(newDate, this._selectedDate)) {
258
+ this.setActiveMonth(newDate);
259
+ this.onSelectedDateChange(newDate);
260
+ this.selectedDate = newDate;
261
+ this.dateChange.emit(dateToEmit);
262
+ }
263
+ this.dateSelect.emit(dateToEmit);
264
+ }
265
+ _changeMonth(index) {
266
+ if (index > 0 && !this._canNavigateForward) return;
267
+ if (index < 0 && !this._canNavigateBack) return;
268
+ this.changeActiveView(index, TimeUnit.months);
269
+ index > 0 ? this.nextMonthClicked.emit(this.activeMonth) : this.previousMonthClicked.emit(this.activeMonth);
270
+ }
271
+ _changeYear(year) {
272
+ const yearNumeric = Number(year);
273
+ this.changeActiveView(yearNumeric - getYear(this.activeMonth), TimeUnit.years);
274
+ this.yearSelect.emit(yearNumeric);
275
+ }
276
+ changeActiveView(index, unit) {
277
+ if (index === 0) return;
278
+ this.activeMonth = add(this.activeMonth, { [unit]: index });
279
+ this.focussedDate = add(this.focussedDate, { [unit]: index });
280
+ this.refreshActiveMonth();
281
+ }
282
+ get _canNavigateBack() {
283
+ const today = this.getTodayDate();
284
+ const reachedPastDatesLimit = this.disablePastDates && isSameMonth(this.activeMonth, today);
285
+ const reachedOrExceededMinDate = this.minDate && (isSameMonth(this.activeMonth, this.minDate) || isBefore(this.activeMonth, this.minDate));
286
+ return !reachedPastDatesLimit && !reachedOrExceededMinDate;
287
+ }
288
+ get _canNavigateForward() {
289
+ const today = this.getTodayDate();
290
+ const reachedFutureDatesLimit = this.disableFutureDates && isSameMonth(this.activeMonth, today);
291
+ const reachedOrExceededMaxDate = this.maxDate && (isSameMonth(this.activeMonth, this.maxDate) || isAfter(this.activeMonth, this.maxDate));
292
+ return !reachedFutureDatesLimit && !reachedOrExceededMaxDate;
293
+ }
294
+ getDay(date) {
295
+ let foundDay = null;
296
+ if (date) for (const week of this._month) {
297
+ foundDay = week.find((day) => {
298
+ return day.isCurrentMonth && day.date === date.getDate();
299
+ });
300
+ if (foundDay) break;
301
+ }
302
+ return foundDay;
303
+ }
304
+ subtractTimezoneOffset(date) {
305
+ const timezoneOffsetInMs = date.getTimezoneOffset() * 60 * 1e3;
306
+ return new Date(date.getTime() - timezoneOffsetInMs);
307
+ }
308
+ getDateFromNavigableYear(navigableYear) {
309
+ if (navigableYear instanceof Date) return navigableYear;
310
+ const today = this.todayDate || /* @__PURE__ */ new Date();
311
+ return new Date(today.getFullYear() + navigableYear, 0, 1);
312
+ }
313
+ getYearsBetweenDates(startDate, endDate) {
314
+ const [startYear, endYear] = [startDate.getFullYear(), endDate.getFullYear()].sort();
315
+ const numberOfYears = endYear - startYear;
316
+ return Array.from({ length: numberOfYears + 1 }, (_, i) => (startYear + i).toString());
317
+ }
318
+ setFocussedDay(newDate) {
319
+ const newDay = this.getDay(newDate);
320
+ if (!newDay) return;
321
+ if (this.focussedDay) this.focussedDay.isFocussed = false;
322
+ newDay.isFocussed = true;
323
+ this.focussedDay = newDay;
324
+ }
325
+ focusDate(newDate) {
326
+ if (!newDate) return;
327
+ newDate = this.normalizeDate(newDate);
328
+ if (this.timezone === "UTC") newDate = fromZonedTime(this.subtractTimezoneOffset(newDate), this.timeZoneName);
329
+ const today = this.getTodayDate();
330
+ if (!this.isWithinAllowedRange(newDate, today)) return;
331
+ if (!this.hasDateChanged(newDate, this.focussedDate)) return;
332
+ this.setActiveMonth(newDate);
333
+ this.setFocussedDay(newDate);
334
+ this.focussedDate = newDate;
335
+ this.cdr.detectChanges();
336
+ this.elementRef.nativeElement.querySelector(".focussed").focus();
337
+ }
338
+ _onDateKeydown(event) {
339
+ const { key, shiftKey } = event;
340
+ let newDate;
341
+ switch (key) {
342
+ case "ArrowUp":
343
+ newDate = add(this.focussedDate, { days: -7 });
344
+ break;
345
+ case "ArrowDown":
346
+ newDate = add(this.focussedDate, { days: 7 });
347
+ break;
348
+ case "ArrowRight":
349
+ newDate = add(this.focussedDate, { days: 1 });
350
+ break;
351
+ case "ArrowLeft":
352
+ newDate = add(this.focussedDate, { days: -1 });
353
+ break;
354
+ case "Home":
355
+ newDate = startOfWeek(this.focussedDate, { locale: this.locale });
356
+ break;
357
+ case "End":
358
+ newDate = lastDayOfWeek(this.focussedDate, { locale: this.locale });
359
+ break;
360
+ case "PageUp":
361
+ newDate = shiftKey ? add(this.focussedDate, { years: -1 }) : add(this.focussedDate, { months: -1 });
362
+ break;
363
+ case "PageDown":
364
+ newDate = shiftKey ? add(this.focussedDate, { years: 1 }) : add(this.focussedDate, { months: 1 });
365
+ break;
366
+ default: return;
367
+ }
368
+ event.preventDefault();
369
+ this.focusDate(newDate);
370
+ }
371
+ static {
372
+ this.ɵfac = i0.ɵɵngDeclareFactory({
373
+ minVersion: "12.0.0",
374
+ version: "22.2.2",
375
+ ngImport: i0,
376
+ type: CalendarComponent,
377
+ deps: [
378
+ { token: LOCALE_ID },
379
+ { token: i0.ElementRef },
380
+ { token: i0.ChangeDetectorRef },
381
+ { token: i1.TranslationService }
382
+ ],
383
+ target: i0.ɵɵFactoryTarget.Component
384
+ });
385
+ }
386
+ static {
387
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
388
+ minVersion: "17.0.0",
389
+ version: "22.2.2",
390
+ type: CalendarComponent,
391
+ isStandalone: true,
392
+ selector: "kirby-calendar",
393
+ inputs: {
394
+ timezone: "timezone",
395
+ disableWeekends: "disableWeekends",
396
+ disablePastDates: "disablePastDates",
397
+ disableFutureDates: "disableFutureDates",
398
+ alwaysEnableToday: "alwaysEnableToday",
399
+ locales: "locales",
400
+ customLocales: "customLocales",
401
+ usePopover: "usePopover",
402
+ yearNavigatorOptions: "yearNavigatorOptions",
403
+ selectedDate: "selectedDate",
404
+ disabledDates: "disabledDates",
405
+ enabledDates: "enabledDates",
406
+ todayDate: "todayDate",
407
+ minDate: "minDate",
408
+ maxDate: "maxDate"
409
+ },
410
+ outputs: {
411
+ dateChange: "dateChange",
412
+ dateSelect: "dateSelect",
413
+ yearSelect: "yearSelect",
414
+ previousMonthClicked: "previousMonthClicked",
415
+ nextMonthClicked: "nextMonthClicked"
416
+ },
417
+ host: { properties: { "class.has-year-navigator": "this._hasYearNavigator" } },
418
+ usesOnChanges: true,
419
+ ngImport: i0,
420
+ template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('previousMonth')\"\n [attr.aria-disabled]=\"_canNavigateBack ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(-1)\"\n >\n <kirby-icon name=\"arrow-back\" aria-hidden=\"true\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\" [id]=\"_tableMonthId\" aria-live=\"polite\" aria-atomic=\"true\">\n <span class=\"month\">{{ activeMonthName }}</span>\n @if (!_hasYearNavigator) {\n <span class=\"year\">{{ activeYear }}</span>\n }\n </div>\n\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('nextMonth')\"\n [attr.aria-disabled]=\"_canNavigateForward ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(1)\"\n >\n <kirby-icon name=\"arrow-more\" aria-hidden=\"true\"></kirby-icon>\n </button>\n </div>\n @if (_hasYearNavigator) {\n <kirby-dropdown\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n }\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n @for (weekDay of _weekDays; track weekDay.fullName) {\n <th scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"kirby-visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (week of _month; track $index) {\n <tr>\n @for (day of week; track day.date + '-' + day.monthIndex + '-' + day.year) {\n <td [attr.aria-selected]=\"day.isSelected ? true : false\">\n <button\n kirby-button\n type=\"button\"\n (click)=\"_onDateSelected(day)\"\n (keydown)=\"_onDateKeydown($event)\"\n class=\"day\"\n [class.current-month]=\"day.isCurrentMonth\"\n [class.weekend]=\"day.isWeekend\"\n [class.today]=\"day.isToday\"\n [class.selectable]=\"day.isSelectable\"\n [class.selected]=\"day.isSelected\"\n [class.focussed]=\"day.isFocussed\"\n [class.past]=\"day.isPast\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-disabled]=\"day.isSelectable ? null : true\"\n [noDecoration]=\"day.isSelected ? false : true\"\n [attentionLevel]=\"day.isSelected ? '1' : null\"\n [disabled]=\"day.isFocusable ? null : true\"\n [tabIndex]=\"day.isFocussed ? 0 : -1\"\n >\n {{ day.date }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n",
421
+ styles: [":host{font-size:var(--kirby-font-size-n);color:var(--kirby-color-content-base)}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:var(--kirby-spacing-xxs)}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:var(--kirby-spacing-xxs)}th:last-child,td:last-child{padding-right:var(--kirby-spacing-xxs)}th{height:50px;border-bottom:1px solid var(--kirby-color-border-base-quiet)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:var(--kirby-spacing-xxs);margin-bottom:0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-and-year{-webkit-user-select:none;user-select:none;font-weight:var(--kirby-font-weight-bold)}.month-and-year .month{margin-right:var(--kirby-spacing-xxs)}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 var(--kirby-spacing-xxs);text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:calc(var(--kirby-spacing-xl) * .5);min-width:var(--kirby-spacing-xl);min-height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);height:var(--kirby-spacing-xl);margin:var(--kirby-spacing-xxxs) 0;font-size:var(--kirby-font-size-n);padding-inline:0}.day:focus{z-index:var(--kirby-z-index-default)}.day.selectable:not(.current-month,.selected){color:var(--kirby-color-content-base-quiet)}.day.today:not(.selected,:focus-visible){border:1px solid var(--kirby-color-border-base)}\n"],
422
+ dependencies: [
423
+ {
424
+ kind: "component",
425
+ type: DropdownComponent,
426
+ selector: "kirby-dropdown",
427
+ inputs: [
428
+ "items",
429
+ "selectedIndex",
430
+ "focusedIndex",
431
+ "itemTextProperty",
432
+ "placeholder",
433
+ "popout",
434
+ "attentionLevel",
435
+ "expand",
436
+ "disabled",
437
+ "hasError",
438
+ "size",
439
+ "tabindex",
440
+ "usePopover"
441
+ ],
442
+ outputs: ["hasErrorChange", "change"]
443
+ },
444
+ {
445
+ kind: "component",
446
+ type: ButtonComponent,
447
+ selector: "button[kirby-button],Button[kirby-button],a[kirby-button]",
448
+ inputs: [
449
+ "attentionLevel",
450
+ "noDecoration",
451
+ "themeColor",
452
+ "expand",
453
+ "isFloating",
454
+ "size",
455
+ "showIconOnly"
456
+ ]
457
+ },
458
+ {
459
+ kind: "component",
460
+ type: IconComponent,
461
+ selector: "kirby-icon",
462
+ inputs: ["size", "name"]
463
+ }
464
+ ],
465
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
466
+ });
467
+ }
468
+ };
469
+ i0.ɵɵngDeclareClassMetadata({
470
+ minVersion: "12.0.0",
471
+ version: "22.2.2",
472
+ ngImport: i0,
473
+ type: CalendarComponent,
474
+ decorators: [{
475
+ type: Component,
476
+ args: [{
477
+ imports: [
478
+ DropdownComponent,
479
+ ButtonComponent,
480
+ IconComponent
481
+ ],
482
+ selector: "kirby-calendar",
483
+ changeDetection: ChangeDetectionStrategy.OnPush,
484
+ template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('previousMonth')\"\n [attr.aria-disabled]=\"_canNavigateBack ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(-1)\"\n >\n <kirby-icon name=\"arrow-back\" aria-hidden=\"true\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\" [id]=\"_tableMonthId\" aria-live=\"polite\" aria-atomic=\"true\">\n <span class=\"month\">{{ activeMonthName }}</span>\n @if (!_hasYearNavigator) {\n <span class=\"year\">{{ activeYear }}</span>\n }\n </div>\n\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('nextMonth')\"\n [attr.aria-disabled]=\"_canNavigateForward ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(1)\"\n >\n <kirby-icon name=\"arrow-more\" aria-hidden=\"true\"></kirby-icon>\n </button>\n </div>\n @if (_hasYearNavigator) {\n <kirby-dropdown\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n }\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n @for (weekDay of _weekDays; track weekDay.fullName) {\n <th scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"kirby-visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (week of _month; track $index) {\n <tr>\n @for (day of week; track day.date + '-' + day.monthIndex + '-' + day.year) {\n <td [attr.aria-selected]=\"day.isSelected ? true : false\">\n <button\n kirby-button\n type=\"button\"\n (click)=\"_onDateSelected(day)\"\n (keydown)=\"_onDateKeydown($event)\"\n class=\"day\"\n [class.current-month]=\"day.isCurrentMonth\"\n [class.weekend]=\"day.isWeekend\"\n [class.today]=\"day.isToday\"\n [class.selectable]=\"day.isSelectable\"\n [class.selected]=\"day.isSelected\"\n [class.focussed]=\"day.isFocussed\"\n [class.past]=\"day.isPast\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-disabled]=\"day.isSelectable ? null : true\"\n [noDecoration]=\"day.isSelected ? false : true\"\n [attentionLevel]=\"day.isSelected ? '1' : null\"\n [disabled]=\"day.isFocusable ? null : true\"\n [tabIndex]=\"day.isFocussed ? 0 : -1\"\n >\n {{ day.date }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n",
485
+ styles: [":host{font-size:var(--kirby-font-size-n);color:var(--kirby-color-content-base)}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:var(--kirby-spacing-xxs)}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:var(--kirby-spacing-xxs)}th:last-child,td:last-child{padding-right:var(--kirby-spacing-xxs)}th{height:50px;border-bottom:1px solid var(--kirby-color-border-base-quiet)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:var(--kirby-spacing-xxs);margin-bottom:0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-and-year{-webkit-user-select:none;user-select:none;font-weight:var(--kirby-font-weight-bold)}.month-and-year .month{margin-right:var(--kirby-spacing-xxs)}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 var(--kirby-spacing-xxs);text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:calc(var(--kirby-spacing-xl) * .5);min-width:var(--kirby-spacing-xl);min-height:var(--kirby-spacing-xl);width:var(--kirby-spacing-xl);height:var(--kirby-spacing-xl);margin:var(--kirby-spacing-xxxs) 0;font-size:var(--kirby-font-size-n);padding-inline:0}.day:focus{z-index:var(--kirby-z-index-default)}.day.selectable:not(.current-month,.selected){color:var(--kirby-color-content-base-quiet)}.day.today:not(.selected,:focus-visible){border:1px solid var(--kirby-color-border-base)}\n"]
486
+ }]
487
+ }],
488
+ ctorParameters: () => [
489
+ {
490
+ type: void 0,
491
+ decorators: [{
492
+ type: Inject,
493
+ args: [LOCALE_ID]
494
+ }]
495
+ },
496
+ { type: i0.ElementRef },
497
+ { type: i0.ChangeDetectorRef },
498
+ { type: i1.TranslationService }
499
+ ],
500
+ propDecorators: {
501
+ dateChange: [{ type: Output }],
502
+ dateSelect: [{ type: Output }],
503
+ yearSelect: [{ type: Output }],
504
+ previousMonthClicked: [{ type: Output }],
505
+ nextMonthClicked: [{ type: Output }],
506
+ timezone: [{ type: Input }],
507
+ disableWeekends: [{ type: Input }],
508
+ disablePastDates: [{ type: Input }],
509
+ disableFutureDates: [{ type: Input }],
510
+ alwaysEnableToday: [{ type: Input }],
511
+ locales: [{ type: Input }],
512
+ customLocales: [{ type: Input }],
513
+ usePopover: [{ type: Input }],
514
+ yearNavigatorOptions: [{ type: Input }],
515
+ selectedDate: [{ type: Input }],
516
+ disabledDates: [{ type: Input }],
517
+ enabledDates: [{ type: Input }],
518
+ todayDate: [{ type: Input }],
519
+ minDate: [{ type: Input }],
520
+ maxDate: [{ type: Input }],
521
+ _hasYearNavigator: [{
522
+ type: HostBinding,
523
+ args: ["class.has-year-navigator"]
524
+ }]
525
+ }
526
+ });
520
527
  export { CalendarComponent };
521
- //# sourceMappingURL=kirbydesign-designsystem-calendar.mjs.map
528
+
529
+ //# sourceMappingURL=kirbydesign-designsystem-calendar.mjs.map