@heartlandone/vega 2.63.1 → 2.65.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 (457) hide show
  1. package/dist/cjs/{app-globals-2d0b157e.js → app-globals-681a0ed4.js} +10 -10
  2. package/dist/cjs/{brand-switch-state-controller-slimmer-b83a4596.js → brand-switch-state-controller-slimmer-3d41b2a4.js} +1 -1
  3. package/dist/cjs/{child-nodes-event-prevent-slimmer-4e96270e.js → child-nodes-event-prevent-slimmer-feb072c4.js} +1 -1
  4. package/dist/cjs/{child-nodes-notify-observer-slimmer-34ac3bfc.js → child-nodes-notify-observer-slimmer-257fedb3.js} +1 -1
  5. package/dist/cjs/{code-block-cc740807.js → code-block-961d54e8.js} +13 -17
  6. package/dist/cjs/{component-value-history-controller-slimmer.abstract-0bb81172.js → component-value-history-controller-slimmer.abstract-c5b8b47b.js} +6 -6
  7. package/dist/cjs/{dark-mode-state-controller-slimmer-17022f93.js → dark-mode-state-controller-slimmer-8a87ec08.js} +1 -1
  8. package/dist/cjs/{dark-mode-style-controller-b1e9ec82.js → dark-mode-style-controller-27809ff8.js} +1 -1
  9. package/dist/cjs/{design-token-bf913c86.js → design-token-98652b67.js} +1 -1
  10. package/dist/cjs/{dom-node-subject-observer-factory-58e3c010.js → dom-node-subject-observer-factory-56609e5a.js} +1 -1
  11. package/dist/cjs/{dto-renderer-manager-424c5031.js → dto-renderer-manager-4b9d2560.js} +11 -6
  12. package/dist/cjs/{element-appender-slimmer-1d035b1f.js → element-appender-slimmer-1f46981b.js} +6 -6
  13. package/dist/cjs/{event-emit-slimmer-428d8802.js → event-emit-slimmer-3cefb326.js} +2 -2
  14. package/dist/cjs/{form-field-controller-slimmer-cc6e53a4.js → form-field-controller-slimmer-1e1123ea.js} +16 -8
  15. package/dist/cjs/{image-annotation-action-f831e09b.js → image-annotation-action-03b36f68.js} +5 -5
  16. package/dist/cjs/{index-00ba6623.js → index-58ea899e.js} +1 -0
  17. package/dist/cjs/{index-5505e8dd.js → index-f2fe26a0.js} +2 -2
  18. package/dist/cjs/index.cjs.js +16 -16
  19. package/dist/cjs/{inject-keyboard-manager-ad865c95.js → inject-keyboard-manager-51033b3f.js} +1 -1
  20. package/dist/cjs/{internal-vega-event-manager-28b957c8.js → internal-vega-event-manager-9b503f1a.js} +1 -1
  21. package/dist/cjs/{keyboard-manager-7f4e1f43.js → keyboard-manager-144907d7.js} +1 -1
  22. package/dist/cjs/{keyboard-manager-slimmer-138a90e5.js → keyboard-manager-slimmer-04c48756.js} +1 -1
  23. package/dist/cjs/{language-extension-cfe0eabd.js → language-extension-059d62f6.js} +2 -2
  24. package/dist/cjs/loader.cjs.js +15 -15
  25. package/dist/cjs/{public-rules-7e9b633d.js → public-rules-58e0218b.js} +8 -8
  26. package/dist/cjs/{range-44f08955.js → range-42732973.js} +2 -2
  27. package/dist/cjs/{responsive-format-facade-a7fbefc4.js → responsive-format-facade-29070d00.js} +5 -5
  28. package/dist/cjs/{rich-text-editor-required-rule-a0618c85.js → rich-text-editor-required-rule-ce4dd5fb.js} +1 -1
  29. package/dist/cjs/{static-subject-title-85732e0f.js → static-subject-title-5829a298.js} +0 -8
  30. package/dist/cjs/{string-input-formatter-slimmer-f6c7a255.js → string-input-formatter-slimmer-0d69ea76.js} +3 -3
  31. package/dist/cjs/{style-formatter-795451f2.js → style-formatter-f6723cb3.js} +1 -1
  32. package/dist/cjs/{sub-state-notify-slimmer-bb64fcfc.js → sub-state-notify-slimmer-066f2aa9.js} +2 -2
  33. package/dist/cjs/{sub-state-observer-slimmer-84175d61.js → sub-state-observer-slimmer-569e3297.js} +3 -3
  34. package/dist/cjs/{token-extension-4764d5f3.js → token-extension-260adb8a.js} +6 -6
  35. package/dist/cjs/{translation-cde4dce3.js → translation-f5adcb9f.js} +1 -1
  36. package/dist/cjs/{translation-slimmer-af399096.js → translation-slimmer-4b6239d1.js} +1 -1
  37. package/dist/cjs/{ui-4ce1fa08.js → ui-9e181079.js} +16 -3
  38. package/dist/cjs/vega-accordion.cjs.entry.js +14 -14
  39. package/dist/cjs/vega-app-footer.cjs.entry.js +4 -4
  40. package/dist/cjs/vega-app-header-button.cjs.entry.js +15 -15
  41. package/dist/cjs/vega-backdrop.cjs.entry.js +2 -2
  42. package/dist/cjs/vega-banner.cjs.entry.js +5 -5
  43. package/dist/cjs/vega-bar-chart.cjs.entry.js +1 -1
  44. package/dist/cjs/vega-box.cjs.entry.js +14 -14
  45. package/dist/cjs/vega-brand-logo.cjs.entry.js +4 -4
  46. package/dist/cjs/vega-breadcrumb.cjs.entry.js +6 -6
  47. package/dist/cjs/vega-button-circle.cjs.entry.js +20 -17
  48. package/dist/cjs/vega-button-group_2.cjs.entry.js +9 -9
  49. package/dist/cjs/vega-button-link.cjs.entry.js +6 -6
  50. package/dist/cjs/vega-button.cjs.entry.js +20 -15
  51. package/dist/cjs/vega-calendar_4.cjs.entry.js +528 -226
  52. package/dist/cjs/vega-card.cjs.entry.js +13 -13
  53. package/dist/cjs/vega-carousel.cjs.entry.js +13 -13
  54. package/dist/cjs/vega-checkbox_2.cjs.entry.js +12 -12
  55. package/dist/cjs/vega-chip.cjs.entry.js +15 -15
  56. package/dist/cjs/vega-code-block.cjs.entry.js +16 -16
  57. package/dist/cjs/vega-color-picker.cjs.entry.js +10 -10
  58. package/dist/cjs/vega-combo-box.cjs.entry.js +13 -13
  59. package/dist/cjs/vega-counter-badge.cjs.entry.js +1 -1
  60. package/dist/cjs/vega-date-picker_2.cjs.entry.js +63 -26
  61. package/dist/cjs/vega-dialog_2.cjs.entry.js +16 -16
  62. package/dist/cjs/vega-divider.cjs.entry.js +13 -13
  63. package/dist/cjs/vega-dropdown_5.cjs.entry.js +24 -23
  64. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  65. package/dist/cjs/vega-field-error.cjs.entry.js +2 -2
  66. package/dist/cjs/vega-field-label.cjs.entry.js +5 -5
  67. package/dist/cjs/vega-file-uploader.cjs.entry.js +11 -11
  68. package/dist/cjs/vega-flag-icon.cjs.entry.js +13 -13
  69. package/dist/cjs/vega-flex.cjs.entry.js +14 -14
  70. package/dist/cjs/vega-font.cjs.entry.js +13 -13
  71. package/dist/cjs/vega-form.cjs.entry.js +636 -323
  72. package/dist/cjs/vega-grid.cjs.entry.js +13 -13
  73. package/dist/cjs/vega-hint.cjs.entry.js +1 -1
  74. package/dist/cjs/vega-icon.cjs.entry.js +13 -13
  75. package/dist/cjs/vega-image-uploader.cjs.entry.js +18 -18
  76. package/dist/cjs/vega-input-credit-card.cjs.entry.js +11 -11
  77. package/dist/cjs/vega-input-numeric.cjs.entry.js +14 -14
  78. package/dist/cjs/vega-input-phone-number.cjs.entry.js +15 -15
  79. package/dist/cjs/vega-input-range.cjs.entry.js +12 -12
  80. package/dist/cjs/vega-input-select.cjs.entry.js +17 -17
  81. package/dist/cjs/vega-input.cjs.entry.js +12 -12
  82. package/dist/cjs/{vega-internal-event-id-9647aaf8.js → vega-internal-event-id-6d4a2c53.js} +8 -0
  83. package/dist/cjs/vega-item-toggle.cjs.entry.js +5 -5
  84. package/dist/cjs/vega-left-nav_5.cjs.entry.js +45 -21
  85. package/dist/cjs/vega-line-chart.cjs.entry.js +1 -1
  86. package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +12 -12
  87. package/dist/cjs/vega-page-notification_2.cjs.entry.js +3 -3
  88. package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +6 -6
  89. package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +7 -7
  90. package/dist/cjs/vega-pagination.cjs.entry.js +15 -15
  91. package/dist/cjs/vega-pie-chart.cjs.entry.js +1 -1
  92. package/dist/cjs/vega-popover_2.cjs.entry.js +17 -17
  93. package/dist/cjs/vega-progress-tracker.cjs.entry.js +5 -5
  94. package/dist/cjs/vega-radio_2.cjs.entry.js +14 -14
  95. package/dist/cjs/vega-rich-text-content.cjs.entry.js +11 -11
  96. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +25 -29
  97. package/dist/cjs/vega-section-title.cjs.entry.js +1 -1
  98. package/dist/cjs/vega-segment-control.cjs.entry.js +5 -5
  99. package/dist/cjs/vega-selection-chip_2.cjs.entry.js +17 -17
  100. package/dist/cjs/vega-selection-tile_2.cjs.entry.js +13 -13
  101. package/dist/cjs/vega-sidenav_3.cjs.entry.js +15 -15
  102. package/dist/cjs/vega-signature-capture.cjs.entry.js +17 -17
  103. package/dist/cjs/vega-skeleton.cjs.entry.js +1 -1
  104. package/dist/cjs/vega-slot-container.cjs.entry.js +1 -1
  105. package/dist/cjs/vega-stepper.cjs.entry.js +11 -11
  106. package/dist/cjs/vega-tab-group_2.cjs.entry.js +7 -7
  107. package/dist/cjs/vega-table_8.cjs.entry.js +17 -17
  108. package/dist/cjs/vega-text.cjs.entry.js +2 -2
  109. package/dist/cjs/vega-textarea.cjs.entry.js +11 -11
  110. package/dist/cjs/vega-time-picker_2.cjs.entry.js +20 -20
  111. package/dist/cjs/vega-toggle-switch.cjs.entry.js +10 -10
  112. package/dist/cjs/vega-tooltip_2.cjs.entry.js +15 -15
  113. package/dist/cjs/vega.cjs.js +15 -15
  114. package/dist/collection/components/vega-button/vega-button.js +9 -2
  115. package/dist/collection/components/vega-button-circle/vega-button-circle.js +8 -3
  116. package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-current-period-controller.js +7 -4
  117. package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-controller.js +21 -1
  118. package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-preivew-popover-controller.js +18 -1
  119. package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-post-operation-date-controller.js +14 -1
  120. package/dist/collection/components/vega-calendar/slimmers/common/helpers/repeat-pattern/calendar-event-repeat-pattern-factory.js +8 -9
  121. package/dist/collection/components/vega-calendar/slimmers/common/helpers/repeat-pattern/calendar-event-weekly-repeat-pattern.js +3 -1
  122. package/dist/collection/components/vega-calendar/slimmers/common/helpers/test/calendar-event-repeat-pattern-factory.test.js +34 -0
  123. package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-item-renderer.js +1 -1
  124. package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-preview-popover-renderer.js +7 -6
  125. package/dist/collection/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-time-marker-renderer.js +31 -5
  126. package/dist/collection/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-view-with-time-renderer.js +4 -1
  127. package/dist/collection/components/vega-calendar/slimmers/month-view/renderers/vega-calendar-month-event-renderer.js +11 -10
  128. package/dist/collection/components/vega-calendar/slimmers/month-view/renderers/vega-calendar-month-view-renderer.js +4 -1
  129. package/dist/collection/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.js +15 -5
  130. package/dist/collection/components/vega-calendar/vega-calendar.js +47 -1
  131. package/dist/collection/components/vega-date-picker/slimmers/renderers/vega-date-picker-calendar-renderer.js +37 -3
  132. package/dist/collection/components/vega-date-picker/vega-date-picker.js +6 -0
  133. package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +1 -1
  134. package/dist/collection/components/vega-dropdown/vega-dropdown-item/vega-dropdown-item.css +4 -8
  135. package/dist/collection/components/vega-dropdown/vega-dropdown.js +4 -0
  136. package/dist/collection/components/vega-form/slimmers/controllers/vega-form-field-controller.js +351 -0
  137. package/dist/collection/components/vega-form/slimmers/controllers/vega-form-reset-controller.js +99 -0
  138. package/dist/collection/components/vega-form/slimmers/controllers/vega-form-submit-controller.js +122 -0
  139. package/dist/collection/components/vega-form/slimmers/renderers/native-form-renderer.js +30 -0
  140. package/dist/collection/components/vega-form/vega-form.js +97 -335
  141. package/dist/collection/components/vega-modal/vega-modal.css +4 -1
  142. package/dist/collection/components/vega-nav/slimmers/vega-nav-observer-slimmer.js +8 -3
  143. package/dist/collection/components/vega-nav/vega-left-nav-link/slimmers/controllers/vega-left-nav-link-controller.js +21 -4
  144. package/dist/collection/components/vega-rich-text-editor/dto/annotations/link-annotation.js +1 -1
  145. package/dist/collection/components/vega-rich-text-editor/dto/annotations/link-group-annotation.js +5 -7
  146. package/dist/collection/components/vega-rich-text-editor/dto/blocks/text-block.js +3 -5
  147. package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +7 -2
  148. package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/vega-rich-text-editor-renderer.js +1 -5
  149. package/dist/collection/components/vega-rich-text-editor/test/dto/annotations.test.js +9 -1
  150. package/dist/collection/components/vega-rich-text-editor/test/dto/blocks/text-block.test.js +1 -1
  151. package/dist/collection/components/vega-rich-text-editor/test/dto/content-state.test.js +51 -40
  152. package/dist/collection/helpers/calendar/calendar-date.js +10 -8
  153. package/dist/collection/helpers/calendar/calendar-event.js +152 -16
  154. package/dist/collection/helpers/calendar/calendar-period/calendar-period.abstract.js +13 -4
  155. package/dist/collection/helpers/calendar/calendar-period/day-period.js +4 -4
  156. package/dist/collection/helpers/calendar/calendar-period/month-period.js +7 -6
  157. package/dist/collection/helpers/calendar/calendar-period/week-period.js +3 -3
  158. package/dist/collection/helpers/calendar/calendar-view-generator/week-view-generator.js +1 -1
  159. package/dist/collection/helpers/calendar/test/calendar-date.test.js +24 -0
  160. package/dist/collection/helpers/calendar/test/calendar-event.test.js +71 -0
  161. package/dist/collection/helpers/calendar/test/calendar-period/day-period.test.js +28 -0
  162. package/dist/collection/helpers/calendar/test/calendar-period/month-period.test.js +35 -0
  163. package/dist/collection/helpers/calendar/test/calendar-period/week-period.test.js +43 -0
  164. package/dist/collection/helpers/calendar/test/utils.test.js +29 -1
  165. package/dist/collection/helpers/calendar/utils.js +46 -0
  166. package/dist/collection/helpers/change-manager/subject/static-subject/static-subject-title.js +0 -3
  167. package/dist/collection/helpers/event-manager/event-id/vega-internal-event-id.js +4 -0
  168. package/dist/collection/helpers/validator/form-field-controller.js +13 -3
  169. package/dist/collection/utils/test/ui.test.js +55 -0
  170. package/dist/collection/utils/ui.js +16 -3
  171. package/dist/esm/{app-globals-2623304e.js → app-globals-1bacb762.js} +10 -10
  172. package/dist/esm/{brand-switch-state-controller-slimmer-d6e4d217.js → brand-switch-state-controller-slimmer-60249013.js} +1 -1
  173. package/dist/esm/{child-nodes-event-prevent-slimmer-7fe3dc57.js → child-nodes-event-prevent-slimmer-f32efdee.js} +1 -1
  174. package/dist/esm/{child-nodes-notify-observer-slimmer-78f77c2c.js → child-nodes-notify-observer-slimmer-b676cd2b.js} +1 -1
  175. package/dist/esm/{code-block-23e7f8d0.js → code-block-cb657afd.js} +13 -17
  176. package/dist/esm/{component-value-history-controller-slimmer.abstract-df25e4a1.js → component-value-history-controller-slimmer.abstract-65a83eaf.js} +6 -6
  177. package/dist/esm/{dark-mode-state-controller-slimmer-0c7d1c77.js → dark-mode-state-controller-slimmer-f2b4f8ed.js} +1 -1
  178. package/dist/esm/{dark-mode-style-controller-972e1f06.js → dark-mode-style-controller-b7e85b6a.js} +1 -1
  179. package/dist/esm/{design-token-0f439510.js → design-token-3889675a.js} +1 -1
  180. package/dist/esm/{dom-node-subject-observer-factory-c7bc3035.js → dom-node-subject-observer-factory-ed4b89f4.js} +1 -1
  181. package/dist/esm/{dto-renderer-manager-65b7b1b1.js → dto-renderer-manager-8cac8f0f.js} +11 -6
  182. package/dist/esm/{element-appender-slimmer-bf5ca501.js → element-appender-slimmer-31b21e1b.js} +6 -6
  183. package/dist/esm/{event-emit-slimmer-3922d816.js → event-emit-slimmer-000ca6a7.js} +2 -2
  184. package/dist/esm/{form-field-controller-slimmer-f7e8845b.js → form-field-controller-slimmer-24dbc255.js} +16 -8
  185. package/dist/esm/{image-annotation-action-af21ea8f.js → image-annotation-action-59ea166c.js} +5 -5
  186. package/dist/esm/{index-057d0f70.js → index-090d31ca.js} +1 -0
  187. package/dist/esm/{index-7fe93427.js → index-50b32f3d.js} +2 -2
  188. package/dist/esm/index.js +16 -16
  189. package/dist/esm/{inject-keyboard-manager-109817bf.js → inject-keyboard-manager-f7d92809.js} +1 -1
  190. package/dist/esm/{internal-vega-event-manager-cb06e987.js → internal-vega-event-manager-13e3ed3d.js} +1 -1
  191. package/dist/esm/{keyboard-manager-ab521d22.js → keyboard-manager-f4bbc452.js} +1 -1
  192. package/dist/esm/{keyboard-manager-slimmer-cae3a002.js → keyboard-manager-slimmer-a02cbc5f.js} +1 -1
  193. package/dist/esm/{language-extension-d355f9aa.js → language-extension-038014ac.js} +2 -2
  194. package/dist/esm/loader.js +15 -15
  195. package/dist/esm/{public-rules-1a5da7bf.js → public-rules-a42e6f59.js} +8 -8
  196. package/dist/esm/{range-fac2962c.js → range-c08d8de1.js} +2 -2
  197. package/dist/esm/{responsive-format-facade-2904b456.js → responsive-format-facade-d8ccc742.js} +5 -5
  198. package/dist/esm/{rich-text-editor-required-rule-bb94d680.js → rich-text-editor-required-rule-3a8f319c.js} +1 -1
  199. package/dist/esm/{static-subject-title-633b3474.js → static-subject-title-52f93124.js} +1 -5
  200. package/dist/esm/{string-input-formatter-slimmer-69117deb.js → string-input-formatter-slimmer-c64c7855.js} +3 -3
  201. package/dist/esm/{style-formatter-a724e38d.js → style-formatter-ab6a9248.js} +1 -1
  202. package/dist/esm/{sub-state-notify-slimmer-4252a90e.js → sub-state-notify-slimmer-8b3b15ee.js} +2 -2
  203. package/dist/esm/{sub-state-observer-slimmer-baa8853a.js → sub-state-observer-slimmer-2b98e2c9.js} +3 -3
  204. package/dist/esm/{token-extension-89eeef74.js → token-extension-f5bf06a5.js} +6 -6
  205. package/dist/esm/{translation-833d9ef4.js → translation-f10b1e19.js} +1 -1
  206. package/dist/esm/{translation-slimmer-c83b52c1.js → translation-slimmer-984c9ce6.js} +1 -1
  207. package/dist/esm/{ui-c20be16d.js → ui-bb99c0c2.js} +16 -3
  208. package/dist/esm/vega-accordion.entry.js +14 -14
  209. package/dist/esm/vega-app-footer.entry.js +4 -4
  210. package/dist/esm/vega-app-header-button.entry.js +15 -15
  211. package/dist/esm/vega-backdrop.entry.js +2 -2
  212. package/dist/esm/vega-banner.entry.js +5 -5
  213. package/dist/esm/vega-bar-chart.entry.js +1 -1
  214. package/dist/esm/vega-box.entry.js +14 -14
  215. package/dist/esm/vega-brand-logo.entry.js +4 -4
  216. package/dist/esm/vega-breadcrumb.entry.js +6 -6
  217. package/dist/esm/vega-button-circle.entry.js +20 -17
  218. package/dist/esm/vega-button-group_2.entry.js +9 -9
  219. package/dist/esm/vega-button-link.entry.js +6 -6
  220. package/dist/esm/vega-button.entry.js +20 -15
  221. package/dist/esm/vega-calendar_4.entry.js +529 -227
  222. package/dist/esm/vega-card.entry.js +13 -13
  223. package/dist/esm/vega-carousel.entry.js +13 -13
  224. package/dist/esm/vega-checkbox_2.entry.js +12 -12
  225. package/dist/esm/vega-chip.entry.js +15 -15
  226. package/dist/esm/vega-code-block.entry.js +16 -16
  227. package/dist/esm/vega-color-picker.entry.js +10 -10
  228. package/dist/esm/vega-combo-box.entry.js +13 -13
  229. package/dist/esm/vega-counter-badge.entry.js +1 -1
  230. package/dist/esm/vega-date-picker_2.entry.js +63 -26
  231. package/dist/esm/vega-dialog_2.entry.js +16 -16
  232. package/dist/esm/vega-divider.entry.js +13 -13
  233. package/dist/esm/vega-dropdown_5.entry.js +24 -23
  234. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  235. package/dist/esm/vega-field-error.entry.js +2 -2
  236. package/dist/esm/vega-field-label.entry.js +5 -5
  237. package/dist/esm/vega-file-uploader.entry.js +11 -11
  238. package/dist/esm/vega-flag-icon.entry.js +13 -13
  239. package/dist/esm/vega-flex.entry.js +14 -14
  240. package/dist/esm/vega-font.entry.js +13 -13
  241. package/dist/esm/vega-form.entry.js +636 -323
  242. package/dist/esm/vega-grid.entry.js +13 -13
  243. package/dist/esm/vega-hint.entry.js +1 -1
  244. package/dist/esm/vega-icon.entry.js +13 -13
  245. package/dist/esm/vega-image-uploader.entry.js +18 -18
  246. package/dist/esm/vega-input-credit-card.entry.js +11 -11
  247. package/dist/esm/vega-input-numeric.entry.js +14 -14
  248. package/dist/esm/vega-input-phone-number.entry.js +15 -15
  249. package/dist/esm/vega-input-range.entry.js +12 -12
  250. package/dist/esm/vega-input-select.entry.js +17 -17
  251. package/dist/esm/vega-input.entry.js +12 -12
  252. package/dist/esm/{vega-internal-event-id-5a143cd2.js → vega-internal-event-id-5c3e5f7f.js} +5 -1
  253. package/dist/esm/vega-item-toggle.entry.js +5 -5
  254. package/dist/esm/vega-left-nav_5.entry.js +45 -21
  255. package/dist/esm/vega-line-chart.entry.js +1 -1
  256. package/dist/esm/vega-loader-wrapper_2.entry.js +12 -12
  257. package/dist/esm/vega-page-notification_2.entry.js +3 -3
  258. package/dist/esm/vega-pagination-page-selector-mobile.entry.js +6 -6
  259. package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +7 -7
  260. package/dist/esm/vega-pagination.entry.js +15 -15
  261. package/dist/esm/vega-pie-chart.entry.js +1 -1
  262. package/dist/esm/vega-popover_2.entry.js +17 -17
  263. package/dist/esm/vega-progress-tracker.entry.js +5 -5
  264. package/dist/esm/vega-radio_2.entry.js +14 -14
  265. package/dist/esm/vega-rich-text-content.entry.js +11 -11
  266. package/dist/esm/vega-rich-text-editor_4.entry.js +25 -29
  267. package/dist/esm/vega-section-title.entry.js +1 -1
  268. package/dist/esm/vega-segment-control.entry.js +5 -5
  269. package/dist/esm/vega-selection-chip_2.entry.js +17 -17
  270. package/dist/esm/vega-selection-tile_2.entry.js +13 -13
  271. package/dist/esm/vega-sidenav_3.entry.js +15 -15
  272. package/dist/esm/vega-signature-capture.entry.js +17 -17
  273. package/dist/esm/vega-skeleton.entry.js +1 -1
  274. package/dist/esm/vega-slot-container.entry.js +1 -1
  275. package/dist/esm/vega-stepper.entry.js +11 -11
  276. package/dist/esm/vega-tab-group_2.entry.js +7 -7
  277. package/dist/esm/vega-table_8.entry.js +17 -17
  278. package/dist/esm/vega-text.entry.js +2 -2
  279. package/dist/esm/vega-textarea.entry.js +11 -11
  280. package/dist/esm/vega-time-picker_2.entry.js +20 -20
  281. package/dist/esm/vega-toggle-switch.entry.js +10 -10
  282. package/dist/esm/vega-tooltip_2.entry.js +15 -15
  283. package/dist/esm/vega.js +15 -15
  284. package/dist/sri/vega-sri-loader.js +147 -0
  285. package/dist/sri/vega-sri-manifest.json +698 -0
  286. package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-current-period-controller.d.ts +1 -0
  287. package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-controller.d.ts +6 -0
  288. package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-preivew-popover-controller.d.ts +5 -0
  289. package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-post-operation-date-controller.d.ts +6 -0
  290. package/dist/types/components/vega-calendar/slimmers/common/helpers/repeat-pattern/calendar-event-repeat-pattern-factory.d.ts +3 -1
  291. package/dist/types/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-time-marker-renderer.d.ts +1 -0
  292. package/dist/types/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-view-with-time-renderer.d.ts +1 -0
  293. package/dist/types/components/vega-calendar/slimmers/month-view/renderers/vega-calendar-month-view-renderer.d.ts +1 -0
  294. package/dist/types/components/vega-calendar/types.d.ts +5 -0
  295. package/dist/types/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.d.ts +3 -0
  296. package/dist/types/components/vega-calendar/vega-calendar.d.ts +17 -0
  297. package/dist/types/components/vega-date-picker/slimmers/renderers/vega-date-picker-calendar-renderer.d.ts +13 -0
  298. package/dist/types/components/vega-date-picker/vega-date-picker.d.ts +1 -0
  299. package/dist/types/components/vega-dropdown/vega-dropdown.d.ts +1 -0
  300. package/dist/types/components/vega-form/slimmers/controllers/vega-form-field-controller.d.ts +158 -0
  301. package/dist/types/components/vega-form/slimmers/controllers/vega-form-reset-controller.d.ts +43 -0
  302. package/dist/types/components/vega-form/slimmers/controllers/vega-form-submit-controller.d.ts +55 -0
  303. package/dist/types/components/vega-form/slimmers/renderers/native-form-renderer.d.ts +12 -0
  304. package/dist/types/components/vega-form/types.d.ts +13 -0
  305. package/dist/types/components/vega-form/vega-form.d.ts +28 -97
  306. package/dist/types/components/vega-nav/slimmers/vega-nav-observer-slimmer.d.ts +3 -0
  307. package/dist/types/components/vega-nav/vega-left-nav-link/slimmers/controllers/vega-left-nav-link-controller.d.ts +8 -0
  308. package/dist/types/components/vega-rich-text-editor/dto/annotations/link-group-annotation.d.ts +0 -1
  309. package/dist/types/components/vega-rich-text-editor/dto/blocks/text-block.d.ts +1 -2
  310. package/dist/types/components/vega-rich-text-editor/dto/content-state.d.ts +2 -1
  311. package/dist/types/components.d.ts +42 -1
  312. package/dist/types/helpers/calendar/calendar-date.d.ts +5 -3
  313. package/dist/types/helpers/calendar/calendar-event.d.ts +50 -1
  314. package/dist/types/helpers/calendar/calendar-period/calendar-period.abstract.d.ts +8 -1
  315. package/dist/types/helpers/calendar/calendar-period/day-period.d.ts +1 -1
  316. package/dist/types/helpers/calendar/calendar-period/month-period.d.ts +4 -3
  317. package/dist/types/helpers/calendar/calendar-period/week-period.d.ts +1 -1
  318. package/dist/types/helpers/calendar/utils.d.ts +22 -0
  319. package/dist/types/helpers/change-manager/subject/static-subject/static-subject-title.d.ts +1 -4
  320. package/dist/types/helpers/event-manager/event-id/vega-internal-event-id.d.ts +4 -0
  321. package/dist/types/types/components.type.d.ts +0 -1
  322. package/dist/types/utils/ui.d.ts +5 -1
  323. package/dist/vega/index.esm.js +1 -1
  324. package/dist/vega/p-050bb2ad.entry.js +1 -0
  325. package/dist/vega/{p-3cdbee7e.js → p-053eb64a.js} +1 -1
  326. package/dist/vega/{p-76c7538a.entry.js → p-0685cba6.entry.js} +1 -1
  327. package/dist/vega/{p-476cc642.entry.js → p-0b38a01f.entry.js} +1 -1
  328. package/dist/vega/{p-5e4fb663.entry.js → p-0bb3be0b.entry.js} +1 -1
  329. package/dist/vega/{p-e74c275a.entry.js → p-12d4488b.entry.js} +1 -1
  330. package/dist/vega/{p-5397648b.entry.js → p-13c6a04c.entry.js} +1 -1
  331. package/dist/vega/{p-b6c51409.entry.js → p-185dfdd4.entry.js} +1 -1
  332. package/dist/vega/{p-942fc9b9.js → p-199dc74b.js} +1 -1
  333. package/dist/vega/p-1bd5d806.entry.js +1 -0
  334. package/dist/vega/p-1eb5b772.entry.js +1 -0
  335. package/dist/vega/{p-2591f217.entry.js → p-1f061725.entry.js} +1 -1
  336. package/dist/vega/{p-64c281ec.entry.js → p-1f43f551.entry.js} +1 -1
  337. package/dist/vega/{p-1da54ff3.js → p-2033f86e.js} +1 -1
  338. package/dist/vega/{p-e513f041.js → p-228de113.js} +1 -1
  339. package/dist/vega/{p-f1436035.js → p-24cb0a7e.js} +1 -1
  340. package/dist/vega/{p-f92fc49b.entry.js → p-299e14b4.entry.js} +1 -1
  341. package/dist/vega/{p-da6369d4.entry.js → p-2d91799a.entry.js} +1 -1
  342. package/dist/vega/{p-0bc93777.entry.js → p-2f4f3744.entry.js} +1 -1
  343. package/dist/vega/{p-b32f7aac.entry.js → p-303efbfe.entry.js} +1 -1
  344. package/dist/vega/p-308aa2e3.js +1 -0
  345. package/dist/vega/{p-d15e70d7.entry.js → p-33837794.entry.js} +1 -1
  346. package/dist/vega/p-33c6fb3f.entry.js +1 -0
  347. package/dist/vega/{p-9b2d8516.entry.js → p-3494a5f1.entry.js} +1 -1
  348. package/dist/vega/{p-66199d68.js → p-378e5881.js} +1 -1
  349. package/dist/vega/{p-bf0ced3c.js → p-39482a1a.js} +1 -1
  350. package/dist/vega/p-39b4c838.js +1 -0
  351. package/dist/vega/{p-3be7bfee.entry.js → p-3b953a24.entry.js} +1 -1
  352. package/dist/vega/{p-2ee4def0.js → p-3c21b875.js} +1 -1
  353. package/dist/vega/p-43257678.js +1 -0
  354. package/dist/vega/{p-4c3075ef.js → p-45ead9fe.js} +1 -1
  355. package/dist/vega/{p-351405f2.entry.js → p-4897bedd.entry.js} +1 -1
  356. package/dist/vega/{p-02a4732a.js → p-4c192985.js} +1 -1
  357. package/dist/vega/{p-cc5a3a1b.entry.js → p-4dd6554e.entry.js} +1 -1
  358. package/dist/vega/{p-d4564bfd.js → p-521d1d07.js} +1 -1
  359. package/dist/vega/{p-57257de0.entry.js → p-5910be31.entry.js} +1 -1
  360. package/dist/vega/{p-9c309b85.entry.js → p-59d70a67.entry.js} +1 -1
  361. package/dist/vega/{p-20223e8e.entry.js → p-5cdcd08f.entry.js} +1 -1
  362. package/dist/vega/{p-589b7ea3.entry.js → p-5d36cc3f.entry.js} +1 -1
  363. package/dist/vega/{p-09cb98f3.entry.js → p-5e1c913d.entry.js} +1 -1
  364. package/dist/vega/p-5e2ef0b8.entry.js +1 -0
  365. package/dist/vega/p-5f377954.js +1 -1
  366. package/dist/vega/{p-81fbf18f.entry.js → p-5f854901.entry.js} +1 -1
  367. package/dist/vega/p-5fec05a2.js +1 -0
  368. package/dist/vega/p-63596567.entry.js +1 -0
  369. package/dist/vega/{p-92469fa1.entry.js → p-63a5bbf4.entry.js} +1 -1
  370. package/dist/vega/{p-89d2cf34.js → p-64c3d021.js} +1 -1
  371. package/dist/vega/{p-0b36f4ce.js → p-651fe4fc.js} +1 -1
  372. package/dist/vega/{p-26ef2066.entry.js → p-671afda4.entry.js} +1 -1
  373. package/dist/vega/{p-5970369e.entry.js → p-676bee73.entry.js} +1 -1
  374. package/dist/vega/{p-6180c1af.entry.js → p-6a4db686.entry.js} +1 -1
  375. package/dist/vega/{p-614e450a.entry.js → p-6ce1e9d4.entry.js} +1 -1
  376. package/dist/vega/{p-460429da.entry.js → p-6d371296.entry.js} +1 -1
  377. package/dist/vega/{p-bc0ae89a.entry.js → p-6f96dd01.entry.js} +1 -1
  378. package/dist/vega/{p-2d58cf34.entry.js → p-719354e7.entry.js} +1 -1
  379. package/dist/vega/{p-134ed822.entry.js → p-74e684fc.entry.js} +1 -1
  380. package/dist/vega/{p-969066d3.entry.js → p-78d607ca.entry.js} +1 -1
  381. package/dist/vega/p-7c594a9f.js +1 -0
  382. package/dist/vega/p-7cd2b93b.js +1 -0
  383. package/dist/vega/{p-8a484812.entry.js → p-833d81d0.entry.js} +1 -1
  384. package/dist/vega/{p-4f21faf1.js → p-840c09c7.js} +1 -1
  385. package/dist/vega/p-852fa2d2.entry.js +1 -0
  386. package/dist/vega/{p-4f5a2b0c.entry.js → p-85ad1c21.entry.js} +1 -1
  387. package/dist/vega/{p-b4d88fce.entry.js → p-8a5c123f.entry.js} +1 -1
  388. package/dist/vega/{p-5313d0bc.js → p-901ff5d3.js} +1 -1
  389. package/dist/vega/{p-2f88ba36.entry.js → p-9439077d.entry.js} +1 -1
  390. package/dist/vega/{p-c2377afa.js → p-99b1492c.js} +1 -1
  391. package/dist/vega/{p-40924882.entry.js → p-9d492a46.entry.js} +1 -1
  392. package/dist/vega/p-9e6db93d.entry.js +1 -0
  393. package/dist/vega/{p-427b2b55.entry.js → p-a082d41b.entry.js} +1 -1
  394. package/dist/vega/{p-27dfa896.js → p-a4912b85.js} +1 -1
  395. package/dist/vega/p-a528714c.js +1 -0
  396. package/dist/vega/{p-521ace2d.js → p-a5713178.js} +1 -1
  397. package/dist/vega/{p-7cd2fac8.entry.js → p-a6010b93.entry.js} +1 -1
  398. package/dist/vega/{p-b110b7bd.entry.js → p-a61e2108.entry.js} +1 -1
  399. package/dist/vega/{p-3fba9e77.entry.js → p-a69c9e42.entry.js} +1 -1
  400. package/dist/vega/{p-cfb2af9c.entry.js → p-ab3c4b43.entry.js} +1 -1
  401. package/dist/vega/{p-8175d8de.entry.js → p-ad2055f4.entry.js} +1 -1
  402. package/dist/vega/{p-0717073b.entry.js → p-ae598946.entry.js} +1 -1
  403. package/dist/vega/{p-743c5baf.js → p-b4c25109.js} +1 -1
  404. package/dist/vega/{p-2608b9fe.js → p-b510e4d7.js} +1 -1
  405. package/dist/vega/{p-2a1b3108.entry.js → p-b68a13df.entry.js} +1 -1
  406. package/dist/vega/{p-320cccc5.entry.js → p-ba24f7b9.entry.js} +1 -1
  407. package/dist/vega/{p-2b90fae6.js → p-bc9484a6.js} +1 -1
  408. package/dist/vega/{p-dcae53cf.entry.js → p-c12000ee.entry.js} +1 -1
  409. package/dist/vega/{p-25c831a4.entry.js → p-c1fa6088.entry.js} +2 -2
  410. package/dist/vega/{p-ab29f968.js → p-c241f615.js} +1 -1
  411. package/dist/vega/{p-6244b0ad.entry.js → p-c682d53c.entry.js} +1 -1
  412. package/dist/vega/{p-c61f8ca6.entry.js → p-c8a3fb7f.entry.js} +1 -1
  413. package/dist/vega/{p-0ec14fbc.entry.js → p-c96d28dc.entry.js} +1 -1
  414. package/dist/vega/p-cef9f638.js +1 -0
  415. package/dist/vega/{p-648134d2.entry.js → p-cf211582.entry.js} +1 -1
  416. package/dist/vega/p-d3137a6e.entry.js +1 -0
  417. package/dist/vega/p-d418ecc1.entry.js +1 -0
  418. package/dist/vega/p-d5d6dae6.js +1 -0
  419. package/dist/vega/p-d5ff8b7f.js +1 -0
  420. package/dist/vega/p-d9671d27.js +1 -0
  421. package/dist/vega/{p-7bad6577.entry.js → p-dabba918.entry.js} +1 -1
  422. package/dist/vega/{p-dadc6ab3.js → p-dc92fec6.js} +1 -1
  423. package/dist/vega/{p-36ae2dd3.entry.js → p-e5af5a4d.entry.js} +1 -1
  424. package/dist/vega/{p-b1054e18.entry.js → p-e853105a.entry.js} +1 -1
  425. package/dist/vega/{p-d72abacd.entry.js → p-e9b86dac.entry.js} +1 -1
  426. package/dist/vega/p-ebfc4323.entry.js +1 -0
  427. package/dist/vega/{p-81765b4b.entry.js → p-f83739d0.entry.js} +1 -1
  428. package/dist/vega/{p-6585cfd5.entry.js → p-fbc85265.entry.js} +1 -1
  429. package/dist/vega/{p-3ab20f9e.entry.js → p-fbd38139.entry.js} +1 -1
  430. package/dist/vega/{p-bdd9ef3b.js → p-fddca002.js} +1 -1
  431. package/dist/vega/{p-de1ee131.entry.js → p-fee972e6.entry.js} +1 -1
  432. package/dist/vega/{p-b73532c0.entry.js → p-fff13ed1.entry.js} +1 -1
  433. package/dist/vega/vega.esm.js +1 -1
  434. package/package.json +3 -2
  435. package/dist/vega/p-02b29c18.js +0 -1
  436. package/dist/vega/p-079f5d94.entry.js +0 -1
  437. package/dist/vega/p-0e3cd270.entry.js +0 -1
  438. package/dist/vega/p-0e954b9b.js +0 -1
  439. package/dist/vega/p-10454aa5.entry.js +0 -1
  440. package/dist/vega/p-258f9603.js +0 -1
  441. package/dist/vega/p-51d40b0d.entry.js +0 -1
  442. package/dist/vega/p-56ff8559.entry.js +0 -1
  443. package/dist/vega/p-575235c8.js +0 -1
  444. package/dist/vega/p-657446a3.entry.js +0 -1
  445. package/dist/vega/p-6908117a.js +0 -1
  446. package/dist/vega/p-846ae5fb.js +0 -1
  447. package/dist/vega/p-893d5dfa.js +0 -1
  448. package/dist/vega/p-8a6b820a.entry.js +0 -1
  449. package/dist/vega/p-8a877e12.js +0 -1
  450. package/dist/vega/p-9ffd2a96.entry.js +0 -1
  451. package/dist/vega/p-bb61f015.js +0 -1
  452. package/dist/vega/p-c7726252.js +0 -1
  453. package/dist/vega/p-d85b0bfa.entry.js +0 -1
  454. package/dist/vega/p-d87c3058.entry.js +0 -1
  455. package/dist/vega/p-e0729c4d.entry.js +0 -1
  456. package/dist/vega/p-e5cd6521.js +0 -1
  457. /package/dist/vega/{p-48a58baf.js → p-6b2342e0.js} +0 -0
@@ -2,7 +2,8 @@ import calendarEventRepeatPatternFactory from '../../components/vega-calendar/sl
2
2
  import { generateUUID } from '../../utils/misc';
3
3
  import { VegaInternalTranslation } from '../translation';
4
4
  import { CalendarDate } from './calendar-date';
5
- import { formatDisplayTime, WeekdayLongNames } from './utils';
5
+ import { formatDisplayTime, getSystemTimezone, WeekdayLongNames } from './utils';
6
+ import { LogUtility } from '../../utils/log';
6
7
  const CalendarDateFormatReg = /^\d{1,2}\/\d{1,2}\/\d{4}/;
7
8
  const CalendarTimeFormatReg = /^\d{1,2}:\d{1,2}/;
8
9
  /** The `CalendarEvent` class in TypeScript represents a calendar event with methods to validate required fields, initialize dates and times, and determine if it is a group event. */
@@ -16,13 +17,15 @@ export class CalendarEvent {
16
17
  * @param {string} eventKey If a value is not provided for `eventKey`, a UUID (Universally
17
18
  * Unique Identifier) will be generated as a default value. This identifier is used to distinguish
18
19
  * different events and can be helpful for tracking
20
+ * @param {string} timezone - Optional timezone identifier for timezone-aware date calculations
19
21
  */
20
- constructor(eventOptions, eventKey) {
22
+ constructor(eventOptions, eventKey, timezone) {
21
23
  // the default value is 1 when the event end date is same as start date
22
24
  this._eventSpansDays = 1;
23
25
  this.repeatPattern = null;
24
26
  this._event = eventOptions;
25
27
  this._eventKey = eventKey || generateUUID();
28
+ this._timezone = timezone || getSystemTimezone();
26
29
  this.checkEventRequireField(eventOptions);
27
30
  this.initDate(eventOptions);
28
31
  this.initEventSpansDays();
@@ -202,7 +205,7 @@ export class CalendarEvent {
202
205
  getEventDuration() {
203
206
  const [startHour, startMinutes] = this.startTime.split(':');
204
207
  const [endHour, endMinutes] = this.endTime.split(':');
205
- const now = CalendarDate.from(new Date());
208
+ const now = CalendarDate.from(new Date(), this._timezone);
206
209
  const startDate = new Date(now.year, now.month, now.date, Number(startHour), Number(startMinutes));
207
210
  const endDate = new Date(now.year, now.month, now.date, Number(endHour) === 0 && Number(startHour) !== 0 ? 24 : Number(endHour), Number(endMinutes));
208
211
  return (endDate.valueOf() - startDate.valueOf()) / (60 * 1000);
@@ -222,6 +225,17 @@ export class CalendarEvent {
222
225
  }
223
226
  return [];
224
227
  }
228
+ /**
229
+ * Refresh event dates and related properties when timezone changes
230
+ *
231
+ * @param {string} timezone - The new timezone to apply to the event
232
+ */
233
+ updateTimezone(timezone) {
234
+ this._timezone = timezone;
235
+ this.initDate(this._event);
236
+ this.initEventSpansDays();
237
+ this.initRepeatPattern();
238
+ }
225
239
  /**
226
240
  * The function `convertTimeTo24Hour` converts a time string from 12-hour format to 24-hour format in TypeScript.
227
241
  *
@@ -279,42 +293,164 @@ export class CalendarEvent {
279
293
  */
280
294
  initDate(eventOptions) {
281
295
  const { startDate, startTime, endDate, endTime } = eventOptions;
296
+ const originalDateParts = this.processStartDate(startDate, startTime || '');
297
+ this._startTime = this.formatTimeForDisplay(this._startDate, startTime || '');
298
+ this.processEndDate(endDate || '', endTime || '', originalDateParts);
299
+ this._endTime = this.formatTimeForDisplay(this._endDate, endTime || '');
300
+ }
301
+ /**
302
+ * Process start date
303
+ *
304
+ * @param {string | Date} startDate - Start date (string or Date object)
305
+ * @param {string} startTime - Start time string
306
+ * @returns {DateParts | undefined} originalDateParts information
307
+ */
308
+ processStartDate(startDate, startTime) {
309
+ let originalDateParts;
310
+ let tempDate;
282
311
  if (startDate && typeof startDate === 'object') {
283
- this._startDate = startDate;
312
+ originalDateParts = {
313
+ year: startDate.getFullYear(),
314
+ month: startDate.getMonth(),
315
+ date: startDate.getDate(),
316
+ };
317
+ tempDate = startDate;
284
318
  }
285
319
  else if (startDate && typeof startDate === 'string') {
286
320
  const [month, day, year] = startDate.split('/');
287
- this._startDate = new Date(Number(year), Number(month) - 1, Number(day));
321
+ originalDateParts = {
322
+ year: Number(year),
323
+ month: Number(month) - 1,
324
+ date: Number(day),
325
+ };
326
+ tempDate = new Date(originalDateParts.year, originalDateParts.month, originalDateParts.date);
288
327
  }
289
- if (!startTime) {
290
- this._startTime = `${this._startDate.getHours()}:${this._startDate.getMinutes()}`;
328
+ if (startTime && originalDateParts && tempDate) {
329
+ const { timeHours, timeMinutes } = this.getCurrentHourAndMinutes(startTime);
330
+ tempDate = new Date(originalDateParts.year, originalDateParts.month, originalDateParts.date, timeHours, timeMinutes, 0);
291
331
  }
292
- else {
293
- this._startTime = this.convertTimeTo24Hour(startTime);
332
+ if (tempDate) {
333
+ this._startDate = this.convertDateToTimezone(tempDate);
294
334
  }
335
+ return originalDateParts;
336
+ }
337
+ /**
338
+ * Process end date
339
+ *
340
+ * @param {string | Date} endDate - End date (string or Date object)
341
+ * @param {string} endTime - End time string
342
+ * @param {DateParts | undefined} fallbackDateParts - Default date parts to use when endDate is empty
343
+ */
344
+ processEndDate(endDate, endTime, fallbackDateParts) {
345
+ let tempDate;
295
346
  if (endDate && typeof endDate === 'object') {
296
- this._endDate = endDate;
347
+ tempDate = endDate;
297
348
  }
298
349
  else if (endDate && typeof endDate === 'string') {
299
350
  const [month, day, year] = endDate.split('/');
300
- this._endDate = new Date(Number(year), Number(month) - 1, Number(day), 23, 59, 59);
351
+ tempDate = new Date(Number(year), Number(month) - 1, Number(day), 23, 59, 59);
301
352
  }
302
353
  else {
303
- this._endDate = new Date(this._startDate.getFullYear(), this._startDate.getMonth(), this._startDate.getDate(), 23, 59, 59);
354
+ if (fallbackDateParts) {
355
+ tempDate = new Date(fallbackDateParts.year, fallbackDateParts.month, fallbackDateParts.date, 23, 59, 59);
356
+ }
357
+ }
358
+ if (endTime && tempDate) {
359
+ const { timeHours, timeMinutes } = this.getCurrentHourAndMinutes(endTime, 23, 59);
360
+ tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), timeHours, timeMinutes, 59);
304
361
  }
305
- if (!endTime) {
306
- this._endTime = `${this._endDate.getHours()}:${this._endDate.getMinutes()}`;
362
+ if (tempDate) {
363
+ this._endDate = this.convertDateToTimezone(tempDate);
364
+ }
365
+ }
366
+ /**
367
+ * Format time for display
368
+ *
369
+ * @param {Date} date - Date object
370
+ * @param {string} originalTime - Original time string
371
+ * @returns {string} Formatted time string
372
+ */
373
+ formatTimeForDisplay(date, originalTime) {
374
+ const shouldUseOriginalTime = Boolean(originalTime) && this._timezone === getSystemTimezone();
375
+ if (shouldUseOriginalTime) {
376
+ const convertedTime = this.convertTimeTo24Hour(originalTime);
377
+ const [hour, minutes] = convertedTime.split(':');
378
+ return `${date.getHours().toString().padStart(hour.length, '0')}:${date
379
+ .getMinutes()
380
+ .toString()
381
+ .padStart(minutes.length, '0')}`;
307
382
  }
308
383
  else {
309
- this._endTime = this.convertTimeTo24Hour(endTime);
384
+ return `${date.getHours()}:${date.getMinutes()}`;
385
+ }
386
+ }
387
+ /**
388
+ * Parses a time string and extracts hour and minute values.
389
+ * If the time string is empty or invalid, returns the provided default values.
390
+ *
391
+ * @param {string} time - The time string to parse (e.g., "14:30", "2:30 PM")
392
+ * @param {number} defaultHours - Default hour value to use when time is empty (default: 0)
393
+ * @param {number} defaultMinutes - Default minute value to use when time is empty (default: 0)
394
+ * @returns {CalendarTimeHourMinutes} An object containing timeHours and timeMinutes as numbers
395
+ */
396
+ getCurrentHourAndMinutes(time, defaultHours = 0, defaultMinutes = 0) {
397
+ let timeHours = defaultHours;
398
+ let timeMinutes = defaultMinutes;
399
+ if (time) {
400
+ const timeString = this.convertTimeTo24Hour(time).split(':');
401
+ timeHours = Number(timeString[0]);
402
+ timeMinutes = Number(timeString[1]);
403
+ }
404
+ return { timeHours, timeMinutes };
405
+ }
406
+ /**
407
+ * Converts a Date object to the target timezone
408
+ *
409
+ * @param {Date} date - The Date object to convert
410
+ * @returns {Date} A Date object representing the date/time in the target timezone
411
+ */
412
+ convertDateToTimezone(date) {
413
+ if (this._timezone && this._timezone !== getSystemTimezone()) {
414
+ try {
415
+ const targetFormatter = new Intl.DateTimeFormat([], {
416
+ timeZone: this._timezone,
417
+ year: 'numeric',
418
+ month: '2-digit',
419
+ day: '2-digit',
420
+ hour: '2-digit',
421
+ minute: '2-digit',
422
+ second: '2-digit',
423
+ hour12: false,
424
+ });
425
+ const targetParts = targetFormatter.formatToParts(date);
426
+ const getYear = targetParts.find((part) => part.type === 'year');
427
+ const getMonth = targetParts.find((part) => part.type === 'month');
428
+ const getDay = targetParts.find((part) => part.type === 'day');
429
+ const getHour = targetParts.find((part) => part.type === 'hour');
430
+ const getMinute = targetParts.find((part) => part.type === 'minute');
431
+ const getSecond = targetParts.find((part) => part.type === 'second');
432
+ if (getYear && getMonth && getDay && getHour && getMinute && getSecond) {
433
+ const year = parseInt(getYear.value, 10);
434
+ const month = parseInt(getMonth.value, 10);
435
+ const day = parseInt(getDay.value, 10);
436
+ const hour = parseInt(getHour.value, 10);
437
+ const minute = parseInt(getMinute.value, 10);
438
+ const second = parseInt(getSecond.value, 10);
439
+ return new Date(year, month - 1, day, hour, minute, second);
440
+ }
441
+ }
442
+ catch (error) {
443
+ LogUtility.warn('Invalid timezone:', this._timezone);
444
+ }
310
445
  }
446
+ return date;
311
447
  }
312
448
  /**
313
449
  * The function initializes a repeat pattern controller for a calendar event with specified start and end dates and repeat options.
314
450
  */
315
451
  initRepeatPattern() {
316
452
  if (this._event.repeatOptions && this._event.repeatOptions.frequency) {
317
- this.repeatPattern = calendarEventRepeatPatternFactory.getPattern(this._startDate, this._event.repeatOptions);
453
+ this.repeatPattern = calendarEventRepeatPatternFactory.getPattern(this._startDate, this._event.repeatOptions, this._timezone);
318
454
  }
319
455
  }
320
456
  /**
@@ -1,12 +1,13 @@
1
1
  import { CalendarDate } from '../calendar-date';
2
- import { getWeekdays } from '../utils';
2
+ import { getSystemTimezone, getWeekdays } from '../utils';
3
3
  /**
4
4
  * CalendarPeriod is an abstract class that represents a period of date for calendar.
5
5
  */
6
6
  export class CalendarPeriod {
7
- constructor(count, current) {
7
+ constructor(count, current, timezone) {
8
8
  this._count = count;
9
- this._current = current ? current : CalendarDate.from(new Date());
9
+ this._timezone = timezone || getSystemTimezone();
10
+ this._current = current ? current : CalendarDate.from(new Date(), this._timezone);
10
11
  this.calculatePeriod(this._current);
11
12
  }
12
13
  /**
@@ -57,6 +58,14 @@ export class CalendarPeriod {
57
58
  get showWeekends() {
58
59
  return this._showWeekends;
59
60
  }
61
+ /**
62
+ * The timezone of the period.
63
+ *
64
+ * @type {string | undefined}
65
+ */
66
+ get timezone() {
67
+ return this._timezone;
68
+ }
60
69
  /**
61
70
  * Go to a specific date.
62
71
  *
@@ -72,7 +81,7 @@ export class CalendarPeriod {
72
81
  * @returns {this} - The current period.
73
82
  */
74
83
  now() {
75
- return this.createBy(CalendarDate.from(new Date()));
84
+ return this.createBy(CalendarDate.from(new Date(), this._timezone));
76
85
  }
77
86
  /**
78
87
  * Calculate the period start date and end date.
@@ -5,8 +5,8 @@ import { DateDirection, getClosestWorkday } from '../../../components/vega-calen
5
5
  * Period of day.
6
6
  */
7
7
  export class DayPeriod extends CalendarPeriod {
8
- constructor(current, showWeekends) {
9
- super(DayPeriod.DISPLAY_DATE_COUNT, current);
8
+ constructor(current, showWeekends, timezone) {
9
+ super(DayPeriod.DISPLAY_DATE_COUNT, current, timezone);
10
10
  this._type = 'day';
11
11
  this._showWeekends = true;
12
12
  this._showWeekends = showWeekends === false ? false : true;
@@ -41,7 +41,7 @@ export class DayPeriod extends CalendarPeriod {
41
41
  * @returns {this} - The current period.
42
42
  */
43
43
  now() {
44
- let calendarDate = CalendarDate.from(new Date());
44
+ let calendarDate = CalendarDate.from(new Date(), this.timezone);
45
45
  if (this._showWeekends === false) {
46
46
  calendarDate = getClosestWorkday(calendarDate);
47
47
  }
@@ -51,7 +51,7 @@ export class DayPeriod extends CalendarPeriod {
51
51
  * @inheritDoc
52
52
  */
53
53
  createBy(current) {
54
- return new DayPeriod(current, this._showWeekends);
54
+ return new DayPeriod(current, this._showWeekends, this.timezone);
55
55
  }
56
56
  }
57
57
  DayPeriod.DISPLAY_DATE_COUNT = 1;
@@ -5,8 +5,8 @@ import { getWeekdays } from '../utils';
5
5
  * Period of month
6
6
  */
7
7
  export class MonthPeriod extends CalendarPeriod {
8
- constructor(current, showWeekends) {
9
- super(MonthPeriod.DISPLAY_DATE_COUNT, current);
8
+ constructor(current, showWeekends, timezone) {
9
+ super(MonthPeriod.DISPLAY_DATE_COUNT, current, timezone);
10
10
  this._type = 'month';
11
11
  this._showWeekends = true;
12
12
  this._showWeekends = showWeekends === false ? false : true;
@@ -17,12 +17,13 @@ export class MonthPeriod extends CalendarPeriod {
17
17
  * @param {CalendarDate} [calendarDate] - The `calendarDate` parameter is an optional parameter of
18
18
  * type `CalendarDate`. It represents a specific date in the calendar. If a `calendarDate` is
19
19
  * provided, the function will use that date to determine the first day of the month. If no
20
- * `calendarDate` is provided, the function
20
+ * `calendarDate` is provided, the function will use the current date considering timezone.
21
+ * @param {string} [timezone] - The timezone to use when no calendarDate is provided
21
22
  * @returns {CalendarDate} A new `CalendarDate` object representing the first day of the month from the provided
22
23
  * `calendarDate` parameter or the current date if no parameter is provided.
23
24
  */
24
- static getMonthFirstDay(calendarDate) {
25
- const date = calendarDate || CalendarDate.from(new Date());
25
+ static getMonthFirstDay(calendarDate, timezone) {
26
+ const date = calendarDate || CalendarDate.from(new Date(), timezone);
26
27
  return new CalendarDate(date.year, date.month, 1);
27
28
  }
28
29
  /**
@@ -58,7 +59,7 @@ export class MonthPeriod extends CalendarPeriod {
58
59
  * @inheritDoc
59
60
  */
60
61
  createBy(current) {
61
- return new MonthPeriod(current, this._showWeekends);
62
+ return new MonthPeriod(current, this._showWeekends, this.timezone);
62
63
  }
63
64
  }
64
65
  MonthPeriod.DISPLAY_DATE_COUNT = 6 * 7;
@@ -4,8 +4,8 @@ import { CalendarDate } from '../calendar-date';
4
4
  * Period of the week
5
5
  */
6
6
  export class WeekPeriod extends CalendarPeriod {
7
- constructor(current, showWeekends) {
8
- super(WeekPeriod.DISPLAY_DATE_COUNT, current);
7
+ constructor(current, showWeekends, timezone) {
8
+ super(WeekPeriod.DISPLAY_DATE_COUNT, current, timezone);
9
9
  this._type = 'week';
10
10
  this._showWeekends = true;
11
11
  this._showWeekends = showWeekends === false ? false : true;
@@ -30,7 +30,7 @@ export class WeekPeriod extends CalendarPeriod {
30
30
  * @inheritDoc
31
31
  */
32
32
  createBy(current) {
33
- return new WeekPeriod(current, this._showWeekends);
33
+ return new WeekPeriod(current, this._showWeekends, this.timezone);
34
34
  }
35
35
  }
36
36
  WeekPeriod.DISPLAY_DATE_COUNT = 7;
@@ -12,7 +12,7 @@ export class WeekViewGenerator extends CalendarViewGenerator {
12
12
  const dates = this.generateDates(period);
13
13
  const showWeekends = period.showWeekends;
14
14
  let weekDays = this.generateWeekHead();
15
- let dateItems = [dates.map(CalendarDate.from)];
15
+ let dateItems = [dates.map((date) => CalendarDate.from(date))];
16
16
  if (showWeekends === false) {
17
17
  weekDays = weekDays.slice(1, 6);
18
18
  dateItems = dateItems.map((items) => items.slice(1, 6));
@@ -73,3 +73,27 @@ describe('calendar-date', () => {
73
73
  expect(new CalendarDate(2024, 2, 10).getMonthName(true)).toBe('Feb');
74
74
  });
75
75
  });
76
+ describe('CalendarDate Timezone', () => {
77
+ it('should create calendar date', () => {
78
+ const calendarDate = new CalendarDate(2025, 10, 29);
79
+ expect(calendarDate.year).toBe(2025);
80
+ expect(calendarDate.month).toBe(10);
81
+ expect(calendarDate.date).toBe(29);
82
+ });
83
+ it('should check isToday with timezone', () => {
84
+ jest.useFakeTimers('modern');
85
+ jest.setSystemTime(new Date('2025-10-29T03:00:00Z'));
86
+ const calendarDate = new CalendarDate(2025, 10, 29);
87
+ expect(calendarDate.isToday('UTC')).toBe(true);
88
+ expect(calendarDate.isToday('Asia/Shanghai')).toBe(true);
89
+ expect(calendarDate.isToday('America/New_York')).toBe(false);
90
+ jest.useRealTimers();
91
+ });
92
+ it('should convert to Date object', () => {
93
+ const calendarDate = new CalendarDate(2025, 10, 29);
94
+ const dateObj = calendarDate.toDate();
95
+ expect(dateObj.getFullYear()).toBe(2025);
96
+ expect(dateObj.getMonth() + 1).toBe(10);
97
+ expect(dateObj.getDate()).toBe(29);
98
+ });
99
+ });
@@ -1,6 +1,9 @@
1
1
  import { CalendarDate } from '../calendar-date';
2
2
  import { CalendarEvent } from '../calendar-event';
3
3
  import { MonthPeriod } from '../calendar-period/month-period';
4
+ import { newSpecPage } from '@stencil/core/testing';
5
+ import { VegaCalendar } from '../../../components/vega-calendar/vega-calendar';
6
+ import { LogUtility } from '../../../utils/log';
4
7
  const mockDate = new Date(2024, 5, 13, 13, 44);
5
8
  const mockStringDate = '06/13/2024';
6
9
  const rawEvent = {
@@ -188,3 +191,71 @@ describe('calendar-event', () => {
188
191
  expect(calendarEvent11.generateRepeatString()).toBe('');
189
192
  });
190
193
  });
194
+ describe('calendar event with timezone', () => {
195
+ it('should display correct event start time after timezone conversion', async () => {
196
+ const testEvents = [
197
+ {
198
+ key: 'event1',
199
+ title: 'Test Event 1',
200
+ startDate: '10/29/2025',
201
+ endDate: '10/29/2025',
202
+ startTime: '09:00',
203
+ endTime: '17:00',
204
+ isAllDay: false,
205
+ },
206
+ ];
207
+ const page = await newSpecPage({
208
+ components: [VegaCalendar],
209
+ html: `<vega-calendar timezone="UTC" view-mode="week"></vega-calendar>`,
210
+ });
211
+ const component = page.rootInstance;
212
+ const calendarElement = page.body.querySelector('vega-calendar');
213
+ calendarElement.events = testEvents;
214
+ await page.waitForChanges();
215
+ expect(component.calendarEvents).toHaveLength(1);
216
+ const calendarEvent = component.calendarEvents[0];
217
+ expect(calendarEvent.startTime).toBe('09:00');
218
+ calendarElement.timezone = 'Asia/Shanghai';
219
+ expect(calendarEvent.startTime).toBe('17:0');
220
+ expect(calendarEvent.endTime).toBe('1:0');
221
+ calendarElement.timezone = 'America/New_York';
222
+ expect(calendarEvent.startTime).toBe('5:0');
223
+ expect(calendarEvent.endTime).toBe('13:0');
224
+ });
225
+ it('should handle timezone conversion with invalid timezone gracefully', async () => {
226
+ const testEvents = [
227
+ {
228
+ key: 'event1',
229
+ title: 'Test Event 1',
230
+ startDate: '10/29/2025',
231
+ endDate: '10/29/2025',
232
+ startTime: '14:30',
233
+ endTime: '16:45',
234
+ isAllDay: false,
235
+ },
236
+ ];
237
+ const page = await newSpecPage({
238
+ components: [VegaCalendar],
239
+ html: `<vega-calendar timezone="Invalid/Timezone"></vega-calendar>`,
240
+ });
241
+ const calendarElement = page.body.querySelector('vega-calendar');
242
+ calendarElement.events = testEvents;
243
+ spyOn(LogUtility, 'warn');
244
+ await page.waitForChanges();
245
+ expect(LogUtility.warn).toHaveBeenCalledWith('Invalid timezone:', 'Invalid/Timezone');
246
+ });
247
+ it('should not call updateTimezone when no calendar events exist during timezone change', async () => {
248
+ const page = await newSpecPage({
249
+ components: [VegaCalendar],
250
+ html: `<vega-calendar timezone="UTC"></vega-calendar>`,
251
+ });
252
+ const component = page.rootInstance;
253
+ expect(component.calendarEvents).toHaveLength(0);
254
+ const calendarElement = page.body.querySelector('vega-calendar');
255
+ calendarElement.timezone = 'Asia/Shanghai';
256
+ expect(() => {
257
+ component.watchTimezoneChange();
258
+ }).not.toThrow();
259
+ expect(component.postOperationDate).toBeDefined();
260
+ });
261
+ });
@@ -79,3 +79,31 @@ describe('day-period', () => {
79
79
  expect(dayPeriod.current.date).toEqual(8);
80
80
  });
81
81
  });
82
+ describe('DayPeriod Timezone', () => {
83
+ beforeEach(() => {
84
+ jest.useFakeTimers('modern');
85
+ });
86
+ afterEach(() => {
87
+ jest.useRealTimers();
88
+ });
89
+ it('should create day period for a specific date', () => {
90
+ const dayPeriod = new DayPeriod(new CalendarDate(2025, 10, 29));
91
+ expect(dayPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
92
+ expect(dayPeriod.startDate).toEqual(new CalendarDate(2025, 10, 29));
93
+ expect(dayPeriod.endDate).toEqual(new CalendarDate(2025, 10, 29));
94
+ });
95
+ it('should create day period with timezone Asia/Shanghai', () => {
96
+ jest.setSystemTime(new Date('2025-10-29T16:00:00Z'));
97
+ const dayPeriod = new DayPeriod(undefined, true, 'Asia/Shanghai');
98
+ expect(dayPeriod.current).toEqual(new CalendarDate(2025, 10, 30));
99
+ expect(dayPeriod.startDate).toEqual(new CalendarDate(2025, 10, 30));
100
+ expect(dayPeriod.endDate).toEqual(new CalendarDate(2025, 10, 30));
101
+ });
102
+ it('should go to now with timezone America/Los_Angeles', () => {
103
+ jest.setSystemTime(new Date('2025-10-30T06:00:00Z'));
104
+ const nowPeriod = new DayPeriod(undefined, true, 'America/Los_Angeles');
105
+ expect(nowPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
106
+ expect(nowPeriod.startDate).toEqual(new CalendarDate(2025, 10, 29));
107
+ expect(nowPeriod.endDate).toEqual(new CalendarDate(2025, 10, 29));
108
+ });
109
+ });
@@ -66,3 +66,38 @@ describe('month-period', () => {
66
66
  });
67
67
  });
68
68
  });
69
+ describe('MonthPeriod Timezone', () => {
70
+ beforeEach(() => {
71
+ jest.useFakeTimers('modern');
72
+ });
73
+ afterEach(() => {
74
+ jest.useRealTimers();
75
+ });
76
+ it('should create month period for a specific date', () => {
77
+ const monthPeriod = new MonthPeriod(new CalendarDate(2025, 10, 29));
78
+ expect(monthPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
79
+ expect(monthPeriod.startDate.month).toBe(9);
80
+ expect(monthPeriod.endDate.month).toBe(11);
81
+ });
82
+ it('should create month period with timezone Asia/Shanghai', () => {
83
+ jest.setSystemTime(new Date('2025-10-31T16:00:00Z'));
84
+ const monthPeriod = new MonthPeriod(undefined, true, 'Asia/Shanghai');
85
+ expect(monthPeriod.current).toEqual(new CalendarDate(2025, 11, 1));
86
+ expect(monthPeriod.startDate.month).toBe(10);
87
+ expect(monthPeriod.endDate.month).toBe(12);
88
+ });
89
+ it('should go to now with timezone America/Los_Angeles', () => {
90
+ jest.setSystemTime(new Date('2025-11-01T06:00:00Z'));
91
+ const monthPeriod = new MonthPeriod(undefined, true, 'America/Los_Angeles');
92
+ expect(monthPeriod.current).toEqual(new CalendarDate(2025, 10, 31));
93
+ expect(monthPeriod.startDate.month).toBe(9);
94
+ expect(monthPeriod.endDate.month).toBe(11);
95
+ });
96
+ it('should go to another month', () => {
97
+ const monthPeriod = new MonthPeriod(new CalendarDate(2025, 10, 29));
98
+ const nextMonth = monthPeriod.goTo(new CalendarDate(2025, 11, 1));
99
+ expect(nextMonth.current).toEqual(new CalendarDate(2025, 11, 1));
100
+ expect(nextMonth.startDate.month).toBe(10);
101
+ expect(nextMonth.endDate.month).toBe(12);
102
+ });
103
+ });
@@ -58,3 +58,46 @@ describe('week-period', () => {
58
58
  });
59
59
  });
60
60
  });
61
+ describe('WeekPeriod Timezone', () => {
62
+ beforeEach(() => {
63
+ jest.useFakeTimers('modern');
64
+ });
65
+ afterEach(() => {
66
+ jest.useRealTimers();
67
+ });
68
+ it('should create week period for a specific date', () => {
69
+ jest.setSystemTime(new Date('2025-10-29T12:00:00Z'));
70
+ const weekPeriod = new WeekPeriod();
71
+ expect(weekPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
72
+ expect(weekPeriod.startDate).toEqual(new CalendarDate(2025, 10, 26));
73
+ expect(weekPeriod.endDate).toEqual(new CalendarDate(2025, 11, 1));
74
+ });
75
+ it('should create week period with timezone Asia/Shanghai', () => {
76
+ jest.setSystemTime(new Date('2025-10-27T16:00:00Z'));
77
+ const weekPeriod = new WeekPeriod(undefined, true, 'Asia/Shanghai');
78
+ expect(weekPeriod.current).toEqual(new CalendarDate(2025, 10, 28));
79
+ expect(weekPeriod.startDate).toEqual(new CalendarDate(2025, 10, 26));
80
+ expect(weekPeriod.endDate).toEqual(new CalendarDate(2025, 11, 1));
81
+ });
82
+ it('should go to a date in another week', () => {
83
+ const weekPeriod = new WeekPeriod(new CalendarDate(2025, 10, 29));
84
+ const nextWeek = weekPeriod.goTo(new CalendarDate(2025, 11, 4));
85
+ expect(nextWeek.current).toEqual(new CalendarDate(2025, 11, 4));
86
+ expect(nextWeek.startDate).toEqual(new CalendarDate(2025, 11, 2));
87
+ expect(nextWeek.endDate).toEqual(new CalendarDate(2025, 11, 8));
88
+ });
89
+ it('should go to now with timezone America/New_York', () => {
90
+ jest.setSystemTime(new Date('2025-11-02T04:00:00Z'));
91
+ const weekPeriod = new WeekPeriod(undefined, true, 'America/New_York');
92
+ const nowPeriod = weekPeriod.now();
93
+ expect(nowPeriod.current).toEqual(new CalendarDate(2025, 11, 2));
94
+ expect(nowPeriod.startDate).toEqual(new CalendarDate(2025, 11, 2));
95
+ expect(nowPeriod.endDate).toEqual(new CalendarDate(2025, 11, 8));
96
+ });
97
+ it('should handle week period at year boundary', () => {
98
+ const weekPeriod = new WeekPeriod(new CalendarDate(2025, 12, 31));
99
+ expect(weekPeriod.current).toEqual(new CalendarDate(2025, 12, 31));
100
+ expect(weekPeriod.startDate).toEqual(new CalendarDate(2025, 12, 28));
101
+ expect(weekPeriod.endDate).toEqual(new CalendarDate(2026, 1, 3));
102
+ });
103
+ });
@@ -1,4 +1,4 @@
1
- import { getWeekdays } from '../utils';
1
+ import { getWeekdays, getCurrentDatePartsInTimezone, getSystemTimezone } from '../utils';
2
2
  describe('utils', () => {
3
3
  it('should return weekdays as expected by default', () => {
4
4
  expect(getWeekdays()).toEqual([0, 1, 2, 3, 4, 5, 6]);
@@ -7,3 +7,31 @@ describe('utils', () => {
7
7
  expect(getWeekdays(1)).toEqual([1, 2, 3, 4, 5, 6, 0]);
8
8
  });
9
9
  });
10
+ describe('timezone-utils', () => {
11
+ beforeEach(() => {
12
+ jest.useFakeTimers('modern');
13
+ jest.setSystemTime(new Date('2025-10-29T23:30:00Z'));
14
+ });
15
+ afterEach(() => {
16
+ jest.useRealTimers();
17
+ });
18
+ it('should get correct date parts in UTC', () => {
19
+ const result = getCurrentDatePartsInTimezone('UTC', new Date('2025-10-29T23:30:00Z'));
20
+ expect(result.year).toBe(2025);
21
+ expect(result.month).toBe(10);
22
+ expect(result.date).toBe(29);
23
+ });
24
+ it('should get current date parts in specific timezone', () => {
25
+ const shanghaiParts = getCurrentDatePartsInTimezone('Asia/Shanghai', new Date('2025-10-29T23:30:00Z'));
26
+ expect(shanghaiParts.year).toBe(2025);
27
+ expect(shanghaiParts.month).toBe(10);
28
+ expect(shanghaiParts.date).toBe(30); // already next day
29
+ });
30
+ it('should fallback to system time for invalid timezone', () => {
31
+ const result = getCurrentDatePartsInTimezone('Invalid/Timezone', new Date('2025-10-29T23:30:00Z'));
32
+ const systemTimezoneResult = getCurrentDatePartsInTimezone(getSystemTimezone(), new Date('2025-10-29T23:30:00Z'));
33
+ expect(result.year).toBe(systemTimezoneResult.year);
34
+ expect(result.month).toBe(systemTimezoneResult.month);
35
+ expect(result.date).toBe(systemTimezoneResult.date);
36
+ });
37
+ });