@kirbydesign/designsystem 10.1.2 → 10.2.0

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 (386) hide show
  1. package/avatar/avatar.component.d.ts +2 -1
  2. package/button/button.component.d.ts +1 -0
  3. package/calendar/calendar.component.d.ts +28 -18
  4. package/calendar/interfaces/calendar-day.d.ts +17 -0
  5. package/calendar/public_api.d.ts +1 -1
  6. package/chart/shared/chart-config-service/chart-config.service.d.ts +1 -1
  7. package/empty-state/empty-state.component.d.ts +10 -3
  8. package/esm2022/accordion/accordion-item.component.mjs +4 -4
  9. package/esm2022/accordion/accordion.directive.mjs +4 -4
  10. package/esm2022/accordion/accordion.module.mjs +5 -5
  11. package/esm2022/action-group/action-group.component.mjs +4 -4
  12. package/esm2022/avatar/avatar.component.mjs +7 -5
  13. package/esm2022/badge/badge.component.mjs +4 -4
  14. package/esm2022/button/button.component.mjs +18 -6
  15. package/esm2022/calendar/calendar.component.mjs +168 -101
  16. package/esm2022/calendar/interfaces/calendar-day.mjs +2 -0
  17. package/esm2022/calendar/interfaces/calendar-year-navigator-config.mjs +2 -0
  18. package/esm2022/calendar/public_api.mjs +1 -1
  19. package/esm2022/card/card-as-button/card-as-button.directive.mjs +4 -4
  20. package/esm2022/card/card-footer/card-footer.component.mjs +4 -4
  21. package/esm2022/card/card-header/card-header.component.mjs +4 -4
  22. package/esm2022/card/card.component.mjs +4 -4
  23. package/esm2022/card/card.module.mjs +5 -5
  24. package/esm2022/chart/chart/chart.component.mjs +4 -4
  25. package/esm2022/chart/charts.module.mjs +5 -5
  26. package/esm2022/chart/shared/base-chart/base-chart.component.mjs +4 -4
  27. package/esm2022/chart/shared/chart-config-service/chart-config.service.mjs +4 -4
  28. package/esm2022/chart/shared/chart-js-service/chart-js.service.mjs +4 -4
  29. package/esm2022/chart/stock-chart/stock-chart-js.service.mjs +4 -4
  30. package/esm2022/chart/stock-chart/stock-chart.component.mjs +4 -4
  31. package/esm2022/checkbox/checkbox.component.mjs +4 -4
  32. package/esm2022/data-table/data-table.module.mjs +5 -5
  33. package/esm2022/data-table/sortable/sortable.component.mjs +4 -4
  34. package/esm2022/divider/divider.component.mjs +4 -4
  35. package/esm2022/dropdown/dropdown.component.mjs +6 -6
  36. package/esm2022/dropdown/dropdown.module.mjs +5 -5
  37. package/esm2022/dropdown/keyboard-handler.service.mjs +4 -4
  38. package/esm2022/empty-state/empty-state.component.mjs +31 -7
  39. package/esm2022/empty-state/empty-state.module.mjs +5 -5
  40. package/esm2022/fab-sheet/fab-sheet.component.mjs +4 -4
  41. package/esm2022/flag/flag.component.mjs +4 -4
  42. package/esm2022/form-field/directives/affix/affix.directive.mjs +4 -4
  43. package/esm2022/form-field/directives/date/date-input.directive.mjs +4 -4
  44. package/esm2022/form-field/directives/decimal-mask/decimal-mask.directive.mjs +4 -4
  45. package/esm2022/form-field/form-field-message/form-field-message.component.mjs +4 -4
  46. package/esm2022/form-field/form-field.component.mjs +4 -4
  47. package/esm2022/form-field/form-field.module.mjs +8 -7
  48. package/esm2022/form-field/input/input.component.mjs +4 -4
  49. package/esm2022/form-field/input-counter/input-counter.component.mjs +4 -4
  50. package/esm2022/form-field/textarea/textarea.component.mjs +4 -4
  51. package/esm2022/header/header.component.mjs +16 -16
  52. package/esm2022/header/header.module.mjs +5 -5
  53. package/esm2022/helpers/content-mutation-observer.mjs +50 -0
  54. package/esm2022/helpers/element-ancestor-utils.mjs +33 -0
  55. package/esm2022/helpers/ionic-element-part-helper.mjs +4 -4
  56. package/esm2022/helpers/line-clamp-helper.mjs +4 -4
  57. package/esm2022/helpers/platform.service.mjs +4 -4
  58. package/esm2022/helpers/public_api.mjs +3 -2
  59. package/esm2022/icon/icon-registry.service.mjs +4 -4
  60. package/esm2022/icon/icon.component.mjs +4 -4
  61. package/esm2022/icon/icon.module.mjs +5 -5
  62. package/esm2022/item/item.component.mjs +13 -9
  63. package/esm2022/item/item.module.mjs +5 -5
  64. package/esm2022/item/label/label.component.mjs +5 -5
  65. package/esm2022/item-group/item-group.component.mjs +4 -4
  66. package/esm2022/item-sliding/item-sliding.component.mjs +4 -4
  67. package/esm2022/kirby-app/kirby-app.component.mjs +4 -4
  68. package/esm2022/kirby-app/kirby-app.module.mjs +5 -5
  69. package/esm2022/kirby-ionic-module/kirby-ionic.module.mjs +5 -5
  70. package/esm2022/lib/components/segmented-control/segmented-control.component.mjs +34 -7
  71. package/esm2022/lib/directives/key-handler/key-handler.directive.mjs +4 -4
  72. package/esm2022/lib/directives/modal-router-link/modal-router-link.directive.mjs +4 -4
  73. package/esm2022/lib/kirby.module.mjs +5 -5
  74. package/esm2022/list/directives/infinite-scroll.directive.mjs +4 -4
  75. package/esm2022/list/directives/list-item-color.directive.mjs +4 -4
  76. package/esm2022/list/helpers/list-helper.mjs +4 -4
  77. package/esm2022/list/list-experimental/list-experimental.component.mjs +4 -4
  78. package/esm2022/list/list-header/list-header.component.mjs +4 -4
  79. package/esm2022/list/list-item/list-item.component.mjs +5 -5
  80. package/esm2022/list/list-section-header/list-section-header.component.mjs +4 -4
  81. package/esm2022/list/list.component.mjs +5 -5
  82. package/esm2022/list/list.directive.mjs +13 -13
  83. package/esm2022/list/list.module.mjs +5 -5
  84. package/esm2022/loading-overlay/loading-overlay.component.mjs +4 -4
  85. package/esm2022/loading-overlay/loading-overlay.service.mjs +4 -4
  86. package/esm2022/menu/menu.component.mjs +215 -12
  87. package/esm2022/modal/modal/action-sheet/action-sheet.component.mjs +4 -4
  88. package/esm2022/modal/modal/alert/alert.component.mjs +4 -4
  89. package/esm2022/modal/modal/footer/modal-footer.component.mjs +4 -4
  90. package/esm2022/modal/modal/modal-component/modal.component.mjs +18 -8
  91. package/esm2022/modal/modal/services/action-sheet.helper.mjs +4 -4
  92. package/esm2022/modal/modal/services/alert.helper.mjs +4 -4
  93. package/esm2022/modal/modal/services/can-dismiss.helper.mjs +4 -4
  94. package/esm2022/modal/modal/services/modal-animation-builder.service.mjs +4 -4
  95. package/esm2022/modal/modal/services/modal.controller.mjs +4 -4
  96. package/esm2022/modal/modal/services/modal.helper.mjs +5 -4
  97. package/esm2022/modal/modal-navigation.service.mjs +4 -4
  98. package/esm2022/modal/modal-wrapper/compact/modal-compact-wrapper.component.mjs +19 -10
  99. package/esm2022/modal/modal-wrapper/config/modal-config.mjs +1 -1
  100. package/esm2022/modal/modal-wrapper/modal-elements-mover.delegate.mjs +1 -1
  101. package/esm2022/modal/modal-wrapper/modal-wrapper.component.mjs +35 -12
  102. package/esm2022/modal/modal.interfaces.mjs +4 -4
  103. package/esm2022/page/page-footer/page-footer.component.mjs +4 -4
  104. package/esm2022/page/page.component.mjs +39 -38
  105. package/esm2022/page/page.module.mjs +5 -5
  106. package/esm2022/popover/popover.component.mjs +4 -4
  107. package/esm2022/progress-circle/progress-circle-ring.component.mjs +4 -4
  108. package/esm2022/progress-circle/progress-circle.component.mjs +4 -4
  109. package/esm2022/radio/radio-group/radio-group.component.mjs +4 -4
  110. package/esm2022/radio/radio-module.mjs +5 -5
  111. package/esm2022/radio/radio.component.mjs +4 -4
  112. package/esm2022/range/range.component.mjs +4 -4
  113. package/esm2022/reorder-list/reorder-list.component.mjs +5 -5
  114. package/esm2022/router-outlet/router-outlet.component.mjs +4 -4
  115. package/esm2022/router-outlet/router-outlet.module.mjs +5 -5
  116. package/esm2022/section-header/section-header.component.mjs +4 -4
  117. package/esm2022/shared/component-loader.directive.mjs +4 -4
  118. package/esm2022/shared/fit-heading/fit-heading.directive.mjs +4 -4
  119. package/esm2022/shared/floating/floating.directive.mjs +4 -4
  120. package/esm2022/shared/portal/portal.directive.mjs +4 -4
  121. package/esm2022/shared/public_api.mjs +2 -1
  122. package/esm2022/shared/resize-observer/resize-observer.factory.mjs +4 -4
  123. package/esm2022/shared/resize-observer/resize-observer.service.mjs +4 -4
  124. package/esm2022/shared/theme-color/theme-color.directive.mjs +4 -4
  125. package/esm2022/shared/translation/translation.interface.mjs +2 -0
  126. package/esm2022/shared/translation/translation.service.mjs +37 -0
  127. package/esm2022/shared/translation/translations/da.mjs +11 -0
  128. package/esm2022/shared/translation/translations/en.mjs +11 -0
  129. package/esm2022/slide/slide-stretch-height.directive.mjs +4 -4
  130. package/esm2022/slide/slide.directive.mjs +4 -4
  131. package/esm2022/slide/slide.module.mjs +5 -5
  132. package/esm2022/slide/slides.component.mjs +16 -9
  133. package/esm2022/slide-button/slide-button.component.mjs +4 -4
  134. package/esm2022/spinner/spinner.component.mjs +4 -4
  135. package/esm2022/spinner/spinner.module.mjs +5 -5
  136. package/esm2022/tab-navigation/tab-navigation/tab-navigation.component.mjs +4 -4
  137. package/esm2022/tab-navigation/tab-navigation-item/tab-navigation-item.component.mjs +4 -4
  138. package/esm2022/tab-navigation/tab-navigation.module.mjs +5 -5
  139. package/esm2022/tabs/tab-button/tab-button.component.mjs +4 -4
  140. package/esm2022/tabs/tabs.component.mjs +4 -4
  141. package/esm2022/tabs/tabs.module.mjs +5 -5
  142. package/esm2022/tabs/tabs.service.mjs +4 -4
  143. package/esm2022/testing/test-helper.mjs +8 -5
  144. package/esm2022/testing-base/lib/components/mock.accordion-item.component.mjs +4 -4
  145. package/esm2022/testing-base/lib/components/mock.action-group.component.mjs +4 -4
  146. package/esm2022/testing-base/lib/components/mock.action-sheet.component.mjs +4 -4
  147. package/esm2022/testing-base/lib/components/mock.alert.component.mjs +4 -4
  148. package/esm2022/testing-base/lib/components/mock.avatar.component.mjs +4 -4
  149. package/esm2022/testing-base/lib/components/mock.badge.component.mjs +4 -4
  150. package/esm2022/testing-base/lib/components/mock.base-chart.component.mjs +4 -4
  151. package/esm2022/testing-base/lib/components/mock.button.component.mjs +4 -4
  152. package/esm2022/testing-base/lib/components/mock.calendar.component.mjs +4 -4
  153. package/esm2022/testing-base/lib/components/mock.card-footer.component.mjs +4 -4
  154. package/esm2022/testing-base/lib/components/mock.card-header.component.mjs +4 -4
  155. package/esm2022/testing-base/lib/components/mock.card.component.mjs +4 -4
  156. package/esm2022/testing-base/lib/components/mock.chart.component.mjs +4 -4
  157. package/esm2022/testing-base/lib/components/mock.checkbox.component.mjs +4 -4
  158. package/esm2022/testing-base/lib/components/mock.divider.component.mjs +4 -4
  159. package/esm2022/testing-base/lib/components/mock.dropdown.component.mjs +4 -4
  160. package/esm2022/testing-base/lib/components/mock.empty-state.component.mjs +4 -4
  161. package/esm2022/testing-base/lib/components/mock.fab-sheet.component.mjs +4 -4
  162. package/esm2022/testing-base/lib/components/mock.flag.component.mjs +4 -4
  163. package/esm2022/testing-base/lib/components/mock.form-field-message.component.mjs +4 -4
  164. package/esm2022/testing-base/lib/components/mock.form-field.component.mjs +4 -4
  165. package/esm2022/testing-base/lib/components/mock.header.component.mjs +10 -10
  166. package/esm2022/testing-base/lib/components/mock.icon.component.mjs +4 -4
  167. package/esm2022/testing-base/lib/components/mock.input-counter.component.mjs +4 -4
  168. package/esm2022/testing-base/lib/components/mock.input.component.mjs +4 -4
  169. package/esm2022/testing-base/lib/components/mock.item-group.component.mjs +4 -4
  170. package/esm2022/testing-base/lib/components/mock.item-sliding.component.mjs +4 -4
  171. package/esm2022/testing-base/lib/components/mock.item.component.mjs +4 -4
  172. package/esm2022/testing-base/lib/components/mock.kirby-app.component.mjs +4 -4
  173. package/esm2022/testing-base/lib/components/mock.label.component.mjs +4 -4
  174. package/esm2022/testing-base/lib/components/mock.list-experimental.component.mjs +4 -4
  175. package/esm2022/testing-base/lib/components/mock.list-header.component.mjs +4 -4
  176. package/esm2022/testing-base/lib/components/mock.list-item.component.mjs +4 -4
  177. package/esm2022/testing-base/lib/components/mock.list-section-header.component.mjs +4 -4
  178. package/esm2022/testing-base/lib/components/mock.list.component.mjs +4 -4
  179. package/esm2022/testing-base/lib/components/mock.loading-overlay.component.mjs +4 -4
  180. package/esm2022/testing-base/lib/components/mock.menu.component.mjs +4 -4
  181. package/esm2022/testing-base/lib/components/mock.modal-compact-wrapper.component.mjs +4 -4
  182. package/esm2022/testing-base/lib/components/mock.modal-footer.component.mjs +4 -4
  183. package/esm2022/testing-base/lib/components/mock.modal-wrapper.component.mjs +4 -4
  184. package/esm2022/testing-base/lib/components/mock.page-footer.component.mjs +4 -4
  185. package/esm2022/testing-base/lib/components/mock.page.component.mjs +34 -34
  186. package/esm2022/testing-base/lib/components/mock.popover.component.mjs +4 -4
  187. package/esm2022/testing-base/lib/components/mock.progress-circle-ring.component.mjs +4 -4
  188. package/esm2022/testing-base/lib/components/mock.progress-circle.component.mjs +4 -4
  189. package/esm2022/testing-base/lib/components/mock.radio-group.component.mjs +4 -4
  190. package/esm2022/testing-base/lib/components/mock.radio.component.mjs +4 -4
  191. package/esm2022/testing-base/lib/components/mock.range.component.mjs +4 -4
  192. package/esm2022/testing-base/lib/components/mock.reorder-list.component.mjs +4 -4
  193. package/esm2022/testing-base/lib/components/mock.router-outlet.component.mjs +4 -4
  194. package/esm2022/testing-base/lib/components/mock.section-header.component.mjs +4 -4
  195. package/esm2022/testing-base/lib/components/mock.segmented-control.component.mjs +4 -4
  196. package/esm2022/testing-base/lib/components/mock.slide-button.component.mjs +4 -4
  197. package/esm2022/testing-base/lib/components/mock.slides.component.mjs +4 -4
  198. package/esm2022/testing-base/lib/components/mock.spinner.component.mjs +4 -4
  199. package/esm2022/testing-base/lib/components/mock.stock-chart.component.mjs +4 -4
  200. package/esm2022/testing-base/lib/components/mock.tab-button.component.mjs +4 -4
  201. package/esm2022/testing-base/lib/components/mock.tab-navigation-item.component.mjs +4 -4
  202. package/esm2022/testing-base/lib/components/mock.tab-navigation.component.mjs +4 -4
  203. package/esm2022/testing-base/lib/components/mock.tabs.component.mjs +4 -4
  204. package/esm2022/testing-base/lib/components/mock.textarea.component.mjs +4 -4
  205. package/esm2022/testing-base/lib/components/mock.toggle-button.component.mjs +4 -4
  206. package/esm2022/testing-base/lib/components/mock.toggle.component.mjs +4 -4
  207. package/esm2022/testing-base/lib/directives/mock.accordion.directive.mjs +4 -4
  208. package/esm2022/testing-base/lib/directives/mock.affix.directive.mjs +4 -4
  209. package/esm2022/testing-base/lib/directives/mock.card-as-button.directive.mjs +4 -4
  210. package/esm2022/testing-base/lib/directives/mock.component-loader.directive.mjs +4 -4
  211. package/esm2022/testing-base/lib/directives/mock.date-input.directive.mjs +4 -4
  212. package/esm2022/testing-base/lib/directives/mock.decimal-mask.directive.mjs +4 -4
  213. package/esm2022/testing-base/lib/directives/mock.fit-heading.directive.mjs +4 -4
  214. package/esm2022/testing-base/lib/directives/mock.floating.directive.mjs +4 -4
  215. package/esm2022/testing-base/lib/directives/mock.infinite-scroll.directive.mjs +4 -4
  216. package/esm2022/testing-base/lib/directives/mock.key-handler.directive.mjs +4 -4
  217. package/esm2022/testing-base/lib/directives/mock.list-item-color.directive.mjs +4 -4
  218. package/esm2022/testing-base/lib/directives/mock.list.directive.mjs +13 -13
  219. package/esm2022/testing-base/lib/directives/mock.modal-router-link.directive.mjs +4 -4
  220. package/esm2022/testing-base/lib/directives/mock.portal.directive.mjs +4 -4
  221. package/esm2022/testing-base/lib/directives/mock.slide.directive.mjs +4 -4
  222. package/esm2022/testing-base/lib/directives/mock.theme-color.directive.mjs +4 -4
  223. package/esm2022/testing-base/lib/kirby-testing-base.module.mjs +5 -5
  224. package/esm2022/testing-jasmine/lib/kirby-testing.module.mjs +5 -5
  225. package/esm2022/testing-jest/lib/kirby-testing.module.mjs +5 -5
  226. package/esm2022/toast/services/toast.controller.mjs +4 -4
  227. package/esm2022/toast/services/toast.helper.mjs +4 -4
  228. package/esm2022/toggle/toggle.component.mjs +4 -4
  229. package/esm2022/toggle-button/toggle-button.component.mjs +4 -4
  230. package/esm2022/toggle-button/toggle-button.module.mjs +5 -5
  231. package/esm2022/types/public_api.mjs +2 -1
  232. package/esm2022/types/unobserve-fn.mjs +2 -0
  233. package/esm2022/types/window-ref.mjs +4 -4
  234. package/fesm2022/kirbydesign-designsystem-accordion.mjs +10 -10
  235. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  236. package/fesm2022/kirbydesign-designsystem-action-group.mjs +3 -3
  237. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  238. package/fesm2022/kirbydesign-designsystem-avatar.mjs +6 -4
  239. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  240. package/fesm2022/kirbydesign-designsystem-badge.mjs +3 -3
  241. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  242. package/fesm2022/kirbydesign-designsystem-button.mjs +17 -5
  243. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  244. package/fesm2022/kirbydesign-designsystem-calendar.mjs +168 -177
  245. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  246. package/fesm2022/kirbydesign-designsystem-card.mjs +16 -16
  247. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  248. package/fesm2022/kirbydesign-designsystem-chart.mjs +22 -22
  249. package/fesm2022/kirbydesign-designsystem-chart.mjs.map +1 -1
  250. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +3 -3
  251. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  252. package/fesm2022/kirbydesign-designsystem-data-table.mjs +7 -7
  253. package/fesm2022/kirbydesign-designsystem-data-table.mjs.map +1 -1
  254. package/fesm2022/kirbydesign-designsystem-divider.mjs +3 -3
  255. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  256. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +12 -12
  257. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  258. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +33 -9
  259. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  260. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +3 -3
  261. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
  262. package/fesm2022/kirbydesign-designsystem-flag.mjs +3 -3
  263. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  264. package/fesm2022/kirbydesign-designsystem-form-field.mjs +30 -30
  265. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  266. package/fesm2022/kirbydesign-designsystem-header.mjs +19 -19
  267. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  268. package/fesm2022/kirbydesign-designsystem-helpers.mjs +69 -10
  269. package/fesm2022/kirbydesign-designsystem-helpers.mjs.map +1 -1
  270. package/fesm2022/kirbydesign-designsystem-icon.mjs +10 -10
  271. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  272. package/fesm2022/kirbydesign-designsystem-item-group.mjs +3 -3
  273. package/fesm2022/kirbydesign-designsystem-item-group.mjs.map +1 -1
  274. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +3 -3
  275. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
  276. package/fesm2022/kirbydesign-designsystem-item.mjs +20 -16
  277. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  278. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +7 -7
  279. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs.map +1 -1
  280. package/fesm2022/kirbydesign-designsystem-kirby-ionic-module.mjs +4 -4
  281. package/fesm2022/kirbydesign-designsystem-kirby-ionic-module.mjs.map +1 -1
  282. package/fesm2022/kirbydesign-designsystem-list.mjs +42 -42
  283. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  284. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +6 -6
  285. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  286. package/fesm2022/kirbydesign-designsystem-menu.mjs +214 -11
  287. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  288. package/fesm2022/kirbydesign-designsystem-modal.mjs +99 -57
  289. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  290. package/fesm2022/kirbydesign-designsystem-page.mjs +44 -43
  291. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  292. package/fesm2022/kirbydesign-designsystem-popover.mjs +3 -3
  293. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  294. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +6 -6
  295. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
  296. package/fesm2022/kirbydesign-designsystem-radio.mjs +10 -10
  297. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  298. package/fesm2022/kirbydesign-designsystem-range.mjs +3 -3
  299. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  300. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +4 -4
  301. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  302. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +7 -7
  303. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
  304. package/fesm2022/kirbydesign-designsystem-section-header.mjs +3 -3
  305. package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
  306. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +3 -3
  307. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs.map +1 -1
  308. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +3 -3
  309. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs.map +1 -1
  310. package/fesm2022/kirbydesign-designsystem-shared.mjs +71 -17
  311. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  312. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +3 -3
  313. package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
  314. package/fesm2022/kirbydesign-designsystem-slide.mjs +24 -18
  315. package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
  316. package/fesm2022/kirbydesign-designsystem-spinner.mjs +7 -7
  317. package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
  318. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +10 -10
  319. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  320. package/fesm2022/kirbydesign-designsystem-tabs.mjs +13 -13
  321. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  322. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +286 -286
  323. package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  324. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +4 -4
  325. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs.map +1 -1
  326. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +4 -4
  327. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs.map +1 -1
  328. package/fesm2022/kirbydesign-designsystem-testing.mjs +7 -4
  329. package/fesm2022/kirbydesign-designsystem-testing.mjs.map +1 -1
  330. package/fesm2022/kirbydesign-designsystem-toast.mjs +6 -6
  331. package/fesm2022/kirbydesign-designsystem-toast.mjs.map +1 -1
  332. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +7 -7
  333. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs.map +1 -1
  334. package/fesm2022/kirbydesign-designsystem-toggle.mjs +3 -3
  335. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  336. package/fesm2022/kirbydesign-designsystem-types.mjs +3 -3
  337. package/fesm2022/kirbydesign-designsystem-types.mjs.map +1 -1
  338. package/fesm2022/kirbydesign-designsystem.mjs +43 -16
  339. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  340. package/form-field/form-field.module.d.ts +2 -1
  341. package/helpers/content-mutation-observer.d.ts +8 -0
  342. package/helpers/{element-has-ancestor.d.ts → element-ancestor-utils.d.ts} +1 -0
  343. package/helpers/public_api.d.ts +2 -1
  344. package/icons/svg/accounts-outline.svg +0 -2
  345. package/icons/svg/accounts.svg +0 -2
  346. package/icons/svg/backspace.svg +0 -2
  347. package/icons/svg/camera.svg +0 -2
  348. package/icons/svg/copy.svg +0 -2
  349. package/icons/svg/flag.svg +0 -2
  350. package/icons/svg/inbox-outline.svg +0 -2
  351. package/icons/svg/inbox.svg +0 -2
  352. package/icons/svg/information.svg +0 -2
  353. package/icons/svg/menu-outline.svg +0 -2
  354. package/icons/svg/menu.svg +0 -2
  355. package/icons/svg/person-outline.svg +0 -2
  356. package/icons/svg/person.svg +0 -2
  357. package/icons/svg/reorder.svg +0 -2
  358. package/icons/svg/support.svg +0 -2
  359. package/item/item.component.d.ts +3 -2
  360. package/lib/components/segmented-control/segmented-control.component.d.ts +4 -0
  361. package/menu/menu.component.d.ts +32 -8
  362. package/modal/modal/modal-component/modal.component.d.ts +6 -3
  363. package/modal/modal-wrapper/compact/modal-compact-wrapper.component.d.ts +4 -2
  364. package/modal/modal-wrapper/config/modal-config.d.ts +3 -0
  365. package/modal/modal-wrapper/modal-wrapper.component.d.ts +8 -3
  366. package/package.json +4 -4
  367. package/page/page.component.d.ts +4 -3
  368. package/scss/base/_item-typography.scss +1 -0
  369. package/shared/public_api.d.ts +1 -0
  370. package/shared/translation/translation.interface.d.ts +10 -0
  371. package/shared/translation/translation.service.d.ts +12 -0
  372. package/shared/translation/translations/da.d.ts +2 -0
  373. package/shared/translation/translations/en.d.ts +2 -0
  374. package/slide/slides.component.d.ts +3 -1
  375. package/testing/test-helper.d.ts +1 -0
  376. package/types/public_api.d.ts +1 -0
  377. package/types/unobserve-fn.d.ts +1 -0
  378. package/calendar/helpers/calendar-cell.model.d.ts +0 -9
  379. package/calendar/helpers/calendar-options.model.d.ts +0 -9
  380. package/calendar/helpers/calendar.helper.d.ts +0 -24
  381. package/esm2022/calendar/helpers/calendar-cell.model.mjs +0 -2
  382. package/esm2022/calendar/helpers/calendar-options.model.mjs +0 -2
  383. package/esm2022/calendar/helpers/calendar.helper.mjs +0 -80
  384. package/esm2022/calendar/options/calendar-year-navigator-config.mjs +0 -2
  385. package/esm2022/helpers/element-has-ancestor.mjs +0 -24
  386. /package/calendar/{options → interfaces}/calendar-year-navigator-config.d.ts +0 -0
@@ -1,93 +1,18 @@
1
+ import * as i4 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
1
3
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, LOCALE_ID, Component, Inject, ViewChild, Output, Input, HostBinding } from '@angular/core';
3
- import { isBefore, isAfter, format, isSameMonth, startOfMonth, startOfDay, eachDayOfInterval, startOfWeek, endOfWeek, isSameDay, add, isWeekend, getYear } from 'date-fns';
4
- import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';
4
+ import { EventEmitter, LOCALE_ID, Component, ChangeDetectionStrategy, Inject, Output, Input, HostBinding } from '@angular/core';
5
+ import { isBefore, isAfter, startOfDay, format, isSameMonth, startOfMonth, eachDayOfInterval, startOfWeek, endOfWeek, isSameDay, add, isWeekend, getYear, lastDayOfWeek } from 'date-fns';
6
+ import { toZonedTime, fromZonedTime } from 'date-fns-tz';
5
7
  import { da, enGB, enUS } from 'date-fns/locale';
6
8
  import { capitalizeFirstLetter } from '@kirbydesign/core';
7
- import * as i4 from '@angular/common';
8
- import { CommonModule } from '@angular/common';
9
- import * as i3 from '@kirbydesign/designsystem/icon';
10
- import { IconModule } from '@kirbydesign/designsystem/icon';
9
+ import { ButtonComponent } from '@kirbydesign/designsystem/button';
11
10
  import * as i2 from '@kirbydesign/designsystem/dropdown';
12
11
  import { DropdownModule } from '@kirbydesign/designsystem/dropdown';
13
- import { ButtonComponent } from '@kirbydesign/designsystem/button';
14
- import * as i1 from '@kirbydesign/designsystem/types';
15
-
16
- class CalendarHelper {
17
- constructor(windowRef) {
18
- this.windowRef = windowRef;
19
- this.embeddedViewReady = false;
20
- }
21
- init(calendarContainer, options, onDaySelected, onChangeMonth) {
22
- if (this.hasEmbeddedView(calendarContainer)) {
23
- const iframe = calendarContainer.nativeElement;
24
- iframe.onload = () => {
25
- this.embeddedViewReady = true;
26
- this.emitOptionsToEmbeddedView(options);
27
- };
28
- this.embeddedView = iframe.contentWindow;
29
- this.windowRef.nativeWindow.addEventListener('message', (event) => this.handleMessageEvent(event, onDaySelected, onChangeMonth));
30
- }
31
- }
32
- update(options) {
33
- if (this.embeddedViewReady) {
34
- this.emitOptionsToEmbeddedView(options);
35
- }
36
- }
37
- setSelectedDay(day) {
38
- if (this.embeddedViewReady) {
39
- this.embeddedView.postMessage({
40
- type: 'kirbyCalendarSetSelectedDay',
41
- selectedDay: day,
42
- }, '*');
43
- }
44
- }
45
- hasEmbeddedView(calendarContainer) {
46
- return (calendarContainer &&
47
- calendarContainer.nativeElement &&
48
- calendarContainer.nativeElement instanceof HTMLIFrameElement &&
49
- calendarContainer.nativeElement.contentWindow);
50
- }
51
- emitOptionsToEmbeddedView(options) {
52
- this.embeddedView.postMessage({
53
- type: 'kirbyCalendarInit',
54
- ...options,
55
- }, '*');
56
- }
57
- handleMessageEvent(event, onDaySelected, onChangeMonth) {
58
- if (this.validateMessage(event)) {
59
- switch (event.data.type) {
60
- case 'kirbyCalendarDaySelected':
61
- if (this.validateDateSelectedMessage(event)) {
62
- onDaySelected({ isSelectable: true, date: event.data.day });
63
- }
64
- break;
65
- case 'kirbyCalendarChangeMonth':
66
- if (this.validateNavigateMonthMessage(event)) {
67
- onChangeMonth(event.data.index);
68
- }
69
- break;
70
- }
71
- }
72
- }
73
- validateMessage(event) {
74
- return (this.embeddedView === event.source &&
75
- event.type === 'message' &&
76
- event.data &&
77
- event.data.type);
78
- }
79
- validateDateSelectedMessage(event) {
80
- return event.data.type === 'kirbyCalendarDaySelected' && event.data.day;
81
- }
82
- validateNavigateMonthMessage(event) {
83
- return event.data.type === 'kirbyCalendarChangeMonth' && typeof event.data.index === 'number';
84
- }
85
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarHelper, deps: [{ token: i1.WindowRef }], target: i0.ɵɵFactoryTarget.Injectable }); }
86
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarHelper }); }
87
- }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarHelper, decorators: [{
89
- type: Injectable
90
- }], ctorParameters: () => [{ type: i1.WindowRef }] });
12
+ import { UniqueIdGenerator } from '@kirbydesign/designsystem/helpers';
13
+ import * as i3 from '@kirbydesign/designsystem/icon';
14
+ import { IconModule } from '@kirbydesign/designsystem/icon';
15
+ import * as i1 from '@kirbydesign/designsystem/shared';
91
16
 
92
17
  var TimeUnit;
93
18
  (function (TimeUnit) {
@@ -115,6 +40,7 @@ class CalendarComponent {
115
40
  }
116
41
  if (this.hasDateChanged(value, this._selectedDate)) {
117
42
  this.onSelectedDateChange(value);
43
+ this.focusDate(value);
118
44
  this._selectedDate = value;
119
45
  }
120
46
  }
@@ -174,8 +100,13 @@ class CalendarComponent {
174
100
  get _hasYearNavigator() {
175
101
  return !!this.yearNavigatorOptions;
176
102
  }
177
- constructor(calendarHelper, locale) {
178
- this.calendarHelper = calendarHelper;
103
+ getTodayDate() {
104
+ return startOfDay(this.todayDate ?? new Date());
105
+ }
106
+ constructor(locale, elementRef, cdr, translations) {
107
+ this.elementRef = elementRef;
108
+ this.cdr = cdr;
109
+ this.translations = translations;
179
110
  this.dateChange = new EventEmitter();
180
111
  this.dateSelect = new EventEmitter();
181
112
  this.yearSelect = new EventEmitter();
@@ -192,6 +123,7 @@ class CalendarComponent {
192
123
  For context see: https://github.com/kirbydesign/designsystem/issues/2087
193
124
  */
194
125
  this.usePopover = false;
126
+ this._tableMonthId = UniqueIdGenerator.scopedTo('kirby-calendar-month').next();
195
127
  this._disabledDates = [];
196
128
  this._enabledDates = [];
197
129
  this.includedLocales = { da, enGB, enUS };
@@ -211,13 +143,21 @@ class CalendarComponent {
211
143
  const availableLocales = { ...this.includedLocales, ...this.locales, ...this.customLocales };
212
144
  return availableLocales[locale] || this.includedLocales.enGB; // Default to enGB if injected locale doesnt exist
213
145
  }
146
+ formatDateLabel() {
147
+ const localeDateFormats = {
148
+ da: '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
+ }
214
156
  ngOnInit() {
157
+ this.focussedDate = this.getTodayDate();
215
158
  this._weekDays = this.getWeekDays();
216
159
  this.setActiveMonth(this.selectedDate);
217
160
  }
218
- ngAfterViewInit() {
219
- this.calendarHelper.init(this.calendarContainer, this.getHelperOptions(), this._onDateSelected.bind(this), this.onChangeMonth.bind(this));
220
- }
221
161
  ngOnChanges(changes) {
222
162
  if (!this.activeMonth)
223
163
  return;
@@ -231,14 +171,12 @@ class CalendarComponent {
231
171
  changes.todayDate ||
232
172
  changes.timezone) {
233
173
  this.refreshActiveMonth();
234
- this.calendarHelper.update(this.getHelperOptions());
235
174
  }
236
175
  }
237
176
  setActiveMonth(date = new Date()) {
238
177
  if (!this.activeMonth || !isSameMonth(this.activeMonth, date)) {
239
178
  this.activeMonth = startOfMonth(date);
240
179
  this.refreshActiveMonth();
241
- this.calendarHelper.update(this.getHelperOptions());
242
180
  }
243
181
  }
244
182
  // For leniency, the component will accept any Date that points to either UTC midnight
@@ -253,10 +191,10 @@ class CalendarComponent {
253
191
  // date is local timezone midnight
254
192
  return dateLocalOrUTC;
255
193
  }
256
- if (startOfDay(utcToZonedTime(dateLocalOrUTC, this.timeZoneName)).getTime() ===
257
- utcToZonedTime(dateLocalOrUTC, this.timeZoneName).getTime()) {
194
+ if (startOfDay(toZonedTime(dateLocalOrUTC, this.timeZoneName)).getTime() ===
195
+ toZonedTime(dateLocalOrUTC, this.timeZoneName).getTime()) {
258
196
  // the date is a UTC midnight; create the equivalent local timezone midnight date
259
- const normalizedUTCdate = utcToZonedTime(dateLocalOrUTC, this.timeZoneName);
197
+ const normalizedUTCdate = toZonedTime(dateLocalOrUTC, this.timeZoneName);
260
198
  return normalizedUTCdate;
261
199
  }
262
200
  // does not point to midnight so we make it
@@ -268,10 +206,12 @@ class CalendarComponent {
268
206
  start: startOfWeek(now, { locale: this.locale }),
269
207
  end: endOfWeek(now, { locale: this.locale }),
270
208
  });
271
- return week.map((date) => this.getFirstLetterOfWeekDayCapitalized(date));
272
- }
273
- getFirstLetterOfWeekDayCapitalized(date) {
274
- return this.formatWithLocale(date, 'EEEEE');
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
+ }));
275
215
  }
276
216
  hasDateChanged(newDate, previousDate) {
277
217
  if (!newDate && !previousDate) {
@@ -294,66 +234,64 @@ class CalendarComponent {
294
234
  return;
295
235
  const monthStart = startOfMonth(this.activeMonth);
296
236
  const startOfFirstWeek = startOfWeek(monthStart, { locale: this.locale });
297
- const today = this.todayDate ? startOfDay(this.todayDate) : startOfDay(new Date());
298
237
  const totalNumberOfDays = 42; // Always show 42 days (6 weeks) in calendar
299
238
  const daysArray = Array.from(Array(totalNumberOfDays).keys());
300
- const days = daysArray.map((number) => {
301
- const cellDate = add(startOfFirstWeek, { [TimeUnit.days]: number });
302
- const day = this.getCalendarDay(cellDate, today, monthStart);
303
- const isSelectable = this.isSelectable(day, cellDate);
304
- const isSelected = isSameDay(this.selectedDate, cellDate);
305
- const cell = {
306
- date: cellDate.getDate(),
307
- monthIndex: cellDate.getMonth(),
308
- year: cellDate.getFullYear(),
309
- isCurrentMonth: day.isCurrentMonth,
310
- isSelectable,
311
- isSelected,
312
- cssClasses: this.getCssClasses(day, isSelectable, isSelected),
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),
313
248
  };
314
- if (isSelected) {
315
- this.selectedDay = cell;
249
+ if (calendarDay.isSelected) {
250
+ this.selectedDay = calendarDay;
316
251
  }
317
- return cell;
252
+ if (calendarDay.isFocussed) {
253
+ this.focussedDay = calendarDay;
254
+ }
255
+ return calendarDay;
318
256
  });
319
- this._month = this.chunk(days, 7);
257
+ this._month = this.chunk(calendarDays, 7);
320
258
  }
321
- getCalendarDay(date, today, monthStart) {
259
+ getCalendarDayMetadata(date, today, monthStart) {
322
260
  return {
323
261
  isToday: isSameDay(today, date),
324
262
  isPast: isBefore(date, today),
325
263
  isFuture: isAfter(date, today),
326
264
  isWeekend: isWeekend(date),
327
265
  isCurrentMonth: isSameMonth(date, monthStart),
328
- isDisabled: this.isDisabledDate(date) || !this.isEnabledDate(date),
266
+ isSelectable: this.isSelectable(date, today),
267
+ isFocusable: this.isWithinAllowedRange(date, today),
268
+ isSelected: isSameDay(this.selectedDate, date),
269
+ isFocussed: isSameDay(this.focussedDate, date),
329
270
  };
330
271
  }
331
- isSelectable(day, date) {
332
- return ((this.alwaysEnableToday && day.isToday) ||
333
- (!day.isDisabled &&
334
- !(this.disableWeekends && day.isWeekend) &&
335
- !(this.disablePastDates && day.isPast) &&
336
- !(this.disableFutureDates && day.isFuture) &&
337
- !(this.minDate && isBefore(date, this.minDate)) &&
338
- !(this.maxDate && isAfter(date, this.maxDate))));
339
- }
340
- getCssClasses(day, isSelectable, isSelected) {
341
- const cssClasses = {
342
- 'current-month': day.isCurrentMonth,
343
- weekend: day.isWeekend,
344
- today: day.isToday,
345
- selectable: isSelectable,
346
- selected: isSelected,
347
- past: day.isPast,
348
- disabled: day.isDisabled,
349
- };
350
- let cssClassString = 'day';
351
- for (const key in cssClasses) {
352
- if (cssClasses[key]) {
353
- cssClassString += ' ' + key;
354
- }
355
- }
356
- return cssClassString;
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;
357
295
  }
358
296
  chunk(array, size) {
359
297
  const results = [];
@@ -366,36 +304,33 @@ class CalendarComponent {
366
304
  if (this.selectedDay) {
367
305
  this.selectedDay.isSelected = false;
368
306
  }
369
- const newDay = this.getCell(newDate);
307
+ const newDay = this.getDay(newDate);
370
308
  if (newDay) {
371
309
  newDay.isSelected = true;
372
310
  this.selectedDay = newDay;
373
311
  }
374
- if (newDate) {
375
- this.calendarHelper.setSelectedDay(newDate.getDate());
376
- }
377
312
  }
378
313
  _onDateSelected(newDay) {
379
314
  if (!newDay.isSelectable)
380
315
  return;
381
316
  let newDate = new Date(newDay.year, newDay.monthIndex, newDay.date);
382
317
  if (this.timezone === 'UTC') {
383
- newDate = zonedTimeToUtc(this.subtractTimezoneOffset(newDate), this.timeZoneName);
318
+ newDate = fromZonedTime(this.subtractTimezoneOffset(newDate), this.timeZoneName);
384
319
  }
385
320
  const dateToEmit = newDate;
386
321
  if (this.hasDateChanged(newDate, this._selectedDate)) {
387
322
  this.setActiveMonth(newDate);
388
323
  this.onSelectedDateChange(newDate);
389
- this._selectedDate = newDate;
324
+ this.selectedDate = newDate;
390
325
  this.dateChange.emit(dateToEmit);
391
326
  }
392
327
  this.dateSelect.emit(dateToEmit);
393
328
  }
394
- onChangeMonth(direction) {
395
- this._changeMonth(direction);
396
- this.calendarHelper.update(this.getHelperOptions());
397
- }
398
329
  _changeMonth(index) {
330
+ if (index > 0 && !this._canNavigateForward)
331
+ return;
332
+ if (index < 0 && !this._canNavigateBack)
333
+ return;
399
334
  this.changeActiveView(index, TimeUnit.months);
400
335
  index > 0
401
336
  ? this.nextMonthClicked.emit(this.activeMonth)
@@ -410,21 +345,24 @@ class CalendarComponent {
410
345
  if (index === 0)
411
346
  return;
412
347
  this.activeMonth = add(this.activeMonth, { [unit]: index });
348
+ this.focussedDate = add(this.focussedDate, { [unit]: index });
413
349
  this.refreshActiveMonth();
414
350
  }
415
351
  get _canNavigateBack() {
416
- const reachedPastDatesLimit = this.disablePastDates && isSameMonth(this.activeMonth, this.todayDate);
352
+ const today = this.getTodayDate();
353
+ const reachedPastDatesLimit = this.disablePastDates && isSameMonth(this.activeMonth, today);
417
354
  const reachedOrExceededMinDate = this.minDate &&
418
355
  (isSameMonth(this.activeMonth, this.minDate) || isBefore(this.activeMonth, this.minDate));
419
356
  return !reachedPastDatesLimit && !reachedOrExceededMinDate;
420
357
  }
421
358
  get _canNavigateForward() {
422
- const reachedFutureDatesLimit = this.disableFutureDates && isSameMonth(this.activeMonth, this.todayDate);
359
+ const today = this.getTodayDate();
360
+ const reachedFutureDatesLimit = this.disableFutureDates && isSameMonth(this.activeMonth, today);
423
361
  const reachedOrExceededMaxDate = this.maxDate &&
424
362
  (isSameMonth(this.activeMonth, this.maxDate) || isAfter(this.activeMonth, this.maxDate));
425
363
  return !reachedFutureDatesLimit && !reachedOrExceededMaxDate;
426
364
  }
427
- getCell(date) {
365
+ getDay(date) {
428
366
  let foundDay = null;
429
367
  if (date) {
430
368
  for (const week of this._month) {
@@ -438,16 +376,6 @@ class CalendarComponent {
438
376
  }
439
377
  return foundDay;
440
378
  }
441
- getHelperOptions() {
442
- return {
443
- canNavigateBack: this._canNavigateBack,
444
- canNavigateForward: this._canNavigateForward,
445
- year: this.activeYear,
446
- monthName: this.activeMonthName,
447
- weekDays: this._weekDays,
448
- month: this._month,
449
- };
450
- }
451
379
  subtractTimezoneOffset(date) {
452
380
  const timezoneOffsetInMs = date.getTimezoneOffset() * 60 * 1000;
453
381
  return new Date(date.getTime() - timezoneOffsetInMs);
@@ -464,19 +392,82 @@ class CalendarComponent {
464
392
  const numberOfYears = endYear - startYear;
465
393
  return Array.from({ length: numberOfYears + 1 }, (_, i) => (startYear + i).toString());
466
394
  }
467
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, deps: [{ token: CalendarHelper }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
468
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", 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" } }, providers: [CalendarHelper], viewQueries: [{ propertyName: "calendarContainer", first: true, predicate: ["calendarContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateBack\"\n (click)=\"_changeMonth(-1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-back\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\">\n <span class=\"month\">{{ activeMonthName }}</span>\n <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\n </div>\n\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateForward\"\n (click)=\"_changeMonth(1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-more\"></kirby-icon>\n </button>\n </div>\n <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table>\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\">{{ weekDay }}</th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\">\n <div\n (click)=\"_onDateSelected(day)\"\n class=\"{{ day.cssClasses }} contain-state-layer\"\n [class.selected]=\"day.isSelected\"\n >\n <span class=\"state-layer\" aria-hidden=\"true\"></span>\n <span class=\"content-layer\">{{ day.date }}</span>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n\n<!-- <iframe src=\"kirby/components/calendar/calendar.webview.html\" #calendarContainer style=\"width: 320px; height: 304px; border: 0\"> -->\n", styles: ["table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}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:8px 8px 0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-navigator button:disabled{opacity:.5;pointer-events:none}.month-and-year{-webkit-user-select:none;user-select:none}.month-and-year .month{font-weight:700;margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;width:40px;height:40px;margin:4px 0;color:var(--color, var(--kirby-black));background-color:var(--background-color, transparent)}.day.disabled,.day:not(.selectable){--color: #b4b4b4;pointer-events:none}.day.selectable:not(.current-month){--color: var(--kirby-text-color-semi-dark)}@media (hover: hover){.day.today:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.day.today:active,.day.today.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}@media (hover: hover){.day.selected:hover{--state-layer-opacity: .24;--state-layer-background-color: var(--kirby-black-contrast);cursor:pointer}}.day.selected:active,.day.selected.interaction-state-active{--state-layer-opacity: .36;--state-layer-background-color: var(--kirby-black-contrast)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.contain-state-layer{--state-layer-opacity: 0;--state-layer-background-color: var(--kirby-black);position:relative}.contain-state-layer .content-layer{position:relative;z-index:var(--content-layer-z-index, 1)}.contain-state-layer .state-layer{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;z-index:2}.contain-state-layer .state-layer:before{transition:all 80ms linear 0ms;content:\"\";position:absolute;pointer-events:none;inset:-50%;opacity:var(--state-layer-opacity, 0);background-color:var(--state-layer-background-color, var(--kirby-black))}@media (hover: hover){.contain-state-layer:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.contain-state-layer:active,.contain-state-layer.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}\n"], dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.DropdownComponent, selector: "kirby-dropdown", inputs: ["items", "selectedIndex", "focusedIndex", "itemTextProperty", "placeholder", "popout", "attentionLevel", "expand", "disabled", "hasError", "size", "tabindex", "usePopover"], outputs: ["change"] }, { kind: "component", type: ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i3.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
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
+ if (this.timezone === 'UTC') {
409
+ newDate = fromZonedTime(this.subtractTimezoneOffset(newDate), this.timeZoneName);
410
+ }
411
+ const today = this.getTodayDate();
412
+ if (!this.isWithinAllowedRange(newDate, today))
413
+ return;
414
+ if (!this.hasDateChanged(newDate, this.focussedDate))
415
+ return;
416
+ this.setActiveMonth(newDate);
417
+ this.setFocussedDay(newDate);
418
+ this.focussedDate = newDate;
419
+ this.cdr.detectChanges(); //sync focussed class to template before setting focus
420
+ const elementMarkedForFocus = this.elementRef.nativeElement.querySelector('.focussed');
421
+ elementMarkedForFocus.focus();
422
+ }
423
+ _onDateKeydown(event) {
424
+ const { key, shiftKey } = event;
425
+ let newDate;
426
+ switch (key) {
427
+ case 'ArrowUp':
428
+ newDate = add(this.focussedDate, { days: -7 });
429
+ break;
430
+ case 'ArrowDown':
431
+ newDate = add(this.focussedDate, { days: 7 });
432
+ break;
433
+ case 'ArrowRight':
434
+ newDate = add(this.focussedDate, { days: 1 });
435
+ break;
436
+ case 'ArrowLeft':
437
+ newDate = add(this.focussedDate, { days: -1 });
438
+ break;
439
+ case 'Home':
440
+ newDate = startOfWeek(this.focussedDate, { locale: this.locale });
441
+ break;
442
+ case 'End':
443
+ newDate = lastDayOfWeek(this.focussedDate, { locale: this.locale });
444
+ break;
445
+ case 'PageUp':
446
+ newDate = shiftKey
447
+ ? add(this.focussedDate, { years: -1 })
448
+ : add(this.focussedDate, { months: -1 });
449
+ break;
450
+ case 'PageDown':
451
+ newDate = shiftKey
452
+ ? add(this.focussedDate, { years: 1 })
453
+ : add(this.focussedDate, { months: 1 });
454
+ break;
455
+ default:
456
+ return;
457
+ }
458
+ event.preventDefault();
459
+ this.focusDate(newDate);
460
+ }
461
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarComponent, deps: [{ token: LOCALE_ID }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
462
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", 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 <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\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 <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\" scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\" [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 </tr>\n </tbody>\n</table>\n", styles: [":host{font-size:16px}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}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:8px 8px 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:700}.month-and-year .month{margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;min-width:40px;min-height:40px;width:40px;height:40px;margin:4px 0;font-size:16px}.day:focus{z-index:1}button[aria-disabled=true]{color:#b4b4b4}.day.selectable:not(.current-month,.selected){color:var(--kirby-text-color-semi-dark)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.visually-hidden{position:absolute;scale:0}\n"], dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.DropdownComponent, selector: "kirby-dropdown", inputs: ["items", "selectedIndex", "focusedIndex", "itemTextProperty", "placeholder", "popout", "attentionLevel", "expand", "disabled", "hasError", "size", "tabindex", "usePopover"], outputs: ["change"] }, { kind: "component", type: ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i3.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
469
463
  }
470
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, decorators: [{
464
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarComponent, decorators: [{
471
465
  type: Component,
472
- args: [{ standalone: true, imports: [DropdownModule, ButtonComponent, IconModule, CommonModule], selector: 'kirby-calendar', providers: [CalendarHelper], template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateBack\"\n (click)=\"_changeMonth(-1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-back\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\">\n <span class=\"month\">{{ activeMonthName }}</span>\n <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\n </div>\n\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateForward\"\n (click)=\"_changeMonth(1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-more\"></kirby-icon>\n </button>\n </div>\n <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table>\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\">{{ weekDay }}</th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\">\n <div\n (click)=\"_onDateSelected(day)\"\n class=\"{{ day.cssClasses }} contain-state-layer\"\n [class.selected]=\"day.isSelected\"\n >\n <span class=\"state-layer\" aria-hidden=\"true\"></span>\n <span class=\"content-layer\">{{ day.date }}</span>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n\n<!-- <iframe src=\"kirby/components/calendar/calendar.webview.html\" #calendarContainer style=\"width: 320px; height: 304px; border: 0\"> -->\n", styles: ["table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}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:8px 8px 0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-navigator button:disabled{opacity:.5;pointer-events:none}.month-and-year{-webkit-user-select:none;user-select:none}.month-and-year .month{font-weight:700;margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;width:40px;height:40px;margin:4px 0;color:var(--color, var(--kirby-black));background-color:var(--background-color, transparent)}.day.disabled,.day:not(.selectable){--color: #b4b4b4;pointer-events:none}.day.selectable:not(.current-month){--color: var(--kirby-text-color-semi-dark)}@media (hover: hover){.day.today:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.day.today:active,.day.today.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}@media (hover: hover){.day.selected:hover{--state-layer-opacity: .24;--state-layer-background-color: var(--kirby-black-contrast);cursor:pointer}}.day.selected:active,.day.selected.interaction-state-active{--state-layer-opacity: .36;--state-layer-background-color: var(--kirby-black-contrast)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.contain-state-layer{--state-layer-opacity: 0;--state-layer-background-color: var(--kirby-black);position:relative}.contain-state-layer .content-layer{position:relative;z-index:var(--content-layer-z-index, 1)}.contain-state-layer .state-layer{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;z-index:2}.contain-state-layer .state-layer:before{transition:all 80ms linear 0ms;content:\"\";position:absolute;pointer-events:none;inset:-50%;opacity:var(--state-layer-opacity, 0);background-color:var(--state-layer-background-color, var(--kirby-black))}@media (hover: hover){.contain-state-layer:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.contain-state-layer:active,.contain-state-layer.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}\n"] }]
473
- }], ctorParameters: () => [{ type: CalendarHelper }, { type: undefined, decorators: [{
466
+ args: [{ standalone: true, imports: [DropdownModule, ButtonComponent, IconModule, CommonModule], 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 <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\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 <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\" scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\" [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 </tr>\n </tbody>\n</table>\n", styles: [":host{font-size:16px}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}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:8px 8px 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:700}.month-and-year .month{margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;min-width:40px;min-height:40px;width:40px;height:40px;margin:4px 0;font-size:16px}.day:focus{z-index:1}button[aria-disabled=true]{color:#b4b4b4}.day.selectable:not(.current-month,.selected){color:var(--kirby-text-color-semi-dark)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.visually-hidden{position:absolute;scale:0}\n"] }]
467
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
474
468
  type: Inject,
475
469
  args: [LOCALE_ID]
476
- }] }], propDecorators: { calendarContainer: [{
477
- type: ViewChild,
478
- args: ['calendarContainer', { static: false }]
479
- }], dateChange: [{
470
+ }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.TranslationService }], propDecorators: { dateChange: [{
480
471
  type: Output
481
472
  }], dateSelect: [{
482
473
  type: Output